From df3c4a42d973ec9f4abf9d4f1e5779a40ac310d0 Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Thu, 31 Mar 2011 17:22:51 +0000 Subject: [PATCH] Added wxComboPopup::DestroyPopup(), which responsibility is to call Destroy() for the popup control and also delete the combo popup object itself. The default implementation should be able to handle common cases. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67365 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/combo.h | 7 ++++++ interface/wx/combo.h | 8 ++++++ src/common/combocmn.cpp | 54 +++++++++++++++++++++++------------------ 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/include/wx/combo.h b/include/wx/combo.h index cb13398fba..2196b4e5cb 100644 --- a/include/wx/combo.h +++ b/include/wx/combo.h @@ -767,6 +767,13 @@ public: // Return true for success. virtual bool Create(wxWindow* parent) = 0; + // Calls Destroy() for the popup control (i.e. one returned by + // GetControl()) and makes sure that 'this' is deleted at the end. + // Default implementation works for both cases where popup control + // class is multiple inherited or created on heap as a separate + // object. + virtual void DestroyPopup(); + // We must have an associated control which is subclassed by the combobox. virtual wxWindow *GetControl() = 0; diff --git a/interface/wx/combo.h b/interface/wx/combo.h index 6b7291eca4..00ba186a5f 100644 --- a/interface/wx/combo.h +++ b/interface/wx/combo.h @@ -36,6 +36,14 @@ public: */ virtual bool Create(wxWindow* parent) = 0; + /** + You only need to implement this member function if you create + your popup class in non-standard way. The default implementation can + handle both multiple-inherited popup control (as seen in wxComboCtrl + samples) and one allocated separately in heap. + */ + virtual void DestroyPopup(); + /** Utility function that hides the popup. */ diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index e0a3db75c6..bf1ad43c3a 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -674,6 +674,34 @@ void wxComboPopup::Dismiss() m_combo->HidePopup(true); } +void wxComboPopup::DestroyPopup() +{ + // Here we make sure that the popup control's Destroy() gets called. + // This is necessary for the wxPersistentWindow to work properly. + wxWindow* popupCtrl = GetControl(); + if ( popupCtrl ) + { + // While all wxComboCtrl examples have m_popupInterface and + // popupCtrl as the same class (that will be deleted via the + // Destroy() call below), it is technically still possible to + // have implementations where they are in fact not same + // multiple-inherited class. Here we use C++ RTTI to check for + // this rare case. + #ifndef wxNO_RTTI + // It is probably better to delete m_popupInterface first, so + // that it retains access to its popup control window. + if ( dynamic_cast(this) != + dynamic_cast(popupCtrl) ) + delete this; + #endif + popupCtrl->Destroy(); + } + else + { + delete this; + } +} + // ---------------------------------------------------------------------------- // input handling // ---------------------------------------------------------------------------- @@ -2091,30 +2119,8 @@ void wxComboCtrlBase::DestroyPopup() if ( m_popupInterface ) { - // Here we make sure that the popup control's Destroy() gets called. - // This is necessary for the wxPersistentWindow to work properly. - wxWindow* popupCtrl = m_popupInterface->GetControl(); - if ( popupCtrl ) - { - // While all wxComboCtrl examples have m_popupInterface and - // popupCtrl as the same class (that will be deleted via the - // Destroy() call below), it is technically still possible to - // have implementations where they are in fact not same - // multiple-inherited class. Here we use C++ RTTI to check for - // this rare case. - #ifndef wxNO_RTTI - // It is probably better to delete m_popupInterface first, so - // that it retains access to its popup control window. - if ( dynamic_cast(m_popupInterface) != - dynamic_cast(popupCtrl) ) - delete m_popupInterface; - #endif - popupCtrl->Destroy(); - } - else - { - delete m_popupInterface; - } + // NB: DestroyPopup() performs 'delete this'. + m_popupInterface->DestroyPopup(); m_popupInterface = NULL; } -- 2.47.2