switching notebook implementation to common

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73532 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2013-02-17 14:54:43 +00:00
parent 2a45803fc3
commit dfd0756f75
4 changed files with 122 additions and 171 deletions

View File

@@ -332,7 +332,6 @@ public :
wxBitmap GetBitmap() const;
void SetBitmap( const wxBitmap& bitmap );
void SetBitmapPosition( wxDirection dir );
void SetupTabs( const wxNotebook &notebook );
void GetBestRect( wxRect *r ) const;
bool IsEnabled() const;

View File

@@ -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 &notebook ) =0;
virtual void SetupTabs( const wxNotebook &notebook ) {};
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;

View File

@@ -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<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),
@@ -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<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 ) ;
}
}
#endif

View File

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