genericUMLDiagramEditor.editor.GenericDiagramOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for genericUMLDiagramEditor.editor.GenericDiagramOutlinePage.java

Source

/*****************************************************************
ELDATool
Copyright (C) 2012 G. Fortino
    
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation;
version 2.1 of the License.
    
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
    
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*****************************************************************/

package genericUMLDiagramEditor.editor;

import genericUMLDiagramEditor.editParts.GenericDiagramTreeEditPartFactory;
import genericUMLDiagramEditor.icons.Icons;

import org.eclipse.core.runtime.IAdaptable;

import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.parts.ScrollableThumbnail;
import org.eclipse.draw2d.parts.Thumbnail;

import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.KeyHandler;
import org.eclipse.gef.KeyStroke;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.RootEditPart;
import org.eclipse.gef.editparts.ScalableRootEditPart;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.ui.parts.SelectionSynchronizer;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;

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.ui.IActionBars;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.PageBook;

/**
 * Create the content for the Outline View
 * 
 * @author marguu&zaza
 *
 */
public class GenericDiagramOutlinePage extends ContentOutlinePage implements IAdaptable {
    private final GenericDiagramEditor editor;
    private PageBook pageBook;
    private Control outline;
    private Canvas overview;
    private IAction showOutlineAction, showOverviewAction;
    static final int ID_OUTLINE = 0;
    static final int ID_OVERVIEW = 1;
    private Thumbnail thumbnail;
    private DisposeListener disposeListener;

    protected ActionRegistry registry;
    protected DefaultEditDomain editDomain;
    protected GraphicalViewer graphViewer;
    protected SelectionSynchronizer selSync;

    public GenericDiagramOutlinePage(GenericDiagramEditor editor, EditPartViewer viewer, ActionRegistry registry,
            DefaultEditDomain editDomain, GraphicalViewer graphViewer, SelectionSynchronizer selSync) {

        super(viewer);

        if (editor == null) {
            throw new IllegalArgumentException();
        }

        this.editor = editor;
        this.registry = registry;
        this.editDomain = editDomain;
        this.graphViewer = graphViewer;
        this.selSync = selSync;
    }

    /**
     * @see org.eclipse.ui.part.IPageBookViewPage#init(org.eclipse.ui.part.IPageSite)
     */
    public void init(IPageSite pageSite) {
        super.init(pageSite);
        IActionBars bars = pageSite.getActionBars();
        String id = ActionFactory.UNDO.getId();
        bars.setGlobalActionHandler(id, registry.getAction(id));
        id = ActionFactory.REDO.getId();
        bars.setGlobalActionHandler(id, registry.getAction(id));
        id = ActionFactory.DELETE.getId();
        bars.setGlobalActionHandler(id, registry.getAction(id));
        bars.updateActionBars();
    }

    /**
     * Initialize the outline viewer
     */
    protected void initializeOutlineViewer() {
        getViewer().setEditDomain(editDomain);
        getViewer().setEditPartFactory(new GenericDiagramTreeEditPartFactory());
        ContextMenuProvider provider = new GenericDiagramContextMenuProvider(registry, graphViewer);
        getViewer().setContextMenu(provider);
        getSite().registerContextMenu("org.eclipse.gef.examples.logic.outline.contextmenu", //$NON-NLS-1$
                provider, getSite().getSelectionProvider());
    }

    /**
     * Configure the outline viewer
     */
    protected void configureOutlineViewer() {
        // Effettuo le inizializzazioni di base
        initializeOutlineViewer();

        // Permette la cancellazione degli elementi premendo il tasto canc
        KeyHandler keyHandler = new KeyHandler();
        String id = ActionFactory.DELETE.getId();
        keyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0), registry.getAction(id));
        getViewer().setKeyHandler(new GraphicalViewerKeyHandler(graphViewer).setParent(keyHandler));

        IToolBarManager tbm = getSite().getActionBars().getToolBarManager();
        showOutlineAction = new Action() {
            public void run() {
                showPage(ID_OUTLINE);
            }
        };

        showOutlineAction.setImageDescriptor(ImageDescriptor.createFromImage(Icons.IMAGE_OUTLINE));
        tbm.add(showOutlineAction);

        showOverviewAction = new Action() {
            public void run() {
                showPage(ID_OVERVIEW);
            }
        };

        showOverviewAction.setImageDescriptor(ImageDescriptor.createFromImage(Icons.IMAGE_OVERVIEW));
        tbm.add(showOverviewAction);

        showPage(ID_OUTLINE);
    }

    /**
     * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        pageBook = new PageBook(parent, SWT.NONE);
        outline = getViewer().createControl(pageBook);
        overview = new Canvas(pageBook, SWT.NONE);
        pageBook.showPage(outline);
        configureOutlineViewer();
        hookOutlineViewer();
        setContents(editor.getContents());
    }

    /**
     * @see org.eclipse.ui.part.IPage#dispose()
     */
    public void dispose() {
        unhookOutlineViewer();
        if (thumbnail != null) {
            thumbnail.deactivate();
            thumbnail = null;
        }
        super.dispose();
        editor.disposeOutlinePage();
    }

    /**
     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
     */
    public Object getAdapter(Class type) {
        if (type == ZoomManager.class)
            return graphViewer.getProperty(ZoomManager.class.toString());
        return null;
    }

    /**
     * @see org.eclipse.ui.part.IPage#getControl()
     */
    public Control getControl() {
        return pageBook;
    }

    /**
     * Hook the outline viewer
     */
    protected void hookOutlineViewer() {
        selSync.addViewer(getViewer());
    }

    /**
     * Initialize the overview
     */
    protected void initializeOverview() {
        LightweightSystem lws = new LightweightSystem(overview);
        RootEditPart rep = graphViewer.getRootEditPart();
        if (rep instanceof ScalableRootEditPart) {
            ScalableRootEditPart root = (ScalableRootEditPart) rep;
            thumbnail = new ScrollableThumbnail((Viewport) root.getFigure());
            thumbnail.setBorder(new MarginBorder(3));
            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;
                    }
                }
            };
            graphViewer.getControl().addDisposeListener(disposeListener);
        }
    }

    /**
     * Add  the passad object to the viewer
     * 
     * @param contents the object to add
     */
    public void setContents(Object contents) {
        getViewer().setContents(contents);
    }

    /**
     * Show the selected type for the outline
     * 
     * @param id  the type for the outline
     */
    protected void showPage(int id) {
        if (id == ID_OUTLINE) {
            showOutlineAction.setChecked(true);
            showOverviewAction.setChecked(false);
            pageBook.showPage(outline);
            if (thumbnail != null)
                thumbnail.setVisible(false);
        } else if (id == ID_OVERVIEW) {
            if (thumbnail == null)
                initializeOverview();
            showOutlineAction.setChecked(false);
            showOverviewAction.setChecked(true);
            pageBook.showPage(overview);
            thumbnail.setVisible(true);
        }
    }

    /**
     * Unhook the outline viewer
     */
    protected void unhookOutlineViewer() {
        selSync.removeViewer(getViewer());
        if (disposeListener != null && graphViewer.getControl() != null && !graphViewer.getControl().isDisposed())
            graphViewer.getControl().removeDisposeListener(disposeListener);
    }
}