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;
37 import org.simantics.utils.ui.SWTDPIUtil;
39 public class SWTMouseEventAdapter extends AbstractEventAdapter implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListener {
41 /** Mouse id of the default mouse */
42 public static final int MOUSE_ID = 0;
44 private long [] pressTime = new long[5];
50 * @param sender the sender field in the events
51 * @param delegator the target of the adapted events
53 public SWTMouseEventAdapter(Object sender, IEventHandler delegator) {
54 super(sender, delegator);
59 * @param sender the sender field in the events
62 public SWTMouseEventAdapter(Object sender, IEventQueue queue) {
66 private Point2D getControlPosition(MouseEvent e)
68 return new Point2D.Double(SWTDPIUtil.upscaleSwt(e.x), SWTDPIUtil.upscaleSwt(e.y));
71 private Point2D getScreenPosition(MouseEvent e)
73 Point p = SWTDPIUtil.upscaleSwt(e.display.getCursorLocation());
74 return new Point2D.Double(p.x, p.y);
78 private int getMouseButton(MouseEvent e)
81 case 1: return 1; // LEFT
82 case 2: return 3; // RIGHT
83 case 3: return 2; // MIDDLE
84 case 4: return 4; // BUTTON4
85 case 5: return 5; // BUTTON5
90 static private int getStateMask(MouseEvent e) {
91 return SWTKeyEventAdapter.adaptSWTModifierToAWTModifier(e.stateMask);
95 public void mouseDoubleClick(MouseEvent e) {
96 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
97 System.out.println("SWT mouse double clicked: " + e);
98 handleEvent(new MouseDoubleClickedEvent(
99 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e)
104 public void mouseDown(MouseEvent e) {
105 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
106 System.out.println("SWT mouse down: " + e);
107 buttonStatus |= 1 << e.button;
108 if (e.button<=pressTime.length) pressTime[e.button-1] = e.time & 0xffffffff;
109 handleEvent(new MouseButtonPressedEvent(
110 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), getControlPosition(e), getScreenPosition(e)
115 public void mouseUp(MouseEvent e) {
116 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
117 System.out.println("SWT mouse up: " + e);
118 buttonStatus &=~ (1<<e.button);
119 long holdTime = Long.MAX_VALUE;
120 if (e.button<=pressTime.length)
121 holdTime = (e.time & 0xffffffff) - pressTime[e.button-1];
123 handleEvent(new MouseButtonReleasedEvent(
124 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), holdTime, getControlPosition(e), getScreenPosition(e)
129 public void mouseMove(MouseEvent e) {
130 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
131 System.out.println("SWT mouse move: " + e);
132 MouseMovedEvent mme = new MouseMovedEvent(
133 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e));
138 public void mouseEnter(MouseEvent e) {
139 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
140 System.out.println("SWT mouse enter: " + e);
141 handleEvent(new MouseEnterEvent(
142 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e)
147 public void mouseExit(MouseEvent e) {
148 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
149 System.out.println("SWT mouse exit: " + e);
150 handleEvent(new MouseExitEvent(
151 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getControlPosition(e), getScreenPosition(e)
156 public void mouseHover(MouseEvent e) {
157 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
158 System.out.println("SWT mouse hover: " + e);
162 public void mouseScrolled(MouseEvent e) {
163 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
164 System.out.println("SWT mouse scrolled: " + e);
165 handleEvent(new MouseWheelMovedEvent(
166 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus,
168 getControlPosition(e), getScreenPosition(e),
169 MouseWheelMovedEvent.WHEEL_UNIT_SCROLL,
170 MouseWheelMovedEvent.SCROLL_AMOUNT_ZERO,