From 33ebfc3b9b542e2cefcab456e47a101311b74697 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 16 Sep 2004 22:14:34 +0000 Subject: [PATCH] made wxListbook events more consistent with wxNotebook ones (patch 1001271) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29165 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/listbook.h | 8 ++--- samples/notebook/notebook.cpp | 9 ++--- src/generic/listbkg.cpp | 65 ++++++++++++++++++++--------------- 3 files changed, 45 insertions(+), 37 deletions(-) diff --git a/include/wx/listbook.h b/include/wx/listbook.h index 136c2e879c..44ab2b1c5e 100644 --- a/include/wx/listbook.h +++ b/include/wx/listbook.h @@ -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) diff --git a/samples/notebook/notebook.cpp b/samples/notebook/notebook.cpp index f5ed8758e1..ac9dcd4319 100644 --- a/samples/notebook/notebook.cpp +++ b/samples/notebook/notebook.cpp @@ -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(); diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp index 2fcf9a8548..404d28c6d9 100644 --- a/src/generic/listbkg.cpp +++ b/src/generic/listbkg.cpp @@ -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); } -- 2.47.2