< prev index next >

src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java

Print this page




  27 
  28 import sun.awt.SunToolkit;
  29 import sun.lwawt.LWWindowPeer;
  30 import sun.lwawt.PlatformEventNotifier;
  31 
  32 import java.awt.Toolkit;
  33 import java.awt.event.MouseEvent;
  34 import java.awt.event.InputEvent;
  35 import java.awt.event.MouseWheelEvent;
  36 import java.awt.event.KeyEvent;
  37 import java.util.Locale;
  38 
  39 /**
  40  * Translates NSEvents/NPCocoaEvents into AWT events.
  41  */
  42 final class CPlatformResponder {
  43 
  44     private final PlatformEventNotifier eventNotifier;
  45     private final boolean isNpapiCallback;
  46     private int lastKeyPressCode = KeyEvent.VK_UNDEFINED;


  47 
  48     CPlatformResponder(final PlatformEventNotifier eventNotifier,
  49                        final boolean isNpapiCallback) {
  50         this.eventNotifier = eventNotifier;
  51         this.isNpapiCallback = isNpapiCallback;
  52     }
  53 
  54     /**
  55      * Handles mouse events.
  56      */
  57     void handleMouseEvent(int eventType, int modifierFlags, int buttonNumber,
  58                           int clickCount, int x, int y, int absoluteX,
  59                           int absoluteY) {
  60         final SunToolkit tk = (SunToolkit)Toolkit.getDefaultToolkit();
  61         if ((buttonNumber > 2 && !tk.areExtraMouseButtonsEnabled())
  62                 || buttonNumber > tk.getNumberOfButtons() - 1) {
  63             return;
  64         }
  65 
  66         int jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) :


  73             jeventType != MouseEvent.MOUSE_ENTERED &&
  74             jeventType != MouseEvent.MOUSE_EXITED)
  75         {
  76             jbuttonNumber = NSEvent.nsToJavaButton(buttonNumber);
  77             jclickCount = clickCount;
  78         }
  79 
  80         int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber,
  81                                                         modifierFlags);
  82         boolean jpopupTrigger = NSEvent.isPopupTrigger(jmodifiers);
  83 
  84         eventNotifier.notifyMouseEvent(jeventType, System.currentTimeMillis(), jbuttonNumber,
  85                 x, y, absoluteX, absoluteY, jmodifiers, jclickCount,
  86                 jpopupTrigger, null);
  87     }
  88 
  89     /**
  90      * Handles scroll events.
  91      */
  92     void handleScrollEvent(final int x, final int y, final int modifierFlags,
  93                            final double deltaX, final double deltaY) {

  94         final int buttonNumber = CocoaConstants.kCGMouseButtonCenter;
  95         int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber,
  96                                                         modifierFlags);
  97         final boolean isShift = (jmodifiers & InputEvent.SHIFT_DOWN_MASK) != 0;
  98 



  99         // Vertical scroll.
 100         if (!isShift && deltaY != 0.0) {
 101             dispatchScrollEvent(x, y, jmodifiers, deltaY);
 102         }
 103         // Horizontal scroll or shirt+vertical scroll.
 104         final double delta = isShift && deltaY != 0.0 ? deltaY : deltaX;
 105         if (delta != 0.0) {

 106             jmodifiers |= InputEvent.SHIFT_DOWN_MASK;
 107             dispatchScrollEvent(x, y, jmodifiers, delta);
 108         }
 109     }
 110 
 111     private void dispatchScrollEvent(final int x, final int y,
 112                                      final int modifiers, final double delta) {

 113         final long when = System.currentTimeMillis();
 114         final int scrollType = MouseWheelEvent.WHEEL_UNIT_SCROLL;
 115         final int scrollAmount = 1;
 116         int wheelRotation = (int) delta;
 117         int signum = (int) Math.signum(delta);
 118         if (signum * delta < 1) {
 119             wheelRotation = signum;
 120         }
 121         // invert the wheelRotation for the peer
 122         eventNotifier.notifyMouseWheelEvent(when, x, y, modifiers, scrollType,
 123                 scrollAmount, -wheelRotation, -delta, null);
 124     }
 125 
 126     /**
 127      * Handles key events.
 128      */
 129     void handleKeyEvent(int eventType, int modifierFlags, String chars, String charsIgnoringModifiers,
 130                         short keyCode, boolean needsKeyTyped, boolean needsKeyReleased) {
 131         boolean isFlagsChangedEvent =
 132             isNpapiCallback ? (eventType == CocoaConstants.NPCocoaEventFlagsChanged) :
 133                               (eventType == CocoaConstants.NSFlagsChanged);
 134 
 135         int jeventType = KeyEvent.KEY_PRESSED;
 136         int jkeyCode = KeyEvent.VK_UNDEFINED;
 137         int jkeyLocation = KeyEvent.KEY_LOCATION_UNKNOWN;
 138         boolean postsTyped = false;
 139 
 140         char testChar = KeyEvent.CHAR_UNDEFINED;
 141         boolean isDeadChar = (chars!= null && chars.length() == 0);
 142 
 143         if (isFlagsChangedEvent) {


 239             int index = 0, length = text.length();
 240             char c = 0;
 241             while (index < length) {
 242                 c = text.charAt(index);
 243                 eventNotifier.notifyKeyEvent(KeyEvent.KEY_TYPED,
 244                         System.currentTimeMillis(),
 245                         0, KeyEvent.VK_UNDEFINED, c,
 246                         KeyEvent.KEY_LOCATION_UNKNOWN);
 247                 index++;
 248             }
 249             eventNotifier.notifyKeyEvent(KeyEvent.KEY_RELEASED,
 250                     System.currentTimeMillis(),
 251                     0, lastKeyPressCode, c,
 252                     KeyEvent.KEY_LOCATION_UNKNOWN);
 253         }
 254     }
 255 
 256     void handleWindowFocusEvent(boolean gained, LWWindowPeer opposite) {
 257         eventNotifier.notifyActivation(gained, opposite);
 258     }










































 259 }


  27 
  28 import sun.awt.SunToolkit;
  29 import sun.lwawt.LWWindowPeer;
  30 import sun.lwawt.PlatformEventNotifier;
  31 
  32 import java.awt.Toolkit;
  33 import java.awt.event.MouseEvent;
  34 import java.awt.event.InputEvent;
  35 import java.awt.event.MouseWheelEvent;
  36 import java.awt.event.KeyEvent;
  37 import java.util.Locale;
  38 
  39 /**
  40  * Translates NSEvents/NPCocoaEvents into AWT events.
  41  */
  42 final class CPlatformResponder {
  43 
  44     private final PlatformEventNotifier eventNotifier;
  45     private final boolean isNpapiCallback;
  46     private int lastKeyPressCode = KeyEvent.VK_UNDEFINED;
  47     private final DeltaAccumulator deltaAccumulatorX = new DeltaAccumulator();
  48     private final DeltaAccumulator deltaAccumulatorY = new DeltaAccumulator();
  49 
  50     CPlatformResponder(final PlatformEventNotifier eventNotifier,
  51                        final boolean isNpapiCallback) {
  52         this.eventNotifier = eventNotifier;
  53         this.isNpapiCallback = isNpapiCallback;
  54     }
  55 
  56     /**
  57      * Handles mouse events.
  58      */
  59     void handleMouseEvent(int eventType, int modifierFlags, int buttonNumber,
  60                           int clickCount, int x, int y, int absoluteX,
  61                           int absoluteY) {
  62         final SunToolkit tk = (SunToolkit)Toolkit.getDefaultToolkit();
  63         if ((buttonNumber > 2 && !tk.areExtraMouseButtonsEnabled())
  64                 || buttonNumber > tk.getNumberOfButtons() - 1) {
  65             return;
  66         }
  67 
  68         int jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) :


  75             jeventType != MouseEvent.MOUSE_ENTERED &&
  76             jeventType != MouseEvent.MOUSE_EXITED)
  77         {
  78             jbuttonNumber = NSEvent.nsToJavaButton(buttonNumber);
  79             jclickCount = clickCount;
  80         }
  81 
  82         int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber,
  83                                                         modifierFlags);
  84         boolean jpopupTrigger = NSEvent.isPopupTrigger(jmodifiers);
  85 
  86         eventNotifier.notifyMouseEvent(jeventType, System.currentTimeMillis(), jbuttonNumber,
  87                 x, y, absoluteX, absoluteY, jmodifiers, jclickCount,
  88                 jpopupTrigger, null);
  89     }
  90 
  91     /**
  92      * Handles scroll events.
  93      */
  94     void handleScrollEvent(final int x, final int y, final int modifierFlags,
  95                            final double deltaX, final double deltaY,
  96                            final int scrollPhase) {
  97         final int buttonNumber = CocoaConstants.kCGMouseButtonCenter;
  98         int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber,
  99                                                         modifierFlags);
 100         final boolean isShift = (jmodifiers & InputEvent.SHIFT_DOWN_MASK) != 0;
 101 
 102         int roundDeltaX = deltaAccumulatorX.getRoundedDelta(deltaX, scrollPhase);
 103         int roundDeltaY = deltaAccumulatorY.getRoundedDelta(deltaY, scrollPhase);
 104 
 105         // Vertical scroll.
 106         if (!isShift && (deltaY != 0.0 || roundDeltaY != 0)) {
 107             dispatchScrollEvent(x, y, jmodifiers, roundDeltaY, deltaY);
 108         }
 109         // Horizontal scroll or shirt+vertical scroll.
 110         final double delta = isShift && deltaY != 0.0 ? deltaY : deltaX;
 111         final int roundDelta = isShift && roundDeltaY != 0 ? roundDeltaY : roundDeltaX;
 112         if (delta != 0.0 || roundDelta != 0) {
 113             jmodifiers |= InputEvent.SHIFT_DOWN_MASK;
 114             dispatchScrollEvent(x, y, jmodifiers, roundDelta, delta);
 115         }
 116     }
 117 
 118     private void dispatchScrollEvent(final int x, final int y,
 119                                      final int modifiers,
 120                                      final int roundDelta, final double delta) {
 121         final long when = System.currentTimeMillis();
 122         final int scrollType = MouseWheelEvent.WHEEL_UNIT_SCROLL;
 123         final int scrollAmount = 1;





 124         // invert the wheelRotation for the peer
 125         eventNotifier.notifyMouseWheelEvent(when, x, y, modifiers, scrollType,
 126                 scrollAmount, -roundDelta, -delta, null);
 127     }
 128 
 129     /**
 130      * Handles key events.
 131      */
 132     void handleKeyEvent(int eventType, int modifierFlags, String chars, String charsIgnoringModifiers,
 133                         short keyCode, boolean needsKeyTyped, boolean needsKeyReleased) {
 134         boolean isFlagsChangedEvent =
 135             isNpapiCallback ? (eventType == CocoaConstants.NPCocoaEventFlagsChanged) :
 136                               (eventType == CocoaConstants.NSFlagsChanged);
 137 
 138         int jeventType = KeyEvent.KEY_PRESSED;
 139         int jkeyCode = KeyEvent.VK_UNDEFINED;
 140         int jkeyLocation = KeyEvent.KEY_LOCATION_UNKNOWN;
 141         boolean postsTyped = false;
 142 
 143         char testChar = KeyEvent.CHAR_UNDEFINED;
 144         boolean isDeadChar = (chars!= null && chars.length() == 0);
 145 
 146         if (isFlagsChangedEvent) {


 242             int index = 0, length = text.length();
 243             char c = 0;
 244             while (index < length) {
 245                 c = text.charAt(index);
 246                 eventNotifier.notifyKeyEvent(KeyEvent.KEY_TYPED,
 247                         System.currentTimeMillis(),
 248                         0, KeyEvent.VK_UNDEFINED, c,
 249                         KeyEvent.KEY_LOCATION_UNKNOWN);
 250                 index++;
 251             }
 252             eventNotifier.notifyKeyEvent(KeyEvent.KEY_RELEASED,
 253                     System.currentTimeMillis(),
 254                     0, lastKeyPressCode, c,
 255                     KeyEvent.KEY_LOCATION_UNKNOWN);
 256         }
 257     }
 258 
 259     void handleWindowFocusEvent(boolean gained, LWWindowPeer opposite) {
 260         eventNotifier.notifyActivation(gained, opposite);
 261     }
 262 
 263     static class DeltaAccumulator {
 264 
 265         static final double MIN_THRESHOLD = 0.1;
 266         static final double MAX_THRESHOLD = 0.5;
 267         double accumulatedDelta;
 268 
 269         int getRoundedDelta(double delta, int scrollPhase) {
 270 
 271             int roundDelta = (int) Math.round(delta);
 272 
 273             if (scrollPhase == NSEvent.SCROLL_PHASE_UNSUPPORTED) { // mouse wheel
 274                 if (roundDelta == 0 && delta != 0) {
 275                     roundDelta = delta > 0 ? 1 : -1;
 276                 }
 277             } else { // trackpad
 278                 boolean begin = scrollPhase == NSEvent.SCROLL_PHASE_BEGAN;
 279                 boolean end = scrollPhase == NSEvent.SCROLL_MASK_PHASE_ENDED
 280                         || scrollPhase == NSEvent.SCROLL_MASK_PHASE_CANCELLED;
 281 
 282                 if (begin) {
 283                     accumulatedDelta = 0;
 284                 }
 285 
 286                 accumulatedDelta += delta;
 287 
 288                 double absAccumulatedDelta = Math.abs(accumulatedDelta);
 289                 if (absAccumulatedDelta > MAX_THRESHOLD) {
 290                     roundDelta = (int) Math.round(accumulatedDelta);
 291                     accumulatedDelta -= roundDelta;
 292                 }
 293 
 294                 if (end) {
 295                     if (roundDelta == 0 && absAccumulatedDelta > MIN_THRESHOLD) {
 296                         roundDelta = accumulatedDelta > 0 ? 1 : -1;
 297                     }
 298                 }
 299             }
 300 
 301             return roundDelta;
 302         }
 303     }
 304 }
< prev index next >