| /****************************************************************************** |
| * Copyright (c) 2002, 2004 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.eclipse.gmf.runtime.diagram.ui.internal.tools; |
| |
| |
| import org.eclipse.draw2d.Cursors; |
| import org.eclipse.gef.GraphicalEditPart; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.tools.ResizeTracker; |
| import org.eclipse.swt.graphics.Cursor; |
| |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.IRotatableEditPart; |
| import org.eclipse.gmf.runtime.gef.ui.internal.requests.RotateShapeRequest; |
| |
| /** |
| * Rotate tracker provides support for figure rotations. |
| * Creates and passes off RotateShapeRequests to the EditPolicies |
| * The request specifies whether the EditPart can be rotated |
| * |
| * @author oboyko |
| * |
| */ |
| public class RotateTracker extends ResizeTracker { |
| |
| // We need to remember which of the handles has been used for rotations |
| private int direction; |
| |
| /** |
| * Constructs a resize tracker that resizes in the specified direction. The direction is |
| * specified using {@link PositionConstants#NORTH}, {@link PositionConstants#NORTH_EAST}, |
| * etc. |
| * |
| * @param direction the direction of the resize gesture |
| * @param owner of the resize handle which returned this tracker |
| */ |
| public RotateTracker(GraphicalEditPart owner, int direction) { |
| super(owner, direction); |
| this.direction = direction; |
| } |
| |
| /* |
| * Determines whether the selected EditPart can be rotated |
| */ |
| private boolean isRotationRequired() { |
| boolean result = true; |
| // check if the selected edit parts implement rotatable interface and |
| // if they are check if they are rotatable |
| for (int i=0; i<getOperationSet().size() && result; i++) { |
| result = getOperationSet().get(i) instanceof IRotatableEditPart ? |
| ((IRotatableEditPart) getOperationSet().get(i)).isRotatable() : false; |
| } |
| return result; |
| } |
| |
| /** |
| * This method must be overriden to give the RotateShapeRequest information on |
| * whether the rotation is for the EditPart is permited or not |
| */ |
| protected void updateSourceRequest() { |
| super.updateSourceRequest(); |
| RotateShapeRequest request = (RotateShapeRequest) getSourceRequest(); |
| request.setRotate(isRotationRequired()); |
| } |
| |
| /** |
| * Creates the new RotateShapeRequest for which the rotation p-ermission is |
| * evaluated later on |
| */ |
| protected Request createSourceRequest() { |
| RotateShapeRequest request; |
| request = new RotateShapeRequest(REQ_RESIZE); |
| request.setResizeDirection(getResizeDirection()); |
| return request; |
| } |
| |
| /** |
| * If rotation is not permited for the selected EditParts then by dragging a rotate |
| * handle the rotate tracker becomes resize tracker and the selected figures are being |
| * resized, hence the cursor dispalyed will be an arrow corresponding to the dragging |
| * direction. Otherwise, the cursor returned is "hand" |
| */ |
| protected Cursor getDefaultCursor() { |
| return isRotationRequired() ? Cursors.HAND : Cursors.getDirectionalCursor(direction); |
| } |
| } |
| |