blob: fabace5132ff7d97e24bc5b86bae1bb6c28b84b8 [file] [log] [blame]
/*******************************************************************************
* 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.eclipse.gef.internal.ui.rulers;
import java.util.Iterator;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.SharedCursors;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.UnexecutableCommand;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.tools.SimpleDragTracker;
/**
* @author Pratik Shah
*/
public class RulerDragTracker extends SimpleDragTracker {
protected RulerEditPart source;
private IFigure guide, guideline;
public RulerDragTracker(RulerEditPart source) {
this.source = source;
guide = new GuideFigure(!source.isHorizontal());
guide.setVisible(false);
guideline = new GuideEditPart.GuideLineFigure();
guideline.setVisible(false);
}
protected void eraseSourceFeedback() {
if (guide.getParent() != null) {
guide.getParent().remove(guide);
}
if (guideline.getParent() != null) {
guideline.getParent().remove(guideline);
}
}
protected Command getCommand() {
if (isCreationValid() && !isDelete())
return source.getRulerProvider().getCreateGuideCommand(
getCurrentPosition());
else
return UnexecutableCommand.INSTANCE;
}
protected String getCommandName() {
return REQ_CREATE;
}
protected int getCurrentPositionZoomed() {
/*
* @TODO:Pratik you should cache this, current position, isDelete
* boolean and isCreationValid boolean
*/
Point pt = getLocation();
source.getFigure().translateToRelative(pt);
int position = source.isHorizontal() ? pt.x : pt.y;
return position;
}
protected int getCurrentPosition() {
int position = getCurrentPositionZoomed();
ZoomManager zoomManager = source.getZoomManager();
if (zoomManager != null) {
position = (int) Math.round(position / zoomManager.getZoom());
}
return position;
}
protected String getDebugName() {
return "Guide creation"; //$NON-NLS-1$
}
protected Cursor getDefaultCursor() {
if (isDelete())
return super.getDefaultCursor();
else if (isCreationValid())
return source.isHorizontal() ? SharedCursors.SIZEE
: SharedCursors.SIZEN;
else
return SharedCursors.NO;
}
protected boolean handleButtonDown(int button) {
stateTransition(STATE_INITIAL, STATE_DRAG_IN_PROGRESS);
showSourceFeedback();
return true;
}
protected boolean handleButtonUp(int button) {
if (stateTransition(STATE_DRAG_IN_PROGRESS, STATE_TERMINAL)) {
setCurrentCommand(getCommand());
executeCurrentCommand();
}
return true;
}
protected boolean isCreationValid() {
if (getState() == STATE_INVALID)
return false;
int position = getCurrentPosition();
Iterator guides = source.getRulerProvider().getGuides().iterator();
while (guides.hasNext()) {
int guidePos = source.getRulerProvider().getGuidePosition(
guides.next());
if (Math.abs(guidePos - position) < GuideEditPart.MIN_DISTANCE_BW_GUIDES) {
return false;
}
}
return true;
}
protected boolean isDelete() {
int pos, max, min;
if (!source.isHorizontal()) {
pos = getLocation().x;
Rectangle zone = guide.getBounds().getExpanded(
GuideEditPart.DELETE_THRESHOLD, 0);
min = zone.x;
max = min + zone.width;
} else {
pos = getLocation().y;
Rectangle zone = guide.getBounds().getExpanded(0,
GuideEditPart.DELETE_THRESHOLD);
min = zone.y;
max = min + zone.height;
}
return pos < min || pos > max;
}
protected boolean movedPastThreshold() {
return true;
}
protected void showSourceFeedback() {
if (guide.getParent() == null) {
getCurrentViewer().deselectAll();
source.getFigure().add(guide);
}
if (guideline.getParent() == null) {
source.getGuideLayer().add(guideline);
}
source.setLayoutConstraint(null, guide, new Integer(
getCurrentPositionZoomed()));
Rectangle bounds = Rectangle.SINGLETON;
if (source.isHorizontal()) {
bounds.x = getCurrentPositionZoomed();
bounds.y = source.getGuideLayer().getBounds().y;
bounds.width = 1;
bounds.height = source.getGuideLayer().getBounds().height;
} else {
bounds.x = source.getGuideLayer().getBounds().x;
bounds.y = getCurrentPositionZoomed();
bounds.width = source.getGuideLayer().getBounds().width;
bounds.height = 1;
}
guideline.setBounds(bounds);
guide.setVisible(isCreationValid() && !isDelete());
guideline.setVisible(isCreationValid() && !isDelete());
}
}