X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1808bb47b9899bc730a2e2424bb54668aebfe789..d2c5fe6e6e1ab3b4532b4ca0e2eeba4f9c190562:/src/xrc/xh_sizer.cpp diff --git a/src/xrc/xh_sizer.cpp b/src/xrc/xh_sizer.cpp index fb21758c0b..30a1175b00 100644 --- a/src/xrc/xh_sizer.cpp +++ b/src/xrc/xh_sizer.cpp @@ -161,7 +161,7 @@ wxObject* wxSizerXmlHandler::Handle_sizeritem() else if (wnd) sitem->AssignWindow(wnd); else - wxLogError(wxT("Error in resource.")); + ReportError(n, "unexpected item in sizer"); // finally, set other wxSizerItem attributes SetSizerItemAttributes(sitem); @@ -171,7 +171,7 @@ wxObject* wxSizerXmlHandler::Handle_sizeritem() } else /*n == NULL*/ { - wxLogError(wxT("Error in resource: no window/sizer/spacer within sizeritem object.")); + ReportError("no window/sizer/spacer within sizeritem object"); return NULL; } } @@ -181,8 +181,7 @@ wxObject* wxSizerXmlHandler::Handle_spacer() { if ( !m_parentSizer ) { - wxLogError(_("XRC syntax error: \"spacer\" only allowed inside a " - "sizer")); + ReportError("spacer only allowed inside a sizer"); return NULL; } @@ -205,7 +204,7 @@ wxObject* wxSizerXmlHandler::Handle_sizer() (!parentNode || parentNode->GetType() != wxXML_ELEMENT_NODE || !m_parentAsWindow) ) { - wxLogError(_("XRC syntax error: sizer must have a window parent.")); + ReportError("sizer must have a window parent"); return NULL; } @@ -216,7 +215,11 @@ wxObject* wxSizerXmlHandler::Handle_sizer() sizer = Handle_wxStaticBoxSizer(); #endif else if (m_class == wxT("wxGridSizer")) + { + if ( !ValidateGridSizerChildren() ) + return NULL; sizer = Handle_wxGridSizer(); + } else if (m_class == wxT("wxFlexGridSizer")) { flexsizer = Handle_wxFlexGridSizer(); @@ -228,13 +231,17 @@ wxObject* wxSizerXmlHandler::Handle_sizer() sizer = flexsizer; } else if (m_class == wxT("wxWrapSizer")) + { sizer = Handle_wxWrapSizer(); + } + else + { + ReportError(wxString::Format("unknown sizer class \"%s\"", m_class)); + } + // creation of sizer failed for some (already reported) reason, so exit: if ( !sizer ) - { - wxLogError(_T("Failed to create size of class \"%s\""), m_class.c_str()); return NULL; - } wxSize minsize = GetSize(wxT("minsize")); if (!(minsize == wxDefaultSize)) @@ -319,6 +326,8 @@ wxSizer* wxSizerXmlHandler::Handle_wxGridSizer() wxFlexGridSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer() { + if ( !ValidateGridSizerChildren() ) + return NULL; return new wxFlexGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")), GetDimension(wxT("vgap")), GetDimension(wxT("hgap"))); } @@ -326,6 +335,8 @@ wxFlexGridSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer() wxGridBagSizer* wxSizerXmlHandler::Handle_wxGridBagSizer() { + if ( !ValidateGridSizerChildren() ) + return NULL; return new wxGridBagSizer(GetDimension(wxT("vgap")), GetDimension(wxT("hgap"))); } @@ -336,22 +347,87 @@ 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, const wxChar* param, bool rows) { + int nrows, ncols; + sizer->CalcRowsCols(nrows, ncols); + const int nslots = rows ? nrows : ncols; + wxStringTokenizer tkn; - unsigned long l; tkn.SetString(GetParamValue(param), wxT(",")); + while (tkn.HasMoreTokens()) { + unsigned long l; if (!tkn.GetNextToken().ToULong(&l)) { - wxLogError(wxT("growable[rows|cols] must be comma-separated list of row numbers")); + ReportParamError + ( + param, + "value must be comma-separated list of row numbers" + ); 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) sizer->AddGrowableRow(l); else @@ -467,13 +543,13 @@ wxObject *wxStdDialogButtonSizerXmlHandler::DoCreateResource() if (button) m_parentSizer->AddButton(button); else - wxLogError(wxT("Error in resource - expected button.")); + ReportError(n, "expected wxButton"); return item; } else /*n == NULL*/ { - wxLogError(wxT("Error in resource: no button within wxStdDialogButtonSizer.")); + ReportError("no button within wxStdDialogButtonSizer"); return NULL; } }