1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
14 * @author Toni Kalajainen
16 package org.simantics.scenegraph.g2d.events.adapter;
18 import java.awt.event.InputEvent;
19 import java.awt.event.MouseEvent;
20 import java.awt.event.MouseListener;
21 import java.awt.event.MouseMotionListener;
22 import java.awt.event.MouseWheelEvent;
23 import java.awt.event.MouseWheelListener;
24 import java.awt.geom.Point2D;
26 import org.simantics.scenegraph.g2d.events.EventDebugPolicy;
27 import org.simantics.scenegraph.g2d.events.IEventHandler;
28 import org.simantics.scenegraph.g2d.events.IEventQueue;
29 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;
30 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;
31 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;
32 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseEnterEvent;
33 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;
34 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
35 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseWheelMovedEvent;
39 * Adapts AWT mouse events into G2D events.
41 * Sends adapted events to IEventHandler
43 public class AWTMouseEventAdapter extends AbstractEventAdapter implements MouseListener, MouseMotionListener, MouseWheelListener {
45 private final boolean DEBUG = EventDebugPolicy.AWT_MOUSE_EVENT_ADAPTION;
47 private final boolean IGNORE_CONSUMED_EVENTS = false;
49 /** Mouse id of the default mouse */
50 public static final int MOUSE_ID = 0;
52 private final long [] pressTime = new long[5];
58 * @param sender the sender field in the events
59 * @param delegator the target of the adapted events
61 public AWTMouseEventAdapter(Object sender, IEventHandler delegator) {
62 super(sender, delegator);
67 * @param sender the sender field in the events
70 public AWTMouseEventAdapter(Object sender, IEventQueue queue) {
74 public static Point2D getControlPosition(MouseEvent e)
76 return new Point2D.Double(e.getX(), e.getY());
79 public static Point2D getScreenPosition(MouseEvent e)
81 return e.getLocationOnScreen();
84 public static int getStateMask(MouseEvent e) {
85 int modifiers = e.getModifiersEx();
87 if((modifiers & InputEvent.CTRL_DOWN_MASK) != 0)
88 stateMask |= org.simantics.scenegraph.g2d.events.MouseEvent.CTRL_MASK;
89 if((modifiers & InputEvent.ALT_DOWN_MASK) != 0)
90 stateMask |= org.simantics.scenegraph.g2d.events.MouseEvent.ALT_MASK;
91 if((modifiers & InputEvent.ALT_GRAPH_DOWN_MASK) != 0)
92 stateMask |= org.simantics.scenegraph.g2d.events.MouseEvent.ALT_GRAPH_MASK;
93 if((modifiers & InputEvent.SHIFT_DOWN_MASK) != 0)
94 stateMask |= org.simantics.scenegraph.g2d.events.MouseEvent.SHIFT_MASK;
98 public static int getMouseButton(MouseEvent e)
100 int awtMouseButton = e.getButton();
101 if (awtMouseButton == MouseEvent.BUTTON1)
102 return org.simantics.scenegraph.g2d.events.MouseEvent.LEFT_BUTTON;
103 if (awtMouseButton == MouseEvent.BUTTON2)
104 return org.simantics.scenegraph.g2d.events.MouseEvent.MIDDLE_BUTTON;
105 if (awtMouseButton == MouseEvent.BUTTON3)
106 return org.simantics.scenegraph.g2d.events.MouseEvent.RIGHT_BUTTON;
107 return awtMouseButton;
111 * Converts AWT {@link MouseEvent#getModifiersEx()} mouse button status to
112 * G2D mouse button status. Only supports three buttons while AWT supports
118 public static int getButtonStatus(MouseEvent e) {
119 int modex = e.getModifiersEx();
121 status |= (modex & MouseEvent.BUTTON1_DOWN_MASK) != 0 ? org.simantics.scenegraph.g2d.events.MouseEvent.LEFT_MASK : 0;
122 status |= (modex & MouseEvent.BUTTON2_DOWN_MASK) != 0 ? org.simantics.scenegraph.g2d.events.MouseEvent.MIDDLE_MASK : 0;
123 status |= (modex & MouseEvent.BUTTON3_DOWN_MASK) != 0 ? org.simantics.scenegraph.g2d.events.MouseEvent.RIGHT_MASK : 0;
128 public void mouseEntered(MouseEvent e) {
129 if (IGNORE_CONSUMED_EVENTS) {
130 if (e.isConsumed()) {
132 System.out.println("AWT mouse entered but already consumed: " + e);
137 System.out.println("AWT mouse entered: " + e);
138 buttonStatus = getButtonStatus(e);
139 MouseEnterEvent me = new MouseEnterEvent(sender, e.getWhen(), MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e));
144 public void mouseExited(MouseEvent e) {
145 if (IGNORE_CONSUMED_EVENTS) {
146 if (e.isConsumed()) {
148 System.out.println("AWT mouse exited but already consumed: " + e);
153 System.out.println("AWT mouse exited: " + e);
155 MouseExitEvent me = new MouseExitEvent(sender, e.getWhen(), MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e));
160 public void mousePressed(MouseEvent e) {
161 if (IGNORE_CONSUMED_EVENTS) {
162 if (e.isConsumed()) {
164 System.out.println("AWT mouse pressed but already consumed: " + e);
169 System.out.println("AWT mouse pressed: " + e);
171 int mouseButton = getMouseButton(e);
172 if (mouseButton == MouseEvent.NOBUTTON) {
173 // This is strange, seems to happen on Linux constantly when pressing buttons rapidly.
174 //System.out.println("NO BUTTON EVENT: " + e);
178 if (mouseButton<=pressTime.length) pressTime[mouseButton-1] = e.getWhen();
179 buttonStatus |= 1 << (mouseButton-1);
181 handleEvent(new MouseButtonPressedEvent(sender, e.getWhen(), MOUSE_ID,
182 buttonStatus, getStateMask(e), mouseButton, getControlPosition(e), getScreenPosition(e)));
183 if (e.getClickCount() == 2) {
184 handleEvent(new MouseDoubleClickedEvent(sender, e.getWhen(),
185 MOUSE_ID, buttonStatus, getStateMask(e), mouseButton, getControlPosition(e), getScreenPosition(e)));
190 public void mouseReleased(MouseEvent e) {
191 if (IGNORE_CONSUMED_EVENTS) {
192 if (e.isConsumed()) {
194 System.out.println("AWT mouse released but already consumed: " + e);
199 System.out.println("AWT mouse released: " + e);
201 int mouseButton = getMouseButton(e);
202 if (mouseButton == MouseEvent.NOBUTTON) {
203 // This is strange, seems to happen on Linux constantly when pressing buttons rapidly.
204 //System.out.println("NO BUTTON EVENT: " + e);
208 long holdTime = Long.MAX_VALUE;
209 if (mouseButton<=pressTime.length)
210 holdTime = e.getWhen() - pressTime[mouseButton-1];
212 int stateMask = getStateMask(e);
214 // This works around the problem of AWT putting the ALT_DOWN_MASK in the
215 // mouse event extended modifiers when button 2 is pressed.
216 if (mouseButton == org.simantics.scenegraph.g2d.events.MouseEvent.MIDDLE_BUTTON) {
217 stateMask &= ~(org.simantics.scenegraph.g2d.events.MouseEvent.ALT_MASK);
220 buttonStatus &=~ (1<<(mouseButton-1));
221 MouseButtonReleasedEvent me = new MouseButtonReleasedEvent(sender, e.getWhen(), MOUSE_ID, buttonStatus, stateMask, mouseButton, holdTime, getControlPosition(e), getScreenPosition(e));
226 public void mouseDragged(MouseEvent e) {
227 if (IGNORE_CONSUMED_EVENTS) {
228 if (e.isConsumed()) {
230 System.out.println("AWT mouse dragged but already consumed: " + e);
235 System.out.println("AWT mouse dragged: " + e);
236 MouseMovedEvent me = new MouseMovedEvent(sender, e.getWhen(), MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e));
241 public void mouseMoved(MouseEvent e) {
242 if (IGNORE_CONSUMED_EVENTS) {
243 if (e.isConsumed()) {
245 System.out.println("AWT mouse moved but already consumed: " + e);
250 System.out.println("AWT mouse moved: " + e);
251 MouseMovedEvent me = new MouseMovedEvent(sender, e.getWhen(), MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e));
256 public void mouseWheelMoved(MouseWheelEvent e) {
257 if (IGNORE_CONSUMED_EVENTS) {
258 if (e.isConsumed()) {
260 System.out.println("AWT mouse wheel moved but already consumed: " + e);
265 System.out.println("AWT mouse wheel moved: " + e);
266 int wheelRotation = 0;
267 if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
268 wheelRotation = -e.getUnitsToScroll();
270 wheelRotation = -e.getWheelRotation();
272 handleEvent(new MouseWheelMovedEvent(
273 sender, e.getWhen(), MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e),
274 e.getScrollType(), e.getScrollAmount(), wheelRotation
280 public void mouseClicked(MouseEvent e) {
281 if (IGNORE_CONSUMED_EVENTS) {
282 if (e.isConsumed()) {
284 System.out.println("AWT mouse clicked but already consumed: " + e);
289 System.out.println("AWT mouse clicked: " + e);