1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxHelpController demo
4 // Author: Karsten Ballueder
8 // Copyright: (c) Karsten Ballueder, Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
27 // for all others, include the necessary headers (this file is usually all you
28 // need because it includes almost all "standard" wxWidgets headers
33 # include "wx/image.h"
35 # include "wx/cshelp.h"
38 # include "wx/tooltip.h"
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.
45 #define USE_HTML_HELP 1
47 // Define this to 0 to use the help controller as the help
48 // provider, or to 1 to use the 'simple help provider'
49 // (the one implemented with wxTipWindow).
50 #define USE_SIMPLE_HELP_PROVIDER 0
54 #define USE_HTML_HELP 0
58 #include "wx/filesys.h"
59 #include "wx/fs_zip.h"
61 #include "wx/html/helpctrl.h"
64 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
65 #include "wx/msw/helpchm.h"
68 #if wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__)
69 #include "wx/msw/helpbest.h"
72 // ----------------------------------------------------------------------------
74 // ----------------------------------------------------------------------------
75 // the application icon
76 #if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__)
77 #include "mondrian.xpm"
80 // ----------------------------------------------------------------------------
82 // ----------------------------------------------------------------------------
84 // Define a new application type, each program should derive a class from wxApp
85 class MyApp
: public wxApp
88 // override base class virtuals
89 // ----------------------------
91 // this one is called on application startup and is a good place for the app
92 // initialization (doing it here and not in the ctor allows to have an error
93 // return: if OnInit() returns false, the application terminates)
94 virtual bool OnInit();
96 // do some clean up here
100 // Define a new frame type: this is going to be our main frame
101 class MyFrame
: public wxFrame
105 MyFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
107 wxHelpController
& GetHelpController() { return m_help
; }
110 wxHtmlHelpController
& GetAdvancedHtmlHelpController() { return m_advancedHtmlHelp
; }
112 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
113 wxCHMHelpController
& GetMSHtmlHelpController() { return m_msHtmlHelp
; }
115 #if wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__)
116 wxBestHelpController
& GetBestHelpController() { return m_bestHelp
; }
119 // event handlers (these functions should _not_ be virtual)
120 void OnQuit(wxCommandEvent
& event
);
121 void OnHelp(wxCommandEvent
& event
);
122 void OnAdvancedHtmlHelp(wxCommandEvent
& event
);
123 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
124 void OnMSHtmlHelp(wxCommandEvent
& event
);
126 #if wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__)
127 void OnBestHelp(wxCommandEvent
& event
);
130 void OnShowContextHelp(wxCommandEvent
& event
);
131 void OnShowDialogContextHelp(wxCommandEvent
& event
);
133 void ShowHelp(int commandId
, wxHelpControllerBase
& helpController
);
136 wxHelpController m_help
;
139 wxHtmlHelpController m_advancedHtmlHelp
;
142 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
143 wxCHMHelpController m_msHtmlHelp
;
146 #if wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__)
147 wxBestHelpController m_bestHelp
;
150 // any class wishing to process wxWidgets events must use this macro
151 DECLARE_EVENT_TABLE()
154 // A custom modal dialog
155 class MyModalDialog
: public wxDialog
158 MyModalDialog(wxWindow
*parent
);
162 DECLARE_EVENT_TABLE()
165 // ----------------------------------------------------------------------------
167 // ----------------------------------------------------------------------------
169 // IDs for the controls and the menu commands
175 HelpDemo_Help_Classes
,
176 HelpDemo_Help_Functions
,
178 HelpDemo_Help_Search
,
179 HelpDemo_Help_ContextHelp
,
180 HelpDemo_Help_DialogContextHelp
,
182 HelpDemo_Html_Help_Index
,
183 HelpDemo_Html_Help_Classes
,
184 HelpDemo_Html_Help_Functions
,
185 HelpDemo_Html_Help_Help
,
186 HelpDemo_Html_Help_Search
,
188 HelpDemo_Advanced_Html_Help_Index
,
189 HelpDemo_Advanced_Html_Help_Classes
,
190 HelpDemo_Advanced_Html_Help_Functions
,
191 HelpDemo_Advanced_Html_Help_Help
,
192 HelpDemo_Advanced_Html_Help_Search
,
194 HelpDemo_MS_Html_Help_Index
,
195 HelpDemo_MS_Html_Help_Classes
,
196 HelpDemo_MS_Html_Help_Functions
,
197 HelpDemo_MS_Html_Help_Help
,
198 HelpDemo_MS_Html_Help_Search
,
200 HelpDemo_Best_Help_Index
,
201 HelpDemo_Best_Help_Classes
,
202 HelpDemo_Best_Help_Functions
,
203 HelpDemo_Best_Help_Help
,
204 HelpDemo_Best_Help_Search
,
208 HelpDemo_Help_Netscape
,
209 // controls start here (the numbers are, of course, arbitrary)
210 HelpDemo_Text
= 1000,
213 // ----------------------------------------------------------------------------
214 // event tables and other macros for wxWidgets
215 // ----------------------------------------------------------------------------
217 // the event tables connect the wxWidgets events with the functions (event
218 // handlers) which process them. It can be also done at run-time, but for the
219 // simple menu events like this the static method is much simpler.
220 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
221 EVT_MENU(HelpDemo_Quit
, MyFrame::OnQuit
)
222 EVT_MENU(HelpDemo_Help_Index
, MyFrame::OnHelp
)
223 EVT_MENU(HelpDemo_Help_Classes
, MyFrame::OnHelp
)
224 EVT_MENU(HelpDemo_Help_Functions
, MyFrame::OnHelp
)
225 EVT_MENU(HelpDemo_Help_Help
, MyFrame::OnHelp
)
226 EVT_MENU(HelpDemo_Help_Search
, MyFrame::OnHelp
)
227 EVT_MENU(HelpDemo_Help_ContextHelp
, MyFrame::OnShowContextHelp
)
228 EVT_MENU(HelpDemo_Help_DialogContextHelp
, MyFrame::OnShowDialogContextHelp
)
230 EVT_MENU(HelpDemo_Advanced_Html_Help_Index
, MyFrame::OnAdvancedHtmlHelp
)
231 EVT_MENU(HelpDemo_Advanced_Html_Help_Classes
, MyFrame::OnAdvancedHtmlHelp
)
232 EVT_MENU(HelpDemo_Advanced_Html_Help_Functions
, MyFrame::OnAdvancedHtmlHelp
)
233 EVT_MENU(HelpDemo_Advanced_Html_Help_Help
, MyFrame::OnAdvancedHtmlHelp
)
234 EVT_MENU(HelpDemo_Advanced_Html_Help_Search
, MyFrame::OnAdvancedHtmlHelp
)
236 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
237 EVT_MENU(HelpDemo_MS_Html_Help_Index
, MyFrame::OnMSHtmlHelp
)
238 EVT_MENU(HelpDemo_MS_Html_Help_Classes
, MyFrame::OnMSHtmlHelp
)
239 EVT_MENU(HelpDemo_MS_Html_Help_Functions
, MyFrame::OnMSHtmlHelp
)
240 EVT_MENU(HelpDemo_MS_Html_Help_Help
, MyFrame::OnMSHtmlHelp
)
241 EVT_MENU(HelpDemo_MS_Html_Help_Search
, MyFrame::OnMSHtmlHelp
)
244 #if wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__)
245 EVT_MENU(HelpDemo_Best_Help_Index
, MyFrame::OnBestHelp
)
248 EVT_MENU(HelpDemo_Help_KDE
, MyFrame::OnHelp
)
249 EVT_MENU(HelpDemo_Help_GNOME
, MyFrame::OnHelp
)
250 EVT_MENU(HelpDemo_Help_Netscape
, MyFrame::OnHelp
)
253 // Create a new application object: this macro will allow wxWidgets to create
254 // the application object during program execution (it's better than using a
255 // static object for many reasons) and also declares the accessor function
256 // wxGetApp() which will return the reference of the right type (i.e. MyApp and
260 // ============================================================================
262 // ============================================================================
264 // ----------------------------------------------------------------------------
265 // the application class
266 // ----------------------------------------------------------------------------
268 // `Main program' equivalent: the program execution "starts" here
271 // Create a simple help provider to make SetHelpText() do something.
272 // Note that this must be set before any SetHelpText() calls are made.
273 #if USE_SIMPLE_HELP_PROVIDER
274 wxSimpleHelpProvider
* provider
= new wxSimpleHelpProvider
;
276 wxHelpControllerHelpProvider
* provider
= new wxHelpControllerHelpProvider
;
278 wxHelpProvider::Set(provider
);
282 // Required for images in the online documentation
283 wxImage::AddHandler(new wxGIFHandler
);
285 // Required for advanced HTML help
286 #if wxUSE_STREAMS && wxUSE_ZIPSTREAM && wxUSE_ZLIB
287 wxFileSystem::AddHandler(new wxZipFSHandler
);
293 // Create the main application window
294 MyFrame
*frame
= new MyFrame(_T("HelpDemo wxWidgets App"),
295 wxPoint(50, 50), wxSize(450, 340));
297 #if !USE_SIMPLE_HELP_PROVIDER
298 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
299 provider
->SetHelpController(& frame
->GetMSHtmlHelpController());
301 provider
->SetHelpController(& frame
->GetHelpController());
308 // initialise the help system: this means that we'll use doc.hlp file under
309 // Windows and that the HTML docs are in the subdirectory doc for platforms
311 if ( !frame
->GetHelpController().Initialize(_T("doc")) )
313 wxLogError(wxT("Cannot initialize the help system, aborting."));
318 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
319 if( !frame
->GetMSHtmlHelpController().Initialize(_T("doc")) )
321 wxLogError(wxT("Cannot initialize the MS HTML Help system."));
325 #if wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__)
326 // you need to call Initialize in order to use wxBestHelpController
327 if( !frame
->GetBestHelpController().Initialize(_T("doc")) )
329 wxLogError(wxT("Cannot initialize the best help system, aborting."));
334 // initialise the advanced HTML help system: this means that the HTML docs are in .htb
336 if ( !frame
->GetAdvancedHtmlHelpController().Initialize(_T("doc")) )
338 wxLogError(wxT("Cannot initialize the advanced HTML help system, aborting."));
345 // defined(__WXMSW__) && wxUSE_MS_HTML_HELP
346 wxString
path(wxGetCwd());
347 if ( !frame
->GetMSHtmlHelpController().Initialize(path
+ _T("\\doc.chm")) )
349 wxLogError("Cannot initialize the MS HTML help system, aborting.");
361 delete wxHelpProvider::Set(NULL
);
366 // ----------------------------------------------------------------------------
368 // ----------------------------------------------------------------------------
371 MyFrame::MyFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
)
372 : wxFrame((wxFrame
*)NULL
, 300, title
, pos
, size
)
374 // set the frame icon
375 SetIcon(wxICON(mondrian
));
378 wxMenu
*menuFile
= new wxMenu
;
380 menuFile
->Append(HelpDemo_Help_Index
, _T("&Help Index..."));
381 menuFile
->Append(HelpDemo_Help_Classes
, _T("&Help on Classes..."));
382 menuFile
->Append(HelpDemo_Help_Functions
, _T("&Help on Functions..."));
383 menuFile
->Append(HelpDemo_Help_ContextHelp
, _T("&Context Help..."));
384 menuFile
->Append(HelpDemo_Help_DialogContextHelp
, _T("&Dialog Context Help...\tCtrl-H"));
385 menuFile
->Append(HelpDemo_Help_Help
, _T("&About Help Demo..."));
386 menuFile
->Append(HelpDemo_Help_Search
, _T("&Search help..."));
388 menuFile
->AppendSeparator();
389 menuFile
->Append(HelpDemo_Advanced_Html_Help_Index
, _T("Advanced HTML &Help Index..."));
390 menuFile
->Append(HelpDemo_Advanced_Html_Help_Classes
, _T("Advanced HTML &Help on Classes..."));
391 menuFile
->Append(HelpDemo_Advanced_Html_Help_Functions
, _T("Advanced HTML &Help on Functions..."));
392 menuFile
->Append(HelpDemo_Advanced_Html_Help_Help
, _T("Advanced HTML &About Help Demo..."));
393 menuFile
->Append(HelpDemo_Advanced_Html_Help_Search
, _T("Advanced HTML &Search help..."));
396 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
397 menuFile
->AppendSeparator();
398 menuFile
->Append(HelpDemo_MS_Html_Help_Index
, _T("MS HTML &Help Index..."));
399 menuFile
->Append(HelpDemo_MS_Html_Help_Classes
, _T("MS HTML &Help on Classes..."));
400 menuFile
->Append(HelpDemo_MS_Html_Help_Functions
, _T("MS HTML &Help on Functions..."));
401 menuFile
->Append(HelpDemo_MS_Html_Help_Help
, _T("MS HTML &About Help Demo..."));
402 menuFile
->Append(HelpDemo_MS_Html_Help_Search
, _T("MS HTML &Search help..."));
405 #if wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__)
406 menuFile
->AppendSeparator();
407 menuFile
->Append(HelpDemo_Best_Help_Index
, _T("Best &Help Index..."));
412 menuFile
->AppendSeparator();
413 menuFile
->Append(HelpDemo_Help_KDE
, _T("Use &KDE"));
414 menuFile
->Append(HelpDemo_Help_GNOME
, _T("Use &GNOME"));
415 menuFile
->Append(HelpDemo_Help_Netscape
, _T("Use &Netscape"));
418 menuFile
->AppendSeparator();
419 menuFile
->Append(HelpDemo_Quit
, _T("E&xit"));
421 // now append the freshly created menu to the menu bar...
422 wxMenuBar
*menuBar
= new wxMenuBar
;
423 menuBar
->Append(menuFile
, _T("&File"));
425 // ... and attach this menu bar to the frame
429 // create a status bar just for fun (by default with 1 pane only)
431 SetStatusText(_T("Welcome to wxWidgets!"));
432 #endif // wxUSE_STATUSBAR
434 // now create some controls
436 // a panel first - if there were several controls, it would allow us to
437 // navigate between them from the keyboard
438 wxPanel
*panel
= new wxPanel(this, 301, wxPoint(0, 0), wxSize(400, 200));
439 panel
->SetHelpText(_("This panel just holds a static text control."));
440 //panel->SetHelpText(wxContextId(300));
442 // and a static control whose parent is the panel
443 wxStaticText
* staticText
= new wxStaticText(panel
, 302, _T("Hello, world!"), wxPoint(10, 10));
444 staticText
->SetHelpText(_("This static text control isn't doing a lot right now."));
450 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
452 // true is to force the frame to close
456 void MyFrame::OnHelp(wxCommandEvent
& event
)
458 ShowHelp(event
.GetId(), m_help
);
461 void MyFrame::OnShowContextHelp(wxCommandEvent
& WXUNUSED(event
))
463 // This starts context help mode, then the user
464 // clicks on a window to send a help message
465 wxContextHelp
contextHelp(this);
468 void MyFrame::OnShowDialogContextHelp(wxCommandEvent
& WXUNUSED(event
))
470 MyModalDialog
dialog(this);
474 void MyFrame::OnAdvancedHtmlHelp(wxCommandEvent
& event
)
477 ShowHelp(event
.GetId(), m_advancedHtmlHelp
);
481 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
482 void MyFrame::OnMSHtmlHelp(wxCommandEvent
& event
)
484 ShowHelp(event
.GetId(), m_msHtmlHelp
);
488 #if wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__)
489 void MyFrame::OnBestHelp(wxCommandEvent
& event
)
491 ShowHelp(event
.GetId(), m_bestHelp
);
496 Notes: ShowHelp uses section ids for displaying particular topics,
497 but you might want to use a unique keyword to display a topic, instead.
499 Section ids are specified as follows for the different formats.
503 The [MAP] section specifies the topic to integer id mapping, e.g.
511 The identifier name corresponds to the label used for that topic.
512 You could also put these in a .h file and #include it in both the MAP
513 section and your C++ source.
515 Note that Tex2RTF doesn't currently generate the MAP section automatically.
519 The [MAP] section specifies the HTML filename root to integer id mapping, e.g.
527 The identifier name corresponds to the HTML filename used for that topic.
528 You could also put these in a .h file and #include it in both the MAP
529 section and your C++ source.
531 Note that Tex2RTF doesn't currently generate the MAP section automatically.
533 Simple wxHTML Help and External HTML Help
535 A wxhelp.map file is used, for example:
537 0 wx.htm ; wxWidgets: Help index; additional keywords like overview
538 1 wx204.htm ; wxWidgets Function Reference
539 2 wx34.htm ; wxWidgets Class Reference
541 Note that Tex2RTF doesn't currently generate the MAP section automatically.
545 An extension to the .hhc file format is used, specifying a new parameter
548 <OBJECT type="text/sitemap">
549 <param name="Local" value="doc2.htm#classes">
550 <param name="Name" value="Classes">
551 <param name="ID" value=2>
554 Again, this is not generated automatically by Tex2RTF, though it could
555 be added quite easily.
557 Unfortunately adding the ID parameters appears to interfere with MS HTML Help,
558 so you should not try to compile a .chm file from a .hhc file with
559 this extension, or the contents will be messed up.
562 void MyFrame::ShowHelp(int commandId
, wxHelpControllerBase
& helpController
)
566 case HelpDemo_Help_Classes
:
567 case HelpDemo_Html_Help_Classes
:
568 case HelpDemo_Advanced_Html_Help_Classes
:
569 case HelpDemo_MS_Html_Help_Classes
:
570 case HelpDemo_Best_Help_Classes
:
571 helpController
.DisplaySection(2);
572 //helpController.DisplaySection("Classes"); // An alternative form for most controllers
575 case HelpDemo_Help_Functions
:
576 case HelpDemo_Html_Help_Functions
:
577 case HelpDemo_Advanced_Html_Help_Functions
:
578 case HelpDemo_MS_Html_Help_Functions
:
579 helpController
.DisplaySection(1);
580 //helpController.DisplaySection("Functions"); // An alternative form for most controllers
583 case HelpDemo_Help_Help
:
584 case HelpDemo_Html_Help_Help
:
585 case HelpDemo_Advanced_Html_Help_Help
:
586 case HelpDemo_MS_Html_Help_Help
:
587 case HelpDemo_Best_Help_Help
:
588 helpController
.DisplaySection(3);
589 //helpController.DisplaySection("About"); // An alternative form for most controllers
592 case HelpDemo_Help_Search
:
593 case HelpDemo_Html_Help_Search
:
594 case HelpDemo_Advanced_Html_Help_Search
:
595 case HelpDemo_MS_Html_Help_Search
:
596 case HelpDemo_Best_Help_Search
:
598 wxString key
= wxGetTextFromUser(_T("Search for?"),
599 _T("Search help for keyword"),
603 helpController
.KeywordSearch(key
);
607 case HelpDemo_Help_Index
:
608 case HelpDemo_Html_Help_Index
:
609 case HelpDemo_Advanced_Html_Help_Index
:
610 case HelpDemo_MS_Html_Help_Index
:
611 case HelpDemo_Best_Help_Index
:
612 helpController
.DisplayContents();
615 // These three calls are only used by wxExtHelpController
617 case HelpDemo_Help_KDE
:
618 helpController
.SetViewer(_T("kdehelp"));
620 case HelpDemo_Help_GNOME
:
621 helpController
.SetViewer(_T("gnome-help-browser"));
623 case HelpDemo_Help_Netscape
:
624 helpController
.SetViewer(_T("netscape"), wxHELP_NETSCAPE
);
629 // ----------------------------------------------------------------------------
631 // Demonstrates context-sensitive help
632 // ----------------------------------------------------------------------------
634 BEGIN_EVENT_TABLE(MyModalDialog
, wxDialog
)
637 MyModalDialog::MyModalDialog(wxWindow
*parent
)
640 // Add the context-sensitive help button on the caption for MSW
642 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP
);
645 wxDialog::Create(parent
, wxID_ANY
, wxString(_T("Modal dialog")));
647 wxBoxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
648 wxBoxSizer
*sizerRow
= new wxBoxSizer(wxHORIZONTAL
);
650 wxButton
* btnOK
= new wxButton(this, wxID_OK
, _T("&OK"));
651 btnOK
->SetHelpText(_("The OK button confirms the dialog choices."));
653 wxButton
* btnCancel
= new wxButton(this, wxID_CANCEL
, _T("&Cancel"));
654 btnCancel
->SetHelpText(_("The Cancel button cancels the dialog."));
656 sizerRow
->Add(btnOK
, 0, wxALIGN_CENTER
| wxALL
, 5);
657 sizerRow
->Add(btnCancel
, 0, wxALIGN_CENTER
| wxALL
, 5);
659 // Add explicit context-sensitive help button for non-MSW
661 sizerRow
->Add(new wxContextHelpButton(this), 0, wxALIGN_CENTER
| wxALL
, 5);
664 wxTextCtrl
*text
= new wxTextCtrl(this, wxID_ANY
, wxT("A demo text control"),
665 wxDefaultPosition
, wxSize(300, 100),
667 text
->SetHelpText(_("Type text here if you have got nothing more interesting to do"));
668 sizerTop
->Add(text
, 0, wxEXPAND
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5 );
669 sizerTop
->Add(sizerRow
, 0, wxALIGN_RIGHT
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5 );
673 sizerTop
->SetSizeHints(this);