1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
14 * @author Toni Kalajainen
\r
16 package org.simantics.g2d.event.adapter;
\r
18 import java.awt.geom.Point2D;
\r
20 import org.eclipse.swt.events.MouseEvent;
\r
21 import org.eclipse.swt.events.MouseListener;
\r
22 import org.eclipse.swt.events.MouseMoveListener;
\r
23 import org.eclipse.swt.events.MouseTrackListener;
\r
24 import org.eclipse.swt.events.MouseWheelListener;
\r
25 import org.eclipse.swt.graphics.Point;
\r
26 import org.simantics.scenegraph.g2d.events.EventDebugPolicy;
\r
27 import org.simantics.scenegraph.g2d.events.IEventHandler;
\r
28 import org.simantics.scenegraph.g2d.events.IEventQueue;
\r
29 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;
\r
30 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;
\r
31 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;
\r
32 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseEnterEvent;
\r
33 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;
\r
34 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
\r
35 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseWheelMovedEvent;
\r
36 import org.simantics.scenegraph.g2d.events.adapter.AbstractEventAdapter;
\r
38 public class SWTMouseEventAdapter extends AbstractEventAdapter implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListener {
\r
40 /** Mouse id of the default mouse */
\r
41 public static final int MOUSE_ID = 0;
\r
43 private long [] pressTime = new long[5];
\r
45 int buttonStatus = 0;
\r
48 * create new adapter
\r
49 * @param sender the sender field in the events
\r
50 * @param delegator the target of the adapted events
\r
52 public SWTMouseEventAdapter(Object sender, IEventHandler delegator) {
\r
53 super(sender, delegator);
\r
57 * create new adapter
\r
58 * @param sender the sender field in the events
\r
61 public SWTMouseEventAdapter(Object sender, IEventQueue queue) {
\r
62 super(sender, queue);
\r
65 private Point2D getControlPosition(MouseEvent e)
\r
67 return new Point2D.Double(e.x, e.y);
\r
70 private Point2D getScreenPosition(MouseEvent e)
\r
72 Point p = e.display.getCursorLocation();
\r
73 return new Point2D.Double(p.x, p.y);
\r
77 private int getMouseButton(MouseEvent e)
\r
80 case 1: return 1; // LEFT
\r
81 case 2: return 3; // RIGHT
\r
82 case 3: return 2; // MIDDLE
\r
83 case 4: return 4; // BUTTON4
\r
84 case 5: return 5; // BUTTON5
\r
89 static private int getStateMask(MouseEvent e) {
\r
90 return SWTKeyEventAdapter.adaptSWTModifierToAWTModifier(e.stateMask);
\r
94 public void mouseDoubleClick(MouseEvent e) {
\r
95 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
\r
96 System.out.println("SWT mouse double clicked: " + e);
\r
97 handleEvent(new MouseDoubleClickedEvent(
\r
98 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e)
\r
103 public void mouseDown(MouseEvent e) {
\r
104 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
\r
105 System.out.println("SWT mouse down: " + e);
\r
106 buttonStatus |= 1 << e.button;
\r
107 if (e.button<=pressTime.length) pressTime[e.button-1] = e.time & 0xffffffff;
\r
108 handleEvent(new MouseButtonPressedEvent(
\r
109 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e)
\r
114 public void mouseUp(MouseEvent e) {
\r
115 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
\r
116 System.out.println("SWT mouse up: " + e);
\r
117 buttonStatus &=~ (1<<e.button);
\r
118 long holdTime = Long.MAX_VALUE;
\r
119 if (e.button<=pressTime.length)
\r
120 holdTime = (e.time & 0xffffffff) - pressTime[e.button-1];
\r
122 handleEvent(new MouseButtonReleasedEvent(
\r
123 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), holdTime, getControlPosition(e), getScreenPosition(e)
\r
128 public void mouseMove(MouseEvent e) {
\r
129 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
\r
130 System.out.println("SWT mouse move: " + e);
\r
131 MouseMovedEvent mme = new MouseMovedEvent(
\r
132 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e));
\r
137 public void mouseEnter(MouseEvent e) {
\r
138 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
\r
139 System.out.println("SWT mouse enter: " + e);
\r
140 handleEvent(new MouseEnterEvent(
\r
141 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e)
\r
146 public void mouseExit(MouseEvent e) {
\r
147 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
\r
148 System.out.println("SWT mouse exit: " + e);
\r
149 handleEvent(new MouseExitEvent(
\r
150 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e)
\r
155 public void mouseHover(MouseEvent e) {
\r
156 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
\r
157 System.out.println("SWT mouse hover: " + e);
\r
161 public void mouseScrolled(MouseEvent e) {
\r
162 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
\r
163 System.out.println("SWT mouse scrolled: " + e);
\r
164 handleEvent(new MouseWheelMovedEvent(
\r
165 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus,
\r
167 getControlPosition(e), getScreenPosition(e),
\r
168 MouseWheelMovedEvent.WHEEL_UNIT_SCROLL,
\r