Jelajahi Sumber

Merge pull request #1362 from Yakindu/issue_804

reduces fading time for snap to grid helper lines #804
Rene Beckmann 8 tahun lalu
induk
melakukan
3de109ef5e

+ 1 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editparts/RegionCompartmentEditPart.java

@@ -45,6 +45,7 @@ public class RegionCompartmentEditPart extends ShapeCompartmentEditPart {
 		installEditPolicy(EditPolicy.LAYOUT_ROLE, new XYLayoutEditPolicy());
 		// Removes the collapse expand handler
 		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new ResizableEditPolicyEx());
+		installEditPolicy(EditPolicyRoles.SNAP_FEEDBACK_ROLE, new SimpleSnapFeedbackPolicy());
 	}
 
 	@Override

+ 209 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editparts/SimpleSnapFeedbackPolicy.java

@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2010 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
+ *******************************************************************************/
+package org.yakindu.sct.ui.editor.editparts;
+
+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;
+
+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;
+
+/**
+ * This is a copy of {@link org.eclipse.gef.editpolicies.SnapFeedbackPolicy}
+ * that reduces the animation time and uses a light_blue color.
+ * 
+ * Have to be copied since the Figure can not be exchanged.
+ *
+ * @author andreas muelder - Initial contribution and API
+ *
+ */
+public class SimpleSnapFeedbackPolicy extends GraphicalEditPolicy {
+
+	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 = 2;
+		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, ColorConstants.lightBlue, 0);
+
+			value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_NORTH_ANCHOR);
+			highlightGuide(value, ColorConstants.lightBlue, 1);
+
+			value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_EAST_ANCHOR);
+			highlightGuide(value, ColorConstants.lightBlue, 2);
+
+			value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_SOUTH_ANCHOR);
+			highlightGuide(value, ColorConstants.lightBlue, 3);
+
+			value = (Integer) req.getExtendedData().get(SnapToGuides.KEY_VERTICAL_GUIDE);
+			highlightGuide(value, ColorConstants.red, 4);
+
+			value = (Integer) req.getExtendedData().get(SnapToGuides.KEY_HORIZONTAL_GUIDE);
+			highlightGuide(value, ColorConstants.red, 5);
+		}
+	}
+
+}

+ 1 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editparts/StatechartDiagramEditPart.java

@@ -41,6 +41,7 @@ public class StatechartDiagramEditPart extends DiagramEditPart implements IDiagr
 		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new DragDropEditPolicy());
 		installEditPolicy(EditPolicy.LAYOUT_ROLE, new XYLayoutEditPolicy());
 		removeEditPolicy(EditPolicyRoles.POPUPBAR_ROLE);
+		installEditPolicy(EditPolicyRoles.SNAP_FEEDBACK_ROLE, new SimpleSnapFeedbackPolicy());
 	}
 
 	public void setPreferencesHint(PreferencesHint preferenceHint) {