X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c067fe3c1e752658c63b4d556eb6a5468213860..9d5cfd0e64a2c09d957517405758de680806e674:/src/xrc/xh_sizer.cpp diff --git a/src/xrc/xh_sizer.cpp b/src/xrc/xh_sizer.cpp index 3d059fbf44..fb21758c0b 100644 --- a/src/xrc/xh_sizer.cpp +++ b/src/xrc/xh_sizer.cpp @@ -18,12 +18,21 @@ #if wxUSE_XRC #include "wx/xrc/xh_sizer.h" -#include "wx/sizer.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/panel.h" + #include "wx/statbox.h" + #include "wx/sizer.h" + #include "wx/frame.h" + #include "wx/dialog.h" + #include "wx/button.h" + #include "wx/scrolwin.h" +#endif + #include "wx/gbsizer.h" -#include "wx/log.h" -#include "wx/statbox.h" +#include "wx/wrapsizer.h" #include "wx/notebook.h" -#include "wx/panel.h" #include "wx/tokenzr.h" @@ -34,10 +43,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxSizerXmlHandler, wxXmlResourceHandler) wxSizerXmlHandler::wxSizerXmlHandler() - : wxXmlResourceHandler(), - m_isInside(false), - m_isGBS(false), - m_parentSizer(NULL) + :wxXmlResourceHandler(), + m_isInside(false), + m_isGBS(false), + m_parentSizer(NULL) { XRC_ADD_STYLE(wxHORIZONTAL); XRC_ADD_STYLE(wxVERTICAL); @@ -69,8 +78,17 @@ wxSizerXmlHandler::wxSizerXmlHandler() XRC_ADD_STYLE(wxALIGN_CENTER_VERTICAL); XRC_ADD_STYLE(wxALIGN_CENTRE_VERTICAL); - XRC_ADD_STYLE(wxADJUST_MINSIZE); XRC_ADD_STYLE(wxFIXED_MINSIZE); + XRC_ADD_STYLE(wxRESERVE_SPACE_EVEN_IF_HIDDEN); + + // this flag doesn't do anything any more but we can just ignore its + // occurrences in the old resource files instead of raising a fuss because + // of it + AddStyle("wxADJUST_MINSIZE", 0); + + // wxWrapSizer-specific flags + XRC_ADD_STYLE(wxEXTEND_LAST_ON_EACH_LINE); + XRC_ADD_STYLE(wxREMOVE_LEADING_SPACES); } @@ -105,7 +123,8 @@ bool wxSizerXmlHandler::IsSizerNode(wxXmlNode *node) (IsOfClass(node, wxT("wxStaticBoxSizer"))) || (IsOfClass(node, wxT("wxGridSizer"))) || (IsOfClass(node, wxT("wxFlexGridSizer"))) || - (IsOfClass(node, wxT("wxGridBagSizer"))); + (IsOfClass(node, wxT("wxGridBagSizer"))) || + (IsOfClass(node, wxT("wxWrapSizer"))); } @@ -138,9 +157,9 @@ wxObject* wxSizerXmlHandler::Handle_sizeritem() wxWindow *wnd = wxDynamicCast(item, wxWindow); if (sizer) - sitem->SetSizer(sizer); + sitem->AssignSizer(sizer); else if (wnd) - sitem->SetWindow(wnd); + sitem->AssignWindow(wnd); else wxLogError(wxT("Error in resource.")); @@ -160,11 +179,16 @@ wxObject* wxSizerXmlHandler::Handle_sizeritem() wxObject* wxSizerXmlHandler::Handle_spacer() { - wxCHECK_MSG(m_parentSizer, NULL, wxT("Incorrect syntax of XRC resource: spacer not within sizer!")); + if ( !m_parentSizer ) + { + wxLogError(_("XRC syntax error: \"spacer\" only allowed inside a " + "sizer")); + return NULL; + } wxSizerItem* sitem = MakeSizerItem(); SetSizerItemAttributes(sitem); - sitem->SetSpacer(GetSize()); + sitem->AssignSpacer(GetSize()); AddSizerItem(sitem); return NULL; } @@ -173,32 +197,38 @@ wxObject* wxSizerXmlHandler::Handle_spacer() wxObject* wxSizerXmlHandler::Handle_sizer() { wxSizer *sizer = NULL; + wxFlexGridSizer *flexsizer = NULL; wxXmlNode *parentNode = m_node->GetParent(); - wxCHECK_MSG(m_parentSizer != NULL || - (parentNode && parentNode->GetType() == wxXML_ELEMENT_NODE && - m_parentAsWindow != NULL && - (m_parentAsWindow->IsKindOf(CLASSINFO(wxPanel)) || - m_parentAsWindow->IsKindOf(CLASSINFO(wxFrame)) || - m_parentAsWindow->IsKindOf(CLASSINFO(wxDialog))) - ), NULL, - wxT("Incorrect use of sizer: parent is not 'wxDialog', 'wxFrame' or 'wxPanel'.")); + if ( !m_parentSizer && + (!parentNode || parentNode->GetType() != wxXML_ELEMENT_NODE || + !m_parentAsWindow) ) + { + wxLogError(_("XRC syntax error: sizer must have a window parent.")); + return NULL; + } 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(); + { + flexsizer = Handle_wxGridBagSizer(); + sizer = flexsizer; + } + else if (m_class == wxT("wxWrapSizer")) + sizer = Handle_wxWrapSizer(); if ( !sizer ) { @@ -221,6 +251,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; @@ -232,11 +269,22 @@ wxObject* wxSizerXmlHandler::Handle_sizer() wxXmlNode *nd = m_node; m_node = parentNode; if (GetSize() == wxDefaultSize) - sizer->Fit(m_parentAsWindow); + { + if ( wxDynamicCast(m_parentAsWindow, wxScrolledWindow) != NULL ) + { + sizer->FitInside(m_parentAsWindow); + } + else + { + sizer->Fit(m_parentAsWindow); + } + } m_node = nd; - if (m_parentAsWindow->GetWindowStyle() & (wxMAXIMIZE_BOX | wxRESIZE_BORDER)) + if (m_parentAsWindow->IsTopLevel()) + { sizer->SetSizeHints(m_parentAsWindow); + } } return sizer; @@ -248,6 +296,7 @@ wxSizer* wxSizerXmlHandler::Handle_wxBoxSizer() return new wxBoxSizer(GetStyle(wxT("orient"), wxHORIZONTAL)); } +#if wxUSE_STATBOX wxSizer* wxSizerXmlHandler::Handle_wxStaticBoxSizer() { return new wxStaticBoxSizer( @@ -259,6 +308,7 @@ wxSizer* wxSizerXmlHandler::Handle_wxStaticBoxSizer() GetName()), GetStyle(wxT("orient"), wxHORIZONTAL)); } +#endif // wxUSE_STATBOX wxSizer* wxSizerXmlHandler::Handle_wxGridSizer() { @@ -267,26 +317,23 @@ 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* 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() +{ + wxWrapSizer *sizer = new wxWrapSizer(GetStyle("orient"), GetStyle("flag")); + return sizer; +} @@ -300,13 +347,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); } } @@ -355,6 +404,9 @@ void wxSizerXmlHandler::SetSizerItemAttributes(wxSizerItem* sitem) gbsitem->SetPos(GetGBPos(wxT("cellpos"))); gbsitem->SetSpan(GetGBSpan(wxT("cellspan"))); } + + // record the id of the item, if any, for use by XRCSIZERITEM() + sitem->SetId(GetID()); } void wxSizerXmlHandler::AddSizerItem(wxSizerItem* sitem) @@ -370,6 +422,7 @@ void wxSizerXmlHandler::AddSizerItem(wxSizerItem* sitem) //----------------------------------------------------------------------------- // wxStdDialogButtonSizerXmlHandler //----------------------------------------------------------------------------- +#if wxUSE_BUTTON IMPLEMENT_DYNAMIC_CLASS(wxStdDialogButtonSizerXmlHandler, wxXmlResourceHandler) @@ -431,5 +484,6 @@ bool wxStdDialogButtonSizerXmlHandler::CanHandle(wxXmlNode *node) return (!m_isInside && IsOfClass(node, wxT("wxStdDialogButtonSizer"))) || (m_isInside && IsOfClass(node, wxT("button"))); } +#endif // wxUSE_BUTTON #endif // wxUSE_XRC