Buggy code:
public class ScrollBar extends Widget { NSScroller view ; Scrollable parent ; int minimum ; int maximum = 100 ; int thumb = 10 ; int increment = 1 ; int pageIncrement = 10 ; id target ; int actionSelector ; ScrollBar ( ) { } public void addSelectionListener ( SelectionListener listener ) { } static int checkStyle ( int style ) { } void deregister ( ) { } boolean getDrawing ( ) { } public boolean getEnabled ( ) { } public int getIncrement ( ) { } public int getMaximum ( ) { } public int getMinimum ( ) { } public int getPageIncrement ( ) { } public Scrollable getParent ( ) { } public int getSelection ( ) { } public Point getSize ( ) { } public int getThumb ( ) { } public Rectangle getThumbBounds ( ) { } public Rectangle getThumbTrackBounds ( ) { } public boolean getVisible ( ) { } public boolean isEnabled ( ) { } boolean isDrawing ( ) { } public boolean isVisible ( ) { } public void removeSelectionListener ( SelectionListener listener ) { } void register ( ) { } void releaseHandle ( ) { } void releaseParent ( ) { } void releaseWidget ( ) { } void sendSelection ( ) { NSWindow window = view . window ( ) ; boolean disableFlush = ( target ) == null ; try { if ( disableFlush ) { window . retain ( ) ; window . disableFlushWindow ( ) ; } int value = 0 ; if ( ( target ) != null ) { view . sendAction ( actionSelector , target ) ; } else { value = getSelection ( ) ; } NSPoint point ; NSEvent nsEvent = NSApplication . sharedApplication ( ) . currentEvent ( ) ; if ( nsEvent != null ) { point = nsEvent . locationInWindow ( ) ; if ( ( nsEvent . window ( ) ) == null ) point = window . convertScreenToBase ( point ) ; } else { point = window . mouseLocationOutsideOfEventStream ( ) ; } int hitPart = ( ( int ) ( ( ( NSScroller ) ( view ) ) . testPart ( point ) ) ) ; Event event = new Event ( ) ; switch ( hitPart ) { case OS . NSScrollerDecrementLine : value -= increment ; event . detail = SWT . ARROW_UP ; break ; case OS . NSScrollerDecrementPage : value -= pageIncrement ; event . detail = SWT . PAGE_UP ; break ; case OS . NSScrollerIncrementLine : value += increment ; event . detail = SWT . ARROW_DOWN ; break ; case OS . NSScrollerIncrementPage : value += pageIncrement ; event . detail = SWT . PAGE_DOWN ; break ; case OS . NSScrollerKnob : event . detail = SWT . DRAG ; break ; } if ( ( target ) == null ) { if ( ( event . detail ) != ( SWT . DRAG ) ) { setSelection ( value ) ; } } <START_BUG> sendEvent ( Selection , event ) ; <END_BUG> } finally { if ( disableFlush ) { window . enableFlushWindow ( ) ; window . release ( ) ; } } } public void setIncrement ( int value ) { } void setClipRegion ( float x , float y ) { } public void setEnabled ( boolean enabled ) { } void enableWidget ( boolean enabled ) { } public void setMaximum ( int value ) { } public void setMinimum ( int value ) { } public void setPageIncrement ( int value ) { } public void setSelection ( int value ) { } public void setThumb ( int value ) { } public void setValues ( int selection , int minimum , int maximum , int thumb , int increment , int pageIncrement ) { } public void setVisible ( boolean visible ) { } void updateBar ( int selection , int minimum , int maximum , int thumb ) { } }

Fix:
sendSelectionEvent ( Selection , event , true ) ;