]> git.saurik.com Git - wxWidgets.git/commitdiff
made wxListbook events more consistent with wxNotebook ones (patch 1001271)
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 16 Sep 2004 22:14:34 +0000 (22:14 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 16 Sep 2004 22:14:34 +0000 (22:14 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29165 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/listbook.h
samples/notebook/notebook.cpp
src/generic/listbkg.cpp

index 136c2e879c13c142551161c05481e2f7627a12f3..44ab2b1c5ef497fd314b72a902dc40dd468a7aaf 100644 (file)
@@ -116,10 +116,6 @@ public:
 protected:
     virtual wxWindow *DoRemovePage(size_t page);
 
-private:
-    // common part of all constructors
-    void Init();
-
     // get the size which the list control should have
     wxSize GetListSize() const;
 
@@ -130,7 +126,6 @@ private:
     void OnSize(wxSizeEvent& event);
     void OnListSelected(wxListEvent& event);
 
-
     // the list control we use for showing the pages index
     wxListView *m_list;
 
@@ -142,6 +137,9 @@ private:
     // the currently selected page or wxNOT_FOUND if none
     int m_selection;
 
+private:
+    // common part of all constructors
+    void Init();
 
     DECLARE_EVENT_TABLE()
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxListbook)
index f5ed8758e1a20eb77d8ac54a5b7a5f9e149ce4ae..ac9dcd43194fb9902fcff78c62291299f39020d5 100644 (file)
@@ -506,7 +506,7 @@ void MyFrame::OnNotebook(wxNotebookEvent& event)
 
     if (eventType == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
     {
-        str = wxT("Notebook changed");
+        str = wxT("Changed");
     }
     else if (eventType == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
     {
@@ -528,13 +528,14 @@ void MyFrame::OnNotebook(wxNotebookEvent& event)
 
         }
 
-        str = wxT("Notebook changing");
+        str = wxT("Changing");
     }
 
     static int s_numNotebookEvents = 0;
 
-    wxLogMessage(wxT("Notebook event #%d: %s (%d)"),
-        s_numNotebookEvents++, str.c_str(), eventType);
+    wxLogMessage(wxT("Notebook event #%d: %s (%d) Sel %d, OldSel %d"),
+        s_numNotebookEvents++, str.c_str(), eventType, 
+        event.GetSelection(), event.GetOldSelection());
 
 #if wxUSE_LOG
     m_text->SetInsertionPointEnd();
index 2fcf9a8548cf49e4097adcccb69471aa8902ca02..404d28c6d94c3eafb52d9e429463febed98ecc2e 100644 (file)
@@ -262,23 +262,13 @@ void wxListbook::OnSize(wxSizeEvent& event)
     }
 #endif // wxUSE_LINE_IN_LISTBOOK
 
-    // we should always have some selection if possible
-    if ( m_selection == wxNOT_FOUND && GetPageCount() )
-    {
-        SetSelection(0);
-    }
-
-    if ( m_selection != wxNOT_FOUND )
+    // resize the currently shown page
+    if (m_selection != wxNOT_FOUND )
     {
         wxWindow *page = m_pages[m_selection];
         wxCHECK_RET( page, _T("NULL page in wxListbook?") );
-
         page->SetSize(GetPageRect());
-        if ( !page->IsShown() )
-        {
-            page->Show();
         }
-    }
 }
 
 wxSize wxListbook::CalcSizeFromPage(const wxSize& sizePage) const
@@ -353,22 +343,26 @@ int wxListbook::SetSelection(size_t n)
     wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND,
                  _T("invalid page index in wxListbook::SetSelection()") );
 
-    int selOld = m_selection;
+    const int selOld = m_selection;
 
     if ( (int)n != m_selection )
     {
-        m_list->Select(n);
-        m_list->Focus(n);
+        if ( m_selection != wxNOT_FOUND )
+            m_pages[m_selection]->Hide();
+        wxWindow *page = m_pages[n];
+        page->SetSize(GetPageRect());
+        page->Show();
 
-        // change m_selection only now, otherwise OnListSelected() would ignore
-        // the selection change event
+        // change m_selection only now to ignore the selection change event
         m_selection = n;
+        
+        m_list->Select(n);
+        m_list->Focus(n);        
     }
 
     return selOld;
 }
 
-
 // ----------------------------------------------------------------------------
 // adding/removing the pages
 // ----------------------------------------------------------------------------
@@ -385,10 +379,10 @@ wxListbook::InsertPage(size_t n,
 
     m_list->InsertItem(n, text, imageId);
 
-    if ( bSelect )
+    // we should always have some selection if possible
+    if ( bSelect || (m_selection == wxNOT_FOUND) )
     {
-        m_list->Select(n);
-        m_list->Focus(n);
+        SetSelection(n);
     }
     else // don't select this page
     {
@@ -402,10 +396,28 @@ wxListbook::InsertPage(size_t n,
 
 wxWindow *wxListbook::DoRemovePage(size_t page)
 {
+    const int page_count = GetPageCount();
     wxWindow *win = wxBookCtrl::DoRemovePage(page);
+    
     if ( win )
     {
         m_list->DeleteItem(page);
+
+        if (m_selection >= (int)page)
+        {
+            // force new sel valid if possible
+            int sel = m_selection - 1;
+            if (page_count == 1)
+                sel = -1;
+            else if ((page_count == 2) || (sel == -1))
+                sel = 0;
+            
+            // force sel invalid if deleting current page - don't try to hide it
+            m_selection = (m_selection == (int)page) ? -1 : m_selection - 1;
+            
+            if ((sel != -1) && (sel != m_selection))
+                SetSelection(sel);
+        }
     }
 
     return win;
@@ -425,6 +437,7 @@ bool wxListbook::DeleteAllPages()
 void wxListbook::OnListSelected(wxListEvent& eventList)
 {
     const int selNew = eventList.GetIndex();
+    const int selOld = m_selection;
 
     if ( selNew == m_selection )
     {
@@ -439,7 +452,7 @@ void wxListbook::OnListSelected(wxListEvent& eventList)
 
     eventIng.SetEventObject(this);
     eventIng.SetSelection(selNew);
-    eventIng.SetOldSelection(m_selection);
+    eventIng.SetOldSelection(selOld);
     if ( GetEventHandler()->ProcessEvent(eventIng) && !eventIng.IsAllowed() )
     {
         m_list->Select(m_selection);
@@ -447,17 +460,13 @@ void wxListbook::OnListSelected(wxListEvent& eventList)
     }
 
     // change allowed: do change the page and notify the user about it
-    if ( m_selection != wxNOT_FOUND )
-        m_pages[m_selection]->Hide();
-    wxWindow *page = m_pages[m_selection = selNew];
-    page->SetSize(GetPageRect());
-    page->Show();
+    SetSelection(selNew);
 
     wxListbookEvent eventEd(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED, GetId());
 
     eventEd.SetEventObject(this);
     eventEd.SetSelection(selNew);
-    eventEd.SetOldSelection(m_selection);
+    eventEd.SetOldSelection(selOld);
 
     (void)GetEventHandler()->ProcessEvent(eventEd);
 }