| /******************************************************************************* |
| * Copyright (c) 2003, 2011 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 |
| * SAP AG - Changed for initial API, implementation and documentation of Graphiti: |
| * made class FadeIn a IDisposable |
| * changed getLocalBackgroundColor for color management in Diagram |
| * changed higlightGuide (smaller height and width |
| * mwenz - Bug 352440 - Fixed deprecation warnings - contributed by Felix Velasco |
| *******************************************************************************/ |
| package org.eclipse.graphiti.ui.internal.util.ui.sfx; |
| |
| 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.graphiti.ui.internal.IDisposable; |
| import org.eclipse.graphiti.ui.internal.policy.ResourceManagingGraphicalEditPolicy; |
| import org.eclipse.graphiti.ui.internal.util.draw2d.GFColorConstants; |
| 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; |
| |
| /** |
| * An EditPolicy that is used to show snap feedback for guides (red lines) and |
| * geometry (blue lines). This policy is not required for Grids. |
| * |
| * @author Randy Hudson |
| * @author Pratik Shah |
| * @since 3.0 |
| * @noinstantiate This class is not intended to be instantiated by clients. |
| * @noextend This class is not intended to be subclassed by clients. |
| */ |
| public class GFSnapFeedbackPolicy extends ResourceManagingGraphicalEditPolicy { |
| IFigure guide[] = new IFigure[6]; |
| |
| Integer location[] = new Integer[6]; |
| |
| /** |
| * @see org.eclipse.gef.EditPolicy#eraseTargetFeedback(org.eclipse.gef.Request) |
| */ |
| @Override |
| 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; |
| } |
| } |
| |
| class FadeIn extends Figure implements IDisposable { |
| int opacity = 0; |
| |
| static final int FRAMES = 6; |
| |
| Image image; |
| |
| int count; |
| |
| FadeIn(Color bg) { |
| setBackgroundColor(bg); |
| super.setOpaque(true); |
| } |
| |
| /** |
| * @see org.eclipse.draw2d.IFigure#getLocalBackgroundColor() |
| */ |
| @Override |
| public Color getLocalBackgroundColor() { |
| Color localBackgroundColor = super.getLocalBackgroundColor(); |
| Color parentBackgroundColor = getParent().getBackgroundColor(); |
| Color temp = FigureUtilities.mixColors(localBackgroundColor, parentBackgroundColor, (double) opacity / FRAMES); |
| Color mixColors = manageColor(temp); |
| return mixColors; |
| } |
| |
| /** |
| * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics) |
| */ |
| @Override |
| 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); |
| int fillColor = pData.getPixel(getLocalBackgroundColor().getRGB()); |
| 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() |
| */ |
| @Override |
| public void removeNotify() { |
| if (image != null) { |
| image.dispose(); |
| count--; |
| image = null; |
| } |
| } |
| |
| public void dispose() { |
| getResourceRegistry().dispose(); |
| } |
| } |
| |
| // 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 = 2; |
| figBounds.y = position; |
| } else { |
| figBounds.x = position; |
| figBounds.width = 2; |
| } |
| 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) |
| */ |
| @Override |
| 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, GFColorConstants.HANDLE_BG, 0); |
| |
| value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_NORTH_ANCHOR); |
| highlightGuide(value, GFColorConstants.HANDLE_BG, 1); |
| |
| value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_EAST_ANCHOR); |
| highlightGuide(value, GFColorConstants.HANDLE_BG, 2); |
| |
| value = (Integer) req.getExtendedData().get(SnapToGeometry.KEY_SOUTH_ANCHOR); |
| highlightGuide(value, GFColorConstants.HANDLE_BG, 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); |
| } |
| } |
| |
| @Override |
| protected void removeFeedback(IFigure figure) { |
| super.removeFeedback(figure); |
| disposeFigure(figure); |
| } |
| |
| } |