1 //-----------------------------------------------------------------------------
3 // Purpose: XML resources sample: Object references and ID ranges dialog
4 // Author: David Hart, Vaclav Slavik
6 // Copyright: (c) Vaclav Slavik
7 // Licence: wxWindows licence
8 //-----------------------------------------------------------------------------
10 //-----------------------------------------------------------------------------
11 // Standard wxWidgets headers
12 //-----------------------------------------------------------------------------
14 // For compilers that support precompilation, includes "wx/wx.h".
15 #include "wx/wxprec.h"
21 // For all others, include the necessary headers (this file is usually all you
22 // need because it includes almost all "standard" wxWidgets headers)
27 //-----------------------------------------------------------------------------
28 // Header of this .cpp file
29 //-----------------------------------------------------------------------------
31 #include "objrefdlg.h"
33 //-----------------------------------------------------------------------------
35 //-----------------------------------------------------------------------------
37 #include "wx/xrc/xmlres.h" // XRC XML resouces
41 //-----------------------------------------------------------------------------
43 //-----------------------------------------------------------------------------
44 ObjrefDialog::ObjrefDialog(wxWindow
* parent
)
46 wxXmlResource::Get()->LoadDialog(this, parent
, wxT("objref_dialog"));
48 nb
= XRCCTRL(*this, "objref_notebook", wxNotebook
);
49 wxCHECK_RET(nb
, "failed to find objref_notebook");
51 // Connect different event handlers.
52 nb
->Connect(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
,
53 wxNotebookEventHandler(ObjrefDialog::OnNotebookPageChanged
),
56 // We want to direct UpdateUI events for the ID range 'first_row' to
57 // OnUpdateUIFirst(). We could achieve this using first_row[0] and
58 // first_row[2], but what if a fourth column were added? It's safer to use
59 // the 'typedefs' for the two ends of the range:
60 wxNotebookPage
*page
= nb
->GetPage(icons_page
);
61 page
->Connect(XRCID("first_row[start]"), XRCID("first_row[end]"),
63 wxUpdateUIEventHandler(ObjrefDialog::OnUpdateUIFirst
),
65 page
->Connect(XRCID("second_row[start]"), XRCID("second_row[end]"),
67 wxUpdateUIEventHandler(ObjrefDialog::OnUpdateUISecond
),
69 page
->Connect(XRCID("third_row[start]"), XRCID("third_row[end]"),
71 wxUpdateUIEventHandler(ObjrefDialog::OnUpdateUIThird
),
74 // Connect the id ranges, using the [start] and [end] 'typedefs'
75 page
= nb
->GetPage(calc_page
);
76 page
->Connect(XRCID("digits[start]"), XRCID("digits[end]"),
77 wxEVT_COMMAND_BUTTON_CLICKED
,
78 wxCommandEventHandler(ObjrefDialog::OnNumeralClick
),
80 page
->Connect(XRCID("operators[start]"), XRCID("operators[end]"),
81 wxEVT_COMMAND_BUTTON_CLICKED
,
82 wxCommandEventHandler(ObjrefDialog::OnOperatorClick
),
87 ObjrefDialog::~ObjrefDialog()
89 // Select page 0. Otherwise if the Calc page were selected, when it's
90 // removed the Icons page is selected and sets the log target again in idle
91 // time, *after* myframe restores the old one!
92 nb
->ChangeSelection(0);
95 //-----------------------------------------------------------------------------
96 // Private members (including the event handlers)
97 //-----------------------------------------------------------------------------
98 void ObjrefDialog::OnNotebookPageChanged( wxNotebookEvent
&event
)
100 switch(event
.GetSelection())
104 // This is a straight object reference to the first page
105 // so change the text programmatically
106 nb
->SetPageText(copy_page
, "Page 1 copy");
108 wxNotebookPage
*page
= nb
->GetPage(copy_page
);
110 text
= XRCCTRL(*page
, "description_text", wxTextCtrl
);
112 "This is a duplicate of page 1, using an object reference. "
113 "It was created by this very simple xml:\n\n"
114 "<object class=\"notebookpage\">\n\t<object_ref ref=\"page1\"/>\n"
115 "\t<label>Page 1 copy</label>\n</object>"
116 "\n\n(Then I'm cheating by inserting this text programmatically.)"
123 wxNotebookPage
*page
= nb
->GetPage(icons_page
);
124 text
= XRCCTRL(*page
, "log_text", wxTextCtrl
);
126 delete wxLog::SetActiveTarget(new wxLogTextCtrl(text
));
132 wxNotebookPage
*page
= nb
->GetPage(calc_page
);
133 result_txt
= XRCCTRL(*page
, "result", wxTextCtrl
);
134 text
= XRCCTRL(*page
, "log_text", wxTextCtrl
);
136 delete wxLog::SetActiveTarget(new wxLogTextCtrl(text
));
146 // There are undoubtedly simpler ways of doing all this, but we're
147 // demonstrating the use of ID ranges
148 void ObjrefDialog::OnUpdateUIFirst(wxUpdateUIEvent
& event
)
150 // The checkbox with the XRCID 'check[0]' controls this row of icons
152 chk
= XRCCTRL(*(nb
->GetPage(icons_page
)), "check[0]", wxCheckBox
);
154 event
.Enable(chk
->IsChecked());
156 // Let's create a log-window entry
157 static bool checked
= true;
158 if (chk
->IsChecked() != checked
)
160 checked
= chk
->IsChecked();
161 wxLogMessage("Row one has been %s by check[0], XRCID = %i",
162 checked
? "enabled" : "disabled", XRCID("check[0]"));
163 wxLogMessage("XRCIDs: first_row[start] = %i, first_row[0] = %i, "
164 "first_row[1] = %i, first_row[2] = %i, "
165 "first_row[end] = %i",
166 XRCID("first_row[start]"), XRCID("first_row[0]"),
167 XRCID("first_row[1]"), XRCID("first_row[2]"),
168 XRCID("first_row[end]"));
172 void ObjrefDialog::OnUpdateUISecond(wxUpdateUIEvent
& event
)
174 // The checkbox with the XRCID 'check[1]' controls this row of icons
176 chk
= XRCCTRL(*(nb
->GetPage(icons_page
)), "check[1]", wxCheckBox
);
178 event
.Enable(chk
->IsChecked());
180 // Let's create a log-window entry
181 static bool checked
= true;
182 if (chk
->IsChecked() != checked
)
184 checked
= chk
->IsChecked();
185 wxLogMessage("Row two has been %s by check[1], XRCID = %i",
186 checked
? "enabled" : "disabled", XRCID("check[1]"));
187 wxLogMessage("XRCIDs: second_row[start] = %i, second_row[0] = %i, "
188 "second_row[1] = %i, second_row[2] = %i, "
189 "second_row[end] = %i",
190 XRCID("second_row[start]"), XRCID("second_row[0]"),
191 XRCID("second_row[1]"), XRCID("second_row[2]"),
192 XRCID("second_row[end]"));
196 void ObjrefDialog::OnUpdateUIThird(wxUpdateUIEvent
& event
)
198 // The checkbox with the XRCID 'check[2]' controls this row of icons
200 chk
= XRCCTRL(*(nb
->GetPage(icons_page
)), "check[2]", wxCheckBox
);
202 event
.Enable(chk
->IsChecked());
204 // Let's create a log-window entry
205 static bool checked
= true;
206 if (chk
->IsChecked() != checked
)
208 checked
= chk
->IsChecked();
209 wxLogMessage("Row three has been %s by check[2], XRCID = %i",
210 checked
? "enabled" : "disabled", XRCID("check[2]"));
211 wxLogMessage("XRCIDs: third_row[start] = %i, third_row[0] = %i, "
212 "third_row[1] = %i, third_row[2] = %i, "
213 "third_row[end] = %i",
214 XRCID("third_row[start]"), XRCID("third_row[0]"),
215 XRCID("third_row[1]"), XRCID("third_row[2]"),
216 XRCID("third_row[end]"));
220 void ObjrefDialog::OnNumeralClick(wxCommandEvent
& event
)
222 // See how the id range simplifies determining which numeral was clicked
223 int digit
= event
.GetId() - XRCID("digits[start]");
225 char c
= '0' + digit
;
226 if (current
==0 && previous
==0)
228 // We're just starting a calculation, so get rid of the placeholder '0'
231 else if (operator_expected
== true)
233 // If we've just finished one calculation, and now a digit is entered,
241 current
= current
*10 + digit
;
243 wxLogMessage("You clicked digits[%c], XRCID %i", c
, event
.GetId());
246 void ObjrefDialog::OnOperatorClick(wxCommandEvent
& event
)
248 static const char symbols
[] = "+-*/=";
250 operator_expected
= false;
251 int ID
= event
.GetId() - XRCID("operators[start]");
253 // We carefully used "operators[end]" as the name of the Clear button
254 if (event
.GetId() == XRCID("operators[end]"))
256 wxLogMessage("You clicked operators[%i], XRCID %d, 'Clear'",
258 return ClearCalculator();
265 case operator_multiply
:
266 case operator_divide
:
267 if (current
!=0 || previous
!=0)
269 // We're in the middle of a complex calculation, so do the
273 curr_operator
= (CalcOperator
)ID
;
276 case operator_equals
:
278 wxLogMessage("You clicked operators[%i], XRCID %i, giving a '%c'",
279 ID
, event
.GetId(), symbols
[ID
]);
280 curr_operator
= operator_equals
;
281 // Flag that the next entry should be an operator, not a digit
282 operator_expected
= true;
286 (*result_txt
) << ' ' << symbols
[ID
] << ' ';
288 wxLogMessage("You clicked operators[%i], XRCID %i, giving a '%c'",
289 ID
, event
.GetId(), symbols
[ID
]);
292 void ObjrefDialog::Calculate()
294 switch(curr_operator
)
297 previous
+= current
; break;
299 previous
-= current
; break;
300 case operator_multiply
:
301 previous
*= current
; break;
302 case operator_divide
:
309 curr_operator
= operator_plus
;
313 (*result_txt
) << previous
;
316 void ObjrefDialog::ClearCalculator()
318 current
= previous
= 0;
319 curr_operator
= operator_plus
;
320 operator_expected
= false;
321 result_txt
->ChangeValue("0");