com.mentor.nucleus.bp.ui.graphics.outline.GraphicalOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for com.mentor.nucleus.bp.ui.graphics.outline.GraphicalOutlinePage.java

Source

//========================================================================
//
//File:      $RCSfile: GraphicalOutlinePage.java,v $
//Version:   $Revision: 1.9 $
//Modified:  $Date: 2013/01/10 23:06:21 $
//
//(c) Copyright 2005-2014 by Mentor Graphics Corp. All rights reserved.
//
//========================================================================
// Licensed under the Apache License, Version 2.0 (the "License"); you may not 
// use this file except in compliance with the License.  You may obtain a copy 
// of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   See the 
// License for the specific language governing permissions and limitations under
// the License.
//======================================================================== 
//
package com.mentor.nucleus.bp.ui.graphics.outline;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.draw2d.FigureListener;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.parts.ScrollableThumbnail;
import org.eclipse.draw2d.parts.Thumbnail;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.RootEditPart;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
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.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.NewWizardMenu;
import org.eclipse.ui.part.PageBook;
import org.osgi.framework.Bundle;

import com.mentor.nucleus.bp.core.Component_c;
import com.mentor.nucleus.bp.core.CorePlugin;
import com.mentor.nucleus.bp.core.DomainAsComponent_c;
import com.mentor.nucleus.bp.core.Domain_c;
import com.mentor.nucleus.bp.core.Function_c;
import com.mentor.nucleus.bp.core.Operation_c;
import com.mentor.nucleus.bp.core.Scope_c;
import com.mentor.nucleus.bp.core.common.ITransactionListener;
import com.mentor.nucleus.bp.core.common.NonRootModelElement;
import com.mentor.nucleus.bp.core.common.Transaction;
import com.mentor.nucleus.bp.core.common.TransactionManager;
import com.mentor.nucleus.bp.core.ui.Selection;
import com.mentor.nucleus.bp.core.util.EditorUtil;
import com.mentor.nucleus.bp.core.util.UIUtil;
import com.mentor.nucleus.bp.ui.canvas.CanvasPlugin;
import com.mentor.nucleus.bp.ui.canvas.ModelOutlineSorter;
import com.mentor.nucleus.bp.ui.explorer.ModelContentProvider;
import com.mentor.nucleus.bp.ui.explorer.ModelLabelProvider;
import com.mentor.nucleus.bp.ui.graphics.editor.GraphicalEditor;
import com.mentor.nucleus.bp.ui.graphics.parts.DiagramEditPart;

public class GraphicalOutlinePage extends ContentOutlinePage {

    private PageBook pageBook;
    private Canvas overview;
    static final int ID_OUTLINE = 0;
    static final int ID_OVERVIEW = 1;
    static final int ID_SPLIT = 3;
    private Thumbnail thumbnail;
    private DisposeListener disposeListener;
    private GraphicalEditor editor;
    private Control outline;

    private static final String OPEN = "open";
    private static final String SORT = "Sort";
    private static final String HIDE_STATICS = "Hide Static Members";
    private static final String HIDE_OPERATIONS = "Hide Operations";
    protected Action cut, copy, paste, undo, redo;
    protected Action open, delete, rename;
    protected Action sort, hideStatics, hideOps;
    protected ViewerFilter filterStatics, filterOps;
    private boolean sorting = false;
    private ITransactionListener m_transactionListener;
    private TreeViewer treeViewer;
    private IAction showOutlineAction, showOverviewAction;

    public GraphicalOutlinePage(EditPartViewer viewer, GraphicalEditor editor) {
        super(viewer);
        this.editor = editor;
    }

    protected void configureOutlineViewer() {
        IToolBarManager tbm = getSite().getActionBars().getToolBarManager();
        showOutlineAction = new Action() {
            public void run() {
                showPage(ID_OUTLINE);
            }
        };
        showOutlineAction.setImageDescriptor(CorePlugin.getImageDescriptor("outline.gif")); //$NON-NLS-1$
        showOutlineAction.setToolTipText("Click here to show the outline tree");
        tbm.add(showOutlineAction);
        showOverviewAction = new Action() {
            public void run() {
                showPage(ID_OVERVIEW);
            }
        };
        showOverviewAction.setImageDescriptor(CorePlugin.getImageDescriptor("overview.gif")); //$NON-NLS-1$
        showOverviewAction.setToolTipText("Click here to show a thumbnail view of the diagram");
        tbm.add(showOverviewAction);
        showPage(ID_OUTLINE);
    }

    public void createControl(Composite parent) {
        pageBook = new PageBook(parent, SWT.NONE);
        overview = new Canvas(pageBook, SWT.NONE);
        outline = createOutline(pageBook);
        configureOutlineViewer();
        getSite().setSelectionProvider(editor.getSite().getSelectionProvider());
    }

    private Control createOutline(Composite parent) {
        if (editor.getModel() != null) {
            if (editor.getModel().getRepresents() != null
                    && editor.getModel().getRepresents() instanceof NonRootModelElement) {
                Object selected = editor.getModel().getRepresents();
                if (selected instanceof Domain_c) {
                    Component_c comp = Component_c
                            .getOneC_COnR4204(DomainAsComponent_c.getOneCN_DCOnR4204((Domain_c) selected));
                    if (comp != null)
                        selected = comp;
                }
                treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
                treeViewer.setContentProvider(new ModelContentProvider());
                treeViewer.setLabelProvider(new ModelLabelProvider());
                createActions();
                createMenus();
                createToolbar();
                createFilters();
                hookListeners();
                treeViewer.setInput(selected);
                getSite().getActionBars().setGlobalActionHandler(ActionFactory.DELETE.getId(), delete);
                getSite().getActionBars().setGlobalActionHandler(ActionFactory.RENAME.getId(), rename);
                getSite().getActionBars().setGlobalActionHandler(ActionFactory.CUT.getId(), cut);
                getSite().getActionBars().setGlobalActionHandler(ActionFactory.COPY.getId(), copy);
                getSite().getActionBars().setGlobalActionHandler(ActionFactory.PASTE.getId(), paste);
                getSite().getActionBars().setGlobalActionHandler(ActionFactory.UNDO.getId(), undo);
                getSite().getActionBars().setGlobalActionHandler(ActionFactory.REDO.getId(), redo);
                return treeViewer.getControl();
            }
        }
        return null;
    }

    public Object getAdapter(Class<?> type) {
        if (type == ZoomManager.class)
            return editor.getGraphicalViewer().getProperty(ZoomManager.class.toString());
        return null;
    }

    public Control getControl() {
        return pageBook;
    }

    protected void initializeOverview() {
        LightweightSystem lws = new LightweightSystem(overview);
        RootEditPart rep = editor.getGraphicalViewer().getRootEditPart();
        if (rep instanceof ScalableFreeformRootEditPart) {
            ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart) rep;
            thumbnail = new ScrollableThumbnail((Viewport) root.getFigure());
            ((IFigure) thumbnail.getChildren().get(0)).addFigureListener(new FigureListener() {

                @Override
                public void figureMoved(IFigure source) {
                    // have the editor store the newly set
                    // viewport location
                    editor.storeViewportLocation();
                }
            });
            thumbnail.setSource(root.getLayer(LayerConstants.PRINTABLE_LAYERS));
            lws.setContents(thumbnail);
            disposeListener = new DisposeListener() {
                public void widgetDisposed(DisposeEvent e) {
                    if (thumbnail != null) {
                        thumbnail.deactivate();
                        thumbnail = null;
                    }
                }
            };
            editor.getCanvas().addDisposeListener(disposeListener);
        }
    }

    public void setContents(Object contents) {
        getViewer().setContents(contents);
        DiagramEditPart rootPart = (DiagramEditPart) getViewer().getContents();
        rootPart.setAsOutline();
    }

    protected void showPage(int id) {
        if (id == ID_OUTLINE && outline != null) {
            showOutlineAction.setChecked(true);
            showOverviewAction.setChecked(false);
            pageBook.showPage(outline);
            outline.setParent(pageBook);
            if (thumbnail != null)
                thumbnail.setVisible(false);
        } else if (id == ID_OVERVIEW || outline == null) {
            if (thumbnail == null)
                initializeOverview();
            showOutlineAction.setChecked(false);
            showOverviewAction.setChecked(true);
            pageBook.showPage(overview);
            overview.setParent(pageBook);
            thumbnail.setVisible(true);
        }
    }

    protected void hookListeners() {
        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (event.getSelection().isEmpty()) {
                    return;
                }
                if (event.getSelection() instanceof IStructuredSelection) {
                    editor.getSite().getSelectionProvider().setSelection(event.getSelection());
                    // add the selection to core as well
                    Selection.getInstance().setSelection(event.getSelection());
                }
            }
        });
        m_transactionListener = new ITransactionListener() {
            @Override
            public void transactionCancelled(Transaction transaction) {
                // do nothing
            }

            @Override
            public void transactionEnded(Transaction transaction) {
                UIUtil.refreshViewer(treeViewer, null);
            }

            @Override
            public void transactionStarted(Transaction transaction) {
                // do nothing
            }
        };
        TransactionManager.getSingleton().addTransactionListener(m_transactionListener);

        treeViewer.addOpenListener(new IOpenListener() {
            public void open(OpenEvent event) {
                handleOpen();
            }
        });
    }

    public void selectionChanged(SelectionChangedEvent event) {
        Selection.getInstance().setSelection(event.getSelection());
    }

    protected void createActions() {
        // 'New' is provided as a menu only. See 'createMenus'
        open = new Action(OPEN) {
            public void run() {
                handleOpen();
            }
        };
        open.setText("Open");
        open.setToolTipText("Open this model Element");
        // 'Open With' is provided as a menu only. See 'createMenus'
        cut = new Action(ActionFactory.CUT.getId()) {
            public void run() {
            }
        };
        cut.setText("Cut");
        cut.setToolTipText("Cut this model Element to the clipboard");
        cut.setImageDescriptor(CorePlugin.getImageDescriptor("cut_edit.gif")); // $$NON-NLS-1$$
        cut.setEnabled(false); // Retargetable Actions work removes this line
        copy = new Action(ActionFactory.COPY.getId()) {
            public void run() {
            }
        };
        copy.setText("Copy");
        copy.setToolTipText("Copy this model Element to the clipboard");
        copy.setImageDescriptor(CorePlugin.getImageDescriptor("copy_edit.gif")); // $$NON-NLS-1$$
        copy.setEnabled(false); // Retargetable Actions work removes this line
        paste = new Action(ActionFactory.PASTE.getId()) {
            public void run() {
            }
        };
        paste.setText("Paste");
        paste.setToolTipText("Paste from the clipboard");
        paste.setImageDescriptor(CorePlugin.getImageDescriptor("paste_edit.gif")); // $$NON-NLS-1$$
        paste.setEnabled(false); // Retargetable Actions work removes this line

        //
        // Delete and Rename are retargetable actions defined by core.
        //
        delete = CorePlugin.getDeleteAction();
        rename = CorePlugin.getRenameAction(treeViewer);
        sort = new Action(SORT) {
            public void run() {
                sorting = !sorting;
                if (sorting) {
                    treeViewer.setSorter(new ModelOutlineSorter());
                } else {
                    treeViewer.setSorter(null);
                }
            }
        };
        sort.setChecked(false);
        sort.setToolTipText(SORT);
        sort.setImageDescriptor(CorePlugin.getImageDescriptor("alpha_mode.gif")); //$NON-NLS-1$
        hideStatics = new Action(HIDE_STATICS) {
            public void run() {
                updateFilter(hideStatics);
            }
        };
        hideStatics.setChecked(false);
        hideStatics.setToolTipText(HIDE_STATICS);
        hideStatics.setImageDescriptor(CorePlugin.getImageDescriptor("static_co.gif")); //$NON-NLS-1$
        hideOps = new Action(HIDE_OPERATIONS) {
            public void run() {
                updateFilter(hideOps);
            }
        };
        hideOps.setChecked(false);
        hideOps.setToolTipText(HIDE_OPERATIONS);
        hideOps.setImageDescriptor(CorePlugin.getImageDescriptor("methpub_obj_co.gif")); //$NON-NLS-1$
    }

    protected void createFilters() {
        filterStatics = new ViewerFilter() {
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (element instanceof Operation_c) {
                    return (((Operation_c) element).getInstance_based() == Scope_c.Instance);
                }
                if (element instanceof Function_c) {
                    return false;
                }
                return true;
            }
        };
        filterOps = new ViewerFilter() {
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                return !(element instanceof Operation_c);
            }
        };
    }

    protected void createMenus() {

        // Context Menu
        MenuManager menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuManager.setRemoveAllWhenShown(true);
        final MenuManager createMenuManager = new MenuManager("Ne&w", "com.mentor.nucleus.bp.ui.newroot"); //$NON-NLS-2$
        final MenuManager openMenuManager = new MenuManager("Open Wit&h", "com.mentor.nucleus.bp.ui.openroot"); //$NON-NLS-2$

        final MenuManager classesMenu = new MenuManager("Classes", "com.mentor.nucleus.bp.ui.classroot"); //$NON-NLS-2$
        final MenuManager componentsMenu = new MenuManager("Components", "com.mentor.nucleus.bp.ui.componentroot"); //$NON-NLS-2$
        final MenuManager externalMenu = new MenuManager("External", "com.mentor.nucleus.bp.ui.externalroot"); //$NON-NLS-2$
        final MenuManager interactionMenu = new MenuManager("Interaction",
                "com.mentor.nucleus.bp.ui.interactionroot"); //$NON-NLS-1$
        final MenuManager activityMenu = new MenuManager("Activity", "com.mentor.nucleus.bp.ui.activityroot"); //$NON-NLS-2$
        final MenuManager typesMenu = new MenuManager("Types", "com.mentor.nucleus.bp.ui.typeroot"); //$NON-NLS-2$
        final MenuManager useCaseMenu = new MenuManager("Usecase", "com.mentor.nucleus.bp.ui.usecaseroot"); //$NON-NLS-2$

        menuManager.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager mgr) {
                mgr.add(createMenuManager);
                createMenuManager.removeAll();
                createMenuManager.add(new GroupMarker("com.mentor.nucleus.bp.ui.newmenu")); //$NON-NLS-1$
                createMenuManager.add(activityMenu);
                activityMenu.removeAll();
                activityMenu.add(new GroupMarker("com.mentor.nucleus.bp.ui.newactivitymenu"));

                createMenuManager.add(classesMenu);
                classesMenu.removeAll();
                classesMenu.add(new GroupMarker("com.mentor.nucleus.bp.ui.newclassmenu"));

                createMenuManager.add(componentsMenu);
                componentsMenu.removeAll();
                componentsMenu.add(new GroupMarker("com.mentor.nucleus.bp.ui.newcomponentmenu"));

                createMenuManager.add(externalMenu);
                externalMenu.removeAll();
                externalMenu.add(new GroupMarker("com.mentor.nucleus.bp.ui.newexternalmenu"));

                createMenuManager.add(interactionMenu);
                interactionMenu.removeAll();
                interactionMenu.add(new GroupMarker("com.mentor.nucleus.bp.ui.newinteractionmenu"));

                createMenuManager.add(typesMenu);
                typesMenu.removeAll();
                typesMenu.add(new GroupMarker("com.mentor.nucleus.bp.ui.newtypemenu"));

                createMenuManager.add(useCaseMenu);
                useCaseMenu.removeAll();
                useCaseMenu.add(new GroupMarker("com.mentor.nucleus.bp.ui.newusecasemenu"));

                createMenuManager.add(new NewWizardMenu(getSite().getWorkbenchWindow()));
                mgr.add(open);
                mgr.add(openMenuManager);
                openMenuManager.removeAll();
                openMenuManager.add(new GroupMarker("com.mentor.nucleus.bp.ui.openmenu")); //$NON-NLS-1$
                mgr.add(new Separator("com.mentor.nucleus.bp.ui.context-internal")); //$NON-NLS-1$
                mgr.add(new Separator("com.mentor.nucleus.bp.ui.context-internal-end")); //$NON-NLS-1$
                mgr.add(cut);
                mgr.add(copy);
                mgr.add(paste);
                mgr.add(new Separator());
                mgr.add(delete);
                mgr.add(rename);
                mgr.add(new Separator());
                mgr.add(new Separator());
                // If this is omitted, the platform complains because
                // it can't allow third party plug-ins to extend the menu
                // This is important for those who wish to use change
                // management plugins because Team menu items are added here.
                mgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
            }
        });
        Menu menu = menuManager.createContextMenu(treeViewer.getTree());
        treeViewer.getTree().setMenu(menu);
        getSite().setSelectionProvider(Selection.getInstance());
        getSite().registerContextMenu("com.mentor.nucleus.bp.ui.graphics.outline.menu", menuManager,
                Selection.getInstance());
    }

    /* Multiple filters can be enabled at a time. */
    protected void updateFilter(Action action) {
        if (action == hideStatics) {
            if (action.isChecked()) {
                treeViewer.addFilter(filterStatics);
            } else {
                treeViewer.removeFilter(filterStatics);
            }
            return;
        }
        if (action == hideOps) {
            if (action.isChecked()) {
                treeViewer.addFilter(filterOps);
            } else {
                treeViewer.removeFilter(filterOps);
            }
            return;
        }
    }

    protected void createToolbar() {
        IToolBarManager toolBarManager = getSite().getActionBars().getToolBarManager();
        toolBarManager.add(sort);
        toolBarManager.add(hideStatics);
        toolBarManager.add(hideOps);
    }

    /**
     * Fire up an editor
     */
    private void handleOpen() {
        IStructuredSelection sel = Selection.getInstance().getStructuredSelection();
        if (sel.isEmpty()) {
            return;
        }
        Object current = (sel).iterator().next();
        String name = current.getClass().getName();

        // see if the current element should open
        // something other than itself
        current = EditorUtil.getElementToEdit(current);
        //
        // Get the registry
        //
        IExtensionRegistry reg = Platform.getExtensionRegistry();
        //
        // Get all the plugins that have extended this point
        //
        IExtensionPoint extPt = reg.getExtensionPoint("com.mentor.nucleus.bp.core.editors");
        IExtension[] exts = extPt.getExtensions();
        // Repeat for each extension until we find a default editor
        for (int i = 0; i < exts.length; i++) {
            IConfigurationElement[] elems = exts[i].getConfigurationElements();
            for (int j = 0; j < elems.length; j++) {
                // Find the editor elements
                if (elems[j].getName().equals("editor")) {
                    IConfigurationElement[] edElems = elems[j].getChildren();
                    for (int k = 0; k < edElems.length; k++) {
                        //
                        // Is this editor the default for the current model
                        // element ?
                        //
                        if (edElems[k].getName().equals("defaultFor")
                                && edElems[k].getAttribute("class").equals(name)) {
                            try {
                                //
                                // Get the class supplied for the input
                                //
                                Bundle bundle = Platform
                                        .getBundle(elems[j].getDeclaringExtension().getNamespaceIdentifier());
                                Class<?> inputClass = bundle.loadClass(elems[j].getAttribute("input")); //$NON-NLS-1$
                                Class<?>[] type = new Class[1];
                                type[0] = Object.class;
                                //
                                // Dynamically get the method createInstance,
                                // the supplied class must implement this
                                //
                                Method createInstance = inputClass.getMethod("createInstance", type); //$NON-NLS-1$
                                Object[] args = new Object[1];
                                args[0] = current;
                                //
                                // Invoke the method.
                                // The method is static; no instance is needed,
                                // so first argument is null
                                //
                                IEditorInput input = (IEditorInput) createInstance.invoke(null, args);
                                //
                                // pass the input to the Eclipse editor, along
                                // with the class name supplied by
                                // the extending plugin.
                                //
                                if (input != null) {
                                    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                                            .openEditor(input, elems[j].getAttribute("class")); //$NON-NLS-1$
                                }
                                return;
                            } catch (ClassNotFoundException e) {
                                CanvasPlugin.logError("Input Class not found", e); //$NON-NLS-1$
                            } catch (NoSuchMethodException e) {
                                CanvasPlugin.logError("Class does not implement static method createInstance", e); //$NON-NLS-1$
                            } catch (InvocationTargetException e) {
                                CanvasPlugin.logError(
                                        "Exception occured on invocation of static method createInstance of the Target", //$NON-NLS-1$
                                        e.getTargetException());
                            } catch (IllegalAccessException e) {
                                CanvasPlugin.logError("Target does not support static method createInstance", e); //$NON-NLS-1$
                            } catch (PartInitException e) {
                                CanvasPlugin.logError("Could not activate Editor", e); //$NON-NLS-1$
                            }
                        }
                    }
                }
            }
        }
    }

    public void dispose() {
        if (thumbnail != null) {
            thumbnail.deactivate();
            thumbnail = null;
        }
        super.dispose();
        if (m_transactionListener != null) {
            TransactionManager.getSingleton().removeTransactionListener(m_transactionListener);
        }
    }

    public TreeViewer getTreeViewer() {
        return treeViewer;
    }

}