wxCocoa: Added wxScrollBar

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27967 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Elliott
2004-06-23 15:26:44 +00:00
parent d22004c4f4
commit 5369a0543e
7 changed files with 343 additions and 0 deletions

View 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) $<

View 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

View File

@@ -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__

View File

@@ -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__

View 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

56
src/cocoa/NSScroller.mm Normal file
View File

@@ -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:)];
}
}

134
src/cocoa/scrolbar.mm Normal file
View File

@@ -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