diff options
author | Silenio Quarti <silenio> | 2008-06-13 19:31:43 +0000 |
---|---|---|
committer | Silenio Quarti <silenio> | 2008-06-13 19:31:43 +0000 |
commit | 0479445ea161c359597bce014f4edffc387571e2 (patch) | |
tree | 5daad440fb2b208e1d264831d9bf554bdf09e0cc | |
parent | 932d450a4f72f04fe01a716839f938ce69cfa9f7 (diff) | |
download | eclipse.platform.swt-0479445ea161c359597bce014f4edffc387571e2.tar.gz eclipse.platform.swt-0479445ea161c359597bce014f4edffc387571e2.tar.xz eclipse.platform.swt-0479445ea161c359597bce014f4edffc387571e2.zip |
230120 - Mouse scrolling support in Cocoa applications (SWT.MouseWheel implemented)
5 files changed, 85 insertions, 31 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Composite.java index 85a5743278..5e255e36b8 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Composite.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Composite.java @@ -683,6 +683,16 @@ Point minimumSize (int wHint, int Hint, boolean changed) { return new Point (width, height); } +void pageDown(int id, int sel, int sender) { + if ((state & CANVAS) != 0) return; + super.pageDown(id, sel, sender); +} + +void pageUp(int id, int sel, int sender) { + if ((state & CANVAS) != 0) return; + super.pageUp(id, sel, sender); +} + void releaseChildren (boolean destroy) { Control [] children = _getChildren (); for (int i=0; i<children.length; i++) { @@ -712,6 +722,42 @@ void resized () { } } +void scrollWheel (int id, int sel, int theEvent) { + if ((state & CANVAS) != 0) { + NSEvent nsEvent = new NSEvent(theEvent); + float delta = nsEvent.deltaY(); + if (delta != 0) { + if (hooks (SWT.MouseWheel) || filters (SWT.MouseWheel)) { + if (!sendMouseEvent(nsEvent, SWT.MouseWheel, true)) { + return; + } + } + } + boolean handled = false; + ScrollBar bar = verticalBar; + if (delta != 0 && bar != null && bar.getEnabled ()) { + int selection = Math.max (0, (int)(0.5f + bar.getSelection () - bar.getIncrement () * delta)); + bar.setSelection (selection); + Event event = new Event (); + event.detail = delta > 0 ? SWT.PAGE_UP : SWT.PAGE_DOWN; + bar.sendEvent (SWT.Selection, event); + handled = true; + } + bar = horizontalBar; + delta = nsEvent.deltaX (); + if (delta != 0 && bar != null && bar.getEnabled ()) { + int selection = Math.max (0, (int)(0.5f + bar.getSelection () - bar.getIncrement () * delta)); + bar.setSelection (selection); + Event event = new Event (); + event.detail = delta > 0 ? SWT.PAGE_UP : SWT.PAGE_DOWN; + bar.sendEvent (SWT.Selection, event); + handled = true; + } + if (!handled) view.superview().scrollWheel(nsEvent); + return; + } + super.scrollWheel (id, sel, theEvent); +} /** * Sets the background drawing mode to the argument which should diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Control.java index 36ad059312..b421598c69 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Control.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Control.java @@ -1523,6 +1523,18 @@ Decorations menuShell () { return parent.menuShell (); } +void scrollWheel (int id, int sel, int theEvent) { + if (hooks (SWT.MouseWheel) || filters (SWT.MouseWheel)) { + NSEvent nsEvent = new NSEvent(theEvent); + if (nsEvent.deltaY() != 0) { + if (!sendMouseEvent(nsEvent, SWT.MouseWheel, true)) { + return; + } + } + } + super.scrollWheel(id, sel, theEvent); +} + boolean setInputState (Event event, NSEvent nsEvent, int type) { if (nsEvent == null) return true; int modifierFlags = nsEvent.modifierFlags(); @@ -2246,27 +2258,27 @@ void sendFocusEvent (int type, boolean post) { } boolean sendMouseEvent (NSEvent nsEvent, int type, boolean send) { - int button = 0; + Event event = new Event (); switch (type) { case SWT.MouseDown: case SWT.MouseUp: case SWT.MouseDoubleClick: - button = nsEvent.buttonNumber(); + int button = nsEvent.buttonNumber(); switch (button) { - case 0: button = 1; break; - case 1: button = 3; break; - case 2: button = 2; break; - case 3: button = 4; break; - case 4: button = 5; break; + case 0: event.button = 1; break; + case 1: event.button = 3; break; + case 2: event.button = 2; break; + case 3: event.button = 4; break; + case 4: event.button = 5; break; } break; + case SWT.MouseWheel: + event.detail = SWT.SCROLL_LINE; + float delta = nsEvent.deltaY(); + event.count = delta > 0 ? Math.max (1, (int)delta) : Math.min (-1, (int)delta); + break; } - Event event = new Event (); - event.button = button; -// event.detail = detail; - if (button != 0) { - event.count = nsEvent.clickCount(); - } + if (event.button != 0) event.count = nsEvent.clickCount(); NSPoint windowPoint = view.window().convertScreenToBase(NSEvent.mouseLocation()); NSPoint point = view.convertPoint_fromView_(windowPoint, null); event.x = (int) point.x; @@ -2281,10 +2293,6 @@ boolean sendMouseEvent (NSEvent nsEvent, int type, boolean send) { return event.doit; } -boolean sendMouseWheel (short wheelAxis, int wheelDelta) { - return false; -} - void setBackground () { // redrawWidget (handle, false); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java index 82ebaa29fe..eece063376 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java @@ -1677,6 +1677,8 @@ void initClasses () { OS.class_addIvar(cls, SWT_OBJECT, OS.PTR_SIZEOF, (byte)(Math.log(OS.PTR_SIZEOF) / Math.log(2)), "i"); OS.class_addMethod(cls, OS.sel_sendVerticalSelection, proc2, "@:"); OS.class_addMethod(cls, OS.sel_sendHorizontalSelection, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_pageDown_1, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_pageUp_1, proc3, "@:@"); addEventMethods(cls, proc2, proc3); addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); OS.objc_registerClassPair(cls); @@ -3420,6 +3422,10 @@ int windowDelegateProc(int id, int sel, int arg0) { widget.helpRequested(arg0); } else if (sel == OS.sel_scrollWheel_1) { widget.scrollWheel(id, sel, arg0); + } else if (sel == OS.sel_pageDown_1) { + widget.pageDown(id, sel, arg0); + } else if (sel == OS.sel_pageUp_1) { + widget.pageUp(id, sel, arg0); } return 0; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Scrollable.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Scrollable.java index 620ed9339b..cc68da4cc2 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Scrollable.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Scrollable.java @@ -287,20 +287,6 @@ void sendHorizontalSelection () { horizontalBar.sendSelection (); } -boolean sendMouseWheel (short wheelAxis, int wheelDelta) { -// if ((state & CANVAS) != 0) { -// ScrollBar bar = wheelAxis == OS.kEventMouseWheelAxisX ? horizontalBar : verticalBar; -// if (bar != null && bar.getEnabled ()) { -// bar.setSelection (Math.max (0, bar.getSelection () - bar.getIncrement () * wheelDelta)); -// Event event = new Event (); -// event.detail = wheelDelta > 0 ? SWT.PAGE_UP : SWT.PAGE_DOWN; -// bar.sendEvent (SWT.Selection, event); -// return true; -// } -// } - return false; -} - void sendVerticalSelection () { verticalBar.sendSelection (); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java index 23a3272f7f..7bdc26f16a 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Widget.java @@ -749,6 +749,14 @@ public void notifyListeners (int eventType, Event event) { sendEvent (eventType, event); } +void pageDown (int id, int sel, int sender) { + callSuper(id, sel, sender); +} + +void pageUp (int id, int sel, int sender) { + callSuper(id, sel, sender); +} + void postEvent (int eventType) { sendEvent (eventType, null, false); } |