/******************************************************************************* * 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); } } }