/******************************************************************************* * Copyright (c) 2006-2012 * Software Technology Group, Dresden University of Technology * DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026 * * 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: * Software Technology Group - TU Dresden, Germany; * DevBoost GmbH - Berlin, Germany * - initial API and implementation ******************************************************************************/ /* * @(#)DragHandle.java 1.0 July 24, 2007 * * Copyright (c) 2007 by the original authors of JHotDraw * and all its contributors. * All rights reserved. * * The copyright of this software is owned by the authors and * contributors of the JHotDraw project ("the copyright holders"). * You may not use, copy or modify this software, except in * accordance with the license agreement you entered into with * the copyright holders. For details see accompanying license terms. */ package org.jhotdraw.draw; import java.awt.*; import java.awt.geom.*; import java.util.*; /** * A handle that changes the location of the owning figure, the handle * covers all visible points of the figure. * <p> * Usually, DragHandle is not needed, because of the {@link DragTracker} * in the SelectionTool. Use a (subclass of) DragHandle, if you want * to implement figure specific drag behavior. A CompositeFigure can * create DragHandle's for all its child figures, to support dragging * of child figures without having to decompose the CompositeFigure. * * @author Werner Randelshofer * @version 1.0 July 24, 2007 Created. */ public class DragHandle extends AbstractHandle { /** * The previously handled x and y coordinates. */ private Point2D.Double oldPoint; /** Creates a new instance. */ public DragHandle(Figure owner) { super(owner); } /** * Draws nothing. * Drag Handles have no visual appearance of their own. */ public void draw(Graphics2D g) { } public void trackStart(Point anchor, int modifiersEx) { oldPoint = view.getConstrainer().constrainPoint(view.viewToDrawing(anchor)); } public void trackStep(Point anchor, Point lead, int modifiersEx) { Figure f = getOwner(); Point2D.Double newPoint = view.getConstrainer().constrainPoint(view.viewToDrawing(lead)); AffineTransform tx = new AffineTransform(); tx.translate(newPoint.x - oldPoint.x, newPoint.y - oldPoint.y); f.willChange(); f.transform(tx); f.changed(); oldPoint = newPoint; } public void trackEnd(Point anchor, Point lead, int modifiersEx) { AffineTransform tx = new AffineTransform(); tx.translate(lead.x - anchor.x, lead.y - anchor.y); LinkedList<Figure> draggedFigures = new LinkedList<Figure>(); draggedFigures.add(getOwner()); Point2D.Double dropPoint = getView().viewToDrawing(lead); Figure dropTarget = getView().getDrawing().findFigureExcept( dropPoint, draggedFigures); if (dropTarget != null) { boolean snapBack = dropTarget.handleDrop(dropPoint, draggedFigures, getView()); if (snapBack) { tx = new AffineTransform(); tx.translate(anchor.x - lead.x, anchor.y - lead.y); for (Figure f : draggedFigures) { f.willChange(); f.transform(tx); f.changed(); } } else { fireUndoableEditHappened( new TransformEdit(getOwner(),tx) ); } } else { fireUndoableEditHappened( new TransformEdit(getOwner(),tx) ); } } public boolean contains(Point p) { return getOwner().contains(getView().viewToDrawing(p)); } protected Rectangle basicGetBounds() { return getView().drawingToView(getOwner().getDrawingArea()); } /** * Returns a cursor for the handle. */ public Cursor getCursor() { return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); } }