From: Włodzimierz Skiba Date: Thu, 23 Sep 2004 12:43:10 +0000 (+0000) Subject: wx(Choice/List/Note)book controls send CHANG(ED/ING) events in SetSelection. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1f30c17645c56f85178ee780fa330d954e45cea9?ds=inline wx(Choice/List/Note)book controls send CHANG(ED/ING) events in SetSelection. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29276 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 8d1e1b4612..dd3082df78 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -233,6 +233,7 @@ All (GUI): - added wxChoicebook control - smoother time estimation updates in wxProgressDialog (Christian Sturmlechner) - the XRC contrib library was moved to the core +- wx(Choice/List/Note)book controls send CHANG(ED/ING) events in SetSelection Unix: diff --git a/include/wx/bookctrl.h b/include/wx/bookctrl.h index 0f03436ae5..d404021123 100644 --- a/include/wx/bookctrl.h +++ b/include/wx/bookctrl.h @@ -156,7 +156,7 @@ public: // set the currently selected page, return the index of the previously // selected one (or -1 on error) // - // NB: this function will _not_ generate PAGE_CHANGING/ED events + // NB: this function will generate PAGE_CHANGING/ED events virtual int SetSelection(size_t n) = 0; diff --git a/src/generic/choicbkg.cpp b/src/generic/choicbkg.cpp index 7620db21e9..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) @@ -282,25 +289,36 @@ 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()") ); - const int selOld = m_selection; + const int oldSel = m_selection; - if ( (int)n != m_selection ) + if ( int(n) != m_selection ) { - if ( m_selection != wxNOT_FOUND ) - m_pages[m_selection]->Hide(); - wxWindow *page = m_pages[n]; - page->SetSize(GetPageRect()); - page->Show(); + 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(); + + wxWindow *page = m_pages[n]; + page->SetSize(GetPageRect()); + page->Show(); + + m_selection = n; + m_choice->Select(n); - // change m_selection only now to ignore the selection change event - 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; } // ---------------------------------------------------------------------------- diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp index 928f9b1026..313205d051 100644 --- a/src/generic/listbkg.cpp +++ b/src/generic/listbkg.cpp @@ -48,6 +48,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(wxListbook, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxListbookEvent, wxNotifyEvent) @@ -340,27 +347,37 @@ int wxListbook::GetSelection() const int wxListbook::SetSelection(size_t n) { - wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND, - _T("invalid page index in wxListbook::SetSelection()") ); + wxCHECK_MSG( IS_VALID_PAGE(n), wxNOT_FOUND, + wxT("invalid page index in wxListbook::SetSelection()") ); - const int selOld = m_selection; + const int oldSel = m_selection; - if ( (int)n != m_selection ) + if ( int(n) != m_selection ) { - if ( m_selection != wxNOT_FOUND ) - m_pages[m_selection]->Hide(); - wxWindow *page = m_pages[n]; - page->SetSize(GetPageRect()); - page->Show(); + wxListbookEvent event(wxEVT_COMMAND_LISTBOOK_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 to ignore the selection change event - m_selection = n; + wxWindow *page = m_pages[n]; + page->SetSize(GetPageRect()); + page->Show(); - m_list->Select(n); - m_list->Focus(n); + m_selection = n; + m_list->Select(n); + m_list->Focus(n); + + // program allows the page change + event.SetEventType(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED); + (void)GetEventHandler()->ProcessEvent(event); + } } - return selOld; + return oldSel; } // ----------------------------------------------------------------------------