blob: 64c394c0004b11c20d2df75622d18958ec9e8871 [file] [log] [blame]
/*****************************************************************************
* 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;
}
}