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