9d88141323072a2b16ce94fce4f393e20d48c02b
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / events / GlobalMouseEventWatcher.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Bruno Jofret
4
5  * 
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at    
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 package org.scilab.modules.gui.events;
15
16 import java.awt.AWTEvent;
17 import java.awt.event.AWTEventListener;
18 import java.awt.event.MouseEvent;
19
20 import org.scilab.modules.gui.utils.Debug;
21 import org.scilab.modules.gui.utils.SciTranslator;
22
23 /**
24  * This class create a global mouse event watcher
25  * means at a very high level in the JVM.
26  * @author Bruno Jofret
27  */
28 public abstract class GlobalMouseEventWatcher implements AWTEventListener {
29
30     private boolean isControlDown;
31     private boolean inCanvas = true;
32     private boolean freedom = true;
33     private long eventMask;
34     private SciTranslator clickTranslator;
35     private MouseEvent lastMouse;
36     
37     // Match through Canonical name to have both GLCanvas and GLJPanel wrapper. 
38     private final String ScilabOpenGLComponentCanonicalName = "org.scilab.modules.gui.bridge.canvas.SwingScilabCanvasImpl";
39     
40     /**
41      * Constructor.
42      * 
43      * @param eventMask : a Mask for mouse event watching.
44      * xclick is AWTEvent.MOUSE_EVENT_MASK
45      * xgetmouse is AWTEvent.MOUSE_EVENT_MASK + AWTEvent.MOUSE_MOTION_EVENT_MASK
46      */
47     public GlobalMouseEventWatcher(long eventMask) {
48         this.eventMask = eventMask;
49         //this.canvas = null;
50         clickTranslator = new SciTranslator();
51     }
52
53     /** 
54      * 
55      * When there is a mouse click on a Canvas, just go through the GlobalFilter.
56      * @param mouseEvent : The mouse event caught.
57      * 
58      * @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent)
59      */
60     public void eventDispatched(AWTEvent mouseEvent) {
61         // DEBUG
62         //Debug.DEBUG(this.getClass().getSimpleName(),((MouseEvent) mouseEvent).toString());
63         //if (this.axes != null) {
64             //Debug.DEBUG("axes number " + this.axes.getFigureId());
65         //}
66         /*
67          * Managing Canvas
68          * PRESSED
69          * CLICKED
70          * DCLICKED
71          * MOVED
72          */
73
74         this.lastMouse = (MouseEvent) mouseEvent;
75         /*
76          * Use match on package name to match GLJPanel and GLCanvas
77          * GLJPanel are still used under MacOSX
78          */
79         if (mouseEvent.getSource().getClass().getCanonicalName().contains(ScilabOpenGLComponentCanonicalName)) {
80             this.isControlDown = lastMouse.isControlDown();
81             switch (mouseEvent.getID()) {
82             /* CLICKED */
83             case MouseEvent.MOUSE_CLICKED :
84                 this.inCanvas = true;
85                 //this.axes = (SwingScilabAxes) mouseEvent.getSource();
86                 if (lastMouse.getClickCount() == 1) {
87                     clickTranslator.setClickAction(SciTranslator.CLICKED);
88                 } 
89                 else {
90                     /*
91                      * Means mouseEvent.getClickCount() >= 2
92                      */ 
93                     clickTranslator.setClickAction(SciTranslator.DCLICKED);
94                     synchronized (clickTranslator) {
95                         // To unlock javaClick2Scilab done in launchfilter
96                         clickTranslator.notify();
97                     }
98                 }               
99                 break;
100                 /* PRESSED */
101             case MouseEvent.MOUSE_PRESSED :
102                 this.inCanvas = true;
103                 //this.axes = (SwingScilabAxes) mouseEvent.getSource();
104                 clickTranslator.setClickAction(SciTranslator.PRESSED);
105                 if (this.freedom) {
106                     Thread timer = new Thread() {
107                         public void run() { 
108                             launchFilter(); 
109                         } 
110                     };
111                     timer.start();
112                 }
113                 break;
114                 /* ENTERED */
115             case MouseEvent.MOUSE_ENTERED :
116                 this.inCanvas = true;
117                 //this.axes = (SwingScilabAxes) mouseEvent.getSource();
118                 mouseEventFilter(lastMouse, GlobalEventWatcher.getAxesUID(), SciTranslator.MOVED, this.isControlDown);
119                 break;
120                 /* MOVED */
121             case MouseEvent.MOUSE_MOVED :
122                 this.inCanvas = true;
123                 mouseEventFilter(lastMouse, GlobalEventWatcher.getAxesUID(), SciTranslator.MOVED, this.isControlDown);
124                 break;
125             case MouseEvent.MOUSE_DRAGGED :
126                 if (this.inCanvas) {
127                     if (lastMouse.getID() == MouseEvent.MOUSE_PRESSED) {
128                         clickTranslator.setClickAction(SciTranslator.PRESSED);
129                         synchronized (clickTranslator) {
130                             // To unlock javaClick2Scilab done in launchfilter
131                             clickTranslator.notify();
132                         }
133                     } else {
134                         mouseEventFilter(lastMouse, GlobalEventWatcher.getAxesUID(), SciTranslator.MOVED, this.isControlDown);
135                     }
136                 }
137                 break;
138                 /* EXITED */
139             case MouseEvent.MOUSE_EXITED :
140                 this.inCanvas = false;
141                 break;
142             default:
143                 break;
144             }
145
146         }
147         
148         /*
149          * Use match on package name to match GLJPanel and GLCanvas
150          * GLJPanel are still used under MacOSX
151          */
152         if (mouseEvent.getSource().getClass().getCanonicalName().contains(ScilabOpenGLComponentCanonicalName)) {
153             switch (mouseEvent.getID()) {
154             case MouseEvent.MOUSE_ENTERED :
155                 this.inCanvas = true;
156                 //mouseEventFilter(lastMouse, canvas, SciTranslator.MOVED, this.isControlDown);
157                 break;
158             case MouseEvent.MOUSE_EXITED :
159                 this.inCanvas = false;
160                 break;
161             default:
162                 break;
163             }
164         }
165
166         /*
167          * Manage RELEASED on a Canvas
168          * Means we are still in a Canvas (ENTERED && !EXITED)
169          * and the event is not comming from a Canvas itself.
170          * and got a RELEASED
171          */
172         if (mouseEvent.getID() == MouseEvent.MOUSE_RELEASED && inCanvas 
173                 && (clickTranslator.getClickAction() == SciTranslator.UNMANAGED 
174                 || clickTranslator.getClickAction() == SciTranslator.MOVED)) {
175             clickTranslator.setClickAction(SciTranslator.RELEASED);
176             mouseEventFilter(lastMouse, GlobalEventWatcher.getAxesUID(), clickTranslator.getClickAction(), this.isControlDown); 
177         }
178     }
179
180     /**
181      * Thread to manage old style scilab
182      * click management.
183      */
184     private void launchFilter() {
185         this.freedom = false;
186         mouseEventFilter(lastMouse, GlobalEventWatcher.getAxesUID(), clickTranslator.javaClick2Scilab(), this.isControlDown);
187         this.freedom = true;
188     }
189
190     /**
191      * Method to filter the event received.
192      * Depends off what kind of function is called.
193      * 
194      * @param mouseEvent : the mouse event caught (as seen in Scilab) 
195      * @param axes : the axes where action occurs.
196      * @param scilabMouseAction : the integer scilab code for mouse action.
197      * @param isControlDown true if the CTRL key has been pressed
198      */
199     public abstract void mouseEventFilter(MouseEvent mouseEvent, String axesUID, int scilabMouseAction, boolean isControlDown);
200
201     /**
202      * Event Mask getter.
203      * 
204      * @return eventMask
205      */
206     public long getEventMask() {
207         return eventMask;
208     }
209 }