]> git.saurik.com Git - wxWidgets.git/blob - samples/widgets/hyperlnk.cpp
Make storing non-trivial data in wxThreadSpecificInfo possible.
[wxWidgets.git] / samples / widgets / hyperlnk.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets Widgets Sample
3 // Name: hyperlnk.cpp
4 // Purpose: Part of the widgets sample showing wxHyperlinkCtrl
5 // Author: Dimitri Schoolwerth, Vadim Zeitlin
6 // Created: 27 Sep 2003
7 // Copyright: (c) 2003 wxWindows team
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // ============================================================================
12 // declarations
13 // ============================================================================
14
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18
19 // for compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #if wxUSE_HYPERLINKCTRL
27
28 // for all others, include the necessary headers
29 #ifndef WX_PRECOMP
30 #include "wx/app.h"
31 #include "wx/log.h"
32
33 #include "wx/bitmap.h"
34 #include "wx/button.h"
35 #include "wx/checkbox.h"
36 #include "wx/radiobox.h"
37 #include "wx/statbox.h"
38 #include "wx/stattext.h"
39 #include "wx/textctrl.h"
40
41 #include "wx/sizer.h"
42 #endif
43
44 #include "wx/hyperlink.h"
45
46 #include "widgets.h"
47
48 #include "icons/hyperlnk.xpm"
49
50 // ----------------------------------------------------------------------------
51 // constants
52 // ----------------------------------------------------------------------------
53
54 // control ids
55 enum
56 {
57 HyperlinkPage_Reset = wxID_HIGHEST,
58 HyperlinkPage_SetLabel,
59 HyperlinkPage_SetURL,
60 HyperlinkPage_Ctrl
61 };
62
63 // alignment radiobox indices
64 enum
65 {
66 Align_Left,
67 Align_Centre,
68 Align_Right,
69 Align_Max
70 };
71
72 // ----------------------------------------------------------------------------
73 // CheckBoxWidgetsPage
74 // ----------------------------------------------------------------------------
75
76 class HyperlinkWidgetsPage : public WidgetsPage
77 {
78 public:
79 HyperlinkWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
80 virtual ~HyperlinkWidgetsPage() {}
81
82 virtual wxControl *GetWidget() const { return m_hyperlink; }
83 virtual void RecreateWidget() { CreateHyperlink(); }
84
85 // lazy creation of the content
86 virtual void CreateContent();
87
88 protected:
89 // event handlers
90 void OnButtonSetLabel(wxCommandEvent& event);
91 void OnButtonSetURL(wxCommandEvent& event);
92
93 void OnButtonReset(wxCommandEvent& event);
94 void OnAlignment(wxCommandEvent& event);
95 void OnGeneric(wxCommandEvent& event);
96
97 // reset the control parameters
98 void Reset();
99
100 // (re)create the hyperctrl
101 void CreateHyperlink();
102 void CreateHyperlinkLong(long);
103
104 // the controls
105 // ------------
106
107 // the checkbox itself and the sizer it is in
108 wxGenericHyperlinkCtrl *m_hyperlink;
109 wxGenericHyperlinkCtrl *m_hyperlinkLong;
110
111 wxTextCtrl *m_label;
112 wxTextCtrl *m_url;
113
114 wxStaticText *m_visit;
115 wxStaticText *m_fun;
116
117 // the text entries for command parameters
118 wxTextCtrl *m_textLabel;
119
120 wxRadioBox *m_radioAlignMode;
121 wxCheckBox *m_checkGeneric;
122
123 private:
124 DECLARE_EVENT_TABLE()
125 DECLARE_WIDGETS_PAGE(HyperlinkWidgetsPage)
126 };
127
128 // ----------------------------------------------------------------------------
129 // event tables
130 // ----------------------------------------------------------------------------
131
132 BEGIN_EVENT_TABLE(HyperlinkWidgetsPage, WidgetsPage)
133 EVT_BUTTON(HyperlinkPage_Reset, HyperlinkWidgetsPage::OnButtonReset)
134 EVT_BUTTON(HyperlinkPage_SetLabel, HyperlinkWidgetsPage::OnButtonSetLabel)
135 EVT_BUTTON(HyperlinkPage_SetURL, HyperlinkWidgetsPage::OnButtonSetURL)
136
137 EVT_RADIOBOX(wxID_ANY, HyperlinkWidgetsPage::OnAlignment)
138 EVT_CHECKBOX(wxID_ANY, HyperlinkWidgetsPage::OnGeneric)
139 END_EVENT_TABLE()
140
141 // ============================================================================
142 // implementation
143 // ============================================================================
144
145 IMPLEMENT_WIDGETS_PAGE(HyperlinkWidgetsPage, wxT("Hyperlink"),
146 GENERIC_CTRLS
147 );
148
149 HyperlinkWidgetsPage::HyperlinkWidgetsPage(WidgetsBookCtrl *book,
150 wxImageList *imaglist)
151 :WidgetsPage(book, imaglist, hyperlnk_xpm)
152 {
153 }
154
155 void HyperlinkWidgetsPage::CreateContent()
156 {
157 wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
158
159 // left pane
160 wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("Hyperlink details"));
161
162 wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
163
164 sizerLeft->Add( CreateSizerWithTextAndButton( HyperlinkPage_SetLabel , wxT("Set &Label"), wxID_ANY, &m_label ),
165 0, wxALL | wxALIGN_RIGHT , 5 );
166
167 sizerLeft->Add( CreateSizerWithTextAndButton( HyperlinkPage_SetURL , wxT("Set &URL"), wxID_ANY, &m_url ),
168 0, wxALL | wxALIGN_RIGHT , 5 );
169
170 static const wxString alignments[] =
171 {
172 wxT("&left"),
173 wxT("&centre"),
174 wxT("&right")
175 };
176 wxCOMPILE_TIME_ASSERT( WXSIZEOF(alignments) == Align_Max,
177 AlignMismatch );
178
179 m_radioAlignMode = new wxRadioBox(this, wxID_ANY, wxT("alignment"),
180 wxDefaultPosition, wxDefaultSize,
181 WXSIZEOF(alignments), alignments);
182 m_radioAlignMode->SetSelection(1); // start with "centre" selected since
183 // wxHL_DEFAULT_STYLE contains wxHL_ALIGN_CENTRE
184 sizerLeft->Add(m_radioAlignMode, 0, wxALL|wxGROW, 5);
185
186 m_checkGeneric = new wxCheckBox(this, wxID_ANY, wxT("Use generic version"),
187 wxDefaultPosition, wxDefaultSize);
188 sizerLeft->Add(m_checkGeneric, 0, wxALL|wxGROW, 5);
189
190 // right pane
191 wxSizer *szHyperlinkLong = new wxBoxSizer(wxVERTICAL);
192 wxSizer *szHyperlink = new wxBoxSizer(wxHORIZONTAL);
193
194 m_visit = new wxStaticText(this, wxID_ANY, wxT("Visit "));
195
196 if (m_checkGeneric->IsChecked())
197 {
198 m_hyperlink = new wxGenericHyperlinkCtrl(this,
199 HyperlinkPage_Ctrl,
200 wxT("wxWidgets website"),
201 wxT("www.wxwidgets.org"));
202 }
203 else
204 {
205 m_hyperlink = new wxHyperlinkCtrl(this,
206 HyperlinkPage_Ctrl,
207 wxT("wxWidgets website"),
208 wxT("www.wxwidgets.org"));
209 }
210
211 m_fun = new wxStaticText(this, wxID_ANY, wxT(" for fun!"));
212
213 szHyperlink->Add(0, 0, 1, wxCENTRE);
214 szHyperlink->Add(m_visit, 0, wxCENTRE);
215 szHyperlink->Add(m_hyperlink, 0, wxCENTRE);
216 szHyperlink->Add(m_fun, 0, wxCENTRE);
217 szHyperlink->Add(0, 0, 1, wxCENTRE);
218 szHyperlink->SetMinSize(150, 0);
219
220 if (m_checkGeneric->IsChecked())
221 {
222 m_hyperlinkLong = new wxGenericHyperlinkCtrl(this,
223 wxID_ANY,
224 wxT("This is a long hyperlink"),
225 wxT("www.wxwidgets.org"));
226 }
227 else
228 {
229 m_hyperlinkLong = new wxHyperlinkCtrl(this,
230 wxID_ANY,
231 wxT("This is a long hyperlink"),
232 wxT("www.wxwidgets.org"));
233 }
234
235 szHyperlinkLong->Add(0, 0, 1, wxCENTRE);
236 szHyperlinkLong->Add(szHyperlink, 0, wxCENTRE|wxGROW);
237 szHyperlinkLong->Add(0, 0, 1, wxCENTRE);
238 szHyperlinkLong->Add(m_hyperlinkLong, 0, wxGROW);
239 szHyperlinkLong->Add(0, 0, 1, wxCENTRE);
240
241
242 // the 3 panes panes compose the window
243 sizerTop->Add(sizerLeft, 0, (wxALL & ~wxLEFT), 10);
244 sizerTop->Add(szHyperlinkLong, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
245
246 // final initializations
247 Reset();
248
249 SetSizer(sizerTop);
250 }
251
252 void HyperlinkWidgetsPage::Reset()
253 {
254 m_label->SetValue(m_hyperlink->GetLabel());
255 m_url->SetValue(m_hyperlink->GetURL());
256 }
257
258 void HyperlinkWidgetsPage::CreateHyperlink()
259 {
260 const wxString label = m_hyperlink->GetLabel();
261 const wxString url = m_hyperlink->GetURL();
262
263 wxGenericHyperlinkCtrl *hyp;
264 if (m_checkGeneric->IsChecked())
265 {
266 hyp = new wxGenericHyperlinkCtrl(this,
267 HyperlinkPage_Ctrl,
268 label,
269 url);
270 }
271 else
272 {
273 hyp = new wxHyperlinkCtrl(this,
274 HyperlinkPage_Ctrl,
275 label,
276 url);
277 }
278
279 // update sizer's child window
280 GetSizer()->Replace(m_hyperlink, hyp, true);
281
282 // update our pointer
283 delete m_hyperlink;
284 m_hyperlink = hyp;
285
286 // relayout the sizer
287 GetSizer()->Layout();
288 }
289
290 void HyperlinkWidgetsPage::CreateHyperlinkLong(long style)
291 {
292 style = (wxHL_DEFAULT_STYLE & ~wxHL_ALIGN_CENTRE)|style;
293
294 wxGenericHyperlinkCtrl *hyp;
295 if (m_checkGeneric->IsChecked())
296 {
297 hyp = new wxGenericHyperlinkCtrl(this,
298 wxID_ANY,
299 wxT("This is a long hyperlink"),
300 wxT("www.wxwidgets.org"),
301 wxDefaultPosition,
302 wxDefaultSize,
303 style);
304 }
305 else
306 {
307 hyp = new wxHyperlinkCtrl(this,
308 wxID_ANY,
309 wxT("This is a long hyperlink"),
310 wxT("www.wxwidgets.org"),
311 wxDefaultPosition,
312 wxDefaultSize,
313 style);
314 }
315
316 // update sizer's child window
317 GetSizer()->Replace(m_hyperlinkLong, hyp, true);
318
319 // update our pointer
320 delete m_hyperlinkLong;
321 m_hyperlinkLong = hyp;
322
323 // relayout the sizer
324 GetSizer()->Layout();
325 }
326
327 // ----------------------------------------------------------------------------
328 // event handlers
329 // ----------------------------------------------------------------------------
330
331 void HyperlinkWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
332 {
333 Reset();
334
335 CreateHyperlink();
336 }
337
338 void HyperlinkWidgetsPage::OnButtonSetLabel(wxCommandEvent& WXUNUSED(event))
339 {
340 m_hyperlink->SetLabel(m_label->GetValue());
341 CreateHyperlink();
342 }
343
344 void HyperlinkWidgetsPage::OnButtonSetURL(wxCommandEvent& WXUNUSED(event))
345 {
346 m_hyperlink->SetURL(m_url->GetValue());
347 CreateHyperlink();
348 }
349
350 void HyperlinkWidgetsPage::OnAlignment(wxCommandEvent& WXUNUSED(event))
351 {
352 long addstyle;
353 switch ( m_radioAlignMode->GetSelection() )
354 {
355 default:
356 case Align_Max:
357 wxFAIL_MSG( wxT("unknown alignment") );
358 // fall through
359
360 case Align_Left:
361 addstyle = wxHL_ALIGN_LEFT;
362 break;
363
364 case Align_Centre:
365 addstyle = wxHL_ALIGN_CENTRE;
366 break;
367
368 case Align_Right:
369 addstyle = wxHL_ALIGN_RIGHT;
370 break;
371 }
372
373 CreateHyperlinkLong(addstyle);
374 }
375
376 void HyperlinkWidgetsPage::OnGeneric(wxCommandEvent& event)
377 {
378 CreateHyperlink();
379 OnAlignment(event);
380 }
381
382 #endif // wxUSE_HYPERLINKCTRL