X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03647350fc7cd141953c72e0284e928847d30f44..f239a20092359e3c914adb79bd39f3f5d2b2e06f:/src/osx/notebook_osx.cpp diff --git a/src/osx/notebook_osx.cpp b/src/osx/notebook_osx.cpp index dad2a6c5c4..0f0ea5f37b 100644 --- a/src/osx/notebook_osx.cpp +++ b/src/osx/notebook_osx.cpp @@ -4,7 +4,7 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: notebmac.cpp 55079 2008-08-13 14:56:42Z PC $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -38,50 +38,22 @@ BEGIN_EVENT_TABLE(wxNotebook, wxBookCtrlBase) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) END_EVENT_TABLE() -IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxBookCtrlBase) - - -// common part of all ctors -void wxNotebook::Init() -{ - m_nSelection = -1; -} - -// default for dynamic class -wxNotebook::wxNotebook() -{ - Init(); -} - -// the same arguments as for wxControl -wxNotebook::wxNotebook( wxWindow *parent, - wxWindowID id, - const wxPoint& pos, - const wxSize& size, - long style, - const wxString& name ) -{ - Init(); - - Create( parent, id, pos, size, style, name ); -} - bool wxNotebook::Create( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) -{ - m_macIsUserPane = false ; - +{ + DontCreatePeer(); + if (! (style & wxBK_ALIGN_MASK)) style |= wxBK_TOP; if ( !wxNotebookBase::Create( parent, id, pos, size, style, name ) ) return false; - m_peer = wxWidgetImpl::CreateTabView(this,parent, id, pos, size, style, GetExtraStyle() ); + SetPeer(wxWidgetImpl::CreateTabView(this,parent, id, pos, size, style, GetExtraStyle() )); MacPostControlCreate( pos, size ); @@ -121,25 +93,25 @@ int wxNotebook::DoSetSelection(size_t nPage, int flags) { wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("DoSetSelection: invalid notebook page") ); - if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)m_nSelection ) + if ( m_selection == wxNOT_FOUND || nPage != (size_t)m_selection ) { if ( flags & SetSelection_SendEvent ) { if ( !SendPageChangingEvent(nPage) ) { // vetoed by program - return m_nSelection; + return m_selection; } //else: program allows the page change - SendPageChangedEvent(m_nSelection, nPage); + SendPageChangedEvent(m_selection, nPage); } - ChangePage(m_nSelection, nPage); + ChangePage(m_selection, nPage); } //else: no change - return m_nSelection; + return m_selection; } bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) @@ -204,11 +176,11 @@ wxNotebookPage* wxNotebook::DoRemovePage(size_t nPage) MacSetupTabs(); - if (m_nSelection >= (int)GetPageCount()) - m_nSelection = GetPageCount() - 1; + if (m_selection >= (int)GetPageCount()) + m_selection = GetPageCount() - 1; - if (m_nSelection >= 0) - m_pages[m_nSelection]->Show(true); + if (m_selection >= 0) + m_pages[m_selection]->Show(true); InvalidateBestSize(); @@ -220,7 +192,7 @@ bool wxNotebook::DeleteAllPages() { WX_CLEAR_ARRAY(m_pages) ; MacSetupTabs(); - m_nSelection = -1 ; + m_selection = wxNOT_FOUND ; InvalidateBestSize(); return true; @@ -258,34 +230,25 @@ bool wxNotebook::InsertPage(size_t nPage, // if the inserted page is before the selected one, we must update the // index of the selected page - if ( int(nPage) <= m_nSelection ) + if ( int(nPage) <= m_selection ) { - m_nSelection++; + m_selection++; // while this still is the same page showing, we need to update the tabs - m_peer->SetValue( m_nSelection + 1 ) ; + GetPeer()->SetValue( m_selection + 1 ) ; } - // some page should be selected: either this one or the first one if there - // is still no selection - int selNew = -1; - if ( bSelect ) - selNew = nPage; - else if ( m_nSelection == -1 ) - selNew = 0; - - if ( selNew != -1 ) - SetSelection( selNew ); + DoSetSelectionAfterInsertion(nPage, bSelect); InvalidateBestSize(); return true; } -int wxNotebook::HitTest(const wxPoint& WXUNUSED(pt), long * WXUNUSED(flags)) const +int wxNotebook::HitTest(const wxPoint& pt, long *flags) const { int resultV = wxNOT_FOUND; -#if 0 +#ifdef __WXOSX_CARBON__ const int countPages = GetPageCount(); // we have to convert from Client to Window relative coordinates @@ -296,32 +259,32 @@ int wxNotebook::HitTest(const wxPoint& WXUNUSED(pt), long * WXUNUSED(flags)) con HIPoint hipoint= { adjustedPt.x , adjustedPt.y } ; HIViewPartCode outPart = 0 ; - OSStatus err = HIViewGetPartHit( m_peer->GetControlRef(), &hipoint, &outPart ); + OSStatus err = HIViewGetPartHit( GetPeer()->GetControlRef(), &hipoint, &outPart ); - int max = m_peer->GetMaximum() ; + 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 = m_peer->GetValue() ; + int val = GetPeer()->GetValue() ; int maxval = max ; if ( max == 1 ) { - m_peer->SetMaximum( 2 ) ; + GetPeer()->SetMaximum( 2 ) ; maxval = 2 ; } if ( val == 1 ) - m_peer->SetValue( maxval ) ; + GetPeer()->SetValue( maxval ) ; else - m_peer->SetValue( 1 ) ; + GetPeer()->SetValue( 1 ) ; - err = HIViewGetPartHit( m_peer->GetControlRef(), &hipoint, &outPart ); + err = HIViewGetPartHit( GetPeer()->GetControlRef(), &hipoint, &outPart ); - m_peer->SetValue( val ) ; + GetPeer()->SetValue( val ) ; if ( max == 1 ) - m_peer->SetMaximum( 1 ) ; + GetPeer()->SetMaximum( 1 ) ; } if ( outPart >= 1 && outPart <= countPages ) @@ -337,6 +300,9 @@ int wxNotebook::HitTest(const wxPoint& WXUNUSED(pt), long * WXUNUSED(flags)) con else *flags |= wxBK_HITTEST_NOWHERE; } +#else + wxUnusedVar(pt); + wxUnusedVar(flags); #endif return resultV; } @@ -348,7 +314,7 @@ int wxNotebook::HitTest(const wxPoint& WXUNUSED(pt), long * WXUNUSED(flags)) con // void wxNotebook::MacSetupTabs() { - m_peer->SetupTabs(*this); + GetPeer()->SetupTabs(*this); Refresh(); } @@ -373,9 +339,21 @@ void wxNotebook::OnSize(wxSizeEvent& event) for ( unsigned int nPage = 0; nPage < nCount; nPage++ ) { wxNotebookPage *pPage = m_pages[nPage]; - pPage->SetSize(rect); - if ( pPage->GetAutoLayout() ) - pPage->Layout(); + pPage->SetSize(rect, wxSIZE_FORCE_EVENT); + } + + // If the selected page is hidden at this point, the notebook + // has become visible for the first time after creation, and + // we postponed showing the page in ChangePage(). + // So show the selected page now. + if ( m_selection != wxNOT_FOUND ) + { + wxNotebookPage *pPage = m_pages[m_selection]; + if ( !pPage->IsShown() ) + { + pPage->Show( true ); + pPage->SetFocus(); + } } // Processing continues to next OnSize @@ -395,8 +373,8 @@ void wxNotebook::OnSelChange(wxBookCtrlEvent& event) void wxNotebook::OnSetFocus(wxFocusEvent& event) { // set focus to the currently selected page if any - if ( m_nSelection != -1 ) - m_pages[m_nSelection]->SetFocus(); + if ( m_selection != wxNOT_FOUND ) + m_pages[m_selection]->SetFocus(); event.Skip(); } @@ -429,13 +407,13 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) if ( ((wxWindow*)event.GetEventObject()) == parent ) { // no, it doesn't come from child, case (b): forward to a page - if ( m_nSelection != -1 ) + if ( m_selection != wxNOT_FOUND ) { // so that the page knows that the event comes from it's parent // and is being propagated downwards event.SetEventObject( this ); - wxWindow *page = m_pages[m_nSelection]; + wxWindow *page = m_pages[m_selection]; if ( !page->HandleWindowEvent( event ) ) { page->SetFocus(); @@ -496,30 +474,42 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) if (nOldSel == nSel) return; - if ( nOldSel != -1 ) + if ( nOldSel != wxNOT_FOUND ) m_pages[nOldSel]->Show( false ); - if ( nSel != -1 ) + if ( nSel != wxNOT_FOUND ) { wxNotebookPage *pPage = m_pages[nSel]; - pPage->Show( true ); - pPage->SetFocus(); + if ( IsShownOnScreen() ) + { + pPage->Show( true ); + pPage->SetFocus(); + } + else + { + // Postpone Show() until the control is actually shown. + // Otherwise this forces the containing toplevel window + // to show, even if it's just being created and called + // AddPage() without intent to show the window yet. + // We Show() the selected page in our OnSize handler, + // unless it already is shown. + } } - m_nSelection = nSel; - m_peer->SetValue( m_nSelection + 1 ) ; + m_selection = nSel; + GetPeer()->SetValue( m_selection + 1 ) ; } bool wxNotebook::OSXHandleClicked( double WXUNUSED(timestampsec) ) { bool status = false ; - SInt32 newSel = m_peer->GetValue() - 1 ; - if ( newSel != m_nSelection ) + SInt32 newSel = GetPeer()->GetValue() - 1 ; + if ( newSel != m_selection ) { wxBookCtrlEvent changing( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId, - newSel , m_nSelection ); + newSel , m_selection ); changing.SetEventObject( this ); HandleWindowEvent( changing ); @@ -527,13 +517,13 @@ bool wxNotebook::OSXHandleClicked( double WXUNUSED(timestampsec) ) { wxBookCtrlEvent event( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId, - newSel, m_nSelection ); + newSel, m_selection ); event.SetEventObject( this ); HandleWindowEvent( event ); } else { - m_peer->SetValue( m_nSelection + 1 ) ; + GetPeer()->SetValue( m_selection + 1 ) ; } status = true ;