/******************************************************************************* * Copyright (c) 2000, 2012 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); }