package org.eclipse.uml2.diagram.common.layered; import java.util.HashMap; import java.util.Map; import org.eclipse.draw2d.IFigure; import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.figures.BorderedNodeFigure; import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure; import org.eclipse.uml2.diagram.common.editparts.PrimaryShapeEditPart; /** * @author Yury Semikhatsky */ public class MultilayeredSupportImpl implements MultilayeredSupport { private final Map<String, IFigure> myLayerToFigure = new HashMap<String, IFigure>(); private final Map<String, IFigure> myLayerToContentPane = new HashMap<String, IFigure>(); private MultilayeredSupport myParent; private IFigure myParentDefaultContentPane; public MultilayeredSupportImpl() { myParent = null; myParentDefaultContentPane = null; } public MultilayeredSupportImpl(GraphicalEditPart parentEditPart) { setParentFromParentEditPart(parentEditPart); } public void setParentFromParentEditPart(GraphicalEditPart parentEditPart) { IFigure parentFigure = getPrimaryFigure(parentEditPart); if (parentFigure instanceof MultilayeredFigure) { myParent = ((MultilayeredFigure) parentFigure).getMultilayeredSupport(); } else { myParent = null; } myParentDefaultContentPane = parentEditPart.getContentPane(); } private IFigure getPrimaryFigure(GraphicalEditPart editPart) { if (editPart instanceof PrimaryShapeEditPart) { return ((PrimaryShapeEditPart) editPart).getPrimaryShape(); } else { return editPart.getFigure(); } } public void addToLayers(MultiLayeredContainer container) { for (Map.Entry<String, IFigure> nextEntry : myLayerToFigure.entrySet()) { String layerKey = nextEntry.getKey(); IFigure parent = getContentPane(container, layerKey); IFigure figure = nextEntry.getValue(); figure = getDecorated(figure); parent.add(figure); } } public void removeFromLayers(MultiLayeredContainer container) { for (Map.Entry<String, IFigure> e : myLayerToFigure.entrySet()) { String layerKey = e.getKey(); IFigure parent = getContentPane(container, layerKey); IFigure figure = e.getValue(); figure = getDecorated(figure); parent.remove(figure); } } public IFigure getContentPaneOn(String layerKey) { return myLayerToContentPane.get(layerKey); } public void setLayerToFigure(String layerKey, IFigure figure) { assert !myLayerToFigure.containsKey(layerKey); assert figure != null; myLayerToFigure.put(layerKey, figure); } public void setLayerToContentPane(String layerKey, IFigure contentPane) { assert !myLayerToContentPane.containsKey(layerKey); assert contentPane != null; myLayerToContentPane.put(layerKey, contentPane); } private IFigure getContentPane(MultiLayeredContainer container, String layerKey) { IFigure parent = null; if (myParent != null) { parent = myParent.getContentPaneOn(layerKey); } if (parent == null && MultiLayeredContainer.MIDDLE_LAYER.equals(layerKey)) { parent = myParentDefaultContentPane; } if (parent == null) { parent = container.getLayerContentPane(layerKey); if (parent == null) { throw new IllegalStateException("Unexpected layer key: " + layerKey); //$NON-NLS-1$ } } return parent; } private static IFigure getDecorated(IFigure figure) { if (figure.getParent() instanceof DefaultSizeNodeFigure) { figure = figure.getParent(); } if (figure.getParent() instanceof BorderedNodeFigure) { figure = figure.getParent(); } return figure; } }