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" wxWindows 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 // Use old-style HTML help if 1
48 #define USE_OLD_HTML_HELP 0
52 #define USE_HTML_HELP 0
56 #include <wx/filesys.h>
57 #include <wx/fs_zip.h>
60 #include "wx/generic/helpwxht.h"
63 #include "wx/html/helpctrl.h"
66 #if wxUSE_MS_HTML_HELP
67 #include "wx/msw/helpchm.h"
70 // ----------------------------------------------------------------------------
72 // ----------------------------------------------------------------------------
73 // the application icon
74 #if defined(__WXGTK__) || defined(__WXMOTIF__)
75 #include "mondrian.xpm"
78 // ----------------------------------------------------------------------------
80 // ----------------------------------------------------------------------------
82 // Define a new application type, each program should derive a class from wxApp
83 class MyApp
: public wxApp
86 // override base class virtuals
87 // ----------------------------
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();
94 // do some clean up here
98 // Define a new frame type: this is going to be our main frame
99 class MyFrame
: public wxFrame
103 MyFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
105 wxHelpController
& GetHelpController() { return m_help
; }
108 #if USE_OLD_HTML_HELP
109 wxHelpControllerHtml
& GetHtmlHelpController() { return m_htmlHelp
; }
111 wxHtmlHelpController
& GetAdvancedHtmlHelpController() { return m_advancedHtmlHelp
; }
113 #if wxUSE_MS_HTML_HELP
114 wxCHMHelpController
& GetMSHtmlHelpController() { return m_msHtmlHelp
; }
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
);
124 void OnShowContextHelp(wxCommandEvent
& event
);
125 void OnShowDialogContextHelp(wxCommandEvent
& event
);
127 void ShowHelp(int commandId
, wxHelpControllerBase
& helpController
);
130 wxHelpController m_help
;
133 #if USE_OLD_HTML_HELP
134 wxHelpControllerHtml m_htmlHelp
;
136 wxHtmlHelpController m_advancedHtmlHelp
;
139 #if wxUSE_MS_HTML_HELP
140 wxCHMHelpController m_msHtmlHelp
;
143 // any class wishing to process wxWindows events must use this macro
144 DECLARE_EVENT_TABLE()
147 // A custom modal dialog
148 class MyModalDialog
: public wxDialog
151 MyModalDialog(wxWindow
*parent
);
155 DECLARE_EVENT_TABLE()
158 // ----------------------------------------------------------------------------
160 // ----------------------------------------------------------------------------
162 // IDs for the controls and the menu commands
168 HelpDemo_Help_Classes
,
169 HelpDemo_Help_Functions
,
171 HelpDemo_Help_Search
,
172 HelpDemo_Help_ContextHelp
,
173 HelpDemo_Help_DialogContextHelp
,
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
,
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
,
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
,
195 HelpDemo_Help_Netscape
,
196 // controls start here (the numbers are, of course, arbitrary)
197 HelpDemo_Text
= 1000,
200 // ----------------------------------------------------------------------------
201 // event tables and other macros for wxWindows
202 // ----------------------------------------------------------------------------
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
)
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
)
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
)
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
)
235 EVT_MENU(HelpDemo_Help_KDE
, MyFrame::OnHelp
)
236 EVT_MENU(HelpDemo_Help_GNOME
, MyFrame::OnHelp
)
237 EVT_MENU(HelpDemo_Help_Netscape
, MyFrame::OnHelp
)
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
247 // ============================================================================
249 // ============================================================================
251 // ----------------------------------------------------------------------------
252 // the application class
253 // ----------------------------------------------------------------------------
255 // `Main program' equivalent: the program execution "starts" here
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
);
266 // Required for images in the online documentation
267 wxImage::AddHandler(new wxGIFHandler
);
269 // Required for advanced HTML help
270 #if wxUSE_STREAMS && wxUSE_ZIPSTREAM && wxUSE_ZLIB
271 wxFileSystem::AddHandler(new wxZipFSHandler
);
277 // Create the main application window
278 MyFrame
*frame
= new MyFrame("HelpDemo wxWindows App",
279 wxPoint(50, 50), wxSize(450, 340));
281 #if wxUSE_MS_HTML_HELP
282 provider
->SetHelpController(& frame
->GetMSHtmlHelpController());
284 provider
->SetHelpController(& frame
->GetHelpController());
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
293 if ( !frame
->GetHelpController().Initialize("doc") )
295 wxLogError("Cannot initialize the help system, aborting.");
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") )
306 wxLogError("Cannot initialize the HTML help system, aborting.");
312 // initialise the advanced HTML help system: this means that the HTML docs are in .htb
314 if ( !frame
->GetAdvancedHtmlHelpController().Initialize("doc") )
316 wxLogError("Cannot initialize the advanced HTML help system, aborting.");
322 #if wxUSE_MS_HTML_HELP
323 if ( !frame
->GetMSHtmlHelpController().Initialize("doc") )
325 wxLogError("Cannot initialize the MS HTML help system, aborting.");
337 delete wxHelpProvider::Set(NULL
);
342 // ----------------------------------------------------------------------------
344 // ----------------------------------------------------------------------------
347 MyFrame::MyFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
)
348 : wxFrame((wxFrame
*)NULL
, 300, title
, pos
, size
)
350 // set the frame icon
351 SetIcon(wxICON(mondrian
));
354 wxMenu
*menuFile
= new wxMenu
;
356 menuFile
->Append(HelpDemo_Help_Index
, "&Help Index...");
357 menuFile
->Append(HelpDemo_Help_Classes
, "&Help on Classes...");
358 menuFile
->Append(HelpDemo_Help_Functions
, "&Help on Functions...");
359 menuFile
->Append(HelpDemo_Help_ContextHelp
, "&Context Help...");
360 menuFile
->Append(HelpDemo_Help_DialogContextHelp
, "&Dialog Context Help...\tCtrl-H");
361 menuFile
->Append(HelpDemo_Help_Help
, "&About Help Demo...");
362 menuFile
->Append(HelpDemo_Help_Search
, "&Search help...");
364 #if USE_OLD_HTML_HELP
365 menuFile
->AppendSeparator();
366 menuFile
->Append(HelpDemo_Html_Help_Index
, "HTML &Help Index...");
367 menuFile
->Append(HelpDemo_Html_Help_Classes
, "HTML &Help on Classes...");
368 menuFile
->Append(HelpDemo_Html_Help_Functions
, "HTML &Help on Functions...");
369 menuFile
->Append(HelpDemo_Html_Help_Help
, "HTML &About Help Demo...");
370 menuFile
->Append(HelpDemo_Html_Help_Search
, "HTML &Search help...");
372 menuFile
->AppendSeparator();
373 menuFile
->Append(HelpDemo_Advanced_Html_Help_Index
, "Advanced HTML &Help Index...");
374 menuFile
->Append(HelpDemo_Advanced_Html_Help_Classes
, "Advanced HTML &Help on Classes...");
375 menuFile
->Append(HelpDemo_Advanced_Html_Help_Functions
, "Advanced HTML &Help on Functions...");
376 menuFile
->Append(HelpDemo_Advanced_Html_Help_Help
, "Advanced HTML &About Help Demo...");
377 menuFile
->Append(HelpDemo_Advanced_Html_Help_Search
, "Advanced HTML &Search help...");
380 #if wxUSE_MS_HTML_HELP
381 menuFile
->AppendSeparator();
382 menuFile
->Append(HelpDemo_MS_Html_Help_Index
, "MS HTML &Help Index...");
383 menuFile
->Append(HelpDemo_MS_Html_Help_Classes
, "MS HTML &Help on Classes...");
384 menuFile
->Append(HelpDemo_MS_Html_Help_Functions
, "MS HTML &Help on Functions...");
385 menuFile
->Append(HelpDemo_MS_Html_Help_Help
, "MS HTML &About Help Demo...");
386 menuFile
->Append(HelpDemo_MS_Html_Help_Search
, "MS HTML &Search help...");
391 menuFile
->AppendSeparator();
392 menuFile
->Append(HelpDemo_Help_KDE
, "Use &KDE");
393 menuFile
->Append(HelpDemo_Help_GNOME
, "Use &GNOME");
394 menuFile
->Append(HelpDemo_Help_Netscape
, "Use &Netscape");
397 menuFile
->AppendSeparator();
398 menuFile
->Append(HelpDemo_Quit
, "E&xit");
400 // now append the freshly created menu to the menu bar...
401 wxMenuBar
*menuBar
= new wxMenuBar
;
402 menuBar
->Append(menuFile
, "&File");
404 // ... and attach this menu bar to the frame
407 // create a status bar just for fun (by default with 1 pane only)
409 SetStatusText("Welcome to wxWindows!");
411 // now create some controls
413 // a panel first - if there were several controls, it would allow us to
414 // navigate between them from the keyboard
415 wxPanel
*panel
= new wxPanel(this, 301, wxPoint(0, 0), wxSize(400, 200));
416 //panel->SetHelpText(_("This panel just holds a static text control."));
417 panel
->SetHelpText(wxContextId(300));
419 // and a static control whose parent is the panel
420 wxStaticText
* staticText
= new wxStaticText(panel
, 302, "Hello, world!", wxPoint(10, 10));
421 staticText
->SetHelpText(_("This static text control isn't doing a lot right now."));
427 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
429 // TRUE is to force the frame to close
433 void MyFrame::OnHelp(wxCommandEvent
& event
)
435 ShowHelp(event
.GetId(), m_help
);
438 void MyFrame::OnShowContextHelp(wxCommandEvent
& event
)
440 // This starts context help mode, then the user
441 // clicks on a window to send a help message
442 wxContextHelp
contextHelp(this);
445 void MyFrame::OnShowDialogContextHelp(wxCommandEvent
& event
)
447 MyModalDialog
dialog(this);
451 void MyFrame::OnHtmlHelp(wxCommandEvent
& event
)
453 #if USE_HTML_HELP && USE_OLD_HTML_HELP
454 ShowHelp(event
.GetId(), m_htmlHelp
);
458 void MyFrame::OnAdvancedHtmlHelp(wxCommandEvent
& event
)
461 ShowHelp(event
.GetId(), m_advancedHtmlHelp
);
465 void MyFrame::OnMSHtmlHelp(wxCommandEvent
& event
)
467 #if wxUSE_MS_HTML_HELP
468 ShowHelp(event
.GetId(), m_msHtmlHelp
);
473 Notes: ShowHelp uses section ids for displaying particular topics,
474 but you might want to use a unique keyword to display a topic, instead.
476 Section ids are specified as follows for the different formats.
480 The [MAP] section specifies the topic to integer id mapping, e.g.
488 The identifier name corresponds to the label used for that topic.
489 You could also put these in a .h file and #include it in both the MAP
490 section and your C++ source.
492 Note that Tex2RTF doesn't currently generate the MAP section automatically.
496 The [MAP] section specifies the HTML filename root to integer id mapping, e.g.
504 The identifier name corresponds to the HTML filename used for that topic.
505 You could also put these in a .h file and #include it in both the MAP
506 section and your C++ source.
508 Note that Tex2RTF doesn't currently generate the MAP section automatically.
510 Simple wxHTML Help and External HTML Help
512 A wxhelp.map file is used, for example:
514 0 wx.htm ; wxWindows: Help index; additional keywords like overview
515 1 wx204.htm ; wxWindows Function Reference
516 2 wx34.htm ; wxWindows Class Reference
518 Note that Tex2RTF doesn't currently generate the MAP section automatically.
522 An extension to the .hhc file format is used, specifying a new parameter
525 <OBJECT type="text/sitemap">
526 <param name="Local" value="doc2.htm#classes">
527 <param name="Name" value="Classes">
528 <param name="ID" value=2>
531 Again, this is not generated automatically by Tex2RTF, though it could
532 be added quite easily.
534 Unfortunately adding the ID parameters appears to interfere with MS HTML Help,
535 so you should not try to compile a .chm file from a .hhc file with
536 this extension, or the contents will be messed up.
539 void MyFrame::ShowHelp(int commandId
, wxHelpControllerBase
& helpController
)
543 case HelpDemo_Help_Classes
:
544 case HelpDemo_Html_Help_Classes
:
545 case HelpDemo_Advanced_Html_Help_Classes
:
546 case HelpDemo_MS_Html_Help_Classes
:
547 helpController
.DisplaySection(2);
548 //helpController.DisplaySection("Classes"); // An alternative form for most controllers
551 case HelpDemo_Help_Functions
:
552 case HelpDemo_Html_Help_Functions
:
553 case HelpDemo_Advanced_Html_Help_Functions
:
554 case HelpDemo_MS_Html_Help_Functions
:
555 helpController
.DisplaySection(1);
556 //helpController.DisplaySection("Functions"); // An alternative form for most controllers
558 case HelpDemo_Help_Help
:
559 case HelpDemo_Html_Help_Help
:
560 case HelpDemo_Advanced_Html_Help_Help
:
561 case HelpDemo_MS_Html_Help_Help
:
562 helpController
.DisplaySection(3);
563 //helpController.DisplaySection("About"); // An alternative form for most controllers
566 case HelpDemo_Help_Search
:
567 case HelpDemo_Html_Help_Search
:
568 case HelpDemo_Advanced_Html_Help_Search
:
569 case HelpDemo_MS_Html_Help_Search
:
571 wxString key
= wxGetTextFromUser("Search for?",
572 "Search help for keyword",
576 helpController
.KeywordSearch(key
);
580 case HelpDemo_Help_Index
:
581 case HelpDemo_Html_Help_Index
:
582 case HelpDemo_Advanced_Html_Help_Index
:
583 case HelpDemo_MS_Html_Help_Index
:
584 helpController
.DisplayContents();
587 // These three calls are only used by wxExtHelpController
589 case HelpDemo_Help_KDE
:
590 helpController
.SetViewer("kdehelp");
592 case HelpDemo_Help_GNOME
:
593 helpController
.SetViewer("gnome-help-browser");
595 case HelpDemo_Help_Netscape
:
596 helpController
.SetViewer("netscape", wxHELP_NETSCAPE
);
603 // ----------------------------------------------------------------------------
605 // Demonstrates context-sensitive help
606 // ----------------------------------------------------------------------------
608 BEGIN_EVENT_TABLE(MyModalDialog
, wxDialog
)
611 MyModalDialog::MyModalDialog(wxWindow
*parent
)
614 // Add the context-sensitive help button on the caption for MSW
616 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP
);
619 wxDialog::Create(parent
, -1, wxString("Modal dialog"));
621 wxBoxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
622 wxBoxSizer
*sizerRow
= new wxBoxSizer(wxHORIZONTAL
);
624 wxButton
* btnOK
= new wxButton(this, wxID_OK
, "&OK");
625 btnOK
->SetHelpText(_("The OK button confirms the dialog choices."));
627 wxButton
* btnCancel
= new wxButton(this, wxID_CANCEL
, "&Cancel");
628 btnCancel
->SetHelpText(_("The Cancel button cancels the dialog."));
630 sizerRow
->Add(btnOK
, 0, wxALIGN_CENTER
| wxALL
, 5);
631 sizerRow
->Add(btnCancel
, 0, wxALIGN_CENTER
| wxALL
, 5);
633 // Add explicit context-sensitive help button for non-MSW
635 sizerRow
->Add(new wxContextHelpButton(this), 0, wxALIGN_CENTER
| wxALL
, 5);
638 wxTextCtrl
*text
= new wxTextCtrl(this, -1, wxT("A demo text control"),
639 wxDefaultPosition
, wxSize(300, 100),
641 text
->SetHelpText(_("Type text here if you have got nothing more "
642 "interesting to do"));
643 sizerTop
->Add(text
, 0, wxEXPAND
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5 );
644 sizerTop
->Add(sizerRow
, 0, wxALIGN_RIGHT
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5 );
649 sizerTop
->SetSizeHints(this);