X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f5e0b4bc7c729ff41e66fb7894fb1387f860bdb2..359878c33e86222a2156e25705ec97ab630a8763:/src/generic/choicbkg.cpp diff --git a/src/generic/choicbkg.cpp b/src/generic/choicbkg.cpp index aca807d88b..f390ca06e5 100644 --- a/src/generic/choicbkg.cpp +++ b/src/generic/choicbkg.cpp @@ -50,6 +50,13 @@ const wxCoord MARGIN = 5; // various wxWidgets macros // ---------------------------------------------------------------------------- +// check that the page index is valid +#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + IMPLEMENT_DYNAMIC_CLASS(wxChoicebook, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxChoicebookEvent, wxNotifyEvent) @@ -202,22 +209,12 @@ void wxChoicebook::OnSize(wxSizeEvent& event) m_choice->Move(posChoice.x, posChoice.y); m_choice->SetSize(sizeChoice.x, sizeChoice.y); - // we should always have some selection if possible - if ( m_selection == wxNOT_FOUND && GetPageCount() ) - { - SetSelection(0); - } - + // resize the currently shown page if ( m_selection != wxNOT_FOUND ) { wxWindow *page = m_pages[m_selection]; wxCHECK_RET( page, _T("NULL page in wxChoicebook?") ); - page->SetSize(GetPageRect()); - if ( !page->IsShown() ) - { - page->Show(); - } } } @@ -292,29 +289,38 @@ int wxChoicebook::GetSelection() const int wxChoicebook::SetSelection(size_t n) { - wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND, - _T("invalid page index in wxChoicebook::SetSelection()") ); + wxCHECK_MSG( IS_VALID_PAGE(n), wxNOT_FOUND, + wxT("invalid page index in wxChoicebook::SetSelection()") ); - int selOld = m_selection; + const int oldSel = m_selection; - if ( (int)n != m_selection ) + if ( int(n) != m_selection ) { - m_choice->Select(n); + wxChoicebookEvent event(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, m_windowId); + event.SetSelection(n); + event.SetOldSelection(m_selection); + event.SetEventObject(this); + if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() ) + { + if ( m_selection != wxNOT_FOUND ) + m_pages[m_selection]->Hide(); - // change m_selection only now, otherwise OnChoiceSelected() would ignore - // the selection change event + wxWindow *page = m_pages[n]; + page->SetSize(GetPageRect()); + page->Show(); - if ( m_selection != wxNOT_FOUND ) - m_pages[m_selection]->Hide(); - wxWindow *page = m_pages[m_selection = n]; - page->SetSize(GetPageRect()); - page->Show(); + m_selection = n; + m_choice->Select(n); + + // program allows the page change + event.SetEventType(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED); + (void)GetEventHandler()->ProcessEvent(event); + } } - return selOld; + return oldSel; } - // ---------------------------------------------------------------------------- // adding/removing the pages // ---------------------------------------------------------------------------- @@ -331,9 +337,10 @@ wxChoicebook::InsertPage(size_t n, m_choice->Insert(text, n); - if ( bSelect ) + // we should always have some selection if possible + if ( bSelect || (m_selection == wxNOT_FOUND) ) { - m_choice->Select(n); + SetSelection(n); } else // don't select this page { @@ -347,10 +354,28 @@ wxChoicebook::InsertPage(size_t n, wxWindow *wxChoicebook::DoRemovePage(size_t page) { + const int page_count = GetPageCount(); wxWindow *win = wxBookCtrl::DoRemovePage(page); + if ( win ) { m_choice->Delete(page); + + if (m_selection >= (int)page) + { + // force new sel valid if possible + int sel = m_selection - 1; + if (page_count == 1) + sel = wxNOT_FOUND; + 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) ? wxNOT_FOUND : m_selection - 1; + + if ((sel != wxNOT_FOUND) && (sel != m_selection)) + SetSelection(sel); + } } return win; @@ -370,6 +395,7 @@ bool wxChoicebook::DeleteAllPages() void wxChoicebook::OnChoiceSelected(wxCommandEvent& eventChoice) { const int selNew = eventChoice.GetSelection(); + const int selOld = m_selection; if ( selNew == m_selection ) { @@ -384,7 +410,7 @@ void wxChoicebook::OnChoiceSelected(wxCommandEvent& eventChoice) eventIng.SetEventObject(this); eventIng.SetSelection(selNew); - eventIng.SetOldSelection(m_selection); + eventIng.SetOldSelection(selOld); if ( GetEventHandler()->ProcessEvent(eventIng) && !eventIng.IsAllowed() ) { m_choice->Select(m_selection); @@ -392,17 +418,13 @@ void wxChoicebook::OnChoiceSelected(wxCommandEvent& eventChoice) } // 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); wxChoicebookEvent eventEd(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED, GetId()); eventEd.SetEventObject(this); eventEd.SetSelection(selNew); - eventEd.SetOldSelection(m_selection); + eventEd.SetOldSelection(selOld); (void)GetEventHandler()->ProcessEvent(eventEd); }