/* * Copyright (c) 2000, 2002 IBM Corp. All rights reserved. * This file is made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html */ import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tracker; public class Snippet0031 { public static void main (String [] args) { final Display display = new Display (); final Shell shell = new Shell (display); final int jitter = 8; shell.setSize (200, 200); shell.open (); final Point [] point = new Point [1]; shell.addListener (SWT.MouseDown, new Listener () { public void handleEvent (Event e) { point [0] = new Point (e.x, e.y); } }); shell.addListener (SWT.MouseMove, new Listener () { public void handleEvent (Event e) { if (point [0] == null) return; if (Math.abs (point [0].x - e.x) < jitter && Math.abs (point [0].x - e.x) < jitter) { return; } GC gc = new GC (shell); gc.setBackground (gc.getForeground ()); gc.fillRectangle (point [0].x, point [0].y, 2, 2); gc.dispose (); Tracker tracker = new Tracker (display, 0); Rectangle rect = shell.getClientArea (); Point pt = shell.toDisplay (new Point (rect.x, rect.y)); rect.x = pt.x - (point [0].x - e.x); rect.y = pt.y - (point [0].y - e.y); tracker.setRectangles (new Rectangle [] {rect}); tracker.open (); point [0] = null; } }); shell.addListener (SWT.MouseUp, new Listener () { public void handleEvent (Event e) { point [0] = null; } }); while (!shell.isDisposed()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); } }