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