]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/notebook_osx.cpp
new file added
[wxWidgets.git] / src / osx / notebook_osx.cpp
index a0824ff991b5e2bdd0f59fdd9a0a6a64f79f7a0b..94d609af4e0bcc64f7dd06a7128d9a57b28e4922 100644 (file)
@@ -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,51 +38,23 @@ 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 );
 
     return true ;
@@ -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)
@@ -173,7 +145,7 @@ bool wxNotebook::SetPageImage(size_t nPage, int nImage)
 {
     wxCHECK_MSG( IS_VALID_PAGE(nPage), false,
         wxT("SetPageImage: invalid notebook page") );
-    wxCHECK_MSG( m_imageList && nImage < m_imageList->GetImageCount(), false,
+    wxCHECK_MSG( HasImageList() && nImage < GetImageList()->GetImageCount(), false,
         wxT("SetPageImage: invalid image index") );
 
     if ( nImage != m_images[nPage] )
@@ -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& pt, long * 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& pt, long * flags) const
 
     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& pt, long * flags) const
         else
             *flags |= wxBK_HITTEST_NOWHERE;
     }
+#else
+    wxUnusedVar(pt);
+    wxUnusedVar(flags);
 #endif
     return resultV;
 }
@@ -348,7 +314,7 @@ int wxNotebook::HitTest(const wxPoint& pt, long * flags) const
 //
 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 timestampsec )
+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,15 @@ bool wxNotebook::OSXHandleClicked( double timestampsec )
         {
             wxBookCtrlEvent event(
                 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId,
-                newSel, m_nSelection );
+                newSel, m_selection );
             event.SetEventObject( this );
             HandleWindowEvent( event );
+
+            m_selection = newSel;
         }
         else
         {
-            m_peer->SetValue( m_nSelection + 1 ) ;
+            GetPeer()->SetValue( m_selection + 1 ) ;
         }
 
         status = true ;