Java tutorial
/** * Copyright (c) 2015 Mashin (http://mashin.io). 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 io.mashin.oep.ui.editor; import io.mashin.oep.Activator; import io.mashin.oep.parts.tree.WorkflowTreeEditPartFactory; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.draw2d.FigureCanvas; 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.EditDomain; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.RootEditPart; import org.eclipse.gef.dnd.TemplateTransferDropTargetListener; 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.resource.ImageDescriptor; import org.eclipse.jface.util.TransferDropTargetListener; 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; public class OutlinePage extends ContentOutlinePage implements IAdaptable { private WorkflowEditor workflowEditor; private ActionRegistry actionRegistry; EditDomain editDomain; GraphicalViewer graphicalViewer; SelectionSynchronizer selectionSynchronizer; 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; public OutlinePage(EditPartViewer viewer, WorkflowEditor workflowEditor, ActionRegistry actionRegistry, EditDomain editDomain, GraphicalViewer graphicalViewer, SelectionSynchronizer selectionSynchronizer) { super(viewer); this.workflowEditor = workflowEditor; this.actionRegistry = actionRegistry; this.editDomain = editDomain; this.graphicalViewer = graphicalViewer; this.selectionSynchronizer = selectionSynchronizer; } public void init(IPageSite pageSite) { super.init(pageSite); ActionRegistry registry = actionRegistry; 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(); } protected void configureOutlineViewer() { getViewer().setEditDomain(editDomain); getViewer().setEditPartFactory(new WorkflowTreeEditPartFactory()); //ContextMenuProvider provider = new LogicContextMenuProvider( // getViewer(), getActionRegistry()); //getViewer().setContextMenu(provider); //getSite().registerContextMenu( // "org.eclipse.gef.examples.logic.outline.contextmenu", //$NON-NLS-1$ // provider, getSite().getSelectionProvider()); getViewer().setKeyHandler(workflowEditor.getCommonKeyHandler()); getViewer().addDropTargetListener( (TransferDropTargetListener) new TemplateTransferDropTargetListener(getViewer())); IToolBarManager tbm = getSite().getActionBars().getToolBarManager(); showOutlineAction = new Action() { public void run() { showPage(ID_OUTLINE); } }; showOutlineAction.setImageDescriptor(ImageDescriptor.createFromFile(Activator.class, "icons/outline.gif")); showOutlineAction.setToolTipText("Show Outline"); tbm.add(showOutlineAction); showOverviewAction = new Action() { public void run() { showPage(ID_OVERVIEW); } }; showOverviewAction .setImageDescriptor(ImageDescriptor.createFromFile(Activator.class, "icons/overview.gif")); showOverviewAction.setToolTipText("Show Overview"); tbm.add(showOverviewAction); showPage(ID_OUTLINE); } 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(); } public void dispose() { unhookOutlineViewer(); if (thumbnail != null) { thumbnail.deactivate(); thumbnail = null; } super.dispose(); workflowEditor.outlinePage = null; } @SuppressWarnings("rawtypes") public Object getAdapter(Class type) { if (type == ZoomManager.class) return graphicalViewer.getProperty(ZoomManager.class.toString()); return null; } public Control getControl() { return pageBook; } protected void hookOutlineViewer() { selectionSynchronizer.addViewer(getViewer()); } protected void initializeOutlineViewer() { setContents(workflowEditor.getModel()); } protected void initializeOverview() { LightweightSystem lws = new LightweightSystem(overview); RootEditPart rep = graphicalViewer.getRootEditPart(); if (rep instanceof ScalableFreeformRootEditPart) { ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart) 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; } } }; getEditor().addDisposeListener(disposeListener); } } public void setContents(Object contents) { getViewer().setContents(contents); } 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() { selectionSynchronizer.removeViewer(getViewer()); if (disposeListener != null && getEditor() != null && !getEditor().isDisposed()) getEditor().removeDisposeListener(disposeListener); } protected FigureCanvas getEditor() { return (FigureCanvas) graphicalViewer.getControl(); } }