]> git.saurik.com Git - wxWidgets.git/blob - samples/help/demo.cpp
Added context help stuff to wxPython
[wxWidgets.git] / samples / help / demo.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: demo.cpp
3 // Purpose: wxHelpController demo
4 // Author: Karsten Ballueder
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Karsten Ballueder, Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
22
23 #ifdef __BORLANDC__
24 # pragma hdrstop
25 #endif
26
27 // for all others, include the necessary headers (this file is usually all you
28 // need because it includes almost all "standard" wxWindows headers
29 #ifndef WX_PRECOMP
30 # include "wx/wx.h"
31 #endif
32
33 # include "wx/image.h"
34 # include "wx/help.h"
35 # include "wx/cshelp.h"
36
37 #if wxUSE_TOOLTIPS
38 # include "wx/tooltip.h"
39 #endif
40
41 // define this to 1 to use HTML help even under Windows (by default, Windows
42 // version will use WinHelp).
43 // Please also see samples/html/helpview.
44
45 #define USE_HTML_HELP 1
46
47 // Use old-style HTML help if 1
48 #define USE_OLD_HTML_HELP 0
49
50 #if !wxUSE_HTML
51 #undef USE_HTML_HELP
52 #define USE_HTML_HELP 0
53 #endif
54
55 #if USE_HTML_HELP
56 #include <wx/filesys.h>
57 #include <wx/fs_zip.h>
58
59 #if USE_OLD_HTML_HELP
60 #include "wx/generic/helpwxht.h"
61 #endif
62
63 #include "wx/html/helpctrl.h"
64 #endif
65
66 #if wxUSE_MS_HTML_HELP
67 #include "wx/msw/helpchm.h"
68 #endif
69
70 // ----------------------------------------------------------------------------
71 // ressources
72 // ----------------------------------------------------------------------------
73 // the application icon
74 #if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__)
75 #include "mondrian.xpm"
76 #endif
77
78 // ----------------------------------------------------------------------------
79 // private classes
80 // ----------------------------------------------------------------------------
81
82 // Define a new application type, each program should derive a class from wxApp
83 class MyApp : public wxApp
84 {
85 public:
86 // override base class virtuals
87 // ----------------------------
88
89 // this one is called on application startup and is a good place for the app
90 // initialization (doing it here and not in the ctor allows to have an error
91 // return: if OnInit() returns false, the application terminates)
92 virtual bool OnInit();
93
94 // do some clean up here
95 virtual int OnExit();
96 };
97
98 // Define a new frame type: this is going to be our main frame
99 class MyFrame : public wxFrame
100 {
101 public:
102 // ctor(s)
103 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
104
105 wxHelpController& GetHelpController() { return m_help; }
106
107 #if USE_HTML_HELP
108 #if USE_OLD_HTML_HELP
109 wxHelpControllerHtml& GetHtmlHelpController() { return m_htmlHelp; }
110 #endif
111 wxHtmlHelpController& GetAdvancedHtmlHelpController() { return m_advancedHtmlHelp; }
112 #endif
113 #if wxUSE_MS_HTML_HELP
114 wxCHMHelpController& GetMSHtmlHelpController() { return m_msHtmlHelp; }
115 #endif
116
117 // event handlers (these functions should _not_ be virtual)
118 void OnQuit(wxCommandEvent& event);
119 void OnHelp(wxCommandEvent& event);
120 void OnHtmlHelp(wxCommandEvent& event);
121 void OnAdvancedHtmlHelp(wxCommandEvent& event);
122 void OnMSHtmlHelp(wxCommandEvent& event);
123
124 void OnShowContextHelp(wxCommandEvent& event);
125 void OnShowDialogContextHelp(wxCommandEvent& event);
126
127 void ShowHelp(int commandId, wxHelpControllerBase& helpController);
128
129 private:
130 wxHelpController m_help;
131
132 #if USE_HTML_HELP
133 #if USE_OLD_HTML_HELP
134 wxHelpControllerHtml m_htmlHelp;
135 #endif
136 wxHtmlHelpController m_advancedHtmlHelp;
137 #endif
138
139 #if wxUSE_MS_HTML_HELP
140 wxCHMHelpController m_msHtmlHelp;
141 #endif
142
143 // any class wishing to process wxWindows events must use this macro
144 DECLARE_EVENT_TABLE()
145 };
146
147 // A custom modal dialog
148 class MyModalDialog : public wxDialog
149 {
150 public:
151 MyModalDialog(wxWindow *parent);
152
153 private:
154
155 DECLARE_EVENT_TABLE()
156 };
157
158 // ----------------------------------------------------------------------------
159 // constants
160 // ----------------------------------------------------------------------------
161
162 // IDs for the controls and the menu commands
163 enum
164 {
165 // menu items
166 HelpDemo_Quit = 100,
167 HelpDemo_Help_Index,
168 HelpDemo_Help_Classes,
169 HelpDemo_Help_Functions,
170 HelpDemo_Help_Help,
171 HelpDemo_Help_Search,
172 HelpDemo_Help_ContextHelp,
173 HelpDemo_Help_DialogContextHelp,
174
175 HelpDemo_Html_Help_Index,
176 HelpDemo_Html_Help_Classes,
177 HelpDemo_Html_Help_Functions,
178 HelpDemo_Html_Help_Help,
179 HelpDemo_Html_Help_Search,
180
181 HelpDemo_Advanced_Html_Help_Index,
182 HelpDemo_Advanced_Html_Help_Classes,
183 HelpDemo_Advanced_Html_Help_Functions,
184 HelpDemo_Advanced_Html_Help_Help,
185 HelpDemo_Advanced_Html_Help_Search,
186
187 HelpDemo_MS_Html_Help_Index,
188 HelpDemo_MS_Html_Help_Classes,
189 HelpDemo_MS_Html_Help_Functions,
190 HelpDemo_MS_Html_Help_Help,
191 HelpDemo_MS_Html_Help_Search,
192
193 HelpDemo_Help_KDE,
194 HelpDemo_Help_GNOME,
195 HelpDemo_Help_Netscape,
196 // controls start here (the numbers are, of course, arbitrary)
197 HelpDemo_Text = 1000,
198 };
199
200 // ----------------------------------------------------------------------------
201 // event tables and other macros for wxWindows
202 // ----------------------------------------------------------------------------
203
204 // the event tables connect the wxWindows events with the functions (event
205 // handlers) which process them. It can be also done at run-time, but for the
206 // simple menu events like this the static method is much simpler.
207 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
208 EVT_MENU(HelpDemo_Quit, MyFrame::OnQuit)
209 EVT_MENU(HelpDemo_Help_Index, MyFrame::OnHelp)
210 EVT_MENU(HelpDemo_Help_Classes, MyFrame::OnHelp)
211 EVT_MENU(HelpDemo_Help_Functions, MyFrame::OnHelp)
212 EVT_MENU(HelpDemo_Help_Help, MyFrame::OnHelp)
213 EVT_MENU(HelpDemo_Help_Search, MyFrame::OnHelp)
214 EVT_MENU(HelpDemo_Help_ContextHelp, MyFrame::OnShowContextHelp)
215 EVT_MENU(HelpDemo_Help_DialogContextHelp, MyFrame::OnShowDialogContextHelp)
216
217 EVT_MENU(HelpDemo_Html_Help_Index, MyFrame::OnHtmlHelp)
218 EVT_MENU(HelpDemo_Html_Help_Classes, MyFrame::OnHtmlHelp)
219 EVT_MENU(HelpDemo_Html_Help_Functions, MyFrame::OnHtmlHelp)
220 EVT_MENU(HelpDemo_Html_Help_Help, MyFrame::OnHtmlHelp)
221 EVT_MENU(HelpDemo_Html_Help_Search, MyFrame::OnHtmlHelp)
222
223 EVT_MENU(HelpDemo_Advanced_Html_Help_Index, MyFrame::OnAdvancedHtmlHelp)
224 EVT_MENU(HelpDemo_Advanced_Html_Help_Classes, MyFrame::OnAdvancedHtmlHelp)
225 EVT_MENU(HelpDemo_Advanced_Html_Help_Functions, MyFrame::OnAdvancedHtmlHelp)
226 EVT_MENU(HelpDemo_Advanced_Html_Help_Help, MyFrame::OnAdvancedHtmlHelp)
227 EVT_MENU(HelpDemo_Advanced_Html_Help_Search, MyFrame::OnAdvancedHtmlHelp)
228
229 EVT_MENU(HelpDemo_MS_Html_Help_Index, MyFrame::OnMSHtmlHelp)
230 EVT_MENU(HelpDemo_MS_Html_Help_Classes, MyFrame::OnMSHtmlHelp)
231 EVT_MENU(HelpDemo_MS_Html_Help_Functions, MyFrame::OnMSHtmlHelp)
232 EVT_MENU(HelpDemo_MS_Html_Help_Help, MyFrame::OnMSHtmlHelp)
233 EVT_MENU(HelpDemo_MS_Html_Help_Search, MyFrame::OnMSHtmlHelp)
234
235 EVT_MENU(HelpDemo_Help_KDE, MyFrame::OnHelp)
236 EVT_MENU(HelpDemo_Help_GNOME, MyFrame::OnHelp)
237 EVT_MENU(HelpDemo_Help_Netscape, MyFrame::OnHelp)
238 END_EVENT_TABLE()
239
240 // Create a new application object: this macro will allow wxWindows to create
241 // the application object during program execution (it's better than using a
242 // static object for many reasons) and also declares the accessor function
243 // wxGetApp() which will return the reference of the right type (i.e. MyApp and
244 // not wxApp)
245 IMPLEMENT_APP(MyApp)
246
247 // ============================================================================
248 // implementation
249 // ============================================================================
250
251 // ----------------------------------------------------------------------------
252 // the application class
253 // ----------------------------------------------------------------------------
254
255 // `Main program' equivalent: the program execution "starts" here
256 bool MyApp::OnInit()
257 {
258 // Create a simple help provider to make SetHelpText() do something.
259 // Note that this must be set before any SetHelpText() calls are made.
260 //wxHelpProvider::Set(new wxSimpleHelpProvider);
261 wxHelpControllerHelpProvider* provider = new wxHelpControllerHelpProvider;
262 wxHelpProvider::Set(provider);
263
264 #if wxUSE_HTML
265 #if wxUSE_GIF
266 // Required for images in the online documentation
267 wxImage::AddHandler(new wxGIFHandler);
268
269 // Required for advanced HTML help
270 #if wxUSE_STREAMS && wxUSE_ZIPSTREAM && wxUSE_ZLIB
271 wxFileSystem::AddHandler(new wxZipFSHandler);
272 #endif
273
274 #endif
275 #endif
276
277 // Create the main application window
278 MyFrame *frame = new MyFrame("HelpDemo wxWindows App",
279 wxPoint(50, 50), wxSize(450, 340));
280
281 #if wxUSE_MS_HTML_HELP
282 provider->SetHelpController(& frame->GetMSHtmlHelpController());
283 #else
284 provider->SetHelpController(& frame->GetHelpController());
285 #endif
286
287 frame->Show(TRUE);
288 SetTopWindow(frame);
289
290 // initialise the help system: this means that we'll use doc.hlp file under
291 // Windows and that the HTML docs are in the subdirectory doc for platforms
292 // using HTML help
293 if ( !frame->GetHelpController().Initialize("doc") )
294 {
295 wxLogError("Cannot initialize the help system, aborting.");
296
297 return FALSE;
298 }
299
300 #if USE_HTML_HELP
301 // initialise the standard HTML help system: this means that the HTML docs are in the
302 // subdirectory doc for platforms using HTML help
303 #if USE_OLD_HTML_HELP
304 if ( !frame->GetHtmlHelpController().Initialize("doc") )
305 {
306 wxLogError("Cannot initialize the HTML help system, aborting.");
307
308 return FALSE;
309 }
310 #endif
311
312 // initialise the advanced HTML help system: this means that the HTML docs are in .htb
313 // (zipped) form
314 if ( !frame->GetAdvancedHtmlHelpController().Initialize("doc") )
315 {
316 wxLogError("Cannot initialize the advanced HTML help system, aborting.");
317
318 return FALSE;
319 }
320 #endif
321
322 #if defined(__WXMSW__) && wxUSE_MS_HTML_HELP
323 wxString path(wxGetCwd());
324 if ( !frame->GetMSHtmlHelpController().Initialize(path + "\\doc.chm") )
325 {
326 wxLogError("Cannot initialize the MS HTML help system, aborting.");
327
328 return FALSE;
329 }
330 #endif
331
332 return TRUE;
333 }
334
335 int MyApp::OnExit()
336 {
337 // clean up
338 delete wxHelpProvider::Set(NULL);
339
340 return 0;
341 }
342
343 // ----------------------------------------------------------------------------
344 // main frame
345 // ----------------------------------------------------------------------------
346
347 // frame constructor
348 MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
349 : wxFrame((wxFrame *)NULL, 300, title, pos, size)
350 {
351 // set the frame icon
352 SetIcon(wxICON(mondrian));
353
354 // create a menu bar
355 wxMenu *menuFile = new wxMenu;
356
357 menuFile->Append(HelpDemo_Help_Index, "&Help Index...");
358 menuFile->Append(HelpDemo_Help_Classes, "&Help on Classes...");
359 menuFile->Append(HelpDemo_Help_Functions, "&Help on Functions...");
360 menuFile->Append(HelpDemo_Help_ContextHelp, "&Context Help...");
361 menuFile->Append(HelpDemo_Help_DialogContextHelp, "&Dialog Context Help...\tCtrl-H");
362 menuFile->Append(HelpDemo_Help_Help, "&About Help Demo...");
363 menuFile->Append(HelpDemo_Help_Search, "&Search help...");
364 #if USE_HTML_HELP
365 #if USE_OLD_HTML_HELP
366 menuFile->AppendSeparator();
367 menuFile->Append(HelpDemo_Html_Help_Index, "HTML &Help Index...");
368 menuFile->Append(HelpDemo_Html_Help_Classes, "HTML &Help on Classes...");
369 menuFile->Append(HelpDemo_Html_Help_Functions, "HTML &Help on Functions...");
370 menuFile->Append(HelpDemo_Html_Help_Help, "HTML &About Help Demo...");
371 menuFile->Append(HelpDemo_Html_Help_Search, "HTML &Search help...");
372 #endif
373 menuFile->AppendSeparator();
374 menuFile->Append(HelpDemo_Advanced_Html_Help_Index, "Advanced HTML &Help Index...");
375 menuFile->Append(HelpDemo_Advanced_Html_Help_Classes, "Advanced HTML &Help on Classes...");
376 menuFile->Append(HelpDemo_Advanced_Html_Help_Functions, "Advanced HTML &Help on Functions...");
377 menuFile->Append(HelpDemo_Advanced_Html_Help_Help, "Advanced HTML &About Help Demo...");
378 menuFile->Append(HelpDemo_Advanced_Html_Help_Search, "Advanced HTML &Search help...");
379 #endif
380
381 #if wxUSE_MS_HTML_HELP
382 menuFile->AppendSeparator();
383 menuFile->Append(HelpDemo_MS_Html_Help_Index, "MS HTML &Help Index...");
384 menuFile->Append(HelpDemo_MS_Html_Help_Classes, "MS HTML &Help on Classes...");
385 menuFile->Append(HelpDemo_MS_Html_Help_Functions, "MS HTML &Help on Functions...");
386 menuFile->Append(HelpDemo_MS_Html_Help_Help, "MS HTML &About Help Demo...");
387 menuFile->Append(HelpDemo_MS_Html_Help_Search, "MS HTML &Search help...");
388 #endif
389
390 #ifndef __WXMSW__
391 #if !wxUSE_HTML
392 menuFile->AppendSeparator();
393 menuFile->Append(HelpDemo_Help_KDE, "Use &KDE");
394 menuFile->Append(HelpDemo_Help_GNOME, "Use &GNOME");
395 menuFile->Append(HelpDemo_Help_Netscape, "Use &Netscape");
396 #endif
397 #endif
398 menuFile->AppendSeparator();
399 menuFile->Append(HelpDemo_Quit, "E&xit");
400
401 // now append the freshly created menu to the menu bar...
402 wxMenuBar *menuBar = new wxMenuBar;
403 menuBar->Append(menuFile, "&File");
404
405 // ... and attach this menu bar to the frame
406 SetMenuBar(menuBar);
407
408 // create a status bar just for fun (by default with 1 pane only)
409 CreateStatusBar();
410 SetStatusText("Welcome to wxWindows!");
411
412 // now create some controls
413
414 // a panel first - if there were several controls, it would allow us to
415 // navigate between them from the keyboard
416 wxPanel *panel = new wxPanel(this, 301, wxPoint(0, 0), wxSize(400, 200));
417 //panel->SetHelpText(_("This panel just holds a static text control."));
418 panel->SetHelpText(wxContextId(300));
419
420 // and a static control whose parent is the panel
421 wxStaticText* staticText = new wxStaticText(panel, 302, "Hello, world!", wxPoint(10, 10));
422 staticText->SetHelpText(_("This static text control isn't doing a lot right now."));
423 }
424
425
426 // event handlers
427
428 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
429 {
430 // TRUE is to force the frame to close
431 Close(TRUE);
432 }
433
434 void MyFrame::OnHelp(wxCommandEvent& event)
435 {
436 ShowHelp(event.GetId(), m_help);
437 }
438
439 void MyFrame::OnShowContextHelp(wxCommandEvent& event)
440 {
441 // This starts context help mode, then the user
442 // clicks on a window to send a help message
443 wxContextHelp contextHelp(this);
444 }
445
446 void MyFrame::OnShowDialogContextHelp(wxCommandEvent& event)
447 {
448 MyModalDialog dialog(this);
449 dialog.ShowModal();
450 }
451
452 void MyFrame::OnHtmlHelp(wxCommandEvent& event)
453 {
454 #if USE_HTML_HELP && USE_OLD_HTML_HELP
455 ShowHelp(event.GetId(), m_htmlHelp);
456 #endif
457 }
458
459 void MyFrame::OnAdvancedHtmlHelp(wxCommandEvent& event)
460 {
461 #if USE_HTML_HELP
462 ShowHelp(event.GetId(), m_advancedHtmlHelp);
463 #endif
464 }
465
466 void MyFrame::OnMSHtmlHelp(wxCommandEvent& event)
467 {
468 #if wxUSE_MS_HTML_HELP
469 ShowHelp(event.GetId(), m_msHtmlHelp);
470 #endif
471 }
472
473 /*
474 Notes: ShowHelp uses section ids for displaying particular topics,
475 but you might want to use a unique keyword to display a topic, instead.
476
477 Section ids are specified as follows for the different formats.
478
479 WinHelp
480
481 The [MAP] section specifies the topic to integer id mapping, e.g.
482
483 [MAP]
484 #define intro 100
485 #define functions 1
486 #define classes 2
487 #define about 3
488
489 The identifier name corresponds to the label used for that topic.
490 You could also put these in a .h file and #include it in both the MAP
491 section and your C++ source.
492
493 Note that Tex2RTF doesn't currently generate the MAP section automatically.
494
495 MS HTML Help
496
497 The [MAP] section specifies the HTML filename root to integer id mapping, e.g.
498
499 [MAP]
500 #define doc1 100
501 #define doc3 1
502 #define doc2 2
503 #define doc4 3
504
505 The identifier name corresponds to the HTML filename used for that topic.
506 You could also put these in a .h file and #include it in both the MAP
507 section and your C++ source.
508
509 Note that Tex2RTF doesn't currently generate the MAP section automatically.
510
511 Simple wxHTML Help and External HTML Help
512
513 A wxhelp.map file is used, for example:
514
515 0 wx.htm ; wxWindows: Help index; additional keywords like overview
516 1 wx204.htm ; wxWindows Function Reference
517 2 wx34.htm ; wxWindows Class Reference
518
519 Note that Tex2RTF doesn't currently generate the MAP section automatically.
520
521 Advanced HTML Help
522
523 An extension to the .hhc file format is used, specifying a new parameter
524 with name="ID":
525
526 <OBJECT type="text/sitemap">
527 <param name="Local" value="doc2.htm#classes">
528 <param name="Name" value="Classes">
529 <param name="ID" value=2>
530 </OBJECT>
531
532 Again, this is not generated automatically by Tex2RTF, though it could
533 be added quite easily.
534
535 Unfortunately adding the ID parameters appears to interfere with MS HTML Help,
536 so you should not try to compile a .chm file from a .hhc file with
537 this extension, or the contents will be messed up.
538 */
539
540 void MyFrame::ShowHelp(int commandId, wxHelpControllerBase& helpController)
541 {
542 switch(commandId)
543 {
544 case HelpDemo_Help_Classes:
545 case HelpDemo_Html_Help_Classes:
546 case HelpDemo_Advanced_Html_Help_Classes:
547 case HelpDemo_MS_Html_Help_Classes:
548 helpController.DisplaySection(2);
549 //helpController.DisplaySection("Classes"); // An alternative form for most controllers
550
551 break;
552 case HelpDemo_Help_Functions:
553 case HelpDemo_Html_Help_Functions:
554 case HelpDemo_Advanced_Html_Help_Functions:
555 case HelpDemo_MS_Html_Help_Functions:
556 helpController.DisplaySection(1);
557 //helpController.DisplaySection("Functions"); // An alternative form for most controllers
558 break;
559 case HelpDemo_Help_Help:
560 case HelpDemo_Html_Help_Help:
561 case HelpDemo_Advanced_Html_Help_Help:
562 case HelpDemo_MS_Html_Help_Help:
563 helpController.DisplaySection(3);
564 //helpController.DisplaySection("About"); // An alternative form for most controllers
565 break;
566
567 case HelpDemo_Help_Search:
568 case HelpDemo_Html_Help_Search:
569 case HelpDemo_Advanced_Html_Help_Search:
570 case HelpDemo_MS_Html_Help_Search:
571 {
572 wxString key = wxGetTextFromUser("Search for?",
573 "Search help for keyword",
574 "",
575 this);
576 if(! key.IsEmpty())
577 helpController.KeywordSearch(key);
578 }
579 break;
580
581 case HelpDemo_Help_Index:
582 case HelpDemo_Html_Help_Index:
583 case HelpDemo_Advanced_Html_Help_Index:
584 case HelpDemo_MS_Html_Help_Index:
585 helpController.DisplayContents();
586 break;
587
588 // These three calls are only used by wxExtHelpController
589
590 case HelpDemo_Help_KDE:
591 helpController.SetViewer("kdehelp");
592 break;
593 case HelpDemo_Help_GNOME:
594 helpController.SetViewer("gnome-help-browser");
595 break;
596 case HelpDemo_Help_Netscape:
597 helpController.SetViewer("netscape", wxHELP_NETSCAPE);
598 break;
599 default:
600 break;
601 }
602 }
603
604 // ----------------------------------------------------------------------------
605 // MyModalDialog
606 // Demonstrates context-sensitive help
607 // ----------------------------------------------------------------------------
608
609 BEGIN_EVENT_TABLE(MyModalDialog, wxDialog)
610 END_EVENT_TABLE()
611
612 MyModalDialog::MyModalDialog(wxWindow *parent)
613 : wxDialog()
614 {
615 // Add the context-sensitive help button on the caption for MSW
616 #ifdef __WXMSW__
617 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP);
618 #endif
619
620 wxDialog::Create(parent, -1, wxString("Modal dialog"));
621
622 wxBoxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
623 wxBoxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL);
624
625 wxButton* btnOK = new wxButton(this, wxID_OK, "&OK");
626 btnOK->SetHelpText(_("The OK button confirms the dialog choices."));
627
628 wxButton* btnCancel = new wxButton(this, wxID_CANCEL, "&Cancel");
629 btnCancel->SetHelpText(_("The Cancel button cancels the dialog."));
630
631 sizerRow->Add(btnOK, 0, wxALIGN_CENTER | wxALL, 5);
632 sizerRow->Add(btnCancel, 0, wxALIGN_CENTER | wxALL, 5);
633
634 // Add explicit context-sensitive help button for non-MSW
635 #ifndef __WXMSW__
636 sizerRow->Add(new wxContextHelpButton(this), 0, wxALIGN_CENTER | wxALL, 5);
637 #endif
638
639 wxTextCtrl *text = new wxTextCtrl(this, -1, wxT("A demo text control"),
640 wxDefaultPosition, wxSize(300, 100),
641 wxTE_MULTILINE);
642 text->SetHelpText(_("Type text here if you have got nothing more "
643 "interesting to do"));
644 sizerTop->Add(text, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
645 sizerTop->Add(sizerRow, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
646
647 SetAutoLayout(TRUE);
648 SetSizer(sizerTop);
649
650 sizerTop->SetSizeHints(this);
651 sizerTop->Fit(this);
652
653 btnOK->SetFocus();
654 btnOK->SetDefault();
655 }
656