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
This commit is contained in:
Vadim Zeitlin
2007-03-30 19:57:23 +00:00
parent f4854380c1
commit 4dd10327d2
2 changed files with 85 additions and 21 deletions

View File

@@ -224,7 +224,7 @@ public:
{ {
Init(flags); Init(flags);
SetWindow(window); DoSetWindow(window);
} }
// subsizer // subsizer
@@ -239,7 +239,7 @@ public:
{ {
Init(flags); Init(flags);
SetSizer(sizer); DoSetSizer(sizer);
} }
// spacer // spacer
@@ -255,7 +255,7 @@ public:
{ {
Init(flags); Init(flags);
SetSpacer(width, height); DoSetSpacer(wxSize(width, height));
} }
wxSizerItem(); wxSizerItem();
@@ -340,20 +340,51 @@ public:
wxPoint GetPosition() const wxPoint GetPosition() const
{ return m_pos; } { 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);
}
// these functions do not free old sizer/spacer void AssignSizer(wxSizer *sizer)
void SetWindow(wxWindow *window); {
void SetSizer(wxSizer *sizer); Free();
void SetSpacer(const wxSize& size); DoSetSizer(sizer);
void SetSpacer(int width, int height) { SetSpacer(wxSize(width, height)); } }
void AssignSpacer(const wxSize& size)
{
Free();
DoSetSpacer(size);
}
void AssignSpacer(int w, int h) { AssignSpacer(wxSize(w, h)); }
#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: protected:
// common part of several ctors // 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 // common part of ctors taking wxSizerFlags
void Init(const wxSizerFlags& flags); 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 // discriminated union: depending on m_kind one of the fields is valid
enum enum
@@ -848,6 +879,31 @@ private:
// inline functions implementation // 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* inline wxSizerItem*
wxSizer::Add( wxSizerItem *item ) wxSizer::Add( wxSizerItem *item )
{ {
@@ -1002,5 +1058,4 @@ wxSizer::InsertStretchSpacer(size_t index, int prop)
return Insert(index, 0, 0, prop); return Insert(index, 0, 0, prop);
} }
#endif // __WXSIZER_H__ #endif // __WXSIZER_H__

View File

@@ -103,12 +103,10 @@ wxSizerItem::wxSizerItem()
m_proportion = 0; m_proportion = 0;
m_border = 0; m_border = 0;
m_flag = 0; m_flag = 0;
m_kind = Item_None;
} }
// window item // window item
void wxSizerItem::SetWindow(wxWindow *window) void wxSizerItem::DoSetWindow(wxWindow *window)
{ {
wxCHECK_RET( window, _T("NULL window in wxSizerItem::SetWindow()") ); wxCHECK_RET( window, _T("NULL window in wxSizerItem::SetWindow()") );
@@ -130,16 +128,17 @@ wxSizerItem::wxSizerItem(wxWindow *window,
int flag, int flag,
int border, int border,
wxObject* userData) wxObject* userData)
: m_proportion(proportion), : m_kind(Item_None),
m_proportion(proportion),
m_border(border), m_border(border),
m_flag(flag), m_flag(flag),
m_userData(userData) m_userData(userData)
{ {
SetWindow(window); DoSetWindow(window);
} }
// sizer item // sizer item
void wxSizerItem::SetSizer(wxSizer *sizer) void wxSizerItem::DoSetSizer(wxSizer *sizer)
{ {
m_kind = Item_Sizer; m_kind = Item_Sizer;
m_sizer = sizer; m_sizer = sizer;
@@ -150,19 +149,21 @@ wxSizerItem::wxSizerItem(wxSizer *sizer,
int flag, int flag,
int border, int border,
wxObject* userData) wxObject* userData)
: m_proportion(proportion), : m_kind(Item_None),
m_sizer(NULL),
m_proportion(proportion),
m_border(border), m_border(border),
m_flag(flag), m_flag(flag),
m_ratio(0.0), m_ratio(0.0),
m_userData(userData) m_userData(userData)
{ {
SetSizer(sizer); DoSetSizer(sizer);
// m_minSize is set later // m_minSize is set later
} }
// spacer item // spacer item
void wxSizerItem::SetSpacer(const wxSize& size) void wxSizerItem::DoSetSpacer(const wxSize& size)
{ {
m_kind = Item_Spacer; m_kind = Item_Spacer;
m_spacer = new wxSizerSpacer(size); m_spacer = new wxSizerSpacer(size);
@@ -176,19 +177,25 @@ wxSizerItem::wxSizerItem(int width,
int flag, int flag,
int border, int border,
wxObject* userData) 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_proportion(proportion),
m_border(border), m_border(border),
m_flag(flag), m_flag(flag),
m_userData(userData) m_userData(userData)
{ {
SetSpacer(width, height); DoSetSpacer(wxSize(width, height));
} }
wxSizerItem::~wxSizerItem() wxSizerItem::~wxSizerItem()
{ {
delete m_userData; delete m_userData;
Free();
}
void wxSizerItem::Free()
{
switch ( m_kind ) switch ( m_kind )
{ {
case Item_None: case Item_None:
@@ -210,6 +217,8 @@ wxSizerItem::~wxSizerItem()
default: default:
wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") );
} }
m_kind = Item_None;
} }
wxSize wxSizerItem::GetSpacer() const wxSize wxSizerItem::GetSpacer() const