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