]> git.saurik.com Git - wxWidgets.git/blob - contrib/utils/wxrcedit/prophnd.cpp
6e7921d58b6ea855e46e230abd03a3bb9648992c
[wxWidgets.git] / contrib / utils / wxrcedit / prophnd.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Author: Vaclav Slavik
3 // Created: 2000/05/05
4 // RCS-ID: $Id$
5 // Copyright: (c) 2000 Vaclav Slavik
6 // Licence: wxWindows licence
7 /////////////////////////////////////////////////////////////////////////////
8
9 #ifdef __GNUG__
10 #pragma implementation "prophnd.h"
11 #endif
12
13 // For compilers that support precompilation, includes "wx/wx.h".
14 #include "wx/wxprec.h"
15
16 #ifdef __BORLANDC__
17 #pragma hdrstop
18 #endif
19
20 #include "prophnd.h"
21 #include "wx/xml/xml.h"
22 #include "wx/wx.h"
23 #include "wx/arrimpl.cpp"
24 #include "wx/valtext.h"
25 #include "wx/tokenzr.h"
26 #include "wx/checklst.h"
27 #include "wx/listctrl.h"
28 #include "xmlhelpr.h"
29 #include "editor.h"
30
31
32 WX_DEFINE_OBJARRAY(PropertyInfoArray);
33
34
35 enum
36 {
37 ID_EDITCTRL = wxID_HIGHEST + 1000,
38 ID_XEDIT,
39 ID_YEDIT,
40 ID_USEDLG,
41 ID_BOOLVAL,
42 ID_CHECKLIST
43 };
44
45
46
47 class PropertyPanel : public wxPanel
48 {
49 public:
50 PropertyPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli)
51 : wxPanel(parent, -1), m_Handler(hnd), m_PLI(pli) {}
52
53 void Update(const wxString& value)
54 {
55 XmlWriteValue(m_PLI->m_Node, m_PLI->m_PropInfo->Name, value);
56 m_PLI->m_ListCtrl->SetItemImage(m_PLI->m_Index, 1, 1);
57 m_PLI->m_ListCtrl->SetItem(m_PLI->m_Index, 1,
58 m_Handler->GetBriefValue(m_PLI->m_Node, m_PLI->m_PropInfo));
59 }
60
61 protected:
62 PropertyHandler *m_Handler;
63 PropsListInfo *m_PLI;
64 };
65
66
67
68
69
70 int PropertyHandler::CreateListItem(wxListCtrl *listctrl, wxXmlNode *node, PropertyInfo *pi)
71 {
72 wxString name, value;
73 int iconnum;
74
75 if (XmlFindNode(node, pi->Name) == NULL) iconnum = 0; else iconnum = 1;
76 name = pi->Name;
77 value = GetBriefValue(node, pi);
78
79 long pos = listctrl->GetItemCount();
80 listctrl->InsertItem(pos, name, iconnum);
81 listctrl->SetItem(pos, 1, value);
82 return pos;
83 }
84
85
86
87 wxString PropertyHandler::GetBriefValue(wxXmlNode *node, PropertyInfo *pi)
88 {
89 return XmlReadValue(node, pi->Name);
90 }
91
92
93
94
95
96
97 class TextPropPanel : public PropertyPanel
98 {
99 public:
100 TextPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
101 {
102 wxSizer *sz = new wxBoxSizer(wxVERTICAL);
103 wxTextCtrl *tc;
104
105 sz->Add(new wxStaticText(this, -1, _("Value:")), 0, wxLEFT, 5);
106 sz->Add(tc = new wxTextCtrl(this, ID_EDITCTRL, XmlReadValue(pli->m_Node, pli->m_PropInfo->Name)), 0, wxALL|wxEXPAND, 5);
107 tc->SetFocus();
108
109 SetAutoLayout(TRUE);
110 SetSizer(sz);
111 Layout();
112 }
113
114 void OnEdit(wxCommandEvent &event)
115 {
116 Update(((wxTextCtrl*)event.GetEventObject())->GetValue());
117 }
118
119 DECLARE_EVENT_TABLE()
120 };
121
122 BEGIN_EVENT_TABLE(TextPropPanel, PropertyPanel)
123 EVT_TEXT(ID_EDITCTRL, TextPropPanel::OnEdit)
124 END_EVENT_TABLE()
125
126
127 wxPanel *TextPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
128 {
129 return new TextPropPanel(parent, this, pli);
130 }
131
132
133
134
135
136
137
138
139
140
141
142 class CoordPropPanel : public PropertyPanel
143 {
144 public:
145 CoordPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
146 {
147 wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
148 wxSizer *sz = new wxBoxSizer(wxHORIZONTAL);
149 m_ed1 = m_ed2 = NULL; m_chb = NULL;
150
151 sz->Add(new wxStaticText(this, -1, _("X:")), 0, wxLEFT|wxRIGHT|wxALIGN_CENTER, 5);
152 sz->Add(m_ed1 = new wxTextCtrl(this, ID_XEDIT, "",
153 wxDefaultPosition, wxDefaultSize, 0,
154 wxTextValidator(wxFILTER_NUMERIC)),
155 1, wxRIGHT, 5);
156 m_ed1->SetFocus();
157
158 sz->Add(new wxStaticText(this, -1, _("Y:")), 0, wxLEFT|wxRIGHT|wxALIGN_CENTER, 5);
159 sz->Add(m_ed2 = new wxTextCtrl(this, ID_YEDIT, "",
160 wxDefaultPosition, wxDefaultSize, 0,
161 wxTextValidator(wxFILTER_NUMERIC)),
162 1, wxRIGHT, 5);
163 sizer->Add(sz, 0, wxEXPAND|wxTOP, 5);
164
165 sizer->Add(m_chb = new wxCheckBox(this, ID_USEDLG, _("Use dialog units")), 0, wxLEFT|wxTOP, 5);
166
167 SetAutoLayout(TRUE);
168 SetSizer(sizer);
169 Layout();
170
171 wxString val = XmlReadValue(pli->m_Node, pli->m_PropInfo->Name);
172 m_chb->SetValue(val.Len()==0 || val[val.Len()-1] == 'd');
173 m_ed1->SetValue(val.BeforeFirst(','));
174 m_ed2->SetValue(val.AfterFirst(',').BeforeFirst('d'));
175 }
176
177 void OnEdit(wxCommandEvent &event)
178 {
179 wxString val, v1, v2;
180
181 if (m_ed1 == NULL || m_ed2 == NULL || m_chb == NULL) return;
182
183 v1 = m_ed1->GetValue();
184 v2 = m_ed2->GetValue();
185 if (v1.IsEmpty() || v2.IsEmpty()) return;
186 val = v1 + "," + v2;
187 if (m_chb->GetValue()) val << 'd';
188 Update(val);
189 }
190
191 wxTextCtrl *m_ed1, *m_ed2;
192 wxCheckBox *m_chb;
193
194 DECLARE_EVENT_TABLE()
195 };
196
197 BEGIN_EVENT_TABLE(CoordPropPanel, PropertyPanel)
198 EVT_TEXT(ID_XEDIT, CoordPropPanel::OnEdit)
199 EVT_TEXT(ID_YEDIT, CoordPropPanel::OnEdit)
200 EVT_CHECKBOX(ID_USEDLG, CoordPropPanel::OnEdit)
201 END_EVENT_TABLE()
202
203 wxPanel *CoordPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
204 {
205 return new CoordPropPanel(parent, this, pli);
206 }
207
208
209
210
211
212
213
214
215 class BoolPropPanel : public PropertyPanel
216 {
217 public:
218 BoolPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
219 {
220 m_chb = NULL;
221 wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
222 sizer->Add(m_chb = new wxCheckBox(this, ID_BOOLVAL, _("On/Yes/True")), 0, wxLEFT|wxTOP, 5);
223 SetAutoLayout(TRUE);
224 SetSizer(sizer);
225 Layout();
226 m_chb->SetValue(XmlReadValue(pli->m_Node, pli->m_PropInfo->Name) == "1");
227 }
228
229 void OnEdit(wxCommandEvent &event)
230 {
231 if (m_chb == NULL) return;
232 if (m_chb->GetValue()) Update("1");
233 else Update("0");
234 }
235
236 wxCheckBox *m_chb;
237
238 DECLARE_EVENT_TABLE()
239 };
240
241 BEGIN_EVENT_TABLE(BoolPropPanel, PropertyPanel)
242 EVT_CHECKBOX(ID_BOOLVAL, BoolPropPanel::OnEdit)
243 END_EVENT_TABLE()
244
245 wxPanel *BoolPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
246 {
247 return new BoolPropPanel(parent, this, pli);
248 }
249
250 wxString BoolPropertyHandler::GetBriefValue(wxXmlNode *node, PropertyInfo *pi)
251 {
252 wxString v = XmlReadValue(node, pi->Name);
253 if (v.IsEmpty()) return wxEmptyString;
254 else if (v == "1") return "true";
255 else return "false";
256 }
257
258
259
260
261
262
263
264
265 class FlagsPropPanel : public PropertyPanel
266 {
267 public:
268 FlagsPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
269 {
270 m_chl = NULL;
271 wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
272 sizer->Add(m_chl = new wxCheckListBox(this, ID_CHECKLIST), 1, wxEXPAND|wxALL, 5);
273 SetAutoLayout(TRUE);
274 SetSizer(sizer);
275 Layout();
276
277 {
278 wxStringTokenizer tkn(pli->m_PropInfo->MoreInfo, ",");
279 wxString s;
280 while (tkn.HasMoreTokens())
281 {
282 s = tkn.GetNextToken();
283 m_chl->Append(s);
284 m_flags.Add(s);
285 }
286 }
287
288 {
289 wxStringTokenizer tkn(XmlReadValue(pli->m_Node, pli->m_PropInfo->Name), "| ");
290 int index;
291 while (tkn.HasMoreTokens())
292 {
293 index = m_flags.Index(tkn.GetNextToken());
294 if (index != wxNOT_FOUND)
295 m_chl->Check(index);
296 }
297 }
298 }
299
300 void OnEdit(wxCommandEvent &event)
301 {
302 wxString s;
303 bool first = TRUE;
304
305 for (size_t i = 0; i < m_flags.GetCount(); i++)
306 {
307 if (m_chl->IsChecked(i))
308 {
309 if (!first) s << '|';
310 s << m_flags[i];
311 first = FALSE;
312 }
313 }
314 Update(s);
315 if (m_PLI->m_PropInfo->Name == "orient")
316 // FIXME - dirty hack related to sizers
317 EditorFrame::Get()->NotifyChanged(CHANGED_TREE_SELECTED_ICON);
318 }
319
320 wxCheckListBox *m_chl;
321 wxArrayString m_flags;
322
323 DECLARE_EVENT_TABLE()
324 };
325
326 BEGIN_EVENT_TABLE(FlagsPropPanel, PropertyPanel)
327 EVT_CHECKLISTBOX(ID_CHECKLIST, FlagsPropPanel::OnEdit)
328 END_EVENT_TABLE()
329
330 wxPanel *FlagsPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
331 {
332 return new FlagsPropPanel(parent, this, pli);
333 }
334
335
336
337
338 wxPanel *NotImplPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
339 {
340 wxPanel *p = new wxPanel(parent);
341 wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
342 sizer->Add(new wxStaticText(p, -1, _("Sorry, this is not supported.\nYou have to edit XML code directly.")), 1, wxEXPAND|wxALL, 5);
343 p->SetAutoLayout(TRUE);
344 p->SetSizer(sizer);
345 p->Layout();
346 return p;
347 }