blob: 0401ca2bbb2d585f016fb019d73461278f88a535 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.swt.examples.paint;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.*;
/**
* The superclass for paint tools that use click-drag-release motions to
* draw objects.
*/
public abstract class DragPaintSession extends BasicPaintSession {
/**
* True if a click-drag is in progress
*/
private boolean dragInProgress = false;
/**
* The position of the first click in a click-drag
*/
private Point anchorPosition = new Point(-1, -1);
/**
* A temporary point
*/
private Point tempPosition = new Point(-1, -1);
/**
* Constructs a PaintSession.
*
* @param getPaintSurface() the drawing surface to use
*/
protected DragPaintSession(PaintSurface paintSurface) {
super(paintSurface);
}
/**
* Activates the tool.
*/
public void beginSession() {
getPaintSurface().
setStatusMessage(PaintExample.getResourceString("session.DragInteractivePaint.message"));
anchorPosition.x = -1;
dragInProgress = false;
}
/**
* Deactivates the tool.
*/
public void endSession() {
}
/**
* Resets the tool.
* Aborts any operation in progress.
*/
public void resetSession() {
getPaintSurface().clearRubberbandSelection();
anchorPosition.x = -1;
dragInProgress = false;
}
/**
* Handles a mouseDown event.
*
* @param event the mouse event detail information
*/
public void mouseDown(MouseEvent event) {
if (event.button != 1) return;
if (dragInProgress) return; // spurious event
dragInProgress = true;
anchorPosition.x = event.x;
anchorPosition.y = event.y;
}
/**
* Handles a mouseDoubleClick event.
*
* @param event the mouse event detail information
*/
public void mouseDoubleClick(MouseEvent event) {
}
/**
* Handles a mouseUp event.
*
* @param event the mouse event detail information
*/
public void mouseUp(MouseEvent event) {
if (event.button != 1) {
resetSession(); // abort if right or middle mouse button pressed
return;
}
if (! dragInProgress) return; // spurious event
dragInProgress = false;
if (anchorPosition.x == -1) return; // spurious event
getPaintSurface().commitRubberbandSelection();
}
/**
* Handles a mouseMove event.
*
* @param event the mouse event detail information
*/
public void mouseMove(MouseEvent event) {
final PaintSurface ps = getPaintSurface();
if (! dragInProgress) {
ps.setStatusCoord(ps.getCurrentPosition());
return;
}
ps.setStatusCoordRange(anchorPosition, ps.getCurrentPosition());
ps.clearRubberbandSelection();
tempPosition.x = event.x;
tempPosition.y = event.y;
ps.addRubberbandSelection(createFigure(anchorPosition, tempPosition));
}
/**
* Template Method: Creates a Figure for drawing rubberband entities and the final product
*
* @param anchor the anchor point
* @param cursor the point marking the current pointer location
*/
protected abstract Figure createFigure(Point anchor, Point cursor);
}