]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/scrolbar.mm
Spell contributor name correctly.
[wxWidgets.git] / src / osx / cocoa / scrolbar.mm
index e2a7b01f98ce40dcaf7bd36d85c18cc5948b7a69..dd9c9e18dcc3f2faacfeb82dff099c76f676ab84 100644 (file)
     #include "wx/settings.h"
 #endif
 
+#include "wx/math.h"
 #include "wx/osx/private.h"
 
 @interface wxNSScroller : NSScroller
 {
-    wxWidgetCocoaImpl* impl;
 }
-
-- (void)setImplementation: (wxWidgetCocoaImpl *) theImplementation;
-- (wxWidgetCocoaImpl*) implementation;
-- (BOOL) isFlipped;
- - (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;
-}
-
-- (void) clickedAction: (id) sender
++ (void)initialize
 {
-    if ( impl )
+    static BOOL initialized = NO;
+    if (!initialized)
     {
-        wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
-        if ( wxpeer )
-            wxpeer->HandleClicked(0);
+        initialized = YES;
+        wxOSXCocoaClassAddWXMethods(self);
     }
 }
 
-- (void)setImplementation: (wxWidgetCocoaImpl *) theImplementation
-{
-    impl = theImplementation;
-}
-
-- (wxWidgetCocoaImpl*) implementation
-{
-    return impl ;
-}
-
-- (BOOL) isFlipped
-{
-    return YES;
-}
-
 @end
 
 class wxOSXScrollBarCocoaImpl : public wxWidgetCocoaImpl
@@ -76,17 +46,18 @@ class wxOSXScrollBarCocoaImpl : public wxWidgetCocoaImpl
 public :
     wxOSXScrollBarCocoaImpl( wxWindowMac* peer, WXWidget w) : wxWidgetCocoaImpl( peer, w )
     {
+        m_maximum = 1;
     }
-    
+
     void SetMaximum(wxInt32 v)
     {
-        m_maximum = 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
@@ -94,27 +65,93 @@ public :
         [(wxNSScroller*) m_osxView setKnobProportion:t];
 #endif
     }
-    
-    wxInt32 GetValue() const
+
+    virtual wxInt32 GetValue() const
+    {
+        return wxRound([(wxNSScroller*) m_osxView floatValue] * m_maximum);
+    }
+
+    virtual wxInt32 GetMaximum() const
     {
-        return [(wxNSScroller*) m_osxView floatValue] * m_maximum;
+        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;
 }