]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/event/adapter/SWTMouseEventAdapter.java
Reading background color of a ICanvasContext with SCL
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / event / adapter / SWTMouseEventAdapter.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 /*
13  *
14  * @author Toni Kalajainen
15  */
16 package org.simantics.g2d.event.adapter;
17
18 import java.awt.geom.Point2D;
19
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
38 public class SWTMouseEventAdapter extends AbstractEventAdapter implements MouseListener, MouseMoveListener, MouseTrackListener, MouseWheelListener {
39
40         /** Mouse id of the default mouse */
41         public static final int MOUSE_ID = 0;
42         
43     private long [] pressTime = new long[5];
44     
45         int buttonStatus = 0;
46
47         /**
48          * create new adapter
49          * @param sender the sender field in the events
50          * @param delegator the target of the adapted events
51          */
52         public SWTMouseEventAdapter(Object sender, IEventHandler delegator) {
53                 super(sender, delegator);
54         }
55
56         /**
57          * create new adapter
58          * @param sender the sender field in the events
59          * @param queue
60          */
61         public SWTMouseEventAdapter(Object sender, IEventQueue queue) {
62                 super(sender, queue);
63         }
64         
65         private Point2D getControlPosition(MouseEvent e)
66         {
67                 return new Point2D.Double(e.x, e.y);
68         }
69         
70         private Point2D getScreenPosition(MouseEvent e)
71         {
72                 Point p = e.display.getCursorLocation();
73                 return new Point2D.Double(p.x, p.y);
74                 
75         }
76         
77         private int getMouseButton(MouseEvent e)
78         {
79                 switch (e.button) {
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
85                 }
86                 return e.button;
87         }
88         
89         static private int getStateMask(MouseEvent e) {
90             return SWTKeyEventAdapter.adaptSWTModifierToAWTModifier(e.stateMask);
91         }
92
93         @Override
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)
99                                 ));
100         }
101
102         @Override
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)
110                                 ));
111         }
112
113         @Override
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];
121                 
122                 handleEvent(new MouseButtonReleasedEvent(
123                                 sender, e.time & 0xffffffff, MOUSE_ID, buttonStatus, getStateMask(e), getMouseButton(e), holdTime, getControlPosition(e), getScreenPosition(e)
124                                 ));
125         }
126
127         @Override
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));
133                 handleEvent(mme);
134         }
135
136         @Override
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)
142                                 ));
143         }
144
145         @Override
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)
151                                 ));
152         }
153
154         @Override
155         public void mouseHover(MouseEvent e) {
156                 if (EventDebugPolicy.SWT_MOUSE_EVENT_ADAPTION)
157                         System.out.println("SWT mouse hover: " + e);
158         }
159
160         @Override
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, 
166                                 getStateMask(e),
167                                 getControlPosition(e), getScreenPosition(e), 
168                                 MouseWheelMovedEvent.WHEEL_UNIT_SCROLL, 
169                                 0, 
170                                 e.count
171                                 ));
172         }
173
174 }