/* * Copyright (c) 2006, 2007 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: * Richard Gronback (Borland) - initial API and implementation */ package org.eclipse.gmf.examples.mindmap.rcp.edit.parts; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.eclipse.draw2d.ChopboxAnchor; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.RoundedRectangle; import org.eclipse.draw2d.StackLayout; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.transaction.NotificationFilter; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.TreeEditPart; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.gef.editpolicies.ResizableEditPolicy; import org.eclipse.gef.requests.DirectEditRequest; import org.eclipse.gmf.examples.mindmap.MindmapPackage; import org.eclipse.gmf.examples.mindmap.Topic; import org.eclipse.gmf.examples.mindmap.rcp.edit.policies.TopicComponentEditPolicy; import org.eclipse.gmf.examples.mindmap.rcp.edit.policies.TopicGraphicalNodeEditPolicy; import org.eclipse.gmf.examples.mindmap.rcp.edit.policies.TopicLayoutEditPolicy; import org.eclipse.gmf.examples.mindmap.rcp.part.MindmapDiagramEditorPlugin; import org.eclipse.gmf.examples.mindmap.rcp.part.MindmapVisualIDRegistry; import org.eclipse.gmf.examples.mindmap.rcp.view.factories.TopicSubtopicsViewFactory; import org.eclipse.gmf.runtime.lite.commands.CreateNotationalEdgeCommand; import org.eclipse.gmf.runtime.lite.commands.CreateNotationalElementCommand; import org.eclipse.gmf.runtime.lite.commands.WrappingCommand; import org.eclipse.gmf.runtime.lite.edit.parts.decorations.IDecoratableEditPart; import org.eclipse.gmf.runtime.lite.edit.parts.decorations.IDecorationManager; import org.eclipse.gmf.runtime.lite.edit.parts.decorations.PaneDecorationManager; import org.eclipse.gmf.runtime.lite.edit.parts.labels.ILabelTextDisplayer; import org.eclipse.gmf.runtime.lite.edit.parts.tree.BaseTreeEditPart; import org.eclipse.gmf.runtime.lite.edit.parts.update.IExternallyUpdatableEditPart; import org.eclipse.gmf.runtime.lite.edit.parts.update.IUpdatableEditPart; import org.eclipse.gmf.runtime.lite.edit.parts.update.RefreshersRegistry; import org.eclipse.gmf.runtime.lite.edit.parts.update.TransactionalUpdateManager; import org.eclipse.gmf.runtime.lite.edit.parts.update.UpdaterUtil; import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.EditPartRegistryBasedViewService; import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.ElementDescriptor; import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.IViewService; import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.LinkDescriptor; import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.OwnedLinksNotationModelRefresher; import org.eclipse.gmf.runtime.lite.edit.policies.DelegatingDirectEditPolicy; import org.eclipse.gmf.runtime.lite.edit.policies.LabelDirectEditPolicy; import org.eclipse.gmf.runtime.lite.services.IViewDecorator; import org.eclipse.gmf.runtime.notation.Bounds; import org.eclipse.gmf.runtime.notation.CanonicalStyle; import org.eclipse.gmf.runtime.notation.DrawerStyle; import org.eclipse.gmf.runtime.notation.Edge; import org.eclipse.gmf.runtime.notation.FillStyle; import org.eclipse.gmf.runtime.notation.FontStyle; import org.eclipse.gmf.runtime.notation.Node; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Widget; /** * @generated */ public class TopicEditPart extends AbstractGraphicalEditPart implements NodeEditPart, IUpdatableEditPart, IExternallyUpdatableEditPart, IDecoratableEditPart { /** * @generated */ public static final int VISUAL_ID = 2001; /** * @generated */ protected IFigure primaryShape; /** * @generated */ public TopicEditPart(View model) { assert model instanceof Node; setModel(model); } /** * @generated */ protected void registerModel() { super.registerModel(); View view = (View) getModel(); if (view != null && view.isSetElement() && view.getElement() != null) { getViewer().getEditPartRegistry().put(view.getElement(), this); } } /** * @generated */ protected void unregisterModel() { super.unregisterModel(); View view = (View) getModel(); if (view != null && view.isSetElement() && view.getElement() != null && getViewer().getEditPartRegistry().get(view.getElement()) == this) { getViewer().getEditPartRegistry().remove(view.getElement()); } } /** * @generated */ protected void createEditPolicies() { installEditPolicy(EditPolicy.COMPONENT_ROLE, new TopicComponentEditPolicy()); installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new TopicGraphicalNodeEditPolicy()); installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new DelegatingDirectEditPolicy()); installEditPolicy(EditPolicy.LAYOUT_ROLE, new TopicLayoutEditPolicy()); installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, getPrimaryDragEditPolicy()); installLinkNotationModelRefresher(); } /** * @generated */ protected EditPolicy getPrimaryDragEditPolicy() { ResizableEditPolicy result = new ResizableEditPolicy() { protected List createSelectionHandles() { List result = super.createSelectionHandles(); for (Iterator it = getChildren().iterator(); it.hasNext();) { EditPart next = (EditPart) it.next(); View nextView = (View) next.getModel(); switch (MindmapVisualIDRegistry.getVisualID(nextView)) { case TopicThreadCompartmentEditPart.VISUAL_ID: result.addAll(((TopicThreadCompartmentEditPart) next) .createSelectionHandles()); break; } } return result; } }; return result; } /** * @generated */ protected IFigure createFigure() { IFigure invisibleRectangle = new Figure(); invisibleRectangle.setLayoutManager(new StackLayout()); IFigure shape = createNodeShape(); invisibleRectangle.add(shape); contentPane = setupContentPane(shape); IFigure decorationShape = createDecorationPane(); if (decorationShape != null) { myDecorationManager = createDecorationManager(decorationShape); invisibleRectangle.add(decorationShape, 0); } return invisibleRectangle; } /** * @generated */ private IFigure createDecorationPane() { return new Figure(); } /** * @generated */ private IDecorationManager myDecorationManager; /** * @generated */ public IDecorationManager getDecorationManager() { return myDecorationManager; } /** * @generated */ protected IDecorationManager createDecorationManager(IFigure decorationShape) { return new PaneDecorationManager(decorationShape); } /** * @generated */ protected IFigure createNodeShape() { RoundedTopicFigure figure = new RoundedTopicFigure(); primaryShape = figure; return primaryShape; } /** * @generated */ public RoundedTopicFigure getPrimaryShape() { return (RoundedTopicFigure) primaryShape; } /** * Default implementation treats passed figure as content pane. * Respects layout one may have set for generated figure. * @param nodeShape instance of generated figure class * @generated */ protected IFigure setupContentPane(IFigure nodeShape) { if (nodeShape.getLayoutManager() == null) { ToolbarLayout layout = new ToolbarLayout(); layout.setSpacing(5); nodeShape.setLayoutManager(layout); } return nodeShape; // use nodeShape itself as contentPane } /** * @generated */ protected IFigure contentPane; /** * @generated */ public IFigure getContentPane() { if (contentPane == null) { return super.getContentPane(); } return contentPane; } /** * @generated */ public Node getDiagramNode() { return (Node) getModel(); } /** * @generated */ protected boolean addFixedChild(EditPart childEditPart) { if (childEditPart instanceof TopicNameEditPart) { ((TopicNameEditPart) childEditPart).setLabel(getPrimaryShape() .getFigureTopicNameFigure()); return true; } return false; } /** * @generated */ protected boolean removeFixedChild(EditPart childEditPart) { return false; } /** * Returns the label which should be direct-edited by default. * @generated */ private EditPart getPrimaryLabelEditPart() { for (Iterator it = getDiagramNode().getChildren().iterator(); it .hasNext();) { View nextChild = (View) it.next(); if (MindmapVisualIDRegistry.getVisualID(nextChild) == TopicNameEditPart.VISUAL_ID) { return (EditPart) getViewer().getEditPartRegistry().get( nextChild); } } return null; } /** * @generated */ public void performRequest(Request req) { if (RequestConstants.REQ_OPEN.equals(req.getType())) { Command command = getCommand(req); if (command != null && command.canExecute()) { getViewer().getEditDomain().getCommandStack().execute(command); } return; } if (RequestConstants.REQ_DIRECT_EDIT.equals(req.getType())) { EditPart labelToEdit; if (req instanceof DirectEditRequest) { labelToEdit = getLabelEditPart((DirectEditRequest) req); } else { labelToEdit = getPrimaryLabelEditPart(); } if (labelToEdit != null) { labelToEdit.performRequest(req); } } super.performRequest(req); } /** * @generated */ private EditPart getLabelEditPart(DirectEditRequest req) { EditPart result = getViewer().findObjectAt(req.getLocation()); if (result != null) { if (getDiagramNode().getChildren().contains(result.getModel())) { View view = (View) result.getModel(); int visualId = MindmapVisualIDRegistry.getVisualID(view); switch (visualId) { case TopicNameEditPart.VISUAL_ID: return result; } } } return getPrimaryLabelEditPart(); } /** * @generated */ protected void addChildVisual(EditPart childEditPart, int index) { if (addFixedChild(childEditPart)) { return; } super.addChildVisual(childEditPart, -1); } /** * @generated */ protected void removeChildVisual(EditPart childEditPart) { if (removeFixedChild(childEditPart)) { return; } super.removeChildVisual(childEditPart); } /** * @generated */ protected List getModelChildren() { return getDiagramNode().getVisibleChildren(); } /** * @generated */ protected List getModelSourceConnections() { return getDiagramNode().getSourceEdges(); } /** * @generated */ protected List getModelTargetConnections() { return getDiagramNode().getTargetEdges(); } /** * @generated */ public ConnectionAnchor getSourceConnectionAnchor( ConnectionEditPart connection) { return new ChopboxAnchor(getFigure()); } /** * @generated */ public ConnectionAnchor getSourceConnectionAnchor(Request request) { return new ChopboxAnchor(getFigure()); } /** * @generated */ public ConnectionAnchor getTargetConnectionAnchor( ConnectionEditPart connection) { return new ChopboxAnchor(getFigure()); } /** * @generated */ public ConnectionAnchor getTargetConnectionAnchor(Request request) { return new ChopboxAnchor(getFigure()); } /** * @generated */ public Object getAdapter(Class key) { if (TreeEditPart.class == key) { return getTreeEditPartAdapter(); } return super.getAdapter(key); } /** * @generated */ private TreeEditPartAdapter myTreeEditPartAdapter; /** * @generated */ private TreeEditPartAdapter getTreeEditPartAdapter() { if (myTreeEditPartAdapter == null) { myTreeEditPartAdapter = new TreeEditPartAdapter(); } return myTreeEditPartAdapter; } /** * @generated */ public void activate() { super.activate(); getTransactionalUpdateManager().addUpdatableEditPart( getDiagramNode().getElement(), this); installLinkNotationModelRefresher(); } /** * @generated */ public void deactivate() { uninstallLinkNotationModelRefresher(); getTransactionalUpdateManager().removeUpdatableEditPart( getDiagramNode().getElement(), this); super.deactivate(); } /** * @generated */ private void installLinkNotationModelRefresher() { LinkNotationModelRefresher refresher = getLinkNotationModelRefresher(); getTransactionalUpdateManager().addNotationModelRefresher(refresher); } /** * @generated */ private void uninstallLinkNotationModelRefresher() { LinkNotationModelRefresher refresher = getLinkNotationModelRefresher(); getTransactionalUpdateManager().removeNotationModelRefresher(refresher); } /** * @generated */ private LinkNotationModelRefresher linkNotationModelRefresher; /** * @generated */ private LinkNotationModelRefresher getLinkNotationModelRefresher() { if (linkNotationModelRefresher == null) { linkNotationModelRefresher = new LinkNotationModelRefresher( getViewService()); } return linkNotationModelRefresher; } /** * Service to find a notational element that corresponds to the given underlying domain element. * @generated */ private IViewService viewService; /** * @generated */ private IViewService getViewService() { if (viewService == null) { viewService = new EditPartRegistryBasedViewService(getViewer()); } return viewService; } /** * @generated */ protected void refreshLinkNotationModel() { LinkNotationModelRefresher linkRefresher = getLinkNotationModelRefresher(); if (!linkRefresher.isInstalled()) { return; } org.eclipse.emf.common.command.Command command = linkRefresher .buildRefreshNotationModelCommand(); if (command == null) { return; } TransactionalEditingDomain domainModelEditDomain = TransactionUtil .getEditingDomain(getDiagramNode().getDiagram().getElement()); getViewer().getEditDomain().getCommandStack().execute( new WrappingCommand(domainModelEditDomain, command)); } /** * @generated */ private class LinkNotationModelRefresher extends OwnedLinksNotationModelRefresher { /** * @generated */ public LinkNotationModelRefresher(IViewService viewService) { super(viewService); } /** * Creates a notification filter which filters notifications that may possibly affect the notational model * @generated */ protected NotificationFilter createFilter() { NotificationFilter filter = NotificationFilter .createFeatureFilter(MindmapPackage.eINSTANCE .getTopic_Subtopics()); return filter; } /** * @generated */ protected List getSemanticChildLinks() { List result = new LinkedList(); EObject modelObject = getHost().getElement(); EObject nextValue; for (Iterator it = ((Topic) modelObject).getSubtopics().iterator(); it .hasNext();) { nextValue = (EObject) it.next(); if (nextValue != null) { result.add(new LinkDescriptor(modelObject, nextValue, null, TopicSubtopicsEditPart.VISUAL_ID)); } } return result; } /** * @generated */ protected List getNotationalChildLinks() { List result = new LinkedList(); List allLinks = getDiagramNode().getDiagram().getEdges(); for (Iterator it = allLinks.iterator(); it.hasNext();) { Edge next = (Edge) it.next(); if (next.isSetElement() && next.getElement() == null) { if (next.getSource() == getHost()) { int linkVID = MindmapVisualIDRegistry.getVisualID(next); switch (linkVID) { case TopicSubtopicsEditPart.VISUAL_ID: result.add(next); break; } } } } return result; } /** * @generated */ protected CreateNotationalElementCommand getCreateNotationalElementCommand( ElementDescriptor descriptor) { LinkDescriptor linkDescriptor = (LinkDescriptor) descriptor; View sourceView = getViewService().findView( linkDescriptor.getSource()); View targetView = getViewService().findView( linkDescriptor.getDestination()); IViewDecorator decorator = null; if (sourceView == null || targetView == null) { return null; } String sourceModelID = MindmapVisualIDRegistry .getModelID(sourceView); if (!MapEditPart.MODEL_ID.equals(sourceModelID)) { return null; } String targetModelID = MindmapVisualIDRegistry .getModelID(targetView); if (!MapEditPart.MODEL_ID.equals(targetModelID)) { return null; } switch (linkDescriptor.getVisualID()) { case TopicSubtopicsEditPart.VISUAL_ID: if (linkDescriptor.getElement() == null) { decorator = TopicSubtopicsViewFactory.INSTANCE; } break; } if (decorator == null) { return null; } return new CreateNotationalEdgeCommand(getHost().getDiagram(), linkDescriptor.getElement(), sourceView, targetView, decorator); } /** * Returns whether a notational edge should be created for the given domain element. * The generated code respects canonical style. If the canonycal style is not present, true is always returned. * User can change implementation of this method to handle a more sophisticated logic. * @generated */ protected boolean shouldCreateView(ElementDescriptor descriptor) { CanonicalStyle style = (CanonicalStyle) getDiagramNode().getStyle( NotationPackage.eINSTANCE.getCanonicalStyle()); if (style == null) { return true; } return style.isCanonical(); } /** * @generated */ protected View getHost() { return getDiagramNode(); } } /** * @generated */ private TransactionalUpdateManager getTransactionalUpdateManager() { return (TransactionalUpdateManager) getViewer().getProperty( TransactionalUpdateManager.class.getName()); } /** * @generated */ private RefreshersRegistry myRefreshersRegistry; /** * @generated */ public Refresher getRefresher(EStructuralFeature feature, Notification msg) { if (myRefreshersRegistry == null) { createRefreshers(); } return myRefreshersRegistry.getRefresher(feature, msg); } /** * @generated */ private void createRefreshers() { myRefreshersRegistry = new RefreshersRegistry(); Refresher childrenRefresher = new IExternallyUpdatableEditPart.ExternalRefresher() { public void refresh() { if (!isActive()) { return; } refreshChildren(); } public boolean isAffectingEvent(Notification msg) { if (NotationPackage.eINSTANCE.getView_PersistedChildren() == msg .getFeature() || NotationPackage.eINSTANCE .getView_TransientChildren() == msg .getFeature() || NotationPackage.eINSTANCE.getDrawerStyle_Collapsed() == msg .getFeature()) { return true; } if (NotationPackage.eINSTANCE.getView_Styles() == msg .getFeature()) { return UpdaterUtil.affects(msg, NotationPackage.eINSTANCE .getDrawerStyle()); } if (NotationPackage.eINSTANCE.getView_Visible() == msg .getFeature()) { return msg.getNotifier() != getDiagramNode(); } return false; } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getView_PersistedChildren(), childrenRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE .getView_TransientChildren(), childrenRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getView_Styles(), childrenRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE .getDrawerStyle_Collapsed(), childrenRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getView_Visible(), childrenRefresher); Refresher visibilityRefresher = new IExternallyUpdatableEditPart.ExternalRefresher() { public void refresh() { if (!isActive()) { return; } refreshVisibility(); } public boolean isAffectingEvent(Notification msg) { if (NotationPackage.eINSTANCE.getView_Visible() == msg .getFeature()) { return msg.getNotifier() == getDiagramNode(); } return false; } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE.getView_Visible(), visibilityRefresher); Refresher sourceEdgesRefresher = new Refresher() { public void refresh() { if (!isActive()) { return; } refreshSourceConnections(); } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getView_SourceEdges(), sourceEdgesRefresher); Refresher targetEdgesRefresher = new Refresher() { public void refresh() { if (!isActive()) { return; } refreshTargetConnections(); } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getView_TargetEdges(), targetEdgesRefresher); Refresher boundsRefresher = new Refresher() { public void refresh() { if (!isActive()) { return; } refreshBounds(); } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getNode_LayoutConstraint(), boundsRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getSize_Width(), boundsRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getSize_Height(), boundsRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getLocation_X(), boundsRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getLocation_Y(), boundsRefresher); Refresher fontRefresher = new IExternallyUpdatableEditPart.ExternalRefresher() { public void refresh() { if (!isActive()) { return; } refreshFont(); } public boolean isAffectingEvent(Notification msg) { if (NotationPackage.eINSTANCE.getFontStyle() .getEStructuralFeatures().contains(msg.getFeature())) { return true; } if (NotationPackage.eINSTANCE.getView_Styles() == msg .getFeature()) { return UpdaterUtil.affects(msg, NotationPackage.eINSTANCE .getFontStyle()); } return false; } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFontStyle_FontHeight(), fontRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFontStyle_FontName(), fontRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getFontStyle_Bold(), fontRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFontStyle_Italic(), fontRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getView_Styles(), fontRefresher); Refresher fontColorRefresher = new Refresher() { public void refresh() { if (!isActive()) { return; } refreshFontColor(); } public boolean isAffectingEvent(Notification msg) { if (NotationPackage.eINSTANCE.getFontStyle_FontColor() == msg .getFeature()) { return true; } if (NotationPackage.eINSTANCE.getView_Styles() == msg .getFeature()) { return UpdaterUtil.affects(msg, NotationPackage.eINSTANCE .getFontStyle()); } return false; } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFontStyle_FontColor(), fontColorRefresher); Refresher backgroundColorRefresher = new IExternallyUpdatableEditPart.ExternalRefresher() { public void refresh() { if (!isActive()) { return; } refreshBackgroundColor(); } public boolean isAffectingEvent(Notification msg) { if (NotationPackage.eINSTANCE.getFillStyle_FillColor() == msg .getFeature()) { return true; } if (NotationPackage.eINSTANCE.getView_Styles() == msg .getFeature()) { return UpdaterUtil.affects(msg, NotationPackage.eINSTANCE .getFillStyle()); } return false; } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFillStyle_FillColor(), backgroundColorRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getView_Styles(), backgroundColorRefresher); } /** * @generated */ protected void refreshVisibility() { boolean isVisible = getDiagramNode().isVisible(); boolean wasVisible = getFigure().isVisible(); if (isVisible == wasVisible) { return; } if (!isVisible && (getSelected() != SELECTED_NONE)) { getViewer().deselect(this); } getFigure().setVisible(isVisible); getFigure().revalidate(); } /** * @generated */ protected void refreshBounds() { Node node = getDiagramNode(); if (node.getLayoutConstraint() == null) { return; } assert node.getLayoutConstraint() instanceof Bounds; Bounds bounds = (Bounds) node.getLayoutConstraint(); int x = bounds.getX(); int y = bounds.getY(); int width = bounds.getWidth(); int height = bounds.getHeight(); if (width < 0) { x -= width; width = -width; } if (height < 0) { y -= height; height = -height; } ((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), new Rectangle(x, y, width, height)); } /** * @generated */ protected void refreshFont() { FontStyle style = (FontStyle) getDiagramNode().getStyle( NotationPackage.eINSTANCE.getFontStyle()); Font toDispose = createdFont; if (style != null) { String fontName = style.getFontName(); int fontHeight = style.getFontHeight(); int fontStyle = SWT.NORMAL; if (style.isBold()) { fontStyle |= SWT.BOLD; } if (style.isItalic()) { fontStyle |= SWT.ITALIC; } Font currentFont = getFigure().getFont(); if (currentFont != null) { FontData currentFontData = currentFont.getFontData()[0]; if (currentFontData.getName().equals(fontName) && currentFontData.getHeight() == fontHeight && currentFontData.getStyle() == fontStyle) { return; } } createdFont = new Font(null, fontName, fontHeight, fontStyle); getFigure().setFont(createdFont); } else { //revert to the default font getFigure().setFont(getViewer().getControl().getFont()); createdFont = null; } if (toDispose != null) { toDispose.dispose(); } } /** * The font (created by {@link #refreshFont()}) currently assigned to the label (unless the default font is assigned). * Whenever another non-default font is assigned to it, it is safe to dispose the previous one. * @generated */ private Font createdFont; /** * @generated */ protected void refreshFontColor() { FontStyle style = (FontStyle) getDiagramNode().getStyle( NotationPackage.eINSTANCE.getFontStyle()); Color toDispose = createdFontColor; if (style != null) { int fontColor = style.getFontColor(); int red = fontColor & 0x000000FF; int green = (fontColor & 0x0000FF00) >> 8; int blue = (fontColor & 0x00FF0000) >> 16; Color currentColor = getFigure().getForegroundColor(); if (currentColor != null && currentColor.getRed() == red && currentColor.getGreen() == green && currentColor.getBlue() == blue) { return; } createdFontColor = new Color(null, red, green, blue); getFigure().setForegroundColor(createdFontColor); } else { getFigure().setForegroundColor( getViewer().getControl().getForeground()); createdFontColor = null; } if (toDispose != null) { toDispose.dispose(); } } /** * The color (created by {@link #refreshFontColor()}) currently assigned to the label. * Whenever another color is assigned to it, it is safe to dispose the previous one. * @generated */ private Color createdFontColor; /** * @generated */ protected void refreshBackgroundColor() { FillStyle style = (FillStyle) getDiagramNode().getStyle( NotationPackage.eINSTANCE.getFillStyle()); Color toDispose = createdBackgroundColor; if (style != null) { int backgroundColor = style.getFillColor(); int red = backgroundColor & 0x000000FF; int green = (backgroundColor & 0x0000FF00) >> 8; int blue = (backgroundColor & 0x00FF0000) >> 16; Color currentColor = getFigure().getBackgroundColor(); if (currentColor != null && currentColor.getRed() == red && currentColor.getGreen() == green && currentColor.getBlue() == blue) { return; } createdBackgroundColor = new Color(null, red, green, blue); getFigure().setBackgroundColor(createdBackgroundColor); } else { getFigure().setBackgroundColor( getViewer().getControl().getBackground()); } if (toDispose != null) { toDispose.dispose(); } } /** * The color (created by {@link #refreshBackgroundColor()}) currently assigned to the figure. * Whenever another color is assigned to it, it is safe to dispose the previous one. * @generated */ private Color createdBackgroundColor; /** * @generated */ protected void refreshVisuals() { super.refreshVisuals(); refreshVisibility(); refreshBounds(); refreshFont(); refreshFontColor(); refreshBackgroundColor(); } /** * @generated */ private Collection externalRefreshers = new ArrayList(); /** * @generated */ public Collection getExternalRefreshers() { return externalRefreshers; } /** * @generated */ public void addExternalRefresher( IExternallyUpdatableEditPart.ExternalRefresher externalRefresher) { if (externalRefresher != null && !externalRefreshers.contains(externalRefresher)) { externalRefreshers.add(externalRefresher); } } /** * @generated */ public void removeExternalRefresher( IExternallyUpdatableEditPart.ExternalRefresher externalRefresher) { externalRefreshers.remove(externalRefresher); } /** * @generated */ public class RoundedTopicFigure extends RoundedRectangle { /** * @generated */ private Label fFigureTopicNameFigure; /** * @generated */ public RoundedTopicFigure() { this.setCornerDimensions(new Dimension(12, 12)); this.setForegroundColor(THIS_FORE); createContents(); } /** * @generated */ private void createContents() { fFigureTopicNameFigure = new Label(); fFigureTopicNameFigure.setText(""); this.add(fFigureTopicNameFigure); } /** * @generated */ private boolean myUseLocalCoordinates = false; /** * @generated */ protected boolean useLocalCoordinates() { return myUseLocalCoordinates; } /** * @generated */ protected void setUseLocalCoordinates(boolean useLocalCoordinates) { myUseLocalCoordinates = useLocalCoordinates; } /** * @generated */ public Label getFigureTopicNameFigure() { return fFigureTopicNameFigure; } } /** * @generated */ static final Color THIS_FORE = new Color(null, 220, 220, 250); /** * @generated */ private class TreeEditPartAdapter extends BaseTreeEditPart { /** * @generated */ public TreeEditPartAdapter() { super(getDiagramNode(), MindmapDiagramEditorPlugin.getInstance() .getItemProvidersAdapterFactory()); } /** * @generated */ protected void createEditPolicies() { installEditPolicy(EditPolicy.COMPONENT_ROLE, new TopicComponentEditPolicy() { protected GraphicalEditPart getGraphicalEditPart() { return TopicEditPart.this; } }); installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy()); } /** * @generated */ public void setWidget(Widget widget) { if (widget == null) { myTreeEditPartAdapter = null; } super.setWidget(widget); } /** * @generated */ protected ILabelTextDisplayer createLabelTextDisplayer() { TopicNameEditPart primaryLabelEditPart = getPrimaryLabelEditPart(); if (primaryLabelEditPart != null) { return primaryLabelEditPart.getLabelTextDisplayer(); } return super.createLabelTextDisplayer(); } /** * @generated */ protected Image getImage() { TopicNameEditPart primaryLabelEditPart = getPrimaryLabelEditPart(); if (primaryLabelEditPart != null) { return primaryLabelEditPart.getLabelIcon(); } return null; } /** * @generated */ private TopicNameEditPart getPrimaryLabelEditPart() { for (Iterator it = getDiagramNode().getChildren().iterator(); it .hasNext();) { View nextChild = (View) it.next(); if (MindmapVisualIDRegistry.getVisualID(nextChild) == TopicNameEditPart.VISUAL_ID) { return (TopicNameEditPart) TopicEditPart.this.getViewer() .getEditPartRegistry().get(nextChild); } } return null; } /** * Since compartments and labels are not selectable edit parts, they are filtered from the overview as well. * @generated */ protected List getModelChildren() { List result = new ArrayList(); for (Iterator it = getNotationView().getVisibleChildren() .iterator(); it.hasNext();) { View next = (View) it.next(); switch (MindmapVisualIDRegistry.getVisualID(next)) { case TopicThreadCompartmentEditPart.VISUAL_ID: { DrawerStyle style = (DrawerStyle) next .getStyle(NotationPackage.eINSTANCE .getDrawerStyle()); if (style != null && style.isCollapsed()) { break; } result.addAll(next.getVisibleChildren()); break; } } } for (Iterator it = getNotationView().getSourceEdges().iterator(); it .hasNext();) { Edge next = (Edge) it.next(); if (next.isVisible()) { result.add(next); } } return result; } } }