X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/489468feaa08b8f504735eecca522fb8d0f825d2..55410bb4f67febe1ca20654f078ea4fb9a6223ae:/src/osx/carbon/scrolbar.cpp diff --git a/src/osx/carbon/scrolbar.cpp b/src/osx/carbon/scrolbar.cpp index c7c1263451..6b9f0fc37c 100644 --- a/src/osx/carbon/scrolbar.cpp +++ b/src/osx/carbon/scrolbar.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/scrolbar.cpp +// Name: src/osx/carbon/scrolbar.cpp // Purpose: wxScrollBar // Author: Stefan Csomor // Modified by: @@ -19,229 +19,39 @@ #include "wx/settings.h" #endif -#include "wx/mac/uma.h" +#include "wx/osx/private.h" -IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl) - -BEGIN_EVENT_TABLE(wxScrollBar, wxControl) -END_EVENT_TABLE() - - -bool wxScrollBar::Create( wxWindow *parent, - wxWindowID id, - const wxPoint& pos, - const wxSize& size, - long style, - const wxValidator& validator, - const wxString& name ) -{ - m_macIsUserPane = false; - - if ( !wxControl::Create( parent, id, pos, size, style, validator, name ) ) - return false; - - Rect bounds = wxMacGetBoundsForControl( this, pos, size ); - - m_peer = new wxMacControl( this ); - OSStatus err = CreateScrollBarControl( - MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, - 0, 0, 100, 1, true /* liveTracking */, - GetwxMacLiveScrollbarActionProc(), - m_peer->GetControlRefAddr() ); - verify_noerr( err ); - - MacPostControlCreate( pos, size ); - - return true; -} - -wxScrollBar::~wxScrollBar() -{ -} - -void wxScrollBar::SetThumbPosition( int viewStart ) +class wxOSXScrollBarCarbonImpl : public wxMacControl { - m_peer->SetValue( viewStart ); -} - -int wxScrollBar::GetThumbPosition() const -{ - return m_peer->GetValue(); -} - -void wxScrollBar::SetScrollbar( int position, - int thumbSize, - int range, - int pageSize, - bool WXUNUSED(refresh) ) -{ - m_pageSize = pageSize; - m_viewSize = thumbSize; - m_objectSize = range; - - int range1 = wxMax( (m_objectSize - m_viewSize), 0 ); - - m_peer->SetMinimum( 0 ); - m_peer->SetMaximum( range1 ); - m_peer->SetValue( position ); - m_peer->SetViewSize( m_viewSize ); -} - -void wxScrollBar::Command( wxCommandEvent& event ) -{ - SetThumbPosition( event.GetInt() ); - ProcessCommand( event ); -} - -void wxScrollBar::MacHandleControlClick( WXWidget WXUNUSED(control), wxInt16 controlpart, bool mouseStillDown ) -{ - int position = m_peer->GetValue(); - int minPos = m_peer->GetMinimum(); - int maxPos = m_peer->GetMaximum(); - - wxEventType scrollEvent = wxEVT_NULL; - int nScrollInc = 0; - - // all events have already been reported during mouse down, except for THUMBRELEASE - if ( !mouseStillDown && controlpart != kControlIndicatorPart ) - return; - - switch ( controlpart ) +public : + wxOSXScrollBarCarbonImpl( wxWindowMac* peer) : wxMacControl( peer ) { - case kControlUpButtonPart: - nScrollInc = -1; - scrollEvent = wxEVT_SCROLL_LINEUP; - break; - - case kControlDownButtonPart: - nScrollInc = 1; - scrollEvent = wxEVT_SCROLL_LINEDOWN; - break; - - case kControlPageUpPart: - nScrollInc = -m_pageSize; - scrollEvent = wxEVT_SCROLL_PAGEUP; - break; - - case kControlPageDownPart: - nScrollInc = m_pageSize; - scrollEvent = wxEVT_SCROLL_PAGEDOWN; - break; - - case kControlIndicatorPart: - nScrollInc = 0; - if ( mouseStillDown ) - scrollEvent = wxEVT_SCROLL_THUMBTRACK; - else - scrollEvent = wxEVT_SCROLL_THUMBRELEASE; - break; - - default: - wxFAIL_MSG(wxT("unknown scrollbar selector")); - break; } - - int new_pos = position + nScrollInc; - - if (new_pos < minPos) - new_pos = minPos; - else if (new_pos > maxPos) - new_pos = maxPos; - - if ( nScrollInc ) - SetThumbPosition( new_pos ); - - wxScrollEvent event( scrollEvent, m_windowId ); - if ( m_windowStyle & wxHORIZONTAL ) - event.SetOrientation( wxHORIZONTAL ); - else - event.SetOrientation( wxVERTICAL ); - - event.SetPosition( new_pos ); - event.SetEventObject( this ); - - wxWindow* window = GetParent(); - if (window && window->MacIsWindowScrollbar( this )) - // this is hardcoded - window->MacOnScroll( event ); - else - HandleWindowEvent( event ); -} - -wxInt32 wxScrollBar::MacControlHit( WXEVENTHANDLERREF WXUNUSED(handler), WXEVENTREF mevent ) -{ - int position = m_peer->GetValue(); - int minPos = m_peer->GetMinimum(); - int maxPos = m_peer->GetMaximum(); - - wxEventType scrollEvent = wxEVT_NULL; - int nScrollInc = 0; - - wxMacCarbonEvent cEvent( (EventRef)mevent ); - ControlPartCode controlpart = cEvent.GetParameter(kEventParamControlPart, typeControlPartCode); - - // all events have already been reported during mouse down, except for THUMBRELEASE - // NB: this may need to be reviewed in light of the fact that scroll wheel events - // aren't being handled properly - if ( controlpart != kControlIndicatorPart ) - return eventNotHandledErr; - - switch ( controlpart ) + + void SetScrollThumb( wxInt32 value, wxInt32 thumbSize ) { - case kControlIndicatorPart: - nScrollInc = 0; - scrollEvent = wxEVT_SCROLL_THUMBRELEASE; - break; - - default: - wxFAIL_MSG(wxT("unknown scrollbar selector")); - break; + SetValue( value ); + SetControlViewSize(m_controlRef , thumbSize ); } +protected: +}; - int new_pos = position + nScrollInc; - - if (new_pos < minPos) - new_pos = minPos; - else if (new_pos > maxPos) - new_pos = maxPos; - - if ( nScrollInc ) - SetThumbPosition( new_pos ); - - wxScrollEvent event( scrollEvent, m_windowId ); - if ( m_windowStyle & wxHORIZONTAL ) - event.SetOrientation( wxHORIZONTAL ); - else - event.SetOrientation( wxVERTICAL ); - - event.SetPosition( new_pos ); - event.SetEventObject( this ); - wxWindow* window = GetParent(); - if (window && window->MacIsWindowScrollbar( this )) - // this is hardcoded - window->MacOnScroll( event ); - else - HandleWindowEvent( event ); - - return noErr; -} - - -wxSize wxScrollBar::DoGetBestSize() const +wxWidgetImplType* wxWidgetImpl::CreateScrollBar( wxWindowMac* wxpeer, + wxWindowMac* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + long extraStyle) { - int w = 100; - int h = 100; - - if ( IsVertical() ) - { - w = wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); - } - else - { - h = wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y); - } + Rect bounds = wxMacGetBoundsForControl( wxpeer, pos, size ); - wxSize best(w, h); - CacheBestSize(best); - return best; + wxMacControl* peer = new wxOSXScrollBarCarbonImpl( wxpeer ); + OSStatus err = CreateScrollBarControl( + MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, + 0, 0, 100, 1, true /* liveTracking */, + GetwxMacLiveScrollbarActionProc(), + peer->GetControlRefAddr() ); + verify_noerr( err ); + return peer; }