void key(NSEvent nsEvent) { int nsType = (int) /*64*/ nsEvent.type(); long /*int*/ modifierFlags = nsEvent.modifierFlags(); int nsKeyCode = nsEvent.keyCode(); int keyCode = Display.translateKey(nsKeyCode); switch (nsType) { case OS.NSKeyDown: case OS.NSKeyUp: { Event event = new Event(); event.keyCode = keyCode; int type = nsType == OS.NSKeyDown ? SWT.KeyDown : SWT.KeyUp; if (!setKeyState(event, type, nsEvent)) break; if (!sendKeyEvent(type, event)) return; break; } case OS.NSFlagsChanged: { int mask = 0; switch (keyCode) { case SWT.ALT: mask = OS.NSAlternateKeyMask; break; case SWT.CONTROL: mask = OS.NSControlKeyMask; break; case SWT.COMMAND: mask = OS.NSCommandKeyMask; break; case SWT.SHIFT: mask = OS.NSShiftKeyMask; break; case SWT.CAPS_LOCK: Event event = new Event(); event.keyCode = keyCode; setInputState(event, nsEvent, SWT.KeyDown); sendKeyEvent(SWT.KeyDown, event); setInputState(event, nsEvent, SWT.KeyUp); sendKeyEvent(SWT.KeyUp, event); break; } if (mask != 0) { int type = (mask & modifierFlags) != 0 ? SWT.KeyDown : SWT.KeyUp; Event event = new Event(); event.keyCode = keyCode; setLocationMask(event, nsEvent); setInputState(event, nsEvent, type); if (!sendKeyEvent(type, event)) return; } break; } } int stepSize = (modifierFlags & OS.NSControlKeyMask) != 0 ? STEPSIZE_SMALL : STEPSIZE_LARGE; int xChange = 0, yChange = 0; switch (nsKeyCode) { case 53: /* Esc */ cancelled = true; tracking = false; break; case 76: /* KP Enter */ case 36: /* Return */ tracking = false; break; case 123: /* Left arrow */ xChange = -stepSize; break; case 124: /* Right arrow */ xChange = stepSize; break; case 126: /* Up arrow */ yChange = -stepSize; break; case 125: /* Down arrow */ yChange = stepSize; break; } if (xChange != 0 || yChange != 0) { Rectangle[] oldRectangles = rectangles; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); int newX = oldX + xChange; int newY = oldY + yChange; event.x = newX; event.y = newY; Point cursorPos; if ((style & SWT.RESIZE) != 0) { resizeRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Resize, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustResizeCursor(true); } else { moveRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Move, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX = cursorPos.x; oldY = cursorPos.y; } } }
void key(NSEvent nsEvent) { // TODO send event // if (!sendKeyEvent (SWT.KeyDown, theEvent)) return OS.noErr; int modifierFlags = nsEvent.modifierFlags(); int stepSize = (modifierFlags & OS.NSControlKeyMask) != 0 ? STEPSIZE_SMALL : STEPSIZE_LARGE; int xChange = 0, yChange = 0; switch (nsEvent.keyCode()) { case 53: /* Esc */ cancelled = true; tracking = false; break; case 76: /* KP Enter */ case 36: /* Return */ tracking = false; break; case 123: /* Left arrow */ xChange = -stepSize; break; case 124: /* Right arrow */ xChange = stepSize; break; case 126: /* Up arrow */ yChange = -stepSize; break; case 125: /* Down arrow */ yChange = stepSize; break; } if (xChange != 0 || yChange != 0) { Rectangle[] oldRectangles = rectangles; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); int newX = oldX + xChange; int newY = oldY + yChange; event.x = newX; event.y = newY; Point cursorPos; if ((style & SWT.RESIZE) != 0) { resizeRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Resize, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustResizeCursor(true); } else { moveRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Move, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX = cursorPos.x; oldY = cursorPos.y; } } }