/***************************************************************************** * Copyright (c) 2011 CEA LIST. * * 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: * * CEA LIST - Initial API and implementation * Vincent Lorenzo (CEA-LIST) - vincent.lorenzo@cea.fr (bug 493876) *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.common.edit.part; import java.util.List; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.StackLayout; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.editpolicies.LayoutEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator; import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities; import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure; import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; import org.eclipse.gmf.runtime.notation.Edge; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.gmf.tooling.runtime.linklf.LinkLFNodeFigure; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultGraphicalNodeEditPolicy; import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultSemanticEditPolicy; import org.eclipse.papyrus.infra.gmfdiag.common.preferences.PreferencesConstantsHelper; import org.eclipse.papyrus.infra.gmfdiag.preferences.utils.GradientPreferenceConverter; import org.eclipse.papyrus.sysml.diagram.common.Activator; import org.eclipse.papyrus.uml.diagram.common.editparts.AbstractBorderEditPart; import org.eclipse.papyrus.uml.diagram.common.figure.node.AffixedNamedElementFigure; import org.eclipse.papyrus.uml.diagram.common.helper.PreferenceInitializerForElementHelper; import org.eclipse.swt.graphics.Color; /** * Abstract non-diagram specific edit part for border node. * This class is adapted from edit parts generated by GMF Tooling. */ public abstract class AbstractElementBorderEditPart extends AbstractBorderEditPart { protected IFigure contentPane; protected IFigure primaryShape; public AbstractElementBorderEditPart(View view) { super(view); } @Override protected void createDefaultEditPolicies() { super.createDefaultEditPolicies(); installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new DefaultSemanticEditPolicy()); installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new DefaultGraphicalNodeEditPolicy()); installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy()); } protected abstract LayoutEditPolicy createLayoutEditPolicy(); protected IFigure createNodeShape() { return primaryShape = new AffixedNamedElementFigure(); } @Override public AffixedNamedElementFigure getPrimaryShape() { return (AffixedNamedElementFigure) primaryShape; } /** * {@inheritDoc} */ @Override public IBorderItemLocator getBorderItemLocator() { IFigure parentFigure = getFigure().getParent(); if (parentFigure != null && parentFigure.getLayoutManager() != null) { Object constraint = parentFigure.getLayoutManager().getConstraint(getFigure()); return (IBorderItemLocator) constraint; } return null; } /** * {@inheritDoc} */ @Override protected void handleNotificationEvent(Notification event) { // When a node has external node labels, the methods refreshChildren() removes the label's // edit part from the registry. Once removed from the registry the visibility cannot be set back to visible. // Copied from generated code for Affixed nodes to fix: // 366504: [SysML Block Definition Diagram] Cannot make masked labels of border items (Port) visible // https://bugs.eclipse.org/bugs/show_bug.cgi?id=366504 // 366503: [SysML Internal Block Diagram] Cannot make masked labels of border items (Port) visible // https://bugs.eclipse.org/bugs/show_bug.cgi?id=366503 // (this sounds strange as the "Show all labels" manages to get labels back without trouble...). if (NotationPackage.eINSTANCE.getView_Visible().equals(event.getFeature())) { Object notifier = event.getNotifier(); List modelChildren = ((View) getModel()).getChildren(); if (!(notifier instanceof Edge)) { if (modelChildren.contains(event.getNotifier())) { return; } } } super.handleNotificationEvent(event); } /** * {@inheritDoc} */ @Override protected void refreshBounds() { if (getBorderItemLocator() != null) { int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_X())).intValue(); int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_Y())).intValue(); Point loc = new Point(x, y); int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Width())).intValue(); int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Height())).intValue(); Dimension size = new Dimension(width, height); // Update locator constraint IBorderItemLocator locator = getBorderItemLocator(); locator.setConstraint(new Rectangle(loc, size)); // Set new constraint on parent figure getFigure().getParent().setConstraint(getFigure(), locator); } else { super.refreshBounds(); } } protected NodeFigure createNodePlate() { String prefElementId = getNotationView().getType(); IPreferenceStore store = Activator.getInstance().getPreferenceStore(); String preferenceConstantWitdh = PreferenceInitializerForElementHelper.getpreferenceKey(getNotationView(), prefElementId, PreferencesConstantsHelper.WIDTH); String preferenceConstantHeight = PreferenceInitializerForElementHelper.getpreferenceKey(getNotationView(), prefElementId, PreferencesConstantsHelper.HEIGHT); DefaultSizeNodeFigure result = new LinkLFNodeFigure(this,store.getInt(preferenceConstantWitdh), store.getInt(preferenceConstantHeight)); // FIXME: workaround for #154536 result.getBounds().setSize(result.getPreferredSize()); return result; } @Override protected NodeFigure createMainFigure() { NodeFigure figure = createNodePlate(); figure.setLayoutManager(new StackLayout()); IFigure shape = createNodeShape(); figure.add(shape); contentPane = setupContentPane(shape); return figure; } protected IFigure setupContentPane(IFigure nodeShape) { return nodeShape; // use nodeShape itself as contentPane } /** * @generated */ @Override public IFigure getContentPane() { if (contentPane != null) { return contentPane; } return super.getContentPane(); } @Override protected void setForegroundColor(Color color) { if (primaryShape != null) { primaryShape.setForegroundColor(color); } } @Override public abstract EditPart getPrimaryChildEditPart(); @Override public Object getPreferredValue(EStructuralFeature feature) { String prefKey = getNotationView().getType(); IPreferenceStore store = (IPreferenceStore) getDiagramPreferencesHint().getPreferenceStore(); Object result = null; if (feature == NotationPackage.eINSTANCE.getLineStyle_LineColor() || feature == NotationPackage.eINSTANCE.getFontStyle_FontColor() || feature == NotationPackage.eINSTANCE.getFillStyle_FillColor()) { String prefColor = null; if (feature == NotationPackage.eINSTANCE.getLineStyle_LineColor()) { prefColor = PreferencesConstantsHelper.getElementConstant(prefKey, PreferencesConstantsHelper.COLOR_LINE); } else if (feature == NotationPackage.eINSTANCE.getFontStyle_FontColor()) { prefColor = PreferencesConstantsHelper.getElementConstant(prefKey, PreferencesConstantsHelper.COLOR_FONT); } else if (feature == NotationPackage.eINSTANCE.getFillStyle_FillColor()) { prefColor = PreferencesConstantsHelper.getElementConstant(prefKey, PreferencesConstantsHelper.COLOR_FILL); } result = FigureUtilities.RGBToInteger(PreferenceConverter.getColor(store, prefColor)); } else if (feature == NotationPackage.eINSTANCE.getFillStyle_Transparency() || feature == NotationPackage.eINSTANCE.getFillStyle_Gradient()) { String prefGradient = PreferencesConstantsHelper.getElementConstant(prefKey, PreferencesConstantsHelper.COLOR_GRADIENT); GradientPreferenceConverter gradientPreferenceConverter = new GradientPreferenceConverter(store.getString(prefGradient)); if (feature == NotationPackage.eINSTANCE.getFillStyle_Transparency()) { result = new Integer(gradientPreferenceConverter.getTransparency()); } else if (feature == NotationPackage.eINSTANCE.getFillStyle_Gradient()) { result = gradientPreferenceConverter.getGradientData(); } } if (result == null) { result = getStructuralFeatureValue(feature); } return result; } }