1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: XML resource for wxBoxSizer
4 // Author: Vaclav Slavik
7 // Copyright: (c) 2000 Vaclav Slavik
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "xh_sizer.h"
15 // For compilers that support precompilation, includes "wx.h".
16 #include "wx/wxprec.h"
22 #include "wx/xrc/xh_sizer.h"
25 #include "wx/statbox.h"
26 #include "wx/notebook.h"
27 #include "wx/tokenzr.h"
29 bool wxSizerXmlHandler::IsSizerNode(wxXmlNode
*node
)
31 return (IsOfClass(node
, wxT("wxBoxSizer"))) ||
32 (IsOfClass(node
, wxT("wxStaticBoxSizer"))) ||
33 (IsOfClass(node
, wxT("wxGridSizer"))) ||
34 (IsOfClass(node
, wxT("wxFlexGridSizer")));
39 wxSizerXmlHandler::wxSizerXmlHandler()
40 : wxXmlResourceHandler(), m_isInside(FALSE
), m_parentSizer(NULL
)
42 ADD_STYLE(wxHORIZONTAL
);
43 ADD_STYLE(wxVERTICAL
);
59 ADD_STYLE(wxSTRETCH_NOT
);
61 ADD_STYLE(wxALIGN_CENTER
);
62 ADD_STYLE(wxALIGN_CENTRE
);
63 ADD_STYLE(wxALIGN_LEFT
);
64 ADD_STYLE(wxALIGN_TOP
);
65 ADD_STYLE(wxALIGN_RIGHT
);
66 ADD_STYLE(wxALIGN_BOTTOM
);
67 ADD_STYLE(wxALIGN_CENTER_HORIZONTAL
);
68 ADD_STYLE(wxALIGN_CENTRE_HORIZONTAL
);
69 ADD_STYLE(wxALIGN_CENTER_VERTICAL
);
70 ADD_STYLE(wxALIGN_CENTRE_VERTICAL
);
75 wxObject
*wxSizerXmlHandler::DoCreateResource()
77 if (m_class
== wxT("sizeritem"))
79 wxXmlNode
*n
= GetParamNode(wxT("object"));
83 bool old_ins
= m_isInside
;
84 wxSizer
*old_par
= m_parentSizer
;
86 if (!IsSizerNode(n
)) m_parentSizer
= NULL
;
87 wxObject
*item
= CreateResFromNode(n
, m_parent
, NULL
);
89 m_parentSizer
= old_par
;
90 wxSizer
*sizer
= wxDynamicCast(item
, wxSizer
);
91 wxWindow
*wnd
= wxDynamicCast(item
, wxWindow
);
92 wxSize minsize
= GetSize(wxT("minsize"));
96 m_parentSizer
->Add(sizer
, GetLong(wxT("option")),
97 GetStyle(wxT("flag")), GetDimension(wxT("border")));
98 if (!(minsize
== wxDefaultSize
))
99 m_parentSizer
->SetItemMinSize(sizer
, minsize
.x
, minsize
.y
);
103 m_parentSizer
->Add(wnd
, GetLong(wxT("option")),
104 GetStyle(wxT("flag")), GetDimension(wxT("border")));
105 if (!(minsize
== wxDefaultSize
))
106 m_parentSizer
->SetItemMinSize(wnd
, minsize
.x
, minsize
.y
);
109 wxLogError(wxT("Error in resource."));
115 wxLogError(wxT("Error in resource: no control/sizer within sizer's <item> tag."));
120 else if (m_class
== wxT("spacer"))
122 wxCHECK_MSG(m_parentSizer
, NULL
, wxT("Incorrect syntax of XML resource: spacer not within sizer!"));
123 wxSize sz
= GetSize();
124 m_parentSizer
->Add(sz
.x
, sz
.y
,
125 GetLong(wxT("option")), GetStyle(wxT("flag")), GetDimension(wxT("border")));
131 wxSizer
*sizer
= NULL
;
133 wxXmlNode
*parentNode
= m_node
->GetParent();
135 wxCHECK_MSG(m_parentSizer
!= NULL
||
136 ((IsOfClass(parentNode
, wxT("wxPanel")) ||
137 IsOfClass(parentNode
, wxT("wxDialog"))) &&
138 parentNode
->GetType() == wxXML_ELEMENT_NODE
), NULL
,
139 wxT("Incorrect use of sizer: parent is not 'wxDialog' or 'wxPanel'."));
141 if (m_class
== wxT("wxBoxSizer"))
142 sizer
= new wxBoxSizer(GetStyle(wxT("orient"), wxHORIZONTAL
));
144 else if (m_class
== wxT("wxStaticBoxSizer"))
146 sizer
= new wxStaticBoxSizer(
147 new wxStaticBox(m_parentAsWindow
, -1, GetText(wxT("label"))),
148 GetStyle(wxT("orient"), wxHORIZONTAL
));
151 else if (m_class
== wxT("wxGridSizer"))
152 sizer
= new wxGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")),
153 GetDimension(wxT("vgap")), GetDimension(wxT("hgap")));
155 else if (m_class
== wxT("wxFlexGridSizer"))
157 wxFlexGridSizer
*fsizer
=
158 new wxFlexGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")),
159 GetDimension(wxT("vgap")), GetDimension(wxT("hgap")));
161 wxStringTokenizer tkn
;
163 tkn
.SetString(GetParamValue(wxT("growablerows")), wxT(","));
164 while (tkn
.HasMoreTokens())
166 if (!tkn
.GetNextToken().ToULong(&l
))
167 wxLogError(wxT("growablerows must be comma-separated list of row numbers"));
169 fsizer
->AddGrowableRow(l
);
171 tkn
.SetString(GetParamValue(wxT("growablecols")), wxT(","));
172 while (tkn
.HasMoreTokens())
174 if (!tkn
.GetNextToken().ToULong(&l
))
175 wxLogError(wxT("growablecols must be comma-separated list of column numbers"));
177 fsizer
->AddGrowableCol(l
);
181 wxSize minsize
= GetSize(wxT("minsize"));
182 if (!(minsize
== wxDefaultSize
))
183 sizer
->SetMinSize(minsize
);
185 wxSizer
*old_par
= m_parentSizer
;
186 m_parentSizer
= sizer
;
187 bool old_ins
= m_isInside
;
189 CreateChildren(m_parent
, TRUE
/*only this handler*/);
190 m_isInside
= old_ins
;
191 m_parentSizer
= old_par
;
193 if (m_parentSizer
== NULL
) // setup window:
195 m_parentAsWindow
->SetAutoLayout(TRUE
);
196 m_parentAsWindow
->SetSizer(sizer
);
198 wxXmlNode
*nd
= m_node
;
200 if (GetSize() == wxDefaultSize
)
201 sizer
->Fit(m_parentAsWindow
);
204 if (m_parentAsWindow
->GetWindowStyle() & (wxRESIZE_BOX
| wxRESIZE_BORDER
))
205 sizer
->SetSizeHints(m_parentAsWindow
);
214 bool wxSizerXmlHandler::CanHandle(wxXmlNode
*node
)
216 return ((!m_isInside
&& IsSizerNode(node
)) ||
217 (m_isInside
&& IsOfClass(node
, wxT("sizeritem"))) ||
218 (m_isInside
&& IsOfClass(node
, wxT("spacer"))));