]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/scrolbar.mm
Spell contributor name correctly.
[wxWidgets.git] / src / osx / cocoa / scrolbar.mm
index 74168cf6e00b4cd8269728a52f0a9dcb3c69e144..dd9c9e18dcc3f2faacfeb82dff099c76f676ab84 100644 (file)
     #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;
 }