X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03647350fc7cd141953c72e0284e928847d30f44..48e05747043db02c4e9d2e286eca4fdf5dee7881:/src/osx/carbon/notebmac.cpp?ds=sidebyside diff --git a/src/osx/carbon/notebmac.cpp b/src/osx/carbon/notebmac.cpp index 9840b549f4..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( m_peer->GetControlRef(), &hipoint, &outPart ); - - int max = m_peer->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 = m_peer->GetValue() ; - int maxval = max ; - if ( max == 1 ) - { - m_peer->SetMaximum( 2 ) ; - maxval = 2 ; - } - - if ( val == 1 ) - m_peer->SetValue( maxval ) ; - else - m_peer->SetValue( 1 ) ; - - err = HIViewGetPartHit( m_peer->GetControlRef(), &hipoint, &outPart ); - - m_peer->SetValue( val ) ; - if ( max == 1 ) - m_peer->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.Ok() ) - { - 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