1 /*
2  * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package sun.lwawt.macosx;
27 
28 import java.awt.event.*;
29 
30 /**
31  * A class representing Cocoa NSEvent class with the fields only necessary for
32  * JDK functionality.
33  */
34 final class NSEvent {
35 
36     static final int SCROLL_PHASE_UNSUPPORTED = 1;
37     static final int SCROLL_PHASE_BEGAN = 2;
38     static final int SCROLL_PHASE_CONTINUED = 3;
39     static final int SCROLL_PHASE_MOMENTUM_BEGAN = 4;
40     static final int SCROLL_PHASE_ENDED = 5;
41 
42     private int type;
43     private int modifierFlags;
44 
45     // Mouse event information
46     private int clickCount;
47     private int buttonNumber;
48     private int x;
49     private int y;
50     private double scrollDeltaY;
51     private double scrollDeltaX;
52     private int scrollPhase;
53     private int absX;
54     private int absY;
55 
56     // Key event information
57     private short keyCode;
58     private String characters;
59     private String charactersIgnoringModifiers;
60 
61     // Called from native
NSEvent(int type, int modifierFlags, short keyCode, String characters, String charactersIgnoringModifiers)62     NSEvent(int type, int modifierFlags, short keyCode, String characters, String charactersIgnoringModifiers) {
63         this.type = type;
64         this.modifierFlags = modifierFlags;
65         this.keyCode = keyCode;
66         this.characters = characters;
67         this.charactersIgnoringModifiers = charactersIgnoringModifiers;
68     }
69 
70     // Called from native
NSEvent(int type, int modifierFlags, int clickCount, int buttonNumber, int x, int y, int absX, int absY, double scrollDeltaY, double scrollDeltaX, int scrollPhase)71     NSEvent(int type, int modifierFlags, int clickCount, int buttonNumber,
72                    int x, int y, int absX, int absY,
73                    double scrollDeltaY, double scrollDeltaX, int scrollPhase) {
74         this.type = type;
75         this.modifierFlags = modifierFlags;
76         this.clickCount = clickCount;
77         this.buttonNumber = buttonNumber;
78         this.x = x;
79         this.y = y;
80         this.absX = absX;
81         this.absY = absY;
82         this.scrollDeltaY = scrollDeltaY;
83         this.scrollDeltaX = scrollDeltaX;
84         this.scrollPhase = scrollPhase;
85     }
86 
getType()87     int getType() {
88         return type;
89     }
90 
getModifierFlags()91     int getModifierFlags() {
92         return modifierFlags;
93     }
94 
getClickCount()95     int getClickCount() {
96         return clickCount;
97     }
98 
getButtonNumber()99     int getButtonNumber() {
100         return buttonNumber;
101     }
102 
getX()103     int getX() {
104         return x;
105     }
106 
getY()107     int getY() {
108         return y;
109     }
110 
getScrollDeltaY()111     double getScrollDeltaY() {
112         return scrollDeltaY;
113     }
114 
getScrollDeltaX()115     double getScrollDeltaX() {
116         return scrollDeltaX;
117     }
118 
getScrollPhase()119     int getScrollPhase() {
120         return scrollPhase;
121     }
122 
getAbsX()123     int getAbsX() {
124         return absX;
125     }
126 
getAbsY()127     int getAbsY() {
128         return absY;
129     }
130 
getKeyCode()131     short getKeyCode() {
132         return keyCode;
133     }
134 
getCharactersIgnoringModifiers()135     String getCharactersIgnoringModifiers() {
136         return charactersIgnoringModifiers;
137     }
138 
getCharacters()139     String getCharacters() {
140         return characters;
141     }
142 
143     @Override
toString()144     public String toString() {
145         return "NSEvent[" + getType() + " ," + getModifierFlags() + " ,"
146                 + getClickCount() + " ," + getButtonNumber() + " ," + getX() + " ,"
147                 + getY() + " ," + getAbsX() + " ," + getAbsY()+ " ," + getKeyCode() + " ,"
148                 + getCharacters() + " ," + getCharactersIgnoringModifiers() + "]";
149     }
150 
151     /*
152      * Converts an NSEvent button number to a MouseEvent constant.
153      */
nsToJavaButton(int buttonNumber)154     static int nsToJavaButton(int buttonNumber) {
155         int jbuttonNumber = buttonNumber + 1;
156         switch (buttonNumber) {
157             case CocoaConstants.kCGMouseButtonLeft:
158                 jbuttonNumber = MouseEvent.BUTTON1;
159                 break;
160             case CocoaConstants.kCGMouseButtonRight:
161                 jbuttonNumber = MouseEvent.BUTTON3;
162                 break;
163             case CocoaConstants.kCGMouseButtonCenter:
164                 jbuttonNumber = MouseEvent.BUTTON2;
165                 break;
166         }
167         return jbuttonNumber;
168     }
169 
170     /*
171      * Converts NPCocoaEvent types to AWT event types.
172      */
npToJavaEventType(int npEventType)173     static int npToJavaEventType(int npEventType) {
174         int jeventType = 0;
175         switch (npEventType) {
176             case CocoaConstants.NPCocoaEventMouseDown:
177                 jeventType = MouseEvent.MOUSE_PRESSED;
178                 break;
179             case CocoaConstants.NPCocoaEventMouseUp:
180                 jeventType = MouseEvent.MOUSE_RELEASED;
181                 break;
182             case CocoaConstants.NPCocoaEventMouseMoved:
183                 jeventType = MouseEvent.MOUSE_MOVED;
184                 break;
185             case CocoaConstants.NPCocoaEventMouseEntered:
186                 jeventType = MouseEvent.MOUSE_ENTERED;
187                 break;
188             case CocoaConstants.NPCocoaEventMouseExited:
189                 jeventType = MouseEvent.MOUSE_EXITED;
190                 break;
191             case CocoaConstants.NPCocoaEventMouseDragged:
192                 jeventType = MouseEvent.MOUSE_DRAGGED;
193                 break;
194             case CocoaConstants.NPCocoaEventKeyDown:
195                 jeventType = KeyEvent.KEY_PRESSED;
196                 break;
197             case CocoaConstants.NPCocoaEventKeyUp:
198                 jeventType = KeyEvent.KEY_RELEASED;
199                 break;
200         }
201         return jeventType;
202     }
203 
204     /*
205      * Converts NSEvent types to AWT event types.
206      */
nsToJavaEventType(int nsEventType)207     static int nsToJavaEventType(int nsEventType) {
208         int jeventType = 0;
209         switch (nsEventType) {
210             case CocoaConstants.NSLeftMouseDown:
211             case CocoaConstants.NSRightMouseDown:
212             case CocoaConstants.NSOtherMouseDown:
213                 jeventType = MouseEvent.MOUSE_PRESSED;
214                 break;
215             case CocoaConstants.NSLeftMouseUp:
216             case CocoaConstants.NSRightMouseUp:
217             case CocoaConstants.NSOtherMouseUp:
218                 jeventType = MouseEvent.MOUSE_RELEASED;
219                 break;
220             case CocoaConstants.NSMouseMoved:
221                 jeventType = MouseEvent.MOUSE_MOVED;
222                 break;
223             case CocoaConstants.NSLeftMouseDragged:
224             case CocoaConstants.NSRightMouseDragged:
225             case CocoaConstants.NSOtherMouseDragged:
226                 jeventType = MouseEvent.MOUSE_DRAGGED;
227                 break;
228             case CocoaConstants.NSMouseEntered:
229                 jeventType = MouseEvent.MOUSE_ENTERED;
230                 break;
231             case CocoaConstants.NSMouseExited:
232                 jeventType = MouseEvent.MOUSE_EXITED;
233                 break;
234             case CocoaConstants.NSScrollWheel:
235                 jeventType = MouseEvent.MOUSE_WHEEL;
236                 break;
237             case CocoaConstants.NSKeyDown:
238                 jeventType = KeyEvent.KEY_PRESSED;
239                 break;
240             case CocoaConstants.NSKeyUp:
241                 jeventType = KeyEvent.KEY_RELEASED;
242                 break;
243         }
244         return jeventType;
245     }
246 
247     /**
248      * Converts NSEvent key modifiers to AWT key modifiers. Note that this
249      * method adds the current mouse state as a mouse modifiers.
250      *
251      * @param  modifierFlags the NSEvent key modifiers
252      * @return the java key and mouse modifiers
253      */
nsToJavaModifiers(int modifierFlags)254     static native int nsToJavaModifiers(int modifierFlags);
255 
256     /*
257      * Converts NSEvent key info to AWT key info.
258      */
nsToJavaKeyInfo(int[] in, int[] out)259     static native boolean nsToJavaKeyInfo(int[] in, int[] out);
260 
261     /*
262      * Converts NSEvent key modifiers to AWT key info.
263      */
nsKeyModifiersToJavaKeyInfo(int[] in, int[] out)264     static native void nsKeyModifiersToJavaKeyInfo(int[] in, int[] out);
265 
266     /*
267      * There is a small number of NS characters that need to be converted
268      * into other characters before we pass them to AWT.
269      */
nsToJavaChar(char nsChar, int modifierFlags, boolean spaceKeyTyped)270     static native char nsToJavaChar(char nsChar, int modifierFlags, boolean spaceKeyTyped);
271 
isPopupTrigger(int jmodifiers)272     static boolean isPopupTrigger(int jmodifiers) {
273         final boolean isRightButtonDown = ((jmodifiers & InputEvent.BUTTON3_DOWN_MASK) != 0);
274         final boolean isLeftButtonDown = ((jmodifiers & InputEvent.BUTTON1_DOWN_MASK) != 0);
275         final boolean isControlDown = ((jmodifiers & InputEvent.CTRL_DOWN_MASK) != 0);
276         return isRightButtonDown || (isControlDown && isLeftButtonDown);
277     }
278 }
279