From: Włodzimierz Skiba Date: Wed, 24 May 2006 09:29:06 +0000 (+0000) Subject: [ 1493802 ] Allow multiple wxComboCtrl::SetPopupControl calls. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7ca4ac63835adef8226b655013a8a84b416c8171 [ 1493802 ] Allow multiple wxComboCtrl::SetPopupControl calls. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39311 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/combo.h b/include/wx/combo.h index 213409a74b..c821f1e328 100644 --- a/include/wx/combo.h +++ b/include/wx/combo.h @@ -375,6 +375,9 @@ protected: // Creates popup window, calls interface->Create(), etc void CreatePopup(); + // Destroy popup window and all related constructs + void DestroyPopup(); + // override the base class virtuals involved in geometry calculations virtual void DoMoveWindow(int x, int y, int width, int height); virtual wxSize DoGetBestSize() const; diff --git a/include/wx/odcombo.h b/include/wx/odcombo.h index 832778c237..3c960cb4ee 100644 --- a/include/wx/odcombo.h +++ b/include/wx/odcombo.h @@ -125,7 +125,7 @@ protected: // sends combobox select event from the parent combo control void SendComboBoxEvent( int selection ); - + // gets value, sends event and dismisses void DismissWithEvent(); @@ -221,7 +221,7 @@ public: const wxPoint& pos, const wxSize& size, const wxArrayString& choices, - long style = 0, + long style, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr); @@ -262,6 +262,13 @@ public: virtual int GetSelection() const; virtual void SetSelection(int n) { Select(n); } + + // Prevent a method from being hidden + virtual void SetSelection(long from, long to) + { + wxComboCtrl::SetSelection(from,to); + } + wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST protected: @@ -294,5 +301,6 @@ private: #endif // wxUSE_ODCOMBOBOX + #endif // _WX_ODCOMBO_H_ diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index e78ccaaa1a..356689bf70 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -774,15 +774,7 @@ wxComboCtrlBase::~wxComboCtrlBase() m_toplevEvtHandler = (wxEvtHandler*) NULL; #endif - if ( m_popup ) - m_popup->RemoveEventHandler(m_popupExtraHandler); - - delete m_popupExtraHandler; - - HidePopup(); - - delete m_popupInterface; - delete m_winPopup; + DestroyPopup(); RemoveEventHandler(m_extraEvtHandler); @@ -1531,19 +1523,38 @@ void wxComboCtrlBase::CreatePopup() popupInterface->m_iFlags |= wxCP_IFLAG_CREATED; } +// Destroy popup window and the child control +void wxComboCtrlBase::DestroyPopup() +{ + if ( m_popup ) + m_popup->RemoveEventHandler(m_popupExtraHandler); + + delete m_popupExtraHandler; + + HidePopup(); + + delete m_popupInterface; + + if ( m_winPopup ) + m_winPopup->Destroy(); + + m_popupInterface = (wxComboPopup*) NULL; + m_winPopup = (wxWindow*) NULL; + m_popup = (wxWindow*) NULL; +} + void wxComboCtrlBase::SetPopupControl( wxComboPopup* iface ) { wxCHECK_RET( iface, wxT("no popup interface set for wxComboCtrl") ); - delete m_popupInterface; - delete m_winPopup; + DestroyPopup(); iface->InitBase(this); iface->Init(); m_popupInterface = iface; - if ( !iface->LazyCreate() || m_winPopup ) + if ( !iface->LazyCreate() ) { CreatePopup(); }