org.jboss.tools.hibernate.ui.diagram.editors.DiagramContentOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.hibernate.ui.diagram.editors.DiagramContentOutlinePage.java

Source

/*******************************************************************************
 * Copyright (c) 2007-2009 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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
 *
 * Contributor:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.hibernate.ui.diagram.editors;

import java.util.HashSet;
import java.util.Set;

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.EditPartViewer;
import org.eclipse.gef.GraphicalViewer;
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.actions.ActionRegistry;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
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.action.MenuManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.swt.SWT;
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;
import org.jboss.tools.hibernate.ui.diagram.DiagramViewerMessages;
import org.jboss.tools.hibernate.ui.diagram.editors.actions.AutoLayoutAction;
import org.jboss.tools.hibernate.ui.diagram.editors.actions.LexicalSortingAction;
import org.jboss.tools.hibernate.ui.diagram.editors.actions.ToggleConnectionsAction;
import org.jboss.tools.hibernate.ui.diagram.editors.actions.ToggleShapeExpandStateAction;
import org.jboss.tools.hibernate.ui.diagram.editors.actions.ToggleShapeVisibleStateAction;
import org.jboss.tools.hibernate.ui.diagram.editors.model.OrmDiagram;
import org.jboss.tools.hibernate.ui.diagram.editors.parts.TreePartFactory;
import org.jboss.tools.hibernate.ui.diagram.editors.popup.PopupMenuProvider;

/**
 *
 */
public class DiagramContentOutlinePage extends ContentOutlinePage implements IAdaptable {

    private GraphicalViewer graphicalViewer;

    private DiagramViewer editor;

    private OrmDiagram ormDiagram;

    private SelectionSynchronizer selectionSynchronizer;

    private PageBook pageBook;

    private Control outline;
    /*
     * surface for drawing 
     */
    private Canvas overview;

    private IAction showOutlineAction, showOverviewAction;

    static final int ID_OUTLINE = 0;

    static final int ID_OVERVIEW = 1;

    private Thumbnail thumbnail;

    private ActionRegistry actionRegistry;

    /**
     * The constructor
     * 
     * @param viewer
     */
    public DiagramContentOutlinePage(EditPartViewer viewer, ActionRegistry actionRegistry) {
        super(viewer);
        this.actionRegistry = actionRegistry;
    }

    /**
     * Sets graphical viewer
     * 
     * @param graphicalViewer
     */
    public void setGraphicalViewer(GraphicalViewer graphicalViewer) {
        this.graphicalViewer = graphicalViewer;
    }

    public void update(GraphicalViewer graphicalViewer) {
        if (this.graphicalViewer != null) {
            if (this.graphicalViewer != graphicalViewer) {
                getSelectionSynchronizer().removeViewer(this.graphicalViewer);
                replaceSelectionChangedListeners(graphicalViewer);
                this.graphicalViewer = graphicalViewer;
                getSelectionSynchronizer().addViewer(graphicalViewer);
                initializeOverview();
            }
        }

    }

    /**
     * @return graphical viewer
     */
    public GraphicalViewer getGraphicalViewer() {
        return graphicalViewer;
    }

    /**
     * sets selection synchronizer
     * 
     * @param selectionSynchronizer
     */
    public void setSelectionSynchronizer(SelectionSynchronizer selectionSynchronizer) {
        this.selectionSynchronizer = selectionSynchronizer;
    }

    /**
     * @return returns selection synchronizer
     */
    public SelectionSynchronizer getSelectionSynchronizer() {
        return selectionSynchronizer;
    }

    /**
     * initializator
     */
    public void init(IPageSite pageSite) {
        super.init(pageSite);
        ActionRegistry registry = getActionRegistry();
        if (registry == null) {
            return;
        }
        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.REFRESH.getId();
        bars.setGlobalActionHandler(id, registry.getAction(id));
        id = ActionFactory.PRINT.getId();
        bars.setGlobalActionHandler(id, registry.getAction(id));
        id = AutoLayoutAction.ACTION_ID;
        bars.setGlobalActionHandler(id, registry.getAction(id));
        id = ToggleConnectionsAction.ACTION_ID;
        bars.setGlobalActionHandler(id, registry.getAction(id));
        id = ToggleShapeExpandStateAction.ACTION_ID;
        bars.setGlobalActionHandler(id, registry.getAction(id));
        id = ToggleShapeVisibleStateAction.ACTION_ID;
        bars.setGlobalActionHandler(id, registry.getAction(id));
        id = LexicalSortingAction.ACTION_ID;
        bars.setGlobalActionHandler(id, registry.getAction(id));
        bars.updateActionBars();
    }

    /**
     * Outline viewer configuration
     * 
     */
    protected void configureOutlineViewer() {
        getViewer().setEditDomain(editor.getDefaultEditDomain());
        getViewer().setEditPartFactory(new TreePartFactory());
        MenuManager provider = new PopupMenuProvider(getViewer(), getActionRegistry());
        //getViewer().setContextMenu(provider);
        getViewer().setContextMenu(provider);
        getSite().registerContextMenu("org.jboss.tools.hibernate.ui.diagram.editors.popup.outline.contextmenu", //$NON-NLS-1$
                provider, getSite().getSelectionProvider());
        IToolBarManager tbm = getSite().getActionBars().getToolBarManager();

        tbm.add(editor.getLexicalSortingAction());

        showOutlineAction = new Action() {
            public void run() {
                showPage(ID_OUTLINE);
            }
        };
        showOutlineAction.setToolTipText(DiagramViewerMessages.DiagramContentOutlinePage_Outline);
        showOutlineAction
                .setImageDescriptor(ImageDescriptor.createFromFile(DiagramViewer.class, "icons/outline.gif")); //$NON-NLS-1$
        tbm.add(showOutlineAction);
        showOverviewAction = new Action() {
            public void run() {
                showPage(ID_OVERVIEW);
            }
        };
        showOverviewAction.setToolTipText(DiagramViewerMessages.DiagramContentOutlinePage_Overview);
        showOverviewAction
                .setImageDescriptor(ImageDescriptor.createFromFile(DiagramViewer.class, "icons/overview.gif")); //$NON-NLS-1$
        tbm.add(showOverviewAction);
        showPage(ID_OVERVIEW);
    }

    /**
     * @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();
        initializeOutlineViewer();
    }

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

    /**
     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
     */
    @SuppressWarnings("rawtypes")
    public Object getAdapter(Class type) {
        if (type == ZoomManager.class) {
            return ((ScalableFreeformRootEditPart) getGraphicalViewer().getRootEditPart()).getZoomManager();
        }
        return null;
    }

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

    /**
     * 
     */
    protected void hookOutlineViewer() {
        getSelectionSynchronizer().addViewer(getViewer());
    }

    /**
     * 
     */
    protected void initializeOutlineViewer() {
        setContents(getOrmDiagram());
    }

    /**
     * 
     */
    protected void initializeOverview() {
        LightweightSystem lws = new LightweightSystem(overview);
        RootEditPart rep = getGraphicalViewer().getRootEditPart();

        if (rep instanceof ScalableFreeformRootEditPart) {
            ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart) rep;
            if (this.thumbnail != null) {
                this.thumbnail.deactivate();
            }
            thumbnail = new ScrollableThumbnail((Viewport) root.getFigure());
            thumbnail.setBorder(new MarginBorder(3));
            thumbnail.setSource(root.getLayer(LayerConstants.PRINTABLE_LAYERS));
            lws.setContents(thumbnail);
        }
    }

    public void setContents(Object contents) {
        if (getViewer().getEditPartFactory() == null) {
            getViewer().setEditPartFactory(new TreePartFactory());
        }
        getViewer().setContents(contents);
    }

    /**
     * @param id
     */
    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);
        }

    }

    /**
     * 
     */
    protected void unhookOutlineViewer() {
        getSelectionSynchronizer().removeViewer(getViewer());
    }

    Set<ISelectionChangedListener> listeners = new HashSet<ISelectionChangedListener>();

    public void addSelectionChangedListener(ISelectionChangedListener listener) {
        super.addSelectionChangedListener(listener);
        listeners.add(listener);
    }

    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
        super.removeSelectionChangedListener(listener);
        listeners.remove(listener);
    }

    void replaceSelectionChangedListeners(GraphicalViewer graphicalViewer) {
        for (ISelectionChangedListener l : listeners) {
            getViewer().removeSelectionChangedListener(l);
            graphicalViewer.addSelectionChangedListener(l);
        }
    }

    /**
     * @return the ormDiagram
     */
    public OrmDiagram getOrmDiagram() {
        return ormDiagram;
    }

    /**
     * @param ormDiagram the ormDiagram to set
     */
    public void setOrmDiagram(OrmDiagram ormDiagram) {
        this.ormDiagram = ormDiagram;
    }

    public Control getOutline() {
        return outline;
    }

    public DiagramViewer getEditor() {
        return editor;
    }

    public void setEditor(DiagramViewer editor) {
        this.editor = editor;
    }

    protected ActionRegistry getActionRegistry() {
        return actionRegistry;
    }

    public void cleanupSelection() {
        getViewer().deselectAll();
    }
}