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/xml/xh_sizer.h"
25 #include "wx/statbox.h"
26 #include "wx/notebook.h"
28 bool wxSizerXmlHandler::IsSizerNode(wxXmlNode
*node
)
30 return (IsOfClass(node
, _T("wxBoxSizer"))) ||
31 (IsOfClass(node
, _T("wxStaticBoxSizer"))) ||
32 (IsOfClass(node
, _T("wxGridSizer"))) ||
33 (IsOfClass(node
, _T("wxFlexGridSizer")));
38 wxSizerXmlHandler::wxSizerXmlHandler()
39 : wxXmlResourceHandler(), m_IsInside(FALSE
), m_ParentSizer(NULL
)
41 ADD_STYLE(wxHORIZONTAL
);
42 ADD_STYLE(wxVERTICAL
);
58 ADD_STYLE(wxSTRETCH_NOT
);
60 ADD_STYLE(wxALIGN_CENTER
);
61 ADD_STYLE(wxALIGN_CENTRE
);
62 ADD_STYLE(wxALIGN_LEFT
);
63 ADD_STYLE(wxALIGN_TOP
);
64 ADD_STYLE(wxALIGN_RIGHT
);
65 ADD_STYLE(wxALIGN_BOTTOM
);
66 ADD_STYLE(wxALIGN_CENTER_HORIZONTAL
);
67 ADD_STYLE(wxALIGN_CENTRE_HORIZONTAL
);
68 ADD_STYLE(wxALIGN_CENTER_VERTICAL
);
69 ADD_STYLE(wxALIGN_CENTRE_VERTICAL
);
74 wxObject
*wxSizerXmlHandler::DoCreateResource()
76 if (m_Class
== _T("sizeritem"))
78 wxXmlNode
*n
= GetParamNode(_T("object"));
82 bool old_ins
= m_IsInside
;
83 wxSizer
*old_par
= m_ParentSizer
;
85 if (!IsSizerNode(n
)) m_ParentSizer
= NULL
;
86 wxObject
*item
= CreateResFromNode(n
, m_Parent
, NULL
);
88 m_ParentSizer
= old_par
;
89 wxSizer
*sizer
= wxDynamicCast(item
, wxSizer
);
90 wxWindow
*wnd
= wxDynamicCast(item
, wxWindow
);
91 wxSize minsize
= GetSize(_T("minsize"));
95 m_ParentSizer
->Add(sizer
, GetLong(_T("option")),
96 GetStyle(_T("flag")), GetDimension(_T("border")));
97 if (!(minsize
== wxDefaultSize
))
98 m_ParentSizer
->SetItemMinSize(sizer
, minsize
.x
, minsize
.y
);
102 m_ParentSizer
->Add(wnd
, GetLong(_T("option")),
103 GetStyle(_T("flag")), GetDimension(_T("border")));
104 if (!(minsize
== wxDefaultSize
))
105 m_ParentSizer
->SetItemMinSize(wnd
, minsize
.x
, minsize
.y
);
108 wxLogError(_T("Error in resource."));
114 wxLogError(_T("Error in resource: no control/sizer within sizer's <item> tag."));
119 else if (m_Class
== _T("spacer"))
121 wxCHECK_MSG(m_ParentSizer
, NULL
, _T("Incorrect syntax of XML resource: spacer not within sizer!"));
122 wxSize sz
= GetSize();
123 m_ParentSizer
->Add(sz
.x
, sz
.y
,
124 GetLong(_T("option")), GetStyle(_T("flag")), GetDimension(_T("border")));
130 wxSizer
*sizer
= NULL
;
132 wxXmlNode
*parentNode
= m_Node
->GetParent();
134 wxCHECK_MSG(m_ParentSizer
!= NULL
||
135 ((IsOfClass(parentNode
, _T("wxPanel")) ||
136 IsOfClass(parentNode
, _T("wxDialog"))) &&
137 parentNode
->GetType() == wxXML_ELEMENT_NODE
), NULL
,
138 _T("Incorrect use of sizer: parent is not 'wxDialog' or 'wxPanel'."));
140 if (m_Class
== _T("wxBoxSizer"))
141 sizer
= new wxBoxSizer(GetStyle(_T("orient"), wxHORIZONTAL
));
143 else if (m_Class
== _T("wxStaticBoxSizer"))
145 sizer
= new wxStaticBoxSizer(
146 new wxStaticBox(m_ParentAsWindow
, -1, GetText(_T("label"))),
147 GetStyle(_T("orient"), wxHORIZONTAL
));
150 else if (m_Class
== _T("wxGridSizer"))
151 sizer
= new wxGridSizer(GetLong(_T("rows")), GetLong(_T("cols")),
152 GetDimension(_T("vgap")), GetDimension(_T("hgap")));
154 else if (m_Class
== _T("wxFlexGridSizer"))
155 sizer
= new wxFlexGridSizer(GetLong(_T("rows")), GetLong(_T("cols")),
156 GetDimension(_T("vgap")), GetDimension(_T("hgap")));
158 wxSize minsize
= GetSize(_T("minsize"));
159 if (!(minsize
== wxDefaultSize
))
160 sizer
->SetMinSize(minsize
);
163 wxSizer
*old_par
= m_ParentSizer
;
164 m_ParentSizer
= sizer
;
165 bool old_ins
= m_IsInside
;
167 CreateChildren(m_Parent
, TRUE
/*only this handler*/);
168 m_IsInside
= old_ins
;
169 m_ParentSizer
= old_par
;
171 if (m_ParentSizer
== NULL
) // setup window:
173 m_ParentAsWindow
->SetAutoLayout(TRUE
);
174 m_ParentAsWindow
->SetSizer(sizer
);
176 wxXmlNode
*nd
= m_Node
;
178 if (GetSize() == wxDefaultSize
)
179 sizer
->Fit(m_ParentAsWindow
);
182 if (m_ParentAsWindow
->GetWindowStyle() & (wxRESIZE_BOX
| wxRESIZE_BORDER
))
183 sizer
->SetSizeHints(m_ParentAsWindow
);
192 bool wxSizerXmlHandler::CanHandle(wxXmlNode
*node
)
194 return ((!m_IsInside
&& IsSizerNode(node
)) ||
195 (m_IsInside
&& IsOfClass(node
, _T("sizeritem"))) ||
196 (m_IsInside
&& IsOfClass(node
, _T("spacer"))));