/** * Copyright (c) 2006 Borland Software Corporation * * 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: * bblajer - initial API and implementation */ package org.eclipse.gmf.runtime.lite.parts; 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.KeyHandler; import org.eclipse.gef.KeyStroke; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.editparts.FreeformGraphicalRootEditPart; import org.eclipse.gef.editparts.RootTreeEditPart; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.actions.GEFActionConstants; import org.eclipse.gef.ui.parts.ContentOutlinePage; import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.gmf.internal.runtime.lite.Activator; import org.eclipse.gmf.runtime.lite.edit.parts.tree.DiagramTreeEditPartFactory; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.StructuredSelection; 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.Page; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; /** * The diagram outline. */ public class DiagramContentOutlinePage extends Page implements IContentOutlinePage { public static final int ID_OVERVIEW = 0; public static final int ID_OUTLINE = 1; private final int myDefaultMode; private ContentOutlinePage myOutlinePage; private Canvas myOverview; private PageBook myPageBook; private IAction myShowOutlineAction; private IAction myShowOverviewAction; private Thumbnail myThumbnail; private TreeViewer myTreeViewer; private DisposeListener myDisposeListener; private final IDiagramOutlineHost myHost; public DiagramContentOutlinePage(IDiagramOutlineHost host, int defaultMode) { myHost = host; myDefaultMode = defaultMode; } @Override public void init(IPageSite pageSite) { super.init(pageSite); ActionRegistry registry = myHost.getActionRegistry(); 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(); // Toolbar refresh to solve linux defect RATLC525198 bars.getToolBarManager().markDirty(); } public void addSelectionChangedListener(ISelectionChangedListener listener) { if (myOutlinePage != null) { myOutlinePage.addSelectionChangedListener(listener); } } public void removeSelectionChangedListener(ISelectionChangedListener listener) { if (myOutlinePage != null) { myOutlinePage.removeSelectionChangedListener(listener); } } public ISelection getSelection() { if (myOutlinePage != null) { return myOutlinePage.getSelection(); } return StructuredSelection.EMPTY; } public void setSelection(ISelection selection) { if (myOutlinePage != null) { myOutlinePage.setSelection(selection); } } @Override public void createControl(Composite parent) { myPageBook = new PageBook(parent, SWT.NONE); myTreeViewer = new TreeViewer(); myTreeViewer.setRootEditPart(new RootTreeEditPart()); myTreeViewer.setEditDomain(myHost.getEditDomain()); myTreeViewer.setEditPartFactory(new DiagramTreeEditPartFactory(myHost.getGraphicalViewer())); configureTreeViewer(myTreeViewer); myOutlinePage = new ContentOutlinePage(myTreeViewer); myOutlinePage.createControl(myPageBook); myTreeViewer.setContents(myHost.getGraphicalViewer().getContents().getModel()); hookOutlineViewer(myTreeViewer); configureOutlinePage(); showPage(myDefaultMode); } protected void hookOutlineViewer(TreeViewer viewer) { myHost.getSelectionSynchronizer().addViewer(viewer); } protected void unhookOutlineViewer(TreeViewer viewer) { myHost.getSelectionSynchronizer().removeViewer(viewer); } protected void configureOutlinePage() { IToolBarManager tbm = this.getSite().getActionBars().getToolBarManager(); myShowOutlineAction = new Action() { public void run() { showPage(ID_OUTLINE); } }; myShowOutlineAction.setImageDescriptor(Activator.getImageDescriptor("icons/outline.gif")); //$NON-NLS-1$ myShowOutlineAction.setToolTipText("Show Outline"); tbm.add(myShowOutlineAction); myShowOverviewAction = new Action() { public void run() { showPage(ID_OVERVIEW); } }; myShowOverviewAction.setImageDescriptor(Activator.getImageDescriptor("icons/overview.gif")); //$NON-NLS-1$ myShowOverviewAction.setToolTipText("Show Overview"); tbm.add(myShowOverviewAction); } protected void configureTreeViewer(TreeViewer treeViewer) { KeyHandler keyHandler = new KeyHandler(); keyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0), myHost.getActionRegistry().getAction(ActionFactory.DELETE.getId())); keyHandler.put(KeyStroke.getPressed(SWT.F2, 0), myHost.getActionRegistry() .getAction(GEFActionConstants.DIRECT_EDIT)); treeViewer.setKeyHandler(keyHandler); } protected void showPage(int pageId) { switch (pageId) { case ID_OUTLINE: myShowOutlineAction.setChecked(true); myShowOverviewAction.setChecked(false); myPageBook.showPage(myOutlinePage.getControl()); if (myThumbnail != null) { myThumbnail.setVisible(false); } break; case ID_OVERVIEW: myShowOutlineAction.setChecked(false); myShowOverviewAction.setChecked(true); if (myOverview == null || myOverview.isDisposed()) { initializeOverview(); } myPageBook.showPage(myOverview); if (myThumbnail != null) { myThumbnail.setVisible(true); } } } protected void initializeOverview() { myOverview = new Canvas(myPageBook, SWT.NONE); LightweightSystem lws = new LightweightSystem(myOverview); FreeformGraphicalRootEditPart root = (FreeformGraphicalRootEditPart) myHost.getGraphicalViewer().getRootEditPart(); myThumbnail = new ScrollableThumbnail((Viewport) root.getFigure()); myThumbnail.setSource(root.getLayer(LayerConstants.SCALABLE_LAYERS)); lws.setContents(myThumbnail); myDisposeListener = new DisposeListener() { public void widgetDisposed(DisposeEvent e) { if (myThumbnail != null) { myThumbnail.deactivate(); myThumbnail = null; } } }; myHost.getGraphicalControl().addDisposeListener(myDisposeListener); } @Override public Control getControl() { return myPageBook; } @Override public void setFocus() { if (myOutlinePage != null) { myOutlinePage.setFocus(); } } @Override public void dispose() { if (myOutlinePage != null) { myOutlinePage.dispose(); } unhookOutlineViewer(myTreeViewer); if (myThumbnail != null) { myThumbnail.deactivate(); myThumbnail = null; } if (myDisposeListener != null) { myHost.getGraphicalControl().removeDisposeListener(myDisposeListener); } myOverview = null; super.dispose(); } }