+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+/*\r
+ *\r
+ * @author Toni Kalajainen\r
+ */\r
+package org.simantics.g2d.event.adapter;\r
+\r
+import java.awt.geom.Point2D;\r
+\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.events.MouseListener;\r
+import org.eclipse.swt.events.MouseMoveListener;\r
+import org.eclipse.swt.events.MouseTrackListener;\r
+import org.eclipse.swt.events.MouseWheelListener;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.simantics.scenegraph.g2d.events.EventDebugPolicy;\r
+import org.simantics.scenegraph.g2d.events.IEventHandler;\r
+import org.simantics.scenegraph.g2d.events.IEventQueue;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseEnterEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseWheelMovedEvent;\r
+import org.simantics.scenegraph.g2d.events.adapter.AbstractEventAdapter;\r
+\r
+public class SWTMouseEventAdapter extends AbstractEventAdapter implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListener {\r
+\r
+ /** Mouse id of the default mouse */\r
+ public static final int MOUSE_ID = 0;\r
+ \r
+ private long [] pressTime = new long[5];\r
+ \r
+ int buttonStatus = 0;\r
+\r
+ /**\r
+ * create new adapter\r
+ * @param sender the sender field in the events\r
+ * @param delegator the target of the adapted events\r
+ */\r
+ public SWTMouseEventAdapter(Object sender, IEventHandler delegator) {\r
+ super(sender, delegator);\r
+ }\r
+\r
+ /**\r
+ * create new adapter\r
+ * @param sender the sender field in the events\r
+ * @param queue\r
+ */\r
+ public SWTMouseEventAdapter(Object sender, IEventQueue queue) {\r
+ super(sender, queue);\r
+ }\r
+ \r
+ private Point2D getControlPosition(MouseEvent e)\r
+ {\r
+ return new Point2D.Double(e.x, e.y);\r
+ }\r
+ \r
+ private Point2D getScreenPosition(MouseEvent e)\r
+ {\r
+ Point p = e.display.getCursorLocation();\r
+ return new Point2D.Double(p.x, p.y);\r
+ \r
+ }\r
+ \r
+ private int getMouseButton(MouseEvent e)\r
+ {\r
+ switch (e.button) {\r
+ case 1: return 1; // LEFT\r
+ case 2: return 3; // RIGHT\r
+ case 3: return 2; // MIDDLE\r
+ case 4: return 4; // BUTTON4\r
+ case 5: return 5; // BUTTON5\r
+ }\r
+ return e.button;\r
+ }\r
+ \r
+ static private int getStateMask(MouseEvent e) {\r
+ return SWTKeyEventAdapter.adaptSWTModifierToAWTModifier(e.stateMask);\r
+ }\r
+\r
+ @Override\r
+ public void mouseDoubleClick(MouseEvent e) {\r
+ if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)\r
+ System.out.println("SWT mouse double clicked: " + e);\r
+ handleEvent(new MouseDoubleClickedEvent(\r
+ sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e)\r
+ ));\r
+ }\r
+\r
+ @Override\r
+ public void mouseDown(MouseEvent e) {\r
+ if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)\r
+ System.out.println("SWT mouse down: " + e);\r
+ buttonStatus |= 1 << e.button; \r
+ if (e.button<=pressTime.length) pressTime[e.button-1] = e.time & 0xffffffff; \r
+ handleEvent(new MouseButtonPressedEvent(\r
+ sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e)\r
+ ));\r
+ }\r
+\r
+ @Override\r
+ public void mouseUp(MouseEvent e) {\r
+ if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)\r
+ System.out.println("SWT mouse up: " + e);\r
+ buttonStatus &=~ (1<<e.button);\r
+ long holdTime = Long.MAX_VALUE;\r
+ if (e.button<=pressTime.length)\r
+ holdTime = (e.time & 0xffffffff) - pressTime[e.button-1];\r
+ \r
+ handleEvent(new MouseButtonReleasedEvent(\r
+ sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), holdTime, getControlPosition(e), getScreenPosition(e)\r
+ ));\r
+ }\r
+\r
+ @Override\r
+ public void mouseMove(MouseEvent e) {\r
+ if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)\r
+ System.out.println("SWT mouse move: " + e);\r
+ MouseMovedEvent mme = new MouseMovedEvent(\r
+ sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e));\r
+ handleEvent(mme);\r
+ }\r
+\r
+ @Override\r
+ public void mouseEnter(MouseEvent e) {\r
+ if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)\r
+ System.out.println("SWT mouse enter: " + e);\r
+ handleEvent(new MouseEnterEvent(\r
+ sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e)\r
+ ));\r
+ }\r
+\r
+ @Override\r
+ public void mouseExit(MouseEvent e) {\r
+ if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)\r
+ System.out.println("SWT mouse exit: " + e);\r
+ handleEvent(new MouseExitEvent(\r
+ sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e)\r
+ ));\r
+ }\r
+\r
+ @Override\r
+ public void mouseHover(MouseEvent e) {\r
+ if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)\r
+ System.out.println("SWT mouse hover: " + e);\r
+ }\r
+\r
+ @Override\r
+ public void mouseScrolled(MouseEvent e) {\r
+ if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)\r
+ System.out.println("SWT mouse scrolled: " + e);\r
+ handleEvent(new MouseWheelMovedEvent(\r
+ sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, \r
+ getStateMask(e),\r
+ getControlPosition(e), getScreenPosition(e), \r
+ MouseWheelMovedEvent.WHEEL_UNIT_SCROLL, \r
+ 0, \r
+ e.count\r
+ ));\r
+ }\r
+\r
+}\r