]> git.saurik.com Git - wxWidgets.git/blob - contrib/src/xml/xh_sizer.cpp
0442de477eadb678d8b467054ce6ab0b042a2070
[wxWidgets.git] / contrib / src / xml / xh_sizer.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: xh_sizer.cpp
3 // Purpose: XML resource for wxBoxSizer
4 // Author: Vaclav Slavik
5 // Created: 2000/03/21
6 // RCS-ID: $Id$
7 // Copyright: (c) 2000 Vaclav Slavik
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 #ifdef __GNUG__
12 #pragma implementation "xh_sizer.h"
13 #endif
14
15 // For compilers that support precompilation, includes "wx.h".
16 #include "wx/wxprec.h"
17
18 #ifdef __BORLANDC__
19 #pragma hdrstop
20 #endif
21
22 #include "wx/xml/xh_sizer.h"
23 #include "wx/sizer.h"
24 #include "wx/log.h"
25 #include "wx/statbox.h"
26 #include "wx/notebook.h"
27
28 static bool IsSizerNode(wxXmlNode *node)
29 {
30 return (node->GetName() == _T("boxsizer")) ||
31 (node->GetName() == _T("staticboxsizer")) ||
32 (node->GetName() == _T("gridsizer")) ||
33 (node->GetName() == _T("flexgridsizer"));
34 }
35
36
37
38 wxSizerXmlHandler::wxSizerXmlHandler()
39 : wxXmlResourceHandler(), m_IsInside(FALSE), m_ParentSizer(NULL)
40 {
41 ADD_STYLE(wxHORIZONTAL);
42 ADD_STYLE(wxVERTICAL);
43
44 // and flags
45 ADD_STYLE(wxLEFT);
46 ADD_STYLE(wxRIGHT);
47 ADD_STYLE(wxTOP);
48 ADD_STYLE(wxBOTTOM);
49 ADD_STYLE(wxNORTH);
50 ADD_STYLE(wxSOUTH);
51 ADD_STYLE(wxEAST);
52 ADD_STYLE(wxWEST);
53 ADD_STYLE(wxALL);
54
55 ADD_STYLE(wxGROW);
56 ADD_STYLE(wxEXPAND);
57 ADD_STYLE(wxSHAPED);
58 ADD_STYLE(wxSTRETCH_NOT);
59
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);
70 }
71
72
73
74 wxObject *wxSizerXmlHandler::DoCreateResource()
75 {
76 if (m_Node->GetName() == _T("sizeritem"))
77 {
78 wxXmlNode *n = GetParamNode(_T("window"))->GetChildren();
79
80 while (n)
81 {
82 if (n->GetType() == wxXML_ELEMENT_NODE)
83 {
84 bool old_ins = m_IsInside;
85 wxSizer *old_par = m_ParentSizer;
86 m_IsInside = FALSE;
87 if (!IsSizerNode(n)) m_ParentSizer = NULL;
88 wxObject *item = CreateResFromNode(n, m_Parent, NULL);
89 m_IsInside = old_ins;
90 m_ParentSizer = old_par;
91 wxSizer *sizer = wxDynamicCast(item, wxSizer);
92 wxWindow *wnd = wxDynamicCast(item, wxWindow);
93
94 if (sizer)
95 m_ParentSizer->Add(sizer, GetLong(_T("option")),
96 GetStyle(_T("flag")), GetLong(_T("border")));
97 else if (wnd)
98 m_ParentSizer->Add(wnd, GetLong(_T("option")),
99 GetStyle(_T("flag")), GetLong(_T("border")));
100 else
101 wxLogError(_T("Error in resource."));
102
103 return item;
104 }
105 n = n->GetNext();
106 }
107 wxLogError(_T("Error in resource: no control/sizer within sizer's <item> tag."));
108 return NULL;
109 }
110
111 else if (m_Node->GetName() == _T("spacer"))
112 {
113 wxCHECK_MSG(m_ParentSizer, NULL, _T("Incorrect syntax of XML resource: spacer not within sizer!"));
114 wxSize sz = GetSize();
115 m_ParentSizer->Add(sz.x, sz.y,
116 GetLong(_T("option")), GetStyle(_T("flag")), GetLong(_T("border")));
117 return NULL;
118 }
119
120
121 else {
122 wxSizer *sizer = NULL;
123
124 wxXmlNode *parentNode = m_Node->GetParent()->GetParent();
125
126 wxCHECK_MSG(m_ParentSizer != NULL ||
127 ((parentNode->GetName() == _T("panel") ||
128 parentNode->GetName() == _T("dialog")) &&
129 parentNode->GetType() == wxXML_ELEMENT_NODE), NULL,
130 _T("Incorrect use of sizer: parent is not 'dialog' or 'panel'."));
131
132 if (m_Node->GetName() == _T("boxsizer"))
133 sizer = new wxBoxSizer(GetStyle(_T("orient"), wxHORIZONTAL));
134
135 else if (m_Node->GetName() == _T("staticboxsizer"))
136 {
137 sizer = new wxStaticBoxSizer(
138 new wxStaticBox(m_ParentAsWindow, -1, GetText(_T("label"))),
139 GetStyle(_T("orient"), wxHORIZONTAL));
140 }
141
142 else if (m_Node->GetName() == _T("gridsizer"))
143 sizer = new wxGridSizer(GetLong(_T("rows")), GetLong(_T("cols")),
144 GetLong(_T("vgap")), GetLong(_T("hgap")));
145
146 else if (m_Node->GetName() == _T("flexgridsizer"))
147 sizer = new wxFlexGridSizer(GetLong(_T("rows")), GetLong(_T("cols")),
148 GetLong(_T("vgap")), GetLong(_T("hgap")));
149
150 wxSizer *old_par = m_ParentSizer;
151 m_ParentSizer = sizer;
152 bool old_ins = m_IsInside;
153 m_IsInside = TRUE;
154 CreateChildren(m_Parent, TRUE/*only this handler*/);
155 m_IsInside = old_ins;
156 m_ParentSizer = old_par;
157
158 if (m_ParentSizer == NULL) // setup window:
159 {
160 m_ParentAsWindow->SetAutoLayout(TRUE);
161 m_ParentAsWindow->SetSizer(sizer);
162
163 wxXmlNode *nd = m_Node;
164 m_Node = parentNode;
165 if (GetSize() == wxDefaultSize)
166 sizer->Fit(m_ParentAsWindow);
167 m_Node = nd;
168
169 if (m_ParentAsWindow->GetWindowStyle() & (wxRESIZE_BOX | wxRESIZE_BORDER))
170 sizer->SetSizeHints(m_ParentAsWindow);
171 }
172
173 return sizer;
174 }
175 }
176
177
178
179 bool wxSizerXmlHandler::CanHandle(wxXmlNode *node)
180 {
181 return ((!m_IsInside && IsSizerNode(node)) ||
182 (m_IsInside && node->GetName() == _T("sizeritem")) ||
183 (m_IsInside && node->GetName() == _T("spacer")));
184 }