detect and report errors in XRC specification of grid sizers
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59572 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -741,15 +741,16 @@ public:
|
|||||||
int GetVGap() const { return m_vgap; }
|
int GetVGap() const { return m_vgap; }
|
||||||
int GetHGap() const { return m_hgap; }
|
int GetHGap() const { return m_hgap; }
|
||||||
|
|
||||||
|
// return the number of total items and the number of columns and rows
|
||||||
|
// (for internal use only)
|
||||||
|
int CalcRowsCols(int& rows, int& cols) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int m_rows;
|
int m_rows;
|
||||||
int m_cols;
|
int m_cols;
|
||||||
int m_vgap;
|
int m_vgap;
|
||||||
int m_hgap;
|
int m_hgap;
|
||||||
|
|
||||||
// return the number of total items and the number of columns and rows
|
|
||||||
int CalcRowsCols(int& rows, int& cols) const;
|
|
||||||
|
|
||||||
void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h );
|
void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@@ -47,6 +47,7 @@ private:
|
|||||||
wxGridBagSizer* Handle_wxGridBagSizer();
|
wxGridBagSizer* Handle_wxGridBagSizer();
|
||||||
wxSizer* Handle_wxWrapSizer();
|
wxSizer* Handle_wxWrapSizer();
|
||||||
|
|
||||||
|
bool ValidateGridSizerChildren();
|
||||||
void SetGrowables(wxFlexGridSizer* fsizer, const wxChar* param, bool rows);
|
void SetGrowables(wxFlexGridSizer* fsizer, const wxChar* param, bool rows);
|
||||||
wxGBPosition GetGBPos(const wxString& param);
|
wxGBPosition GetGBPos(const wxString& param);
|
||||||
wxGBSpan GetGBSpan(const wxString& param);
|
wxGBSpan GetGBSpan(const wxString& param);
|
||||||
|
@@ -215,7 +215,11 @@ wxObject* wxSizerXmlHandler::Handle_sizer()
|
|||||||
sizer = Handle_wxStaticBoxSizer();
|
sizer = Handle_wxStaticBoxSizer();
|
||||||
#endif
|
#endif
|
||||||
else if (m_class == wxT("wxGridSizer"))
|
else if (m_class == wxT("wxGridSizer"))
|
||||||
|
{
|
||||||
|
if ( !ValidateGridSizerChildren() )
|
||||||
|
return NULL;
|
||||||
sizer = Handle_wxGridSizer();
|
sizer = Handle_wxGridSizer();
|
||||||
|
}
|
||||||
else if (m_class == wxT("wxFlexGridSizer"))
|
else if (m_class == wxT("wxFlexGridSizer"))
|
||||||
{
|
{
|
||||||
flexsizer = Handle_wxFlexGridSizer();
|
flexsizer = Handle_wxFlexGridSizer();
|
||||||
@@ -227,14 +231,18 @@ wxObject* wxSizerXmlHandler::Handle_sizer()
|
|||||||
sizer = flexsizer;
|
sizer = flexsizer;
|
||||||
}
|
}
|
||||||
else if (m_class == wxT("wxWrapSizer"))
|
else if (m_class == wxT("wxWrapSizer"))
|
||||||
|
{
|
||||||
sizer = Handle_wxWrapSizer();
|
sizer = Handle_wxWrapSizer();
|
||||||
|
}
|
||||||
if ( !sizer )
|
else
|
||||||
{
|
{
|
||||||
ReportError(wxString::Format("unknown sizer class \"%s\"", m_class));
|
ReportError(wxString::Format("unknown sizer class \"%s\"", m_class));
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// creation of sizer failed for some (already reported) reason, so exit:
|
||||||
|
if ( !sizer )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
wxSize minsize = GetSize(wxT("minsize"));
|
wxSize minsize = GetSize(wxT("minsize"));
|
||||||
if (!(minsize == wxDefaultSize))
|
if (!(minsize == wxDefaultSize))
|
||||||
sizer->SetMinSize(minsize);
|
sizer->SetMinSize(minsize);
|
||||||
@@ -318,6 +326,8 @@ wxSizer* wxSizerXmlHandler::Handle_wxGridSizer()
|
|||||||
|
|
||||||
wxFlexGridSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer()
|
wxFlexGridSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer()
|
||||||
{
|
{
|
||||||
|
if ( !ValidateGridSizerChildren() )
|
||||||
|
return NULL;
|
||||||
return new wxFlexGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")),
|
return new wxFlexGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")),
|
||||||
GetDimension(wxT("vgap")), GetDimension(wxT("hgap")));
|
GetDimension(wxT("vgap")), GetDimension(wxT("hgap")));
|
||||||
}
|
}
|
||||||
@@ -325,6 +335,8 @@ wxFlexGridSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer()
|
|||||||
|
|
||||||
wxGridBagSizer* wxSizerXmlHandler::Handle_wxGridBagSizer()
|
wxGridBagSizer* wxSizerXmlHandler::Handle_wxGridBagSizer()
|
||||||
{
|
{
|
||||||
|
if ( !ValidateGridSizerChildren() )
|
||||||
|
return NULL;
|
||||||
return new wxGridBagSizer(GetDimension(wxT("vgap")), GetDimension(wxT("hgap")));
|
return new wxGridBagSizer(GetDimension(wxT("vgap")), GetDimension(wxT("hgap")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,16 +347,59 @@ wxSizer* wxSizerXmlHandler::Handle_wxWrapSizer()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxSizerXmlHandler::ValidateGridSizerChildren()
|
||||||
|
{
|
||||||
|
int rows = GetLong("rows");
|
||||||
|
int cols = GetLong("cols");
|
||||||
|
|
||||||
|
if ( rows && cols )
|
||||||
|
{
|
||||||
|
// fixed number of cells, need to verify children count
|
||||||
|
int children = 0;
|
||||||
|
for ( wxXmlNode *n = m_node->GetChildren(); n; n = n->GetNext() )
|
||||||
|
{
|
||||||
|
if ( n->GetType() == wxXML_ELEMENT_NODE &&
|
||||||
|
(n->GetName() == "object" || n->GetName() == "object_ref") )
|
||||||
|
{
|
||||||
|
children++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( children > rows * cols )
|
||||||
|
{
|
||||||
|
ReportError
|
||||||
|
(
|
||||||
|
wxString::Format
|
||||||
|
(
|
||||||
|
"too many children in grid sizer: %d > %d x %d"
|
||||||
|
" (consider omitting the number of rows or columns)",
|
||||||
|
children,
|
||||||
|
cols,
|
||||||
|
rows
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void wxSizerXmlHandler::SetGrowables(wxFlexGridSizer* sizer,
|
void wxSizerXmlHandler::SetGrowables(wxFlexGridSizer* sizer,
|
||||||
const wxChar* param,
|
const wxChar* param,
|
||||||
bool rows)
|
bool rows)
|
||||||
{
|
{
|
||||||
|
int nrows, ncols;
|
||||||
|
sizer->CalcRowsCols(nrows, ncols);
|
||||||
|
const int nslots = rows ? nrows : ncols;
|
||||||
|
|
||||||
wxStringTokenizer tkn;
|
wxStringTokenizer tkn;
|
||||||
unsigned long l;
|
|
||||||
tkn.SetString(GetParamValue(param), wxT(","));
|
tkn.SetString(GetParamValue(param), wxT(","));
|
||||||
|
|
||||||
while (tkn.HasMoreTokens())
|
while (tkn.HasMoreTokens())
|
||||||
{
|
{
|
||||||
|
unsigned long l;
|
||||||
if (!tkn.GetNextToken().ToULong(&l))
|
if (!tkn.GetNextToken().ToULong(&l))
|
||||||
{
|
{
|
||||||
ReportParamError
|
ReportParamError
|
||||||
@@ -355,6 +410,24 @@ void wxSizerXmlHandler::SetGrowables(wxFlexGridSizer* sizer,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( (int)l >= nslots )
|
||||||
|
{
|
||||||
|
ReportParamError
|
||||||
|
(
|
||||||
|
param,
|
||||||
|
wxString::Format
|
||||||
|
(
|
||||||
|
"invalid %s index %d: must be less than %d",
|
||||||
|
rows ? "row" : "column",
|
||||||
|
l,
|
||||||
|
nslots
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// ignore incorrect value, still try to process the rest
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (rows)
|
if (rows)
|
||||||
sizer->AddGrowableRow(l);
|
sizer->AddGrowableRow(l);
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user