From: Vadim Zeitlin Date: Mon, 9 Oct 2006 21:29:12 +0000 (+0000) Subject: avoid conflict between wxBookCtrlBase::DoSetSelection() and the derived classes;... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/deb325e3b21d956705214520b172ae8bf898a1ae?ds=inline avoid conflict between wxBookCtrlBase::DoSetSelection() and the derived classes; refactor more common code into the base class git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41843 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/bookctrl.h b/include/wx/bookctrl.h index 85d769d71a..8d5a2a3072 100644 --- a/include/wx/bookctrl.h +++ b/include/wx/bookctrl.h @@ -222,22 +222,36 @@ public: virtual bool HasMultiplePages() const { return true; } protected: - // typically, wxBookCtrl-derived classes will use DoSetSelection() function - // to implement SetSelection() and ChangeSelection() functions. - // these flags make DoSetSelection() more readable + // flags for DoSetSelection() enum { SetSelection_SendEvent = 1 }; - // if using DoSetSelection() for implementing [Set|Change]Selection, - // then override UpdateSelectedPage() and MakeChangedEvent() - virtual int DoSetSelection(size_t nPage, int flags, wxBookCtrlBaseEvent &event); + // set the selection to the given page, sending the events (which can + // possibly prevent the page change from taking place) if SendEvent flag is + // included + virtual int DoSetSelection(size_t nPage, int flags = 0); + + // if the derived class uses DoSetSelection() for implementing + // [Set|Change]Selection, it must override UpdateSelectedPage(), + // CreatePageChangingEvent() and MakeChangedEvent(), but as it might not + // use it, these functions are not pure virtual + + // called to notify the control about a new current page virtual void UpdateSelectedPage(size_t WXUNUSED(newsel)) { wxFAIL_MSG(wxT("Override this function!")); } - virtual void MakeChangedEvent(wxBookCtrlBaseEvent &WXUNUSED(event)) + + // create a new "page changing" event + virtual wxBookCtrlBaseEvent* CreatePageChangingEvent() const + { wxFAIL_MSG(wxT("Override this function!")); return NULL; } + + // modify the event created by CreatePageChangingEvent() to "page changed" + // event, usually by just calling SetEventType() on it + virtual void MakeChangedEvent(wxBookCtrlBaseEvent& WXUNUSED(event)) { wxFAIL_MSG(wxT("Override this function!")); } + // Should we accept NULL page pointers in Add/InsertPage()? // // Default is no but derived classes may override it if they can treat NULL diff --git a/include/wx/choicebk.h b/include/wx/choicebk.h index cbb17693f8..0414d0d2f0 100644 --- a/include/wx/choicebk.h +++ b/include/wx/choicebk.h @@ -84,18 +84,14 @@ protected: // get the size which the choice control should have virtual wxSize GetControllerSize() const; - int DoSetSelection(size_t nPage, int flags = 0); - void UpdateSelectedPage(size_t newsel) { m_selection = newsel; GetChoiceCtrl()->Select(newsel); } - void MakeChangedEvent(wxBookCtrlBaseEvent &event) - { - event.SetEventType(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED); - } + wxBookCtrlBaseEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlBaseEvent &event); // event handlers void OnChoiceSelected(wxCommandEvent& event); diff --git a/include/wx/listbook.h b/include/wx/listbook.h index b62da59d47..056fc64bbc 100644 --- a/include/wx/listbook.h +++ b/include/wx/listbook.h @@ -85,14 +85,10 @@ protected: // return the page corresponding to the tab at the specified position virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; - int DoSetSelection(size_t nPage, int flags = 0); - void UpdateSelectedPage(size_t newsel); - void MakeChangedEvent(wxBookCtrlBaseEvent &event) - { - event.SetEventType(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED); - } + wxBookCtrlBaseEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlBaseEvent &event); // event handlers void OnListSelected(wxListEvent& event); diff --git a/include/wx/toolbook.h b/include/wx/toolbook.h index 27e3b28dba..f829b796b4 100644 --- a/include/wx/toolbook.h +++ b/include/wx/toolbook.h @@ -101,13 +101,10 @@ protected: void OnSize(wxSizeEvent& event); void OnIdle(wxIdleEvent& event); - int DoSetSelection(size_t nPage, int flags = 0); void UpdateSelectedPage(size_t newsel); - - void MakeChangedEvent(wxBookCtrlBaseEvent &event) - { - event.SetEventType(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED); - } + + wxBookCtrlBaseEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlBaseEvent &event); // the currently selected page or wxNOT_FOUND if none int m_selection; diff --git a/src/common/bookctrl.cpp b/src/common/bookctrl.cpp index d194cc20a9..db698594dd 100644 --- a/src/common/bookctrl.cpp +++ b/src/common/bookctrl.cpp @@ -423,7 +423,7 @@ wxSize wxBookCtrlBase::GetControllerSize() const return size; } -int wxBookCtrlBase::DoSetSelection(size_t n, int flags, wxBookCtrlBaseEvent &event) +int wxBookCtrlBase::DoSetSelection(size_t n, int flags) { wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND, wxT("invalid page index in wxBookCtrlBase::DoSetSelection()") ); @@ -432,15 +432,16 @@ int wxBookCtrlBase::DoSetSelection(size_t n, int flags, wxBookCtrlBaseEvent &eve if ( oldSel != wxNOT_FOUND && n != (size_t)oldSel ) { + wxBookCtrlBaseEvent *event = CreatePageChangingEvent(); bool allowed = false; if ( flags & SetSelection_SendEvent ) { - event.SetSelection(n); - event.SetOldSelection(oldSel); - event.SetEventObject(this); + event->SetSelection(n); + event->SetOldSelection(oldSel); + event->SetEventObject(this); - allowed = !GetEventHandler()->ProcessEvent(event) || event.IsAllowed(); + allowed = !GetEventHandler()->ProcessEvent(*event) || event->IsAllowed(); } if ( !(flags & SetSelection_SendEvent) || allowed) @@ -458,10 +459,12 @@ int wxBookCtrlBase::DoSetSelection(size_t n, int flags, wxBookCtrlBaseEvent &eve if ( flags & SetSelection_SendEvent ) { // program allows the page change - MakeChangedEvent(event); - (void)GetEventHandler()->ProcessEvent(event); + MakeChangedEvent(*event); + (void)GetEventHandler()->ProcessEvent(*event); } } + + delete event; } return oldSel; diff --git a/src/generic/choicbkg.cpp b/src/generic/choicbkg.cpp index d74d0b575f..7216b152bc 100644 --- a/src/generic/choicbkg.cpp +++ b/src/generic/choicbkg.cpp @@ -209,10 +209,14 @@ int wxChoicebook::GetSelection() const return m_selection; } -int wxChoicebook::DoSetSelection(size_t n, int flags) +wxBookCtrlBaseEvent* wxChoicebook::CreatePageChangingEvent() const { - wxChoicebookEvent event(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, m_windowId); - return wxBookCtrlBase::DoSetSelection(n, flags, event); + return new wxChoicebookEvent(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, m_windowId); +} + +void wxChoicebook::MakeChangedEvent(wxBookCtrlBaseEvent &event) +{ + event.SetEventType(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED); } // ---------------------------------------------------------------------------- diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp index 9f725353c0..a9498bdf3c 100644 --- a/src/generic/listbkg.cpp +++ b/src/generic/listbkg.cpp @@ -274,12 +274,17 @@ int wxListbook::GetSelection() const return m_selection; } -int wxListbook::DoSetSelection(size_t n, int flags) +wxBookCtrlBaseEvent* wxListbook::CreatePageChangingEvent() const { - wxListbookEvent event(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, m_windowId); - return wxBookCtrlBase::DoSetSelection(n, flags, event); + return new wxListbookEvent(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, m_windowId); } +void wxListbook::MakeChangedEvent(wxBookCtrlBaseEvent &event) +{ + event.SetEventType(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED); +} + + // ---------------------------------------------------------------------------- // adding/removing the pages // ---------------------------------------------------------------------------- diff --git a/src/generic/toolbkg.cpp b/src/generic/toolbkg.cpp index 1b8bff7284..310c29ab71 100644 --- a/src/generic/toolbkg.cpp +++ b/src/generic/toolbkg.cpp @@ -245,10 +245,14 @@ int wxToolbook::GetSelection() const return m_selection; } -int wxToolbook::DoSetSelection(size_t n, int flags) +wxBookCtrlBaseEvent* wxToolbook::CreatePageChangingEvent() const { - wxToolbookEvent event(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, m_windowId); - return wxBookCtrlBase::DoSetSelection(n, flags, event); + return new wxToolbookEvent(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, m_windowId); +} + +void wxToolbook::MakeChangedEvent(wxBookCtrlBaseEvent &event) +{ + event.SetEventType(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED); } void wxToolbook::UpdateSelectedPage(size_t newsel)