org.eclipse.jst.jsf.ui.internal.component.ComponentMasterForm.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.jsf.ui.internal.component.ComponentMasterForm.java

Source

/*******************************************************************************
 * Copyright (c) 2001, 2008 Oracle Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.ui.internal.component;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.IInputProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.Decorator;
import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.form.AbstractMasterForm;
import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
import org.eclipse.jst.jsf.designtime.internal.view.DTUIViewRoot;
import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService;
import org.eclipse.jst.jsf.designtime.internal.view.XMLViewObjectMappingService.ElementData;
import org.eclipse.jst.jsf.ui.internal.common.MetadataTagImageManager;
import org.eclipse.jst.jsf.ui.internal.component.ComponentTreeViewProvider.TreePlaceHolder;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;

/*package*/class ComponentMasterForm extends AbstractMasterForm {
    private final DTJSFViewModel _model;
    private TreeViewer _treeViewer;
    private Action _refreshAction;

    protected ComponentMasterForm(final FormToolkit toolkit, final DTJSFViewModel model) {
        super(toolkit);
        _model = model;
    }

    @Override
    public Control createClientArea(final Composite parent) {
        final Tree tree = getToolkit().createTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        tree.setLayoutData(gridData);

        _treeViewer = new TreeViewer(tree);
        _treeViewer.getTree().setLayoutData(gridData);
        _treeViewer.setContentProvider(new ComponentTreeViewProvider());
        _treeViewer.setLabelProvider(new TreeViewLabelProvider(_treeViewer));
        _treeViewer.setSorter(new ComponentTreeSorter());
        _treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(final SelectionChangedEvent event) {
                getListener().selectionChanged(event);
            }

        });

        _model.init(new Runnable() {
            public void run() {
                PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
                    public void run() {
                        final Object[] expanded = _treeViewer.getExpandedElements();
                        _treeViewer.refresh();
                        _treeViewer.setExpandedElements(expanded);
                    }
                });
            }
        });

        _treeViewer.setInput(_model);

        makeActions();
        return tree;
    }

    @Override
    protected void contributeActions(final IToolBarManager formManager, final IToolBarManager localManager) {
        // contribute to local tool bar
        localManager.add(_refreshAction);
        localManager.update(false);
    }

    private void makeActions() {
        _refreshAction = new Action() {
            @Override
            public void run() {
                _model.update();
            }
        };
        _refreshAction.setText(Messages.ComponentMasterForm_RefreshView);
        _refreshAction.setToolTipText(Messages.ComponentMasterForm_RefreshView);
        _refreshAction.setImageDescriptor(JSFUICommonPlugin.getDefault().getImageDescriptor("refresh_nav_16.gif")); //$NON-NLS-1$
    }

    @Override
    protected void contributeToHeadArea(final FormToolkit toolkit, final Composite container) {
        final Text label = new Text(container, SWT.READ_ONLY | SWT.SINGLE | SWT.LEFT);

        String viewId = _model.getViewId();
        viewId = viewId == null ? Messages.ComponentMasterForm_Unknown : viewId;
        label.setText(NLS.bind(Messages.ComponentMasterForm_HeadAreaText, viewId, _model.getProject().getName()));
    }

    private static class TreeViewLabelProvider extends LabelProvider {
        private final IInputProvider _inputProvider;
        private final MetadataTagImageManager _metadataIconManager;

        /**
         * @param inputProvider
         */
        private TreeViewLabelProvider(final IInputProvider inputProvider) {
            super();
            _inputProvider = inputProvider;
            _metadataIconManager = new MetadataTagImageManager();
        }

        @Override
        public String getText(final Object obj) {
            if (obj instanceof ComponentInfo) {
                String text = ""; //$NON-NLS-1$
                final ComponentInfo compInfo = (ComponentInfo) obj;
                String className = compInfo.getComponentTypeInfo().getClassName();
                final int dotIdx = className.lastIndexOf('.');
                if (dotIdx > -1 && dotIdx + 1 < className.length()) {
                    className = className.substring(dotIdx + 1);
                }
                text = className;

                final String id = compInfo.getId();

                if (id != null) {
                    text += " (id=" + id + ")"; //$NON-NLS-1$ //$NON-NLS-2$
                }
                return text;
            } else if (obj instanceof TreePlaceHolder) {
                return Messages.ComponentMasterForm_CalculatingView;
            }
            return obj.toString();
        }

        @Override
        public Image getImage(final Object obj) {
            Image image = null;
            if (obj instanceof ViewObject) {
                final XMLViewObjectMappingService mappingService = getMappingService();

                if (mappingService != null) {
                    final ElementData elementData = mappingService.findElementData((ViewObject) obj);

                    if (elementData != null) {
                        final TagIdentifier tagId = elementData.getTagId();
                        final DTJSFViewModel model = getModel();
                        if (model != null) {
                            image = _metadataIconManager.getSmallIconImage(model.getFile(), tagId);
                        }
                    }
                }
                if (image == null) {
                    image = getDefaultImage((ViewObject) obj);
                }
            } else if (obj instanceof TreePlaceHolder) {
                return JSFUICommonPlugin.getDefault().getImage("configs.gif"); //$NON-NLS-1$
            }
            if (image == null) {
                final String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
                image = PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
            }

            return image;
        }

        private XMLViewObjectMappingService getMappingService() {
            final DTJSFViewModel model = getModel();

            if (model != null) {
                final DTUIViewRoot root = model.getRoot();

                if (root != null) {
                    return (XMLViewObjectMappingService) root.getServices()
                            .getAdapter(XMLViewObjectMappingService.class);
                }
            }
            return null;
        }

        private DTJSFViewModel getModel() {
            final Object input = _inputProvider.getInput();

            if (input instanceof DTJSFViewModel) {
                return (DTJSFViewModel) input;
            }
            return null;
        }

        private Image getDefaultImage(final ViewObject obj) {
            if (obj instanceof DTUIViewRoot) {
                return JSFUICommonPlugin.getDefault().getImage(JSFSharedImages.GENERIC_VIEWROOT_IMG);
            }
            if (obj instanceof ComponentInfo) {
                return JSFUICommonPlugin.getDefault().getImage(JSFSharedImages.GENERIC_OBJECT_IMG);
            } else if (obj instanceof ConverterDecorator) {
                return JSFUICommonPlugin.getDefault().getImage(JSFSharedImages.GENERIC_CONVERTER_IMG);
            } else if (obj instanceof ValidatorDecorator) {
                return JSFUICommonPlugin.getDefault().getImage(JSFSharedImages.GENERIC_VALIDATOR_IMG);
            }
            return JSFUICommonPlugin.getDefault().getImage(JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
        }
    }

    private static class ComponentTreeSorter extends ViewerSorter {
        @Override
        public int compare(final Viewer viewer, final Object e1, final Object e2) {
            return 0;
        }

        @Override
        public int category(final Object element) {
            // sort decorators first into their own category
            if (element instanceof Decorator) {
                return 0;
            }
            return 1;
        }
    }
}