From 5dd238c6dde6c4941b4cb26143cd7e5d2ad65ed4 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 23 Dec 2008 22:33:08 +0000 Subject: [PATCH 1/1] call wxFlexGridSizer::AddGrowableRow/Col() only after creating the sizer children, otherwise row/col index could be out of range (#10294) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57519 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/xrc/xh_sizer.h | 4 +--- src/xrc/xh_sizer.cpp | 46 +++++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/include/wx/xrc/xh_sizer.h b/include/wx/xrc/xh_sizer.h index e7133e6e5a..a6cbe7a31c 100644 --- a/include/wx/xrc/xh_sizer.h +++ b/include/wx/xrc/xh_sizer.h @@ -18,8 +18,6 @@ #include "wx/sizer.h" #include "wx/gbsizer.h" -class WXDLLIMPEXP_FWD_CORE wxSizer; - class WXDLLIMPEXP_XRC wxSizerXmlHandler : public wxXmlResourceHandler { DECLARE_DYNAMIC_CLASS(wxSizerXmlHandler) @@ -45,7 +43,7 @@ private: wxSizer* Handle_wxStaticBoxSizer(); #endif wxSizer* Handle_wxGridSizer(); - wxSizer* Handle_wxFlexGridSizer(); + wxFlexGridSizer* Handle_wxFlexGridSizer(); wxSizer* Handle_wxGridBagSizer(); wxSizer* Handle_wxWrapSizer(); diff --git a/src/xrc/xh_sizer.cpp b/src/xrc/xh_sizer.cpp index ea64786b64..6e2d92cf5f 100644 --- a/src/xrc/xh_sizer.cpp +++ b/src/xrc/xh_sizer.cpp @@ -197,6 +197,7 @@ wxObject* wxSizerXmlHandler::Handle_spacer() wxObject* wxSizerXmlHandler::Handle_sizer() { wxSizer *sizer = NULL; + wxFlexGridSizer *flexsizer = NULL; wxXmlNode *parentNode = m_node->GetParent(); @@ -210,21 +211,19 @@ wxObject* wxSizerXmlHandler::Handle_sizer() if (m_class == wxT("wxBoxSizer")) sizer = Handle_wxBoxSizer(); - #if wxUSE_STATBOX else if (m_class == wxT("wxStaticBoxSizer")) sizer = Handle_wxStaticBoxSizer(); #endif - else if (m_class == wxT("wxGridSizer")) sizer = Handle_wxGridSizer(); - else if (m_class == wxT("wxFlexGridSizer")) - sizer = Handle_wxFlexGridSizer(); - + { + flexsizer = Handle_wxFlexGridSizer(); + sizer = flexsizer; + } else if (m_class == wxT("wxGridBagSizer")) sizer = Handle_wxGridBagSizer(); - else if (m_class == wxT("wxWrapSizer")) sizer = Handle_wxWrapSizer(); @@ -249,6 +248,13 @@ wxObject* wxSizerXmlHandler::Handle_sizer() CreateChildren(m_parent, true/*only this handler*/); + // set growable rows and cols for sizers which support this + if ( flexsizer ) + { + SetGrowables(flexsizer, wxT("growablerows"), true); + SetGrowables(flexsizer, wxT("growablecols"), false); + } + // restore state m_isInside = old_ins; m_parentSizer = old_par; @@ -308,24 +314,16 @@ wxSizer* wxSizerXmlHandler::Handle_wxGridSizer() } -wxSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer() +wxFlexGridSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer() { - wxFlexGridSizer *sizer = - new wxFlexGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")), - GetDimension(wxT("vgap")), GetDimension(wxT("hgap"))); - SetGrowables(sizer, wxT("growablerows"), true); - SetGrowables(sizer, wxT("growablecols"), false); - return sizer; + return new wxFlexGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")), + GetDimension(wxT("vgap")), GetDimension(wxT("hgap"))); } wxSizer* wxSizerXmlHandler::Handle_wxGridBagSizer() { - wxGridBagSizer *sizer = - new wxGridBagSizer(GetDimension(wxT("vgap")), GetDimension(wxT("hgap"))); - SetGrowables(sizer, wxT("growablerows"), true); - SetGrowables(sizer, wxT("growablecols"), false); - return sizer; + return new wxGridBagSizer(GetDimension(wxT("vgap")), GetDimension(wxT("hgap"))); } wxSizer* wxSizerXmlHandler::Handle_wxWrapSizer() @@ -346,13 +344,15 @@ void wxSizerXmlHandler::SetGrowables(wxFlexGridSizer* sizer, while (tkn.HasMoreTokens()) { if (!tkn.GetNextToken().ToULong(&l)) + { wxLogError(wxT("growable[rows|cols] must be comma-separated list of row numbers")); - else { - if (rows) - sizer->AddGrowableRow(l); - else - sizer->AddGrowableCol(l); + break; } + + if (rows) + sizer->AddGrowableRow(l); + else + sizer->AddGrowableCol(l); } } -- 2.47.2