| /***************************************************************************** |
| * 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.papyrus.infra.gmfdiag.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; |
| } |
| } |