/******************************************************************************* * Copyright (c) 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.swt.snippets; /* * Gesture example * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.7 */ import org.eclipse.swt.*; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; public class Snippet353 { static Point origin, size; static double rotation, currentRotation; static float magnification = 1.0f, currentMagnification; public static void main(String [] args) { Display display = new Display(); final Shell shell = new Shell(display); GestureListener gl = new GestureListener() { @Override public void gesture(GestureEvent ge) { if (ge.detail == SWT.GESTURE_BEGIN) { currentRotation = rotation; currentMagnification = magnification; } if (ge.detail == SWT.GESTURE_ROTATE) { rotation = currentRotation - ge.rotation; shell.redraw(); } if (ge.detail == SWT.GESTURE_MAGNIFY) { magnification = (float) (currentMagnification * ge.magnification); shell.redraw(); } if (ge.detail == SWT.GESTURE_SWIPE) { // xDirection and yDirection indicate direction for GESTURE_SWIPE. // For this example, just move in that direction to demonstrate it's working. origin.x += ge.xDirection * 50; origin.y += ge.yDirection * 50; shell.redraw(); } if (ge.detail == SWT.GESTURE_PAN) { origin.x += ge.xDirection; origin.y += ge.yDirection; shell.redraw(); } if (ge.detail == SWT.GESTURE_END) { } } }; PaintListener pl = new PaintListener() { @Override public void paintControl(PaintEvent e) { Transform t = new Transform(Display.getCurrent()); t.translate(origin.x, origin.y); t.translate(size.x / 2, size.y / 2); t.rotate((float) rotation); t.translate(-size.x / 2, -size.y / 2); t.translate(-origin.x, -origin.y); e.gc.setAntialias(SWT.ON); e.gc.setTransform(t); // Because of bug 253670, drawRectangle is incorrect when the rotation is near 45, 135, 225 or 315 degrees. // Uncomment this next line and adjust the bitfield for your platform. See GC#DRAW_OFFSET. //e.gc.getGCData().state |= 1 << 9; e.gc.drawRectangle(origin.x, origin.y, (int)(size.x * magnification), (int)(size.y * magnification)); t.dispose(); } }; shell.addPaintListener(pl); shell.addGestureListener(gl); shell.setSize(400, 400); size = new Point(50, 50); origin = new Point((shell.getSize().x - size.x) / 2, (shell.getSize().y - size.y) / 2); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }