Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Redor2014-10-06 15:52:27 +0000
committerPierre-Charles David2014-10-10 08:04:21 +0000
commit13810aaf26a15f3b6af997fe9c63664291473de8 (patch)
treee81748c96d6c62929c761ff7bd2b810de3026e36
parent4051f13d9978e4a95b04fe4fd58b2197d9a1f084 (diff)
downloadorg.eclipse.sirius-13810aaf26a15f3b6af997fe9c63664291473de8.tar.gz
org.eclipse.sirius-13810aaf26a15f3b6af997fe9c63664291473de8.tar.xz
org.eclipse.sirius-13810aaf26a15f3b6af997fe9c63664291473de8.zip
[446409] Change guides color for snapToShapes feedback.
This needs to duplicate the SnapFeedbackPolicy GEF class and to add this new policy everywhere the old one is installed. Bug: 446409 Change-Id: I3efb5893fc2356ac3f3c0609ab3af801c54b41df Signed-off-by: Laurent Redor <laurent.redor@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDDiagramEditPart.java3
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java3
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/AbstractDNodeContainerCompartmentEditPart.java3
-rw-r--r--plugins/org.eclipse.sirius.ext.gef/META-INF/MANIFEST.MF3
-rw-r--r--plugins/org.eclipse.sirius.ext.gef/src/org/eclipse/sirius/ext/gef/editpolicies/SiriusSnapFeedbackPolicy.java271
6 files changed, 284 insertions, 0 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF
index eda5ee0aab..6ab62f5ad8 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF
@@ -192,5 +192,6 @@ Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.sirius.ext.base;version="2.0.0",
org.eclipse.sirius.ext.draw2d.figure;version="2.0.0",
org.eclipse.sirius.ext.emf;version="2.0.0",
+ org.eclipse.sirius.ext.gef.editpolicies;version="2.0.0",
org.eclipse.sirius.ext.gmf.runtime.editparts;version="2.0.0",
org.eclipse.sirius.ext.swt;version="2.0.0"
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDDiagramEditPart.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDDiagramEditPart.java
index dd6d9023c9..c29a112b2c 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDDiagramEditPart.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDDiagramEditPart.java
@@ -74,6 +74,7 @@ import org.eclipse.sirius.ecore.extender.business.api.permission.IPermissionAuth
import org.eclipse.sirius.ecore.extender.business.api.permission.PermissionAuthorityRegistry;
import org.eclipse.sirius.ext.base.Option;
import org.eclipse.sirius.ext.base.Options;
+import org.eclipse.sirius.ext.gef.editpolicies.SiriusSnapFeedbackPolicy;
import org.eclipse.sirius.ext.gmf.runtime.diagram.ui.tools.RubberbandDragTracker;
import com.google.common.collect.Iterables;
@@ -122,6 +123,8 @@ public abstract class AbstractDDiagramEditPart extends DiagramEditPart implement
protected void createDefaultEditPolicies() {
super.createDefaultEditPolicies();
this.installEditPolicy(EditPolicyRoles.POPUPBAR_ROLE, new SiriusPopupBarEditPolicy());
+ // Replace the feedback policy to have a lighter color for guides
+ installEditPolicy(EditPolicyRoles.SNAP_FEEDBACK_ROLE, new SiriusSnapFeedbackPolicy());
}
/**
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
index d71c0c8a05..49b378c0e3 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
@@ -58,6 +58,7 @@ import org.eclipse.sirius.diagram.ui.tools.api.policy.CompoundEditPolicy;
import org.eclipse.sirius.diagram.ui.tools.api.requests.RequestConstants;
import org.eclipse.sirius.diagram.ui.tools.internal.graphical.edit.policies.SiriusConnectionEndPointEditPolicy;
import org.eclipse.sirius.diagram.ui.tools.internal.routers.SiriusBendpointConnectionRouter;
+import org.eclipse.sirius.ext.gef.editpolicies.SiriusSnapFeedbackPolicy;
import org.eclipse.sirius.viewpoint.description.tool.AbstractToolDescription;
import org.eclipse.sirius.viewpoint.description.tool.PaneBasedSelectionWizardDescription;
import org.eclipse.sirius.viewpoint.description.tool.SelectionWizardDescription;
@@ -170,6 +171,8 @@ public abstract class AbstractDiagramEdgeEditPart extends ConnectionNodeEditPart
} else {
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, selectionFeedBackEditPolicy);
}
+ // Replace the feedback policy to have a lighter color for guides
+ installEditPolicy(EditPolicyRoles.SNAP_FEEDBACK_ROLE, new SiriusSnapFeedbackPolicy());
}
/**
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/AbstractDNodeContainerCompartmentEditPart.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/AbstractDNodeContainerCompartmentEditPart.java
index 729f2122a4..a8b7aa6a40 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/AbstractDNodeContainerCompartmentEditPart.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/AbstractDNodeContainerCompartmentEditPart.java
@@ -66,6 +66,7 @@ import org.eclipse.sirius.diagram.ui.tools.api.requests.RequestConstants;
import org.eclipse.sirius.diagram.ui.tools.internal.graphical.edit.policies.ContainerCompartmentNodeEditPolicy;
import org.eclipse.sirius.ext.base.Option;
import org.eclipse.sirius.ext.base.Options;
+import org.eclipse.sirius.ext.gef.editpolicies.SiriusSnapFeedbackPolicy;
import org.eclipse.sirius.ui.tools.api.color.VisualBindingManager;
import org.eclipse.sirius.viewpoint.RGBValues;
@@ -231,6 +232,8 @@ public abstract class AbstractDNodeContainerCompartmentEditPart extends ShapeCom
installEditPolicy(EditPolicy.LAYOUT_ROLE, new AirXYLayoutEditPolicy());
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ContainerCompartmentNodeEditPolicy());
installEditPolicy(EditPolicyRoles.POPUPBAR_ROLE, new SiriusPopupBarEditPolicy());
+ // Replace the feedback policy to have a lighter color for guides
+ installEditPolicy(EditPolicyRoles.SNAP_FEEDBACK_ROLE, new SiriusSnapFeedbackPolicy());
}
/**
diff --git a/plugins/org.eclipse.sirius.ext.gef/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.ext.gef/META-INF/MANIFEST.MF
index 6293943320..26e2a83141 100644
--- a/plugins/org.eclipse.sirius.ext.gef/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.sirius.ext.gef/META-INF/MANIFEST.MF
@@ -6,3 +6,6 @@ Bundle-Version: 2.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Vendor: %providerName
Bundle-Localization: plugin
+Require-Bundle: org.eclipse.gef;bundle-version="3.9.0",
+ org.eclipse.equinox.common;bundle-version="3.6.100"
+Export-Package: org.eclipse.sirius.ext.gef.editpolicies;version="2.0.0"
diff --git a/plugins/org.eclipse.sirius.ext.gef/src/org/eclipse/sirius/ext/gef/editpolicies/SiriusSnapFeedbackPolicy.java b/plugins/org.eclipse.sirius.ext.gef/src/org/eclipse/sirius/ext/gef/editpolicies/SiriusSnapFeedbackPolicy.java
new file mode 100644
index 0000000000..596858ebba
--- /dev/null
+++ b/plugins/org.eclipse.sirius.ext.gef/src/org/eclipse/sirius/ext/gef/editpolicies/SiriusSnapFeedbackPolicy.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2014 IBM Corporation and others.
+ * 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:
+ * IBM Corporation - initial API and implementation
+ * Laurent Redor (Obeo) <laurent.redor@obeo.fr> - Change feedback color
+ *******************************************************************************/
+package org.eclipse.sirius.ext.gef.editpolicies;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FigureUtilities;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.PrecisionPoint;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.SnapToGeometry;
+import org.eclipse.gef.SnapToGuides;
+import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Specific feedback policy duplicated from
+ * {@link org.eclipse.gef.editpolicies.SnapFeedbackPolicy} to override guide
+ * colors.
+ *
+ * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a>
+ */
+public class SiriusSnapFeedbackPolicy extends GraphicalEditPolicy {
+
+ /**
+ * Color for guides of North, South, East or West side for snap to geometry.
+ * This is the original color used by GEF in
+ * {@link org.eclipse.gef.editpolicies.SnapFeedbackPolicy}.
+ */
+ public static final Color NSEW_GUIDE_ORIGINAL_COLOR = ColorConstants.blue;
+
+ /**
+ * Color for guides of North, South, East or West side for snap to geometry.
+ * Replace the blue color of
+ * {@link org.eclipse.gef.editpolicies.SnapFeedbackPolicy}.
+ */
+ public static final Color NSEW_GUIDE_COLOR = ColorConstants.lightGray;
+
+ /**
+ * Color for guides corresponding to Vertical guide or Horizontal guide.
+ * This is the original color used by GEF in
+ * {@link org.eclipse.gef.editpolicies.SnapFeedbackPolicy}.
+ */
+ public static final Color VERTICAL_HORIZONTAL_ORIGINAL_GUIDE_COLOR = new Color(null, 255, 175, 175);
+
+ /**
+ * Color for guides corresponding to Vertical guide or Horizontal guide.
+ * Replace the red color of
+ * {@link org.eclipse.gef.editpolicies.SnapFeedbackPolicy}.
+ */
+ public static final Color VERTICAL_HORIZONTAL_GUIDE_COLOR = new Color(null, 255, 175, 175);
+
+ /**
+ * Color for guides of North, South, East or West side for snap to geometry.
+ */
+ private Color nsewColor;
+
+ /**
+ * Color for guides corresponding to Vertical guide or Horizontal guide
+ */
+ private Color guideColor;
+
+ /**
+ * Default constructor that uses light gray and light red colors for
+ * feedback.
+ */
+ public SiriusSnapFeedbackPolicy() {
+ this(NSEW_GUIDE_COLOR, VERTICAL_HORIZONTAL_GUIDE_COLOR);
+ }
+
+ /**
+ * Constructor that allows to customize the colors to use for feedback.
+ *
+ * @param nsewColor
+ * Color for guides of North, South, East or West side for snap
+ * to geometry.
+ * @param guideColor
+ * Color for guides corresponding to Vertical guide or Horizontal
+ * guide.
+ */
+ public SiriusSnapFeedbackPolicy(Color nsewColor, Color guideColor) {
+ this.nsewColor = nsewColor;
+ this.guideColor = guideColor;
+ }
+
+ // CHECKSTYLE:OFF (Duplicated code)
+ IFigure guide[] = new IFigure[6];
+
+ Integer location[] = new Integer[6];
+
+ /**
+ * @see org.eclipse.gef.EditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
+ */
+ public void eraseTargetFeedback(Request request) {
+ for (int i = 0; i < guide.length; i++) {
+ if (guide[i] != null)
+ removeFeedback(guide[i]);
+ guide[i] = null;
+ location[i] = null;
+ }
+ }
+
+ static class FadeIn extends Figure {
+ int opacity = 0;
+
+ static final int FRAMES = 6;
+
+ Image image;
+
+ static int count;
+
+ FadeIn(Color bg) {
+ setBackgroundColor(bg);
+ super.setOpaque(true);
+ }
+
+ private Color createMixedColor() {
+ return FigureUtilities.mixColors(getLocalBackgroundColor(), getParent().getBackgroundColor(), (double) opacity / FRAMES);
+ }
+
+ /**
+ * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
+ */
+ protected void paintFigure(Graphics graphics) {
+ if (opacity != FRAMES) {
+ if (image != null) {
+ image.dispose();
+ count--;
+ image = null;
+ }
+ if (opacity != FRAMES - 1) {
+ Display display = Display.getCurrent();
+ PaletteData pData = new PaletteData(0xFF, 0xFF00, 0xFF0000);
+ Color localBackgroundColor = createMixedColor();
+ int fillColor = pData.getPixel(localBackgroundColor.getRGB());
+ localBackgroundColor.dispose();
+ ImageData iData = new ImageData(1, 1, 24, pData);
+ iData.setPixel(0, 0, fillColor);
+ iData.setAlpha(0, 0, 255 * opacity / FRAMES);
+ image = new Image(display, iData);
+ count++;
+ }
+ Display.getCurrent().timerExec(100, new Runnable() {
+ public void run() {
+ opacity = Math.min(FRAMES, opacity + 1);
+ repaint();
+ }
+ });
+ }
+ Rectangle r = getBounds();
+ if (image != null)
+ graphics.drawImage(image, 0, 0, 1, 1, r.x, r.y, r.width, r.height);
+ else
+ super.paintFigure(graphics);
+ }
+
+ /**
+ * @see org.eclipse.draw2d.Figure#removeNotify()
+ */
+ public void removeNotify() {
+ if (image != null) {
+ image.dispose();
+ count--;
+ image = null;
+ }
+ }
+ }
+
+ // Even offset indicates a vertical feedback line; odd, horizontal.
+ void highlightGuide(Integer pos, Color color, int offset) {
+ if (pos == null) {
+ if (guide[offset] != null) {
+ removeFeedback(guide[offset]);
+ guide[offset] = null;
+ }
+ location[offset] = pos;
+ return;
+ }
+
+ // pos is an integer relative to target's client area.
+ // translate pos to absolute, and then make it relative to fig.
+ int position = pos.intValue();
+ PrecisionPoint loc = new PrecisionPoint(position, position);
+ IFigure contentPane = ((GraphicalEditPart) getHost()).getContentPane();
+ contentPane.translateToParent(loc);
+ contentPane.translateToAbsolute(loc);
+
+ if (location[offset] == null || !location[offset].equals(pos)) {
+ location[offset] = pos;
+ if (guide[offset] != null) {
+ removeFeedback(guide[offset]);
+ guide[offset] = null;
+ }
+
+ IFigure fig = new FadeIn(color);
+ guide[offset] = fig;
+ addFeedback(fig);
+ fig.translateToRelative(loc);
+ position = offset % 2 == 0 ? (int) Math.round(loc.preciseX()) : (int) Math.round(loc.preciseY());
+ Rectangle figBounds = getFeedbackLayer().getBounds().getCopy();
+ if ((offset % 2) == 1) {
+ figBounds.height = 1;
+ figBounds.y = position;
+ } else {
+ figBounds.x = position;
+ figBounds.width = 1;
+ }
+ fig.setBounds(figBounds);
+ } else {
+ // The feedback layer could have grown (if auto-scrolling), so
+ // resize the fade-in
+ // line.
+ IFigure fig = guide[offset];
+ Rectangle figBounds = fig.getBounds().getCopy();
+ Rectangle feedbackBounds = getFeedbackLayer().getBounds();
+ if ((offset % 2) == 1) {
+ figBounds.x = feedbackBounds.x;
+ figBounds.width = feedbackBounds.width;
+ } else {
+ figBounds.y = feedbackBounds.y;
+ figBounds.height = feedbackBounds.height;
+ }
+ fig.setBounds(figBounds);
+ }
+ }
+
+ /**
+ * @see org.eclipse.gef.EditPolicy#showTargetFeedback(org.eclipse.gef.Request)
+ */
+ public void showTargetFeedback(Request req) {
+ if (req.getType().equals(REQ_MOVE) || req.getType().equals(REQ_RESIZE) || req.getType().equals(REQ_CLONE) || req.getType().equals(REQ_ADD) || req.getType().equals(REQ_CREATE)) {
+
+ Integer value;
+ value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_WEST_ANCHOR);
+ highlightGuide(value, nsewColor, 0);
+
+ value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_NORTH_ANCHOR);
+ highlightGuide(value, nsewColor, 1);
+
+ value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_EAST_ANCHOR);
+ highlightGuide(value, nsewColor, 2);
+
+ value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_SOUTH_ANCHOR);
+ highlightGuide(value, nsewColor, 3);
+
+ value = (Integer) req.getExtendedData().get(SnapToGuides.KEY_VERTICAL_GUIDE);
+ highlightGuide(value, guideColor, 4);
+
+ value = (Integer) req.getExtendedData().get(SnapToGuides.KEY_HORIZONTAL_GUIDE);
+ highlightGuide(value, guideColor, 5);
+ }
+ }
+
+ // CHECKSTYLE:ON (Duplicated code)
+}

Back to the top