]> git.saurik.com Git - wxWidgets.git/commitdiff
wxCocoa: Added wxScrollBar
authorDavid Elliott <dfe@tgwbd.org>
Wed, 23 Jun 2004 15:26:44 +0000 (15:26 +0000)
committerDavid Elliott <dfe@tgwbd.org>
Wed, 23 Jun 2004 15:26:44 +0000 (15:26 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27967 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

Makefile.in
build/bakefiles/files.bkl
include/wx/cocoa/NSScroller.h [new file with mode: 0644]
include/wx/cocoa/scrolbar.h [new file with mode: 0644]
include/wx/scrolbar.h
src/cocoa/NSScroller.mm [new file with mode: 0644]
src/cocoa/scrolbar.mm [new file with mode: 0644]

index 1d92534dc664c8e5e4e40b273553b9d845fbe439..f775bd92a94cb78b992310caaa0cbe5f21f3383b 100644 (file)
@@ -1181,6 +1181,7 @@ COND_TOOLKIT_COCOA_GUI_HDR =  \
        wx/cocoa/NSControl.h \
        wx/cocoa/NSMenu.h \
        wx/cocoa/NSPanel.h \
+       wx/cocoa/NSScroller.h \
        wx/cocoa/NSTabView.h \
        wx/cocoa/NSTableView.h \
        wx/cocoa/NSTextField.h \
@@ -1226,6 +1227,7 @@ COND_TOOLKIT_COCOA_GUI_HDR =  \
        wx/cocoa/radiobox.h \
        wx/cocoa/radiobut.h \
        wx/cocoa/region.h \
+       wx/cocoa/scrolbar.h \
        wx/cocoa/slider.h \
        wx/cocoa/spinbutt.h \
        wx/cocoa/statbmp.h \
@@ -2571,6 +2573,7 @@ COND_TOOLKIT_COCOA___GUI_SRC_OBJECTS =  \
        monodll_NSControl.o \
        monodll_NSMenu.o \
        monodll_NSPanel.o \
+       monodll_NSScroller.o \
        monodll_NSTabView.o \
        monodll_NSTableView.o \
        monodll_NSTextField.o \
@@ -2616,6 +2619,7 @@ COND_TOOLKIT_COCOA___GUI_SRC_OBJECTS =  \
        monodll_radiobox.o \
        monodll_radiobut.o \
        monodll_region.o \
+       monodll_scrolbar.o \
        monodll_settings.o \
        monodll_slider.o \
        monodll_spinbutt.o \
@@ -3431,6 +3435,7 @@ COND_TOOLKIT_COCOA___GUI_SRC_OBJECTS_1 =  \
        monolib_NSControl.o \
        monolib_NSMenu.o \
        monolib_NSPanel.o \
+       monolib_NSScroller.o \
        monolib_NSTabView.o \
        monolib_NSTableView.o \
        monolib_NSTextField.o \
@@ -3476,6 +3481,7 @@ COND_TOOLKIT_COCOA___GUI_SRC_OBJECTS_1 =  \
        monolib_radiobox.o \
        monolib_radiobut.o \
        monolib_region.o \
+       monolib_scrolbar.o \
        monolib_settings.o \
        monolib_slider.o \
        monolib_spinbutt.o \
@@ -4463,6 +4469,7 @@ COND_TOOLKIT_COCOA___GUI_SRC_OBJECTS_2 =  \
        coredll_NSControl.o \
        coredll_NSMenu.o \
        coredll_NSPanel.o \
+       coredll_NSScroller.o \
        coredll_NSTabView.o \
        coredll_NSTableView.o \
        coredll_NSTextField.o \
@@ -4508,6 +4515,7 @@ COND_TOOLKIT_COCOA___GUI_SRC_OBJECTS_2 =  \
        coredll_radiobox.o \
        coredll_radiobut.o \
        coredll_region.o \
+       coredll_scrolbar.o \
        coredll_settings.o \
        coredll_slider.o \
        coredll_spinbutt.o \
@@ -5190,6 +5198,7 @@ COND_TOOLKIT_COCOA___GUI_SRC_OBJECTS_3 =  \
        corelib_NSControl.o \
        corelib_NSMenu.o \
        corelib_NSPanel.o \
+       corelib_NSScroller.o \
        corelib_NSTabView.o \
        corelib_NSTableView.o \
        corelib_NSTextField.o \
@@ -5235,6 +5244,7 @@ COND_TOOLKIT_COCOA___GUI_SRC_OBJECTS_3 =  \
        corelib_radiobox.o \
        corelib_radiobut.o \
        corelib_region.o \
+       corelib_scrolbar.o \
        corelib_settings.o \
        corelib_slider.o \
        corelib_spinbutt.o \
@@ -8147,6 +8157,9 @@ monodll_NSMenu.o: $(srcdir)/src/cocoa/NSMenu.mm $(MONODLL_ODEP)
 monodll_NSPanel.o: $(srcdir)/src/cocoa/NSPanel.mm $(MONODLL_ODEP)
        $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
 
+monodll_NSScroller.o: $(srcdir)/src/cocoa/NSScroller.mm $(MONODLL_ODEP)
+       $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
+
 monodll_NSTabView.o: $(srcdir)/src/cocoa/NSTabView.mm $(MONODLL_ODEP)
        $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
 
@@ -10064,6 +10077,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_MAC_USE_GUI_1_WXUNIV_0@monodll_scrolbar.o: $(srcdir)/src/mac/carbon/scrolbar.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_MAC_USE_GUI_1_WXUNIV_0@  $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
 
+@COND_TOOLKIT_COCOA_USE_GUI_1_WXUNIV_0@monodll_scrolbar.o: $(srcdir)/src/cocoa/scrolbar.mm $(MONODLL_ODEP)
+@COND_TOOLKIT_COCOA_USE_GUI_1_WXUNIV_0@        $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
+
 @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@monodll_scrolbar.o: $(srcdir)/src/os2/scrolbar.cpp $(MONODLL_ODEP)
 @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@   $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
 
@@ -11090,6 +11106,9 @@ monolib_NSMenu.o: $(srcdir)/src/cocoa/NSMenu.mm $(MONOLIB_ODEP)
 monolib_NSPanel.o: $(srcdir)/src/cocoa/NSPanel.mm $(MONOLIB_ODEP)
        $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
 
+monolib_NSScroller.o: $(srcdir)/src/cocoa/NSScroller.mm $(MONOLIB_ODEP)
+       $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
+
 monolib_NSTabView.o: $(srcdir)/src/cocoa/NSTabView.mm $(MONOLIB_ODEP)
        $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
 
@@ -13007,6 +13026,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_MAC_USE_GUI_1_WXUNIV_0@monolib_scrolbar.o: $(srcdir)/src/mac/carbon/scrolbar.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_MAC_USE_GUI_1_WXUNIV_0@  $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
 
+@COND_TOOLKIT_COCOA_USE_GUI_1_WXUNIV_0@monolib_scrolbar.o: $(srcdir)/src/cocoa/scrolbar.mm $(MONOLIB_ODEP)
+@COND_TOOLKIT_COCOA_USE_GUI_1_WXUNIV_0@        $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
+
 @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@monolib_scrolbar.o: $(srcdir)/src/os2/scrolbar.cpp $(MONOLIB_ODEP)
 @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@   $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
 
@@ -14519,6 +14541,9 @@ coredll_NSMenu.o: $(srcdir)/src/cocoa/NSMenu.mm $(COREDLL_ODEP)
 coredll_NSPanel.o: $(srcdir)/src/cocoa/NSPanel.mm $(COREDLL_ODEP)
        $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $<
 
+coredll_NSScroller.o: $(srcdir)/src/cocoa/NSScroller.mm $(COREDLL_ODEP)
+       $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $<
+
 coredll_NSTabView.o: $(srcdir)/src/cocoa/NSTabView.mm $(COREDLL_ODEP)
        $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $<
 
@@ -16217,6 +16242,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP)
 @COND_TOOLKIT_MAC_USE_GUI_1_WXUNIV_0@coredll_scrolbar.o: $(srcdir)/src/mac/carbon/scrolbar.cpp $(COREDLL_ODEP)
 @COND_TOOLKIT_MAC_USE_GUI_1_WXUNIV_0@  $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $<
 
+@COND_TOOLKIT_COCOA_USE_GUI_1_WXUNIV_0@coredll_scrolbar.o: $(srcdir)/src/cocoa/scrolbar.mm $(COREDLL_ODEP)
+@COND_TOOLKIT_COCOA_USE_GUI_1_WXUNIV_0@        $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $<
+
 @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@coredll_scrolbar.o: $(srcdir)/src/os2/scrolbar.cpp $(COREDLL_ODEP)
 @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@   $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $<
 
@@ -16949,6 +16977,9 @@ corelib_NSMenu.o: $(srcdir)/src/cocoa/NSMenu.mm $(CORELIB_ODEP)
 corelib_NSPanel.o: $(srcdir)/src/cocoa/NSPanel.mm $(CORELIB_ODEP)
        $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $<
 
+corelib_NSScroller.o: $(srcdir)/src/cocoa/NSScroller.mm $(CORELIB_ODEP)
+       $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $<
+
 corelib_NSTabView.o: $(srcdir)/src/cocoa/NSTabView.mm $(CORELIB_ODEP)
        $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $<
 
@@ -18647,6 +18678,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP)
 @COND_TOOLKIT_MAC_USE_GUI_1_WXUNIV_0@corelib_scrolbar.o: $(srcdir)/src/mac/carbon/scrolbar.cpp $(CORELIB_ODEP)
 @COND_TOOLKIT_MAC_USE_GUI_1_WXUNIV_0@  $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $<
 
+@COND_TOOLKIT_COCOA_USE_GUI_1_WXUNIV_0@corelib_scrolbar.o: $(srcdir)/src/cocoa/scrolbar.mm $(CORELIB_ODEP)
+@COND_TOOLKIT_COCOA_USE_GUI_1_WXUNIV_0@        $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $<
+
 @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@corelib_scrolbar.o: $(srcdir)/src/os2/scrolbar.cpp $(CORELIB_ODEP)
 @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@   $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $<
 
index 137e033651b6aacd2bff08e4a6955b17718dbbaf..c780dcaae1a7c72b58a8e02831bc40c8aae7a13a 100644 (file)
@@ -1851,6 +1851,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/cocoa/NSControl.mm
     src/cocoa/NSMenu.mm
     src/cocoa/NSPanel.mm
+    src/cocoa/NSScroller.mm
     src/cocoa/NSTabView.mm
     src/cocoa/NSTableView.mm
     src/cocoa/NSTextField.mm
@@ -1896,6 +1897,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/cocoa/radiobox.mm
     src/cocoa/radiobut.mm
     src/cocoa/region.mm
+    src/cocoa/scrolbar.mm
     src/cocoa/settings.cpp
     src/cocoa/slider.mm
     src/cocoa/spinbutt.mm
@@ -1935,6 +1937,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     wx/cocoa/NSControl.h
     wx/cocoa/NSMenu.h
     wx/cocoa/NSPanel.h
+    wx/cocoa/NSScroller.h
     wx/cocoa/NSTabView.h
     wx/cocoa/NSTableView.h
     wx/cocoa/NSTextField.h
@@ -1980,6 +1983,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     wx/cocoa/radiobox.h
     wx/cocoa/radiobut.h
     wx/cocoa/region.h
+    wx/cocoa/scrolbar.h
     wx/cocoa/slider.h
     wx/cocoa/spinbutt.h
     wx/cocoa/statbmp.h
diff --git a/include/wx/cocoa/NSScroller.h b/include/wx/cocoa/NSScroller.h
new file mode 100644 (file)
index 0000000..948f41e
--- /dev/null
@@ -0,0 +1,39 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        wx/cocoa/NSScroller.h
+// Purpose:     wxCocoaNSScroller class
+// Author:      David Elliott
+// Modified by:
+// Created:     2004/04/27
+// RCS-ID:      $Id$
+// Copyright:   (c) 2004 David Elliott
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_COCOA_NSSCROLLER_H__
+#define _WX_COCOA_NSSCROLLER_H__
+
+#include "wx/hashmap.h"
+#include "wx/cocoa/ObjcAssociate.h"
+#include "wx/cocoa/ObjcRef.h"
+
+DECLARE_WXCOCOA_OBJC_CLASS(NSScroller);
+
+WX_DECLARE_OBJC_HASHMAP(NSScroller);
+
+class wxCocoaNSScroller
+{
+    WX_DECLARE_OBJC_INTERFACE_HASHMAP(NSScroller);
+public:
+    void AssociateNSScroller(WX_NSScroller cocoaNSScroller);
+    inline void DisassociateNSScroller(WX_NSScroller cocoaNSScroller)
+    {
+        if(cocoaNSScroller)
+            sm_cocoaHash.erase(cocoaNSScroller);
+    }
+
+    virtual void Cocoa_wxNSScrollerAction(void) = 0;
+protected:
+    static const wxObjcAutoRefFromAlloc<struct objc_object*> sm_cocoaTarget;
+};
+
+#endif // _WX_COCOA_NSSCROLLER_H__
diff --git a/include/wx/cocoa/scrolbar.h b/include/wx/cocoa/scrolbar.h
new file mode 100644 (file)
index 0000000..2eb0c0a
--- /dev/null
@@ -0,0 +1,74 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/cocoa/scrolbar.h
+// Purpose:     wxScrollBar class
+// Author:      David Elliott
+// Modified by:
+// Created:     2004/04/25
+// RCS-ID:      $Id$
+// Copyright:   (c) 2004 David Elliott
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_COCOA_SCROLBAR_H__
+#define _WX_COCOA_SCROLBAR_H__
+
+#include "wx/cocoa/NSScroller.h"
+
+// ========================================================================
+// wxScrollBar
+// ========================================================================
+class WXDLLEXPORT wxScrollBar: public wxScrollBarBase, protected wxCocoaNSScroller
+{
+    DECLARE_DYNAMIC_CLASS(wxScrollBar)
+    DECLARE_EVENT_TABLE()
+    WX_DECLARE_COCOA_OWNER(NSScroller,NSControl,NSView)
+// ------------------------------------------------------------------------
+// initialization
+// ------------------------------------------------------------------------
+public:
+    wxScrollBar() { }
+    wxScrollBar(wxWindow *parent, wxWindowID winid,
+            const wxPoint& pos = wxDefaultPosition,
+            const wxSize& size = wxDefaultSize,
+            long style = wxSL_HORIZONTAL,
+            const wxValidator& validator = wxDefaultValidator,
+            const wxString& name = wxScrollBarNameStr)
+    {
+        Create(parent, winid, pos, size, style, validator, name);
+    }
+
+    bool Create(wxWindow *parent, wxWindowID winid,
+            const wxPoint& pos = wxDefaultPosition,
+            const wxSize& size = wxDefaultSize,
+            long style = wxSL_HORIZONTAL,
+            const wxValidator& validator = wxDefaultValidator,
+            const wxString& name = wxScrollBarNameStr);
+    virtual ~wxScrollBar();
+
+// ------------------------------------------------------------------------
+// Cocoa callbacks
+// ------------------------------------------------------------------------
+protected:
+    virtual void Cocoa_wxNSScrollerAction(void);
+// ------------------------------------------------------------------------
+// Implementation
+// ------------------------------------------------------------------------
+public:
+    // accessors
+    virtual int GetThumbPosition() const;
+    virtual int GetThumbSize() const { return m_thumbSize; }
+    virtual int GetPageSize() const { return m_pageSize; }
+    virtual int GetRange() const { return m_range; }
+
+    // operations
+    virtual void SetThumbPosition(int viewStart);
+    virtual void SetScrollbar(int position, int thumbSize,
+                              int range, int pageSize,
+                              bool refresh = TRUE);
+protected:
+    int m_range;
+    int m_thumbSize;
+    int m_pageSize;
+};
+
+#endif // _WX_COCOA_SCROLBAR_H__
index 7411fabf3932ba367575b8e342c426b84c8b91e6..512542a0b8f2826ef6047910e415244e7bb53f74 100644 (file)
@@ -53,6 +53,8 @@ private:
     #include "wx/gtk/scrolbar.h"
 #elif defined(__WXMAC__)
     #include "wx/mac/scrolbar.h"
+#elif defined(__WXCOCOA__)
+    #include "wx/cocoa/scrolbar.h"
 #elif defined(__WXPM__)
     #include "wx/os2/scrolbar.h"
 #endif
diff --git a/src/cocoa/NSScroller.mm b/src/cocoa/NSScroller.mm
new file mode 100644 (file)
index 0000000..20c9b9d
--- /dev/null
@@ -0,0 +1,56 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        cocoa/NSScroller.mm
+// Purpose:     wxCocoaNSScroller
+// Author:      David Elliott
+// Modified by:
+// Created:     2004/04/27
+// RCS-ID:      $Id$
+// Copyright:   (c) 2004 David Elliott
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+#endif // WX_PRECOMP
+
+#include "wx/cocoa/NSScroller.h"
+#import <AppKit/NSScroller.h>
+
+WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSScroller)
+
+// ============================================================================
+// @class wxNSScrollerTarget
+// ============================================================================
+@interface wxNSScrollerTarget : NSObject
+{
+}
+
+- (void)wxNSScrollerAction: (id)sender;
+@end // wxNSScrollerTarget
+
+@implementation wxNSScrollerTarget : NSObject
+- (void)wxNSScrollerAction: (id)sender
+{
+    wxCocoaNSScroller *scroller = wxCocoaNSScroller::GetFromCocoa(sender);
+    wxCHECK_RET(scroller,wxT("wxNSScrollerAction received without associated wx object"));
+    scroller->Cocoa_wxNSScrollerAction();
+}
+
+@end // implementation wxNSScrollerTarget
+
+// ============================================================================
+// class wxCocoaNSScroller
+// ============================================================================
+const wxObjcAutoRefFromAlloc<struct objc_object*> wxCocoaNSScroller::sm_cocoaTarget = [[wxNSScrollerTarget alloc] init];
+
+void wxCocoaNSScroller::AssociateNSScroller(WX_NSScroller cocoaNSScroller)
+{
+    if(cocoaNSScroller)
+    {
+        sm_cocoaHash.insert(wxCocoaNSScrollerHash::value_type(cocoaNSScroller,this));
+        [cocoaNSScroller setTarget: sm_cocoaTarget];
+        [cocoaNSScroller setAction: @selector(wxNSScrollerAction:)];
+    }
+}
+
diff --git a/src/cocoa/scrolbar.mm b/src/cocoa/scrolbar.mm
new file mode 100644 (file)
index 0000000..9a21343
--- /dev/null
@@ -0,0 +1,134 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        cocoa/scrolbar.mm
+// Purpose:     wxScrollBar
+// Author:      David Elliott
+// Modified by:
+// Created:     2004/04/25
+// RCS-ID:      $Id$
+// Copyright:   (c) 2004 David Elliott
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+#if wxUSE_SCROLLBAR
+
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/scrolbar.h"
+#endif //WX_PRECOMP
+
+#import <AppKit/NSScroller.h>
+
+IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
+BEGIN_EVENT_TABLE(wxScrollBar, wxScrollBarBase)
+END_EVENT_TABLE()
+WX_IMPLEMENT_COCOA_OWNER(wxScrollBar,NSScroller,NSControl,NSView)
+
+bool wxScrollBar::Create(wxWindow *parent, wxWindowID winid,
+            const wxPoint& pos, const wxSize& size, long style,
+            const wxValidator& validator, const wxString& name)
+{
+    if(!CreateControl(parent,winid,pos,size,style,validator,name))
+        return false;
+    SetNSScroller([[NSScroller alloc] initWithFrame: MakeDefaultNSRect(size)]);
+    [m_cocoaNSView release];
+    if(m_parent)
+        m_parent->CocoaAddChild(this);
+    SetInitialFrameRect(pos,size);
+
+    return true;
+}
+
+wxScrollBar::~wxScrollBar()
+{
+    DisassociateNSScroller(GetNSScroller());
+}
+
+/* A word about NSScroller vs. wxScrollbar:
+
+NSScroller uses two float values to represent the state of the scroller.
+The floatValue indicates where the knob is positioned on a scale from
+0.0 to 1.0.  A value of 0.0 indicates the scroller is at the top or left,
+a value of 1.0 indicates the scroller is at the bottom or right.  A value
+of 0.5 indicates the scroller is dead center.
+
+wxScrollBar uses three values.  The position indicates the number of
+scroll units where 0 is at the top or left.  The range indicates how
+many scroll units there are in the entire bar and the thumb size indicates
+how many scroll units the thumb takes.  The scrollbar is at the bottom
+or right when position == range - thumbSize.
+
+It may be easier to consider wx position to be the top or left of the thumb.
+In Cocoa, floatValue can be considered as if it were the center of the
+thumb and the range is ALWAYS (no matter what the knobProportion is) the
+distance between the center point of the knob from one extreme to the other.
+*/
+
+int wxScrollBar::GetThumbPosition() const
+{
+    return (int)((m_range-m_thumbSize)*[GetNSScroller() floatValue]);
+}
+
+void wxScrollBar::SetThumbPosition(int position)
+{
+    [GetNSScroller() setFloatValue:((float)position)/(m_range-m_thumbSize)];
+}
+
+void wxScrollBar::SetScrollbar(int position, int thumbSize,
+            int range, int pageSize, bool refresh)
+{
+    m_range = range;
+    m_thumbSize = thumbSize;
+    m_pageSize = pageSize;
+    [GetNSScroller() setFloatValue:((float)position)/(m_range-m_thumbSize)
+            knobProportion:((float)m_thumbSize)/m_range];
+}
+
+void wxScrollBar::Cocoa_wxNSScrollerAction()
+{
+    NSScrollerPart hitPart = [GetNSScroller() hitPart];
+    wxEventType command;
+    // Note: the comments about the part that is hit are for OS X, the
+    // constants are sort of a leftover from NeXT.  It makes more sense if
+    // you remember that in NeXT clicking the knob slot used to do what
+    // option-clicking does now.
+    switch(hitPart)
+    {
+    // User dragged knob
+    case NSScrollerKnob:
+        command = wxEVT_SCROLL_THUMBTRACK;
+        break;
+    // User option-clicked slot
+    case NSScrollerKnobSlot:
+        command = wxEVT_SCROLL_THUMBTRACK;
+        break;
+    // User clicked Up/Left button
+    case NSScrollerDecrementLine:
+        command = wxEVT_SCROLL_LINEUP;
+        break;
+    // User option-clicked Up/left or clicked in slot
+    case NSScrollerDecrementPage:
+        command = wxEVT_SCROLL_PAGEUP;
+        break;
+    // User clicked Down/Right button
+    case NSScrollerIncrementLine:
+        command = wxEVT_SCROLL_LINEDOWN;
+        break;
+    // User option-clicked Down/Right or clicked in slot
+    case NSScrollerIncrementPage:
+        command = wxEVT_SCROLL_PAGEDOWN;
+        break;
+    // No-op
+    case NSScrollerNoPart:
+    default:
+        return;
+    }
+    // TODO: When scrolling by pages, readjust the floatValue using the
+    // pageSize (which may be different from thumbSize).
+    wxScrollEvent event(command, GetId(), GetThumbPosition(),
+        HasFlag(wxSB_VERTICAL)?wxVERTICAL:wxHORIZONTAL);
+    event.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(event);
+}
+
+#endif // wxUSE_SCROLLBAR