diff options
| author | Laurent Redor | 2014-10-06 15:52:27 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2014-10-10 08:04:21 +0000 |
| commit | 13810aaf26a15f3b6af997fe9c63664291473de8 (patch) | |
| tree | e81748c96d6c62929c761ff7bd2b810de3026e36 | |
| parent | 4051f13d9978e4a95b04fe4fd58b2197d9a1f084 (diff) | |
| download | org.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>
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) +} |
