From 4dd10327d227f81da68fea2bf5450364b3f74c63 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 30 Mar 2007 19:57:23 +0000 Subject: [PATCH] added wxSizerItem::AssignXXX() methods replacing the old SetXXX() but freeing the current item contents (modified patch 1687785) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45172 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/sizer.h | 75 ++++++++++++++++++++++++++++++++++++++------ src/common/sizer.cpp | 31 +++++++++++------- 2 files changed, 85 insertions(+), 21 deletions(-) diff --git a/include/wx/sizer.h b/include/wx/sizer.h index 5cceec9ca8..8aa759e376 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -224,7 +224,7 @@ public: { Init(flags); - SetWindow(window); + DoSetWindow(window); } // subsizer @@ -239,7 +239,7 @@ public: { Init(flags); - SetSizer(sizer); + DoSetSizer(sizer); } // spacer @@ -255,7 +255,7 @@ public: { Init(flags); - SetSpacer(width, height); + DoSetSpacer(wxSize(width, height)); } wxSizerItem(); @@ -340,20 +340,51 @@ public: wxPoint GetPosition() const { return m_pos; } + // these functions delete the current contents of the item if it's a sizer + // or a spacer but not if it is a window + void AssignWindow(wxWindow *window) + { + Free(); + DoSetWindow(window); + } + + void AssignSizer(wxSizer *sizer) + { + Free(); + DoSetSizer(sizer); + } + + void AssignSpacer(const wxSize& size) + { + Free(); + DoSetSpacer(size); + } + + void AssignSpacer(int w, int h) { AssignSpacer(wxSize(w, h)); } - // these functions do not free old sizer/spacer - void SetWindow(wxWindow *window); - void SetSizer(wxSizer *sizer); - void SetSpacer(const wxSize& size); - void SetSpacer(int width, int height) { SetSpacer(wxSize(width, height)); } +#if WXWIN_COMPATIBILITY_2_8 + // these functions do not free the old sizer/spacer and so can easily + // provoke the memory leaks and so shouldn't be used, use Assign() instead + wxDEPRECATED( void SetWindow(wxWindow *window) ); + wxDEPRECATED( void SetSizer(wxSizer *sizer) ); + wxDEPRECATED( void SetSpacer(const wxSize& size) ); + wxDEPRECATED( void SetSpacer(int width, int height) ); +#endif // WXWIN_COMPATIBILITY_2_8 protected: // common part of several ctors - void Init() { m_userData = NULL; } + void Init() { m_userData = NULL; m_kind = Item_None; } // common part of ctors taking wxSizerFlags void Init(const wxSizerFlags& flags); + // free current contents + void Free(); + + // common parts of Set/AssignXXX() + void DoSetWindow(wxWindow *window); + void DoSetSizer(wxSizer *sizer); + void DoSetSpacer(const wxSize& size); // discriminated union: depending on m_kind one of the fields is valid enum @@ -848,6 +879,31 @@ private: // inline functions implementation // ---------------------------------------------------------------------------- +#if WXWIN_COMPATIBILITY_2_8 + +inline void wxSizerItem::SetWindow(wxWindow *window) +{ + DoSetWindow(window); +} + +inline void wxSizerItem::SetSizer(wxSizer *sizer) +{ + DoSetSizer(sizer); +} + +inline void wxSizerItem::SetSpacer(const wxSize& size) +{ + DoSetSpacer(size); +} + +inline void wxSizerItem::SetSpacer(int width, int height) +{ + DoSetSpacer(wxSize(width, height)); +} + +#endif // WXWIN_COMPATIBILITY_2_8 + + inline wxSizerItem* wxSizer::Add( wxSizerItem *item ) { @@ -1002,5 +1058,4 @@ wxSizer::InsertStretchSpacer(size_t index, int prop) return Insert(index, 0, 0, prop); } - #endif // __WXSIZER_H__ diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 66a1525431..06a9bf2e49 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -103,12 +103,10 @@ wxSizerItem::wxSizerItem() m_proportion = 0; m_border = 0; m_flag = 0; - - m_kind = Item_None; } // window item -void wxSizerItem::SetWindow(wxWindow *window) +void wxSizerItem::DoSetWindow(wxWindow *window) { wxCHECK_RET( window, _T("NULL window in wxSizerItem::SetWindow()") ); @@ -130,16 +128,17 @@ wxSizerItem::wxSizerItem(wxWindow *window, int flag, int border, wxObject* userData) - : m_proportion(proportion), + : m_kind(Item_None), + m_proportion(proportion), m_border(border), m_flag(flag), m_userData(userData) { - SetWindow(window); + DoSetWindow(window); } // sizer item -void wxSizerItem::SetSizer(wxSizer *sizer) +void wxSizerItem::DoSetSizer(wxSizer *sizer) { m_kind = Item_Sizer; m_sizer = sizer; @@ -150,19 +149,21 @@ wxSizerItem::wxSizerItem(wxSizer *sizer, int flag, int border, wxObject* userData) - : m_proportion(proportion), + : m_kind(Item_None), + m_sizer(NULL), + m_proportion(proportion), m_border(border), m_flag(flag), m_ratio(0.0), m_userData(userData) { - SetSizer(sizer); + DoSetSizer(sizer); // m_minSize is set later } // spacer item -void wxSizerItem::SetSpacer(const wxSize& size) +void wxSizerItem::DoSetSpacer(const wxSize& size) { m_kind = Item_Spacer; m_spacer = new wxSizerSpacer(size); @@ -176,19 +177,25 @@ wxSizerItem::wxSizerItem(int width, int flag, int border, wxObject* userData) - : m_minSize(width, height), // minimal size is the initial size + : m_kind(Item_None), + m_sizer(NULL), + m_minSize(width, height), // minimal size is the initial size m_proportion(proportion), m_border(border), m_flag(flag), m_userData(userData) { - SetSpacer(width, height); + DoSetSpacer(wxSize(width, height)); } wxSizerItem::~wxSizerItem() { delete m_userData; + Free(); +} +void wxSizerItem::Free() +{ switch ( m_kind ) { case Item_None: @@ -210,6 +217,8 @@ wxSizerItem::~wxSizerItem() default: wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); } + + m_kind = Item_None; } wxSize wxSizerItem::GetSpacer() const -- 2.45.2