// 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<ControlTabInfoRecV1>( 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<ControlButtonContentInfo>( 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),
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() );
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<ControlTabInfoRecV1>( 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<ControlButtonContentInfo>( ii + 1, kControlTabImageContentTag, &info );
- if ( err != noErr )
- {
- wxFAIL_MSG("Error when setting icon on tab");
- }
-
- wxMacReleaseBitmapButton( &info ) ;
- }
- }
- SetTabEnabled( ii + 1, true ) ;
- }
-}
-
#endif