ca.uwaterloo.gp.fmp.presentation.PropertiesView.java Source code

Java tutorial

Introduction

Here is the source code for ca.uwaterloo.gp.fmp.presentation.PropertiesView.java

Source

/**************************************************************************************
 * Copyright (c) 2005, 2006 Generative Software Development Lab, University of Waterloo
 * 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:
 *   1. Generative Software Development Lab, University of Waterloo,
 *      http://gp.uwaterloo.ca  - initial API and implementation
 **************************************************************************************/
package ca.uwaterloo.gp.fmp.presentation;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import ca.uwaterloo.gp.fmp.Clonable;
import ca.uwaterloo.gp.fmp.ConfigState;
import ca.uwaterloo.gp.fmp.Feature;
import ca.uwaterloo.gp.fmp.Node;
import ca.uwaterloo.gp.fmp.provider.fmpEditPlugin;
import ca.uwaterloo.gp.fmp.system.RoleQuery;

/**
 * @author Michal Antkiewicz <mantkiew@swen.uwaterloo.ca>
 */
public class PropertiesView extends ViewPart implements ISelectionListener, IPartListener {
    private FmpEditor editor;
    FmpAdapterFactoryTreeEditor treeEditor;
    private TreeViewer treeViewer;
    private Action toggleAnnotations;
    private Action toggleLinkingAction;
    private boolean selectionListenerActive = true;
    private boolean filter = true;

    // add drag & drop support
    int dndOperations = DND.DROP_MOVE;
    Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };

    public PropertiesView() {
        super();
    }

    public void createPartControl(Composite parent) {
        treeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.PUSH);

        treeViewer.addFilter(new ViewerFilter() {
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                // hide everyting that is not defined in the metamodel                   
                if (filter && RoleQuery.INSTANCE.getPropertyRole((Node) element) == RoleQuery.NONE)
                    return false;
                // hide configurations
                if (!filter) {
                    if (element instanceof Feature
                            && RoleQuery.INSTANCE.getNodeType((Node) element) == RoleQuery.ROOT_FEATURE)
                        return false;
                }
                if (parentElement instanceof Clonable) {
                    int state = ((Clonable) parentElement).getState().getValue();
                    int min = ((Clonable) parentElement).getMin();
                    if (min == 0 && (state == ConfigState.UNDECIDED || state == ConfigState.MACHINE_ELIMINATED
                            || state == ConfigState.USER_ELIMINATED))
                        return false;
                }
                return true;
            }
        });
        toggleAnnotations = new Action("Toggle Annotations", IAction.AS_CHECK_BOX) {
            public void run() {
                filter = !filter;
                treeViewer.refresh();
            }
        };
        toggleAnnotations.setToolTipText("Shows/hides unused annotations");
        toggleAnnotations.setImageDescriptor(ExtendedImageRegistry.getInstance()
                .getImageDescriptor(fmpEditPlugin.INSTANCE.getImage("full/ShowAnnotationsAction")));

        toggleLinkingAction = new Action("Link with Editor", IAction.AS_CHECK_BOX) {
            public void run() {
                selectionListenerActive = !selectionListenerActive;
            }
        };
        toggleLinkingAction.setChecked(selectionListenerActive);
        toggleLinkingAction.setToolTipText("Link with Editor");
        toggleLinkingAction.setImageDescriptor(
                AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui", "icons/full/elcl16/synced.gif"));
        getViewSite().getActionBars().getToolBarManager().add(toggleLinkingAction);

        getViewSite().getActionBars().getToolBarManager().add(toggleAnnotations);

        // add drag support
        treeViewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(treeViewer));

        getSite().getPage().addPartListener(this);
        getSite().getPage().addSelectionListener(this);

        IEditorPart activeEditor = getSite().getPage().getActiveEditor();
        if (activeEditor instanceof FmpEditor) {
            registerWithEditor((FmpEditor) activeEditor);
            setInputFromEditorSelection(editor.getSelection());
        }
    }

    /**
     * @param activeEditor
     */
    private void setInputFromEditorSelection(ISelection selection) {
        if (selection instanceof IStructuredSelection) {
            Object object = ((IStructuredSelection) selection).getFirstElement();
            if (object instanceof Node)
                object = ((Node) object).getProperties();
            else
                object = null;
            treeViewer.setInput(object);
            treeViewer.expandAll();
        }
    }

    public void setFocus() {
        treeViewer.getControl().setFocus();
        if (editor != null) {
            ((FmpActionBarContributor) editor.getActionBarContributor())
                    .selectionChanged(new SelectionChangedEvent(treeViewer, treeViewer.getSelection()));
        }
    }

    public TreeViewer getTreeViewer() {
        return treeViewer;
    }

    public void dispose() {
        treeViewer.getTree().dispose();
        // remove as selection and part listener when closing the view
        getSite().getPage().removeSelectionListener(this);
        getSite().getPage().removePartListener(this);
        super.dispose();
    }

    public void refresh() {
        treeViewer.refresh();
        expand(treeViewer.getInput());
    }

    private void expand(Object object) {
        if (object != null) {
            treeViewer.expandToLevel(object, AbstractTreeViewer.ALL_LEVELS);
            /*Feature config = (Feature) object;
            for (Iterator i = config.getChildren().iterator(); i.hasNext(); ) {
               Object aux = i.next();
               if (aux instanceof SystemAnnotation) {
              if (((SystemAnnotation) aux).getMetaRole() != MetaRole.NONE_LITERAL)
                  if (aux instanceof ConfNode && ((ConfNode) aux).isChecked())
                      treeViewer.expandToLevel(aux, TreeViewer.ALL_LEVELS);
                  else if (!(aux instanceof ConfNode))
                      treeViewer.expandToLevel(aux, TreeViewer.ALL_LEVELS);
               }
            }*/
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
     */
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        if (!selectionListenerActive)
            return;
        if (!(part instanceof FmpEditor))
            return;
        if (treeViewer != null && !treeViewer.getTree().isDisposed()) {
            FmpEditor newEditor = (FmpEditor) part;
            // switch to different editor if needed
            if (newEditor != editor)
                registerWithEditor(newEditor);
            if (selection instanceof IStructuredSelection && ((IStructuredSelection) selection).size() == 1)
                setInputFromEditorSelection(selection);
        }
    }

    /**
     * @param newEditor
     */
    private void registerWithEditor(FmpEditor newEditor) {
        editor = newEditor;

        AdapterFactory adapterFactory = editor.getAdapterFactory();
        EditingDomain editingDomain = editor.getEditingDomain();
        treeViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
        treeViewer.addSelectionChangedListener((ISelectionChangedListener) editor.getActionBarContributor());
        treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
        treeViewer.setInput(null);

        if (treeEditor == null)
            // register tree editor with tree widget
            treeEditor = new FmpAdapterFactoryTreeEditor(treeViewer.getTree(), adapterFactory, editingDomain,
                    treeViewer);
        else
            treeEditor.reconfigure(adapterFactory, editingDomain);

        // remove drop target from the control.
        DropTarget dropTarget = (DropTarget) treeViewer.getControl().getData("DropTarget");
        if (dropTarget != null)
            dropTarget.dispose();
        treeViewer.addDropSupport(dndOperations, transfers,
                new EditingDomainViewerDropAdapter(editingDomain, treeViewer));

        // add pop-up menu support
        editor.createContextMenuFor(treeViewer);
    }

    public void partActivated(IWorkbenchPart part) {
        if (editor != part && part instanceof FmpEditor) {
            registerWithEditor((FmpEditor) part);
            setInputFromEditorSelection(editor.getSelection());
        }
    }

    public void partBroughtToTop(IWorkbenchPart part) {
    }

    public void partClosed(IWorkbenchPart part) {
        if (part instanceof FmpEditor) {
            if (part == editor) {
                editor = null;
                treeViewer.setInput(null);
            }
            IEditorReference[] editorReferences = getSite().getPage().getEditorReferences();
            boolean found = false;
            for (int i = 0; i < editorReferences.length; i++) {
                if (editorReferences[i].getEditor(false) instanceof FmpEditor) {
                    found = true;
                    break;
                }
            }
            if (!found)
                getSite().getPage().hideView(this);
            else {
                IEditorPart activeEditor = getSite().getPage().getActiveEditor();
                if (activeEditor instanceof FmpEditor) {
                    registerWithEditor((FmpEditor) activeEditor);
                    setInputFromEditorSelection(editor.getSelection());
                }
            }
        }
    }

    public void partDeactivated(IWorkbenchPart part) {
    }

    public void partOpened(IWorkbenchPart part) {
    }
}