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.g2d.event.adapter;
18 import java.awt.geom.Point2D;
20 import org.eclipse.swt.events.MouseEvent;
21 import org.eclipse.swt.events.MouseListener;
22 import org.eclipse.swt.events.MouseMoveListener;
23 import org.eclipse.swt.events.MouseTrackListener;
24 import org.eclipse.swt.events.MouseWheelListener;
25 import org.eclipse.swt.graphics.Point;
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;
36 import org.simantics.scenegraph.g2d.events.adapter.AbstractEventAdapter;
38 public class SWTMouseEventAdapter extends AbstractEventAdapter implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListener {
40 /** Mouse id of the default mouse */
41 public static final int MOUSE_ID = 0;
43 private long [] pressTime = new long[5];
49 * @param sender the sender field in the events
50 * @param delegator the target of the adapted events
52 public SWTMouseEventAdapter(Object sender, IEventHandler delegator) {
53 super(sender, delegator);
58 * @param sender the sender field in the events
61 public SWTMouseEventAdapter(Object sender, IEventQueue queue) {
65 private Point2D getControlPosition(MouseEvent e)
67 return new Point2D.Double(e.x, e.y);
70 private Point2D getScreenPosition(MouseEvent e)
72 Point p = e.display.getCursorLocation();
73 return new Point2D.Double(p.x, p.y);
77 private int getMouseButton(MouseEvent e)
80 case 1: return 1; // LEFT
81 case 2: return 3; // RIGHT
82 case 3: return 2; // MIDDLE
83 case 4: return 4; // BUTTON4
84 case 5: return 5; // BUTTON5
89 static private int getStateMask(MouseEvent e) {
90 return SWTKeyEventAdapter.adaptSWTModifierToAWTModifier(e.stateMask);
94 public void mouseDoubleClick(MouseEvent e) {
95 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
96 System.out.println("SWT mouse double clicked: " + e);
97 handleEvent(new MouseDoubleClickedEvent(
98 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e)
103 public void mouseDown(MouseEvent e) {
104 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
105 System.out.println("SWT mouse down: " + e);
106 buttonStatus |= 1 << e.button;
107 if (e.button<=pressTime.length) pressTime[e.button-1] = e.time & 0xffffffff;
108 handleEvent(new MouseButtonPressedEvent(
109 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e)
114 public void mouseUp(MouseEvent e) {
115 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
116 System.out.println("SWT mouse up: " + e);
117 buttonStatus &=~ (1<<e.button);
118 long holdTime = Long.MAX_VALUE;
119 if (e.button<=pressTime.length)
120 holdTime = (e.time & 0xffffffff) - pressTime[e.button-1];
122 handleEvent(new MouseButtonReleasedEvent(
123 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), holdTime, getControlPosition(e), getScreenPosition(e)
128 public void mouseMove(MouseEvent e) {
129 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
130 System.out.println("SWT mouse move: " + e);
131 MouseMovedEvent mme = new MouseMovedEvent(
132 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e));
137 public void mouseEnter(MouseEvent e) {
138 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
139 System.out.println("SWT mouse enter: " + e);
140 handleEvent(new MouseEnterEvent(
141 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e)
146 public void mouseExit(MouseEvent e) {
147 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
148 System.out.println("SWT mouse exit: " + e);
149 handleEvent(new MouseExitEvent(
150 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e)
155 public void mouseHover(MouseEvent e) {
156 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
157 System.out.println("SWT mouse hover: " + e);
161 public void mouseScrolled(MouseEvent e) {
162 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
163 System.out.println("SWT mouse scrolled: " + e);
164 handleEvent(new MouseWheelMovedEvent(
165 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus,
167 getControlPosition(e), getScreenPosition(e),
168 MouseWheelMovedEvent.WHEEL_UNIT_SCROLL,