]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/scrolbar.mm
move wxGridCellRenderer::Draw before other derived classes implementations (no real...
[wxWidgets.git] / src / osx / cocoa / scrolbar.mm
index e2a7b01f98ce40dcaf7bd36d85c18cc5948b7a69..3cac87abdf255ff0e7f528a266c2bf1fa2694c02 100644 (file)
 
 @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 +45,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 ) 
     {
         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
@@ -95,14 +65,76 @@ public :
 #endif
     }
     
-    wxInt32 GetValue() const
+    virtual wxInt32 GetValue() const
     {
         return [(wxNSScroller*) m_osxView floatValue] * m_maximum;
     }
+    
+    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;
 };
 
+// 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 slf, void *_cmd, void *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* parent, 
                                     wxWindowID id, 
@@ -115,6 +147,6 @@ wxWidgetImplType* wxWidgetImpl::CreateScrollBar( wxWindowMac* wxpeer,
     wxNSScroller* v = [[wxNSScroller alloc] initWithFrame:r];
 
     wxWidgetCocoaImpl* c = new wxOSXScrollBarCocoaImpl( wxpeer, v );
-    [v setImplementation:c];
+    [v setEnabled:YES];
     return c;
 }