// 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;
*/
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.
*/
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<void*>(this) !=
+ dynamic_cast<void*>(popupCtrl) )
+ delete this;
+ #endif
+ popupCtrl->Destroy();
+ }
+ else
+ {
+ delete this;
+ }
+}
+
// ----------------------------------------------------------------------------
// input handling
// ----------------------------------------------------------------------------
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<void*>(m_popupInterface) !=
- dynamic_cast<void*>(popupCtrl) )
- delete m_popupInterface;
- #endif
- popupCtrl->Destroy();
- }
- else
- {
- delete m_popupInterface;
- }
+ // NB: DestroyPopup() performs 'delete this'.
+ m_popupInterface->DestroyPopup();
m_popupInterface = NULL;
}