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:
@@ -332,7 +332,6 @@ public :
|
|||||||
wxBitmap GetBitmap() const;
|
wxBitmap GetBitmap() const;
|
||||||
void SetBitmap( const wxBitmap& bitmap );
|
void SetBitmap( const wxBitmap& bitmap );
|
||||||
void SetBitmapPosition( wxDirection dir );
|
void SetBitmapPosition( wxDirection dir );
|
||||||
void SetupTabs( const wxNotebook ¬ebook );
|
|
||||||
|
|
||||||
void GetBestRect( wxRect *r ) const;
|
void GetBestRect( wxRect *r ) const;
|
||||||
bool IsEnabled() const;
|
bool IsEnabled() const;
|
||||||
|
@@ -311,7 +311,8 @@ public :
|
|||||||
virtual wxBitmap GetBitmap() const = 0;
|
virtual wxBitmap GetBitmap() const = 0;
|
||||||
virtual void SetBitmap( const wxBitmap& bitmap ) = 0;
|
virtual void SetBitmap( const wxBitmap& bitmap ) = 0;
|
||||||
virtual void SetBitmapPosition( wxDirection dir ) = 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 void GetBestRect( wxRect *r ) const = 0;
|
||||||
virtual bool IsEnabled() const = 0;
|
virtual bool IsEnabled() const = 0;
|
||||||
virtual void Enable( bool enable ) = 0;
|
virtual void Enable( bool enable ) = 0;
|
||||||
|
@@ -30,6 +30,123 @@
|
|||||||
// check that the page index is valid
|
// check that the page index is valid
|
||||||
#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount())
|
#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,
|
wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
|
||||||
wxWindowMac* parent,
|
wxWindowMac* parent,
|
||||||
wxWindowID WXUNUSED(id),
|
wxWindowID WXUNUSED(id),
|
||||||
@@ -69,7 +186,8 @@ wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMacControl* peer = new wxMacControl( wxpeer );
|
wxMacControl* peer = new wxCarbonTabView( wxpeer );
|
||||||
|
|
||||||
OSStatus err = CreateTabsControl(
|
OSStatus err = CreateTabsControl(
|
||||||
MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds,
|
MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds,
|
||||||
tabsize, tabstyle, 0, NULL, peer->GetControlRefAddr() );
|
tabsize, tabstyle, 0, NULL, peer->GetControlRefAddr() );
|
||||||
@@ -78,114 +196,4 @@ wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
|
|||||||
return peer;
|
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
|
#endif
|
||||||
|
@@ -247,64 +247,7 @@ bool wxNotebook::InsertPage(size_t nPage,
|
|||||||
|
|
||||||
int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
|
int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
|
||||||
{
|
{
|
||||||
int resultV = wxNOT_FOUND;
|
return GetPeer()->TabHitTest(pt,flags);
|
||||||
#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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Added by Mark Newsam
|
// Added by Mark Newsam
|
||||||
|
Reference in New Issue
Block a user