X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/19c7ac3d3bf1ac2113505a805a79c40ce3db1f5b..a51e79e87db3512823258d487849bb7e7947b700:/src/osx/cocoa/scrolbar.mm diff --git a/src/osx/cocoa/scrolbar.mm b/src/osx/cocoa/scrolbar.mm index 74168cf6e0..10399d7619 100644 --- a/src/osx/cocoa/scrolbar.mm +++ b/src/osx/cocoa/scrolbar.mm @@ -4,7 +4,7 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: scrolbar.cpp 54129 2008-06-11 19:30:52Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -19,84 +19,23 @@ #include "wx/settings.h" #endif +#include "wx/math.h" #include "wx/osx/private.h" @interface wxNSScroller : NSScroller { - WXCOCOAIMPL_COMMON_MEMBERS } - -WXCOCOAIMPL_COMMON_INTERFACE - - - (void) clickedAction: (id) sender; - @end @implementation wxNSScroller -- (id)initWithFrame:(NSRect)frame -{ - [super initWithFrame:frame]; - impl = NULL; - [self setTarget: self]; - [self setAction: @selector(clickedAction:)]; - return self; -} - -WXCOCOAIMPL_COMMON_IMPLEMENTATION_NO_MOUSEDOWN - -// we will have a mouseDown, then in the native -// implementation of mouseDown the tracking code -// is calling clickedAction, therefore we wire this -// to thumbtrack and only after super mouseDown -// returns we will call the thumbrelease - -- (void) clickedAction: (id) sender ++ (void)initialize { - if ( impl ) + static BOOL initialized = NO; + if (!initialized) { - wxEventType scrollEvent = wxEVT_NULL; - switch ([self hitPart]) - { - case NSScrollerIncrementLine: - scrollEvent = wxEVT_SCROLL_LINEDOWN; - break; - case NSScrollerIncrementPage: - scrollEvent = wxEVT_SCROLL_PAGEDOWN; - break; - case NSScrollerDecrementLine: - scrollEvent = wxEVT_SCROLL_LINEUP; - break; - case NSScrollerDecrementPage: - scrollEvent = wxEVT_SCROLL_PAGEUP; - break; - case NSScrollerKnob: - case NSScrollerKnobSlot: - scrollEvent = wxEVT_SCROLL_THUMBTRACK; - break; - case NSScrollerNoPart: - default: - return; - } - - wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); - if ( wxpeer ) - wxpeer->TriggerScrollEvent(scrollEvent); - } -} - --(void)mouseDown:(NSEvent *)event -{ - if ( !impl->DoHandleMouseEvent(event) ) - [super mouseDown:event]; - - // send a release event in case we've been tracking the thumb - NSScrollerPart hit = [self hitPart]; - if ( impl && (hit == NSScrollerKnob || hit == NSScrollerKnobSlot) ) - { - wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); - if ( wxpeer ) - wxpeer->TriggerScrollEvent(wxEVT_SCROLL_THUMBRELEASE); + initialized = YES; + wxOSXCocoaClassAddWXMethods(self); } } @@ -109,16 +48,16 @@ public : { m_maximum = 1; } - + void SetMaximum(wxInt32 v) { m_maximum = (v == 0) ? 1 : v; } - - void SetScrollThumb( wxInt32 value, wxInt32 thumbSize ) + + void SetScrollThumb( wxInt32 value, wxInt32 thumbSize ) { double v = ((double) value)/m_maximum; - double t = ((double) thumbSize)/m_maximum; + double t = ((double) thumbSize)/(m_maximum+thumbSize); #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 [(wxNSScroller*) m_osxView setFloatValue:v knobProportion:t]; #else @@ -126,33 +65,93 @@ public : [(wxNSScroller*) m_osxView setKnobProportion:t]; #endif } - - wxInt32 GetValue() const + + virtual wxInt32 GetValue() const { - return [(wxNSScroller*) m_osxView floatValue] * m_maximum; + return wxRound([(wxNSScroller*) m_osxView floatValue] * m_maximum); } - - wxInt32 GetMaximum() const + + virtual wxInt32 GetMaximum() const { return m_maximum; } + + virtual void controlAction(WXWidget slf, void* _cmd, void *sender); + virtual void mouseEvent(WX_NSEvent event, WXWidget slf, void* _cmd); protected: wxInt32 m_maximum; }; -wxWidgetImplType* wxWidgetImpl::CreateScrollBar( wxWindowMac* wxpeer, - wxWindowMac* parent, - wxWindowID id, - const wxPoint& pos, +// we will have a mouseDown, then in the native +// implementation of mouseDown the tracking code +// is calling clickedAction, therefore we wire this +// to thumbtrack and only after super mouseDown +// returns we will call the thumbrelease + +void wxOSXScrollBarCocoaImpl::controlAction( WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd), void *WXUNUSED(sender)) +{ + wxEventType scrollEvent = wxEVT_NULL; + switch ([(NSScroller*)m_osxView hitPart]) + { + case NSScrollerIncrementLine: + scrollEvent = wxEVT_SCROLL_LINEDOWN; + break; + case NSScrollerIncrementPage: + scrollEvent = wxEVT_SCROLL_PAGEDOWN; + break; + case NSScrollerDecrementLine: + scrollEvent = wxEVT_SCROLL_LINEUP; + break; + case NSScrollerDecrementPage: + scrollEvent = wxEVT_SCROLL_PAGEUP; + break; + case NSScrollerKnob: + case NSScrollerKnobSlot: + scrollEvent = wxEVT_SCROLL_THUMBTRACK; + break; + case NSScrollerNoPart: + default: + return; + } + + wxWindow* wxpeer = (wxWindow*) GetWXPeer(); + if ( wxpeer ) + wxpeer->TriggerScrollEvent(scrollEvent); +} + +void wxOSXScrollBarCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) +{ + wxWidgetCocoaImpl::mouseEvent(event, slf, _cmd); + + // send a release event in case we've been tracking the thumb + if ( strcmp( sel_getName((SEL) _cmd) , "mouseDown:") == 0 ) + { + NSScrollerPart hit = [(NSScroller*)m_osxView hitPart]; + if ( (hit == NSScrollerKnob || hit == NSScrollerKnobSlot) ) + { + wxWindow* wxpeer = (wxWindow*) GetWXPeer(); + if ( wxpeer ) + wxpeer->OSXHandleClicked(0); + } + } +} + +wxWidgetImplType* wxWidgetImpl::CreateScrollBar( wxWindowMac* wxpeer, + wxWindowMac* WXUNUSED(parent), + wxWindowID WXUNUSED(id), + const wxPoint& pos, const wxSize& size, - long style, - long extraStyle) + long style, + long WXUNUSED(extraStyle)) { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; - wxNSScroller* v = [[wxNSScroller alloc] initWithFrame:r]; + // the creation rect defines the orientation + NSRect createRect = ( style & wxSB_HORIZONTAL ) ? NSMakeRect(r.origin.x, r.origin.y , 17, 16) : + NSMakeRect(r.origin.x, r.origin.y , 16, 17); + wxNSScroller* v = [[wxNSScroller alloc] initWithFrame:createRect]; + [v setFrame:r]; wxWidgetCocoaImpl* c = new wxOSXScrollBarCocoaImpl( wxpeer, v ); - [v setImplementation:c]; [v setEnabled:YES]; return c; }