From dfd0756f75c2a714e0c9d9c66c3ae1c17fca532c Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sun, 17 Feb 2013 14:54:43 +0000 Subject: [PATCH] switching notebook implementation to common git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73532 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/osx/carbon/private.h | 1 - include/wx/osx/core/private.h | 3 +- src/osx/carbon/notebmac.cpp | 230 +++++++++++++++++--------------- src/osx/notebook_osx.cpp | 59 +------- 4 files changed, 122 insertions(+), 171 deletions(-) diff --git a/include/wx/osx/carbon/private.h b/include/wx/osx/carbon/private.h index 071ddbe384..4dac1cf0df 100644 --- a/include/wx/osx/carbon/private.h +++ b/include/wx/osx/carbon/private.h @@ -332,7 +332,6 @@ public : wxBitmap GetBitmap() const; void SetBitmap( const wxBitmap& bitmap ); void SetBitmapPosition( wxDirection dir ); - void SetupTabs( const wxNotebook ¬ebook ); void GetBestRect( wxRect *r ) const; bool IsEnabled() const; diff --git a/include/wx/osx/core/private.h b/include/wx/osx/core/private.h index 517ddf61e6..e8dffa3825 100644 --- a/include/wx/osx/core/private.h +++ b/include/wx/osx/core/private.h @@ -311,7 +311,8 @@ public : virtual wxBitmap GetBitmap() const = 0; virtual void SetBitmap( const wxBitmap& bitmap ) = 0; virtual void SetBitmapPosition( wxDirection dir ) = 0; - virtual void SetupTabs( const wxNotebook ¬ebook ) =0; + virtual void SetupTabs( const wxNotebook ¬ebook ) {}; + virtual int TabHitTest( const wxPoint & WXUNUSED(pt), long *flags ) {*flags=1; return -1;}; virtual void GetBestRect( wxRect *r ) const = 0; virtual bool IsEnabled() const = 0; virtual void Enable( bool enable ) = 0; diff --git a/src/osx/carbon/notebmac.cpp b/src/osx/carbon/notebmac.cpp index 710aadbcb0..fe2412e023 100644 --- a/src/osx/carbon/notebmac.cpp +++ b/src/osx/carbon/notebmac.cpp @@ -30,6 +30,123 @@ // check that the page index is valid #define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) +class wxCarbonTabView : public wxMacControl +{ +public: + wxCarbonTabView( wxWindowMac* peer ) : wxMacControl(peer ) + { + } + + // Added by Mark Newsam + // When a page is added or deleted to the notebook this function updates + // information held in the control so that it matches the order + // the user would expect. + // + void SetupTabs( const wxNotebook& notebook) + { + const size_t countPages = notebook.GetPageCount(); + SetMaximum( countPages ) ; + + wxNotebookPage *page; + ControlTabInfoRecV1 info; + + for (size_t ii = 0; ii < countPages; ii++) + { + page = (wxNotebookPage*) notebook.GetPage(ii); + info.version = kControlTabInfoVersionOne; + info.iconSuiteID = 0; + wxCFStringRef cflabel( page->GetLabel(), page->GetFont().GetEncoding() ) ; + info.name = cflabel ; + SetData( ii + 1, kControlTabInfoTag, &info ) ; + + if ( notebook.GetImageList() && notebook.GetPageImage(ii) >= 0 ) + { + const wxBitmap bmap = notebook.GetImageList()->GetBitmap( notebook.GetPageImage( ii ) ) ; + if ( bmap.IsOk() ) + { + ControlButtonContentInfo info ; + + wxMacCreateBitmapButton( &info, bmap ) ; + + OSStatus err = SetData( ii + 1, kControlTabImageContentTag, &info ); + if ( err != noErr ) + { + wxFAIL_MSG("Error when setting icon on tab"); + } + + wxMacReleaseBitmapButton( &info ) ; + } + } + SetTabEnabled( ii + 1, true ) ; + } + } + + int TabHitTest(const wxPoint & pt, long* flags) + { + int resultV = wxNOT_FOUND; + + wxNotebook *notebookpeer = wxDynamicCast( GetWXPeer() , wxNotebook ); + if ( NULL == notebookpeer ) + return wxNOT_FOUND; + + const int countPages = notebookpeer->GetPageCount(); + + // we have to convert from Client to Window relative coordinates + wxPoint adjustedPt = pt + GetWXPeer()->GetClientAreaOrigin(); + // and now to HIView native ones + adjustedPt.x -= GetWXPeer()->MacGetLeftBorderSize() ; + adjustedPt.y -= GetWXPeer()->MacGetTopBorderSize() ; + + HIPoint hipoint= { adjustedPt.x , adjustedPt.y } ; + HIViewPartCode outPart = 0 ; + OSStatus err = HIViewGetPartHit( GetControlRef(), &hipoint, &outPart ); + + int max = GetMaximum() ; + if ( outPart == 0 && max > 0 ) + { + // this is a hack, as unfortunately a hit on an already selected tab returns 0, + // so we have to go some extra miles to make sure we select something different + // and try again .. + int val = GetValue() ; + int maxval = max ; + if ( max == 1 ) + { + SetMaximum( 2 ) ; + maxval = 2 ; + } + + if ( val == 1 ) + SetValue( maxval ) ; + else + SetValue( 1 ) ; + + err = HIViewGetPartHit( GetControlRef(), &hipoint, &outPart ); + + SetValue( val ) ; + if ( max == 1 ) + SetMaximum( 1 ) ; + } + + if ( outPart >= 1 && outPart <= countPages ) + resultV = outPart - 1 ; + + if (flags != NULL) + { + *flags = 0; + + // we cannot differentiate better + if (resultV >= 0) + *flags |= wxBK_HITTEST_ONLABEL; + else + *flags |= wxBK_HITTEST_NOWHERE; + } + + return resultV; + + } + +}; + wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer, wxWindowMac* parent, wxWindowID WXUNUSED(id), @@ -69,7 +186,8 @@ wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer, break; } - wxMacControl* peer = new wxMacControl( wxpeer ); + wxMacControl* peer = new wxCarbonTabView( wxpeer ); + OSStatus err = CreateTabsControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, tabsize, tabstyle, 0, NULL, peer->GetControlRefAddr() ); @@ -78,114 +196,4 @@ wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer, return peer; } - - - - -/* -int wxNotebook::HitTest(const wxPoint& pt, long * flags) const -{ - int resultV = wxNOT_FOUND; - - const int countPages = GetPageCount(); - - // we have to convert from Client to Window relative coordinates - wxPoint adjustedPt = pt + GetClientAreaOrigin(); - // and now to HIView native ones - adjustedPt.x -= MacGetLeftBorderSize() ; - adjustedPt.y -= MacGetTopBorderSize() ; - - HIPoint hipoint= { adjustedPt.x , adjustedPt.y } ; - HIViewPartCode outPart = 0 ; - OSStatus err = HIViewGetPartHit( GetPeer()->GetControlRef(), &hipoint, &outPart ); - - int max = GetPeer()->GetMaximum() ; - if ( outPart == 0 && max > 0 ) - { - // this is a hack, as unfortunately a hit on an already selected tab returns 0, - // so we have to go some extra miles to make sure we select something different - // and try again .. - int val = GetPeer()->GetValue() ; - int maxval = max ; - if ( max == 1 ) - { - GetPeer()->SetMaximum( 2 ) ; - maxval = 2 ; - } - - if ( val == 1 ) - GetPeer()->SetValue( maxval ) ; - else - GetPeer()->SetValue( 1 ) ; - - err = HIViewGetPartHit( GetPeer()->GetControlRef(), &hipoint, &outPart ); - - GetPeer()->SetValue( val ) ; - if ( max == 1 ) - GetPeer()->SetMaximum( 1 ) ; - } - - if ( outPart >= 1 && outPart <= countPages ) - resultV = outPart - 1 ; - - if (flags != NULL) - { - *flags = 0; - - // we cannot differentiate better - if (resultV >= 0) - *flags |= wxBK_HITTEST_ONLABEL; - else - *flags |= wxBK_HITTEST_NOWHERE; - } - - return resultV; -} -*/ - -// Added by Mark Newsam -// When a page is added or deleted to the notebook this function updates -// information held in the control so that it matches the order -// the user would expect. -// - -void wxMacControl::SetupTabs( const wxNotebook& notebook) -{ - const size_t countPages = notebook.GetPageCount(); - SetMaximum( countPages ) ; - - wxNotebookPage *page; - ControlTabInfoRecV1 info; - - for (size_t ii = 0; ii < countPages; ii++) - { - page = (wxNotebookPage*) notebook.GetPage(ii); - info.version = kControlTabInfoVersionOne; - info.iconSuiteID = 0; - wxCFStringRef cflabel( page->GetLabel(), page->GetFont().GetEncoding() ) ; - info.name = cflabel ; - SetData( ii + 1, kControlTabInfoTag, &info ) ; - - if ( notebook.GetImageList() && notebook.GetPageImage(ii) >= 0 ) - { - const wxBitmap bmap = notebook.GetImageList()->GetBitmap( notebook.GetPageImage( ii ) ) ; - if ( bmap.IsOk() ) - { - ControlButtonContentInfo info ; - - wxMacCreateBitmapButton( &info, bmap ) ; - - OSStatus err = SetData( ii + 1, kControlTabImageContentTag, &info ); - if ( err != noErr ) - { - wxFAIL_MSG("Error when setting icon on tab"); - } - - wxMacReleaseBitmapButton( &info ) ; - } - } - SetTabEnabled( ii + 1, true ) ; - } -} - #endif diff --git a/src/osx/notebook_osx.cpp b/src/osx/notebook_osx.cpp index 1c6e314ca8..9e49d0caca 100644 --- a/src/osx/notebook_osx.cpp +++ b/src/osx/notebook_osx.cpp @@ -247,64 +247,7 @@ bool wxNotebook::InsertPage(size_t nPage, int wxNotebook::HitTest(const wxPoint& pt, long *flags) const { - int resultV = wxNOT_FOUND; -#ifdef __WXOSX_CARBON__ - const int countPages = GetPageCount(); - - // we have to convert from Client to Window relative coordinates - wxPoint adjustedPt = pt + GetClientAreaOrigin(); - // and now to HIView native ones - adjustedPt.x -= MacGetLeftBorderSize() ; - adjustedPt.y -= MacGetTopBorderSize() ; - - HIPoint hipoint= { adjustedPt.x , adjustedPt.y } ; - HIViewPartCode outPart = 0 ; - OSStatus err = HIViewGetPartHit( GetPeer()->GetControlRef(), &hipoint, &outPart ); - - int max = GetPeer()->GetMaximum() ; - if ( outPart == 0 && max > 0 ) - { - // this is a hack, as unfortunately a hit on an already selected tab returns 0, - // so we have to go some extra miles to make sure we select something different - // and try again .. - int val = GetPeer()->GetValue() ; - int maxval = max ; - if ( max == 1 ) - { - GetPeer()->SetMaximum( 2 ) ; - maxval = 2 ; - } - - if ( val == 1 ) - GetPeer()->SetValue( maxval ) ; - else - GetPeer()->SetValue( 1 ) ; - - err = HIViewGetPartHit( GetPeer()->GetControlRef(), &hipoint, &outPart ); - - GetPeer()->SetValue( val ) ; - if ( max == 1 ) - GetPeer()->SetMaximum( 1 ) ; - } - - if ( outPart >= 1 && outPart <= countPages ) - resultV = outPart - 1 ; - - if (flags != NULL) - { - *flags = 0; - - // we cannot differentiate better - if (resultV >= 0) - *flags |= wxBK_HITTEST_ONLABEL; - else - *flags |= wxBK_HITTEST_NOWHERE; - } -#else - wxUnusedVar(pt); - wxUnusedVar(flags); -#endif - return resultV; + return GetPeer()->TabHitTest(pt,flags); } // Added by Mark Newsam -- 2.45.2