1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxHtmlHelpFrame
4 // Notes: Based on htmlhelp.cpp, implementing a monolithic
5 // HTML Help controller class, by Vaclav Slavik
6 // Author: Harm van der Heijden and Vaclav Slavik
8 // Copyright: (c) Harm van der Heijden and Vaclav Slavik
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation
16 // For compilers that support precompilation, includes "wx.h"
18 #include "wx/wxprec.h"
31 #include "wx/html/helpfrm.h"
32 #include "wx/notebook.h"
33 #include "wx/imaglist.h"
34 #include "wx/treectrl.h"
35 #include "wx/tokenzr.h"
36 #include "wx/wfstream.h"
37 #include "wx/html/htmlwin.h"
38 #include "wx/busyinfo.h"
39 #include "wx/progdlg.h"
40 #include "wx/toolbar.h"
45 #include "bitmaps/panel.xpm"
46 #include "bitmaps/back.xpm"
47 #include "bitmaps/forward.xpm"
48 #include "bitmaps/book.xpm"
49 #include "bitmaps/folder.xpm"
50 #include "bitmaps/page.xpm"
51 #include "bitmaps/help.xpm"
52 #include "bitmaps/helproot.xpm"
55 #include "wx/stream.h"
57 // number of times that the contents/index creation progress dialog
59 #define PROGRESS_STEP 40
61 //--------------------------------------------------------------------------
62 // wxHtmlHelpTreeItemData
63 //--------------------------------------------------------------------------
65 class wxHtmlHelpTreeItemData
: public wxTreeItemData
71 wxHtmlHelpTreeItemData(wxHtmlContentsItem
*it
) : wxTreeItemData()
73 m_Page
= it
-> m_Book
-> GetBasePath() + it
-> m_Page
;
75 const wxString
& GetPage() { return m_Page
; }
78 //---------------------------------------------------------------------------
80 //---------------------------------------------------------------------------
82 IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpFrame
, wxFrame
)
84 wxHtmlHelpFrame::wxHtmlHelpFrame(wxWindow
* parent
, wxWindowID id
, const wxString
& title
,
85 int style
, wxHtmlHelpData
* data
)
88 Create(parent
, id
, title
, style
);
91 void wxHtmlHelpFrame::Init(wxHtmlHelpData
* data
)
95 m_DataCreated
= FALSE
;
97 m_Data
= new wxHtmlHelpData();
101 m_ContentsImageList
= new wxImageList(16, 16);
102 m_ContentsImageList
-> Add(wxICON(book
));
103 m_ContentsImageList
-> Add(wxICON(folder
));
104 m_ContentsImageList
-> Add(wxICON(page
));
105 m_ContentsImageList
-> Add(wxICON(helproot
));
107 m_ContentsBox
= NULL
;
110 m_SearchButton
= NULL
;
112 m_SearchChoice
= NULL
;
117 m_ConfigRoot
= wxEmptyString
;
119 m_Cfg
.x
= m_Cfg
.y
= 0;
123 m_Cfg
.navig_on
= TRUE
;
126 // Create: builds the GUI components.
127 // with the style flag it's possible to toggle the toolbar, contents, index and search
129 // m_HtmlWin will *always* be created, but it's important to realize that
130 // m_ContentsBox, m_IndexBox, m_SearchList, m_SearchButton, m_SearchText and
131 // m_SearchButton may be NULL.
132 // moreover, if no contents, index or searchpage is needed, m_Splitter and
133 // m_NavigPan will be NULL too (with m_HtmlWin directly connected to the frame)
135 bool wxHtmlHelpFrame::Create(wxWindow
* parent
, wxWindowID id
, const wxString
& title
,
138 // Do the config in two steps. We read the HtmlWindow customization after we
139 // create the window.
141 ReadCustomization(m_Config
, m_ConfigRoot
);
143 wxFrame::Create(parent
, id
, _("Help"), wxPoint(m_Cfg
.x
, m_Cfg
.y
), wxSize(m_Cfg
.w
, m_Cfg
.h
));
145 #if defined(__WXMSW__) || (__WXPM__)
146 wxIcon
frameIcon("wxhelp", wxBITMAP_TYPE_ICO_RESOURCE
, 32, 32);
148 wxIcon
frameIcon(help_xpm
);
153 GetPosition(&m_Cfg
.x
, &m_Cfg
.y
);
155 SetIcon(wxICON(help
));
157 int notebook_page
= 0;
162 if (style
& wxHF_TOOLBAR
) {
163 wxToolBar
*toolBar
= CreateToolBar(wxNO_BORDER
| wxTB_HORIZONTAL
| /*wxTB_FLAT | */
165 toolBar
-> SetMargins(2, 2);
166 wxBitmap
* toolBarBitmaps
[3];
168 #if defined(__WXMSW__) || (__WXPM__)
169 toolBarBitmaps
[0] = new wxBitmap("panel");
170 toolBarBitmaps
[1] = new wxBitmap("back");
171 toolBarBitmaps
[2] = new wxBitmap("forward");
174 toolBarBitmaps
[0] = new wxBitmap(panel_xpm
);
175 toolBarBitmaps
[1] = new wxBitmap(back_xpm
);
176 toolBarBitmaps
[2] = new wxBitmap(forward_xpm
);
182 toolBar
-> AddTool(wxID_HTML_PANEL
, *(toolBarBitmaps
[0]), wxNullBitmap
,
183 FALSE
, currentX
, -1, (wxObject
*) NULL
,
184 _("Show/hide navigation panel"));
185 currentX
+= width
+ 5;
186 toolBar
-> AddSeparator();
187 toolBar
-> AddTool(wxID_HTML_BACK
, *(toolBarBitmaps
[1]), wxNullBitmap
,
188 FALSE
, currentX
, -1, (wxObject
*) NULL
,
189 _("Go back to the previous HTML page"));
190 currentX
+= width
+ 5;
191 toolBar
-> AddTool(wxID_HTML_FORWARD
, *(toolBarBitmaps
[2]), wxNullBitmap
,
192 FALSE
, currentX
, -1, (wxObject
*) NULL
,
193 _("Go forward to the next HTML page"));
194 currentX
+= width
+ 5;
196 toolBar
-> Realize();
198 // Can delete the bitmaps since they're reference counted
199 for (int i
= 0; i
< 3; i
++)
200 delete toolBarBitmaps
[i
];
203 if (style
& (wxHF_CONTENTS
| wxHF_INDEX
| wxHF_SEARCH
)) {
204 // traditional help controller; splitter window with html page on the
205 // right and a notebook containing various pages on the left
206 m_Splitter
= new wxSplitterWindow(this);
208 m_HtmlWin
= new wxHtmlWindow(m_Splitter
);
209 m_NavigPan
= new wxNotebook(m_Splitter
, wxID_HTML_NOTEBOOK
,
210 wxDefaultPosition
, wxDefaultSize
);
211 } else { // only html window, no notebook with index,contents etc
212 m_HtmlWin
= new wxHtmlWindow(this);
215 m_HtmlWin
-> SetRelatedFrame(this, m_TitleFormat
);
216 m_HtmlWin
-> SetRelatedStatusBar(0);
218 m_HtmlWin
-> ReadCustomization(m_Config
, m_ConfigRoot
);
220 // contents tree panel?
221 if (style
& wxHF_CONTENTS
) {
222 m_ContentsBox
= new wxTreeCtrl(m_NavigPan
, wxID_HTML_TREECTRL
,
223 wxDefaultPosition
, wxDefaultSize
,
224 wxTR_HAS_BUTTONS
| wxSUNKEN_BORDER
);
225 m_ContentsBox
-> SetImageList(m_ContentsImageList
);
226 m_NavigPan
-> AddPage(m_ContentsBox
, _("Contents"));
227 m_ContentsPage
= notebook_page
++;
230 // index listbox panel?
231 if (style
& wxHF_INDEX
) {
232 wxWindow
*dummy
= new wxPanel(m_NavigPan
, wxID_HTML_INDEXPAGE
);
233 wxLayoutConstraints
*b1
= new wxLayoutConstraints
;
234 b1
-> top
.SameAs (dummy
, wxTop
, 0);
235 b1
-> left
.SameAs (dummy
, wxLeft
, 0);
236 b1
-> width
.PercentOf (dummy
, wxWidth
, 100);
237 b1
-> bottom
.SameAs (dummy
, wxBottom
, 0);
238 m_IndexBox
= new wxListBox(dummy
, wxID_HTML_INDEXLIST
, wxDefaultPosition
,
239 wxDefaultSize
, 0, NULL
, wxLB_SINGLE
| wxLB_ALWAYS_SB
);
240 m_IndexBox
-> SetConstraints(b1
);
241 dummy
-> SetAutoLayout(TRUE
);
242 m_NavigPan
-> AddPage(dummy
, _("Index"));
243 m_IndexPage
= notebook_page
++;
246 // search list panel?
247 if (style
& wxHF_SEARCH
) {
248 wxWindow
*dummy
= new wxPanel(m_NavigPan
, wxID_HTML_SEARCHPAGE
);
250 wxLayoutConstraints
*b1
= new wxLayoutConstraints
;
251 m_SearchText
= new wxTextCtrl(dummy
, wxID_HTML_SEARCHTEXT
);
252 b1
-> top
.SameAs (dummy
, wxTop
, 10);
253 b1
-> left
.SameAs (dummy
, wxLeft
, 10);
254 b1
-> right
.SameAs (dummy
, wxRight
, 10);
256 m_SearchText
-> SetConstraints(b1
);
258 wxLayoutConstraints
*b2
= new wxLayoutConstraints
;
259 m_SearchButton
= new wxButton(dummy
, wxID_HTML_SEARCHBUTTON
, _("Search"));
260 b2
-> top
.Below (m_SearchText
, 10);
261 b2
-> left
.SameAs (dummy
, wxLeft
, 10);
264 m_SearchButton
-> SetConstraints(b2
);
266 wxLayoutConstraints
*b4
= new wxLayoutConstraints
;
267 m_SearchChoice
= new wxChoice(dummy
, wxID_HTML_SEARCHCHOICE
, wxDefaultPosition
,
269 b4
-> top
.Below (m_SearchText
, 10);
270 b4
-> left
.SameAs (m_SearchButton
, wxRight
, 10);
271 b4
-> right
.SameAs (dummy
, wxRight
, 10);
273 m_SearchChoice
-> SetConstraints(b4
);
275 wxLayoutConstraints
*b3
= new wxLayoutConstraints
;
276 m_SearchList
= new wxListBox(dummy
, wxID_HTML_SEARCHLIST
, wxDefaultPosition
, wxDefaultSize
, 0);
277 b3
-> top
.Below (m_SearchButton
, 10);
278 b3
-> left
.SameAs (dummy
, wxLeft
, 0);
279 b3
-> right
.SameAs (dummy
, wxRight
, 0);
280 b3
-> bottom
.SameAs (dummy
, wxBottom
, 0);
281 m_SearchList
-> SetConstraints(b3
);
283 dummy
-> SetAutoLayout(TRUE
);
285 m_NavigPan
-> AddPage(dummy
, _("Search"));
286 m_SearchPage
= notebook_page
++;
288 m_HtmlWin
-> Show(TRUE
);
293 if (m_NavigPan
&& m_Splitter
) {
294 m_Splitter
-> SetMinimumPaneSize(20);
296 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
298 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
299 m_Splitter
-> Unsplit();
301 if (m_Cfg
.navig_on
) {
302 m_NavigPan
-> Show(TRUE
);
303 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
306 m_NavigPan
-> Show(FALSE
);
307 m_Splitter
-> Initialize(m_HtmlWin
);
313 wxHtmlHelpFrame::~wxHtmlHelpFrame()
315 delete m_ContentsImageList
;
320 bool wxHtmlHelpFrame::Display(const wxString
& x
)
322 wxString url
= m_Data
->FindPageByName(x
);
323 if (! url
.IsEmpty()) {
324 m_HtmlWin
->LoadPage(url
);
330 bool wxHtmlHelpFrame::Display(const int id
)
332 wxString url
= m_Data
->FindPageById(id
);
333 if (! url
.IsEmpty()) {
334 m_HtmlWin
->LoadPage(url
);
342 bool wxHtmlHelpFrame::DisplayContents()
346 if (!m_Splitter
-> IsSplit()) {
347 m_NavigPan
-> Show(TRUE
);
348 m_HtmlWin
-> Show(TRUE
);
349 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
350 m_Cfg
.navig_on
= TRUE
;
352 m_NavigPan
-> SetSelection(0);
358 bool wxHtmlHelpFrame::DisplayIndex()
362 if (!m_Splitter
-> IsSplit()) {
363 m_NavigPan
-> Show(TRUE
);
364 m_HtmlWin
-> Show(TRUE
);
365 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
367 m_NavigPan
-> SetSelection(1);
371 bool wxHtmlHelpFrame::KeywordSearch(const wxString
& keyword
)
373 if (! (m_SearchList
&& m_SearchButton
&& m_SearchText
&& m_SearchChoice
))
378 wxString book
= wxEmptyString
;
380 if (!m_Splitter
-> IsSplit()) {
381 m_NavigPan
-> Show(TRUE
);
382 m_HtmlWin
-> Show(TRUE
);
383 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
385 m_NavigPan
-> SetSelection(m_SearchPage
);
386 m_SearchList
-> Clear();
387 m_SearchText
-> SetValue(keyword
);
388 m_SearchButton
-> Enable(FALSE
);
390 if (m_SearchChoice
->GetSelection() != 0)
391 book
= m_SearchChoice
->GetStringSelection();
393 wxHtmlSearchStatus
status(m_Data
, keyword
, book
);
395 wxProgressDialog
progress(_("Searching..."), _("No matching page found yet"),
396 status
.GetMaxIndex(), this,
397 wxPD_APP_MODAL
| wxPD_CAN_ABORT
| wxPD_AUTO_HIDE
);
399 while (status
.IsActive()) {
400 if (progress
.Update(status
.GetCurIndex()) == FALSE
)
402 if (status
.Search()) {
403 foundstr
.Printf(_("Found %i matches"), ++foundcnt
);
404 progress
.Update(status
.GetCurIndex(), foundstr
);
405 m_SearchList
-> Append(status
.GetName(), status
.GetContentsItem());
410 m_SearchButton
-> Enable(TRUE
);
411 m_SearchText
-> SetSelection(0, keyword
.Length());
412 m_SearchText
-> SetFocus();
414 wxHtmlContentsItem
*it
= (wxHtmlContentsItem
*) m_SearchList
-> GetClientData(0);
415 if (it
) m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
417 return (foundcnt
> 0);
422 void wxHtmlHelpFrame::CreateContents(bool show_progress
)
427 wxProgressDialog
*progress
;
430 m_ContentsBox
->Clear();
432 int cnt
= m_Data
->GetContentsCnt();
433 int div
= (cnt
/ PROGRESS_STEP
) + 1;
436 wxHtmlContentsItem
*it
= m_Data
->GetContents();
439 progress
= new wxProgressDialog(_("Building contents tree..."), wxEmptyString
,
440 cnt
, this, wxPD_APP_MODAL
| wxPD_CAN_ABORT
|
443 wxTreeItemId roots
[MAX_ROOTS
];
444 bool imaged
[MAX_ROOTS
];
446 m_ContentsBox
-> DeleteAllItems();
447 roots
[0] = m_ContentsBox
-> AddRoot(_("(Help)"));
448 m_ContentsBox
-> SetItemImage(roots
[0], IMG_RootFolder
);
449 m_ContentsBox
-> SetItemSelectedImage(roots
[0], IMG_RootFolder
);
452 for (i
= 0; i
< cnt
; i
++, it
++) {
453 if (show_progress
&& ((i
% div
) == 0)) {
454 proginfo
.Printf(_("Added %d/%d items"), i
, cnt
);
455 if (! progress
->Update(i
, proginfo
))
459 roots
[it
-> m_Level
+ 1] = m_ContentsBox
-> AppendItem(
460 roots
[it
-> m_Level
], it
-> m_Name
, IMG_Page
, -1,
461 new wxHtmlHelpTreeItemData(it
));
463 if (it
-> m_Level
== 0) {
464 m_ContentsBox
-> SetItemBold(roots
[1], TRUE
);
465 m_ContentsBox
-> SetItemImage(roots
[1], IMG_Book
);
466 m_ContentsBox
-> SetItemSelectedImage(roots
[1], IMG_Book
);
468 } else imaged
[it
-> m_Level
+ 1] = FALSE
;
470 if (!imaged
[it
-> m_Level
]) {
471 m_ContentsBox
-> SetItemImage(roots
[it
-> m_Level
], IMG_Folder
);
472 m_ContentsBox
-> SetItemSelectedImage(roots
[it
-> m_Level
], IMG_Folder
);
473 imaged
[it
-> m_Level
] = TRUE
;
478 m_ContentsBox
-> Expand(roots
[0]);
482 void wxHtmlHelpFrame::CreateIndex(bool show_progress
)
487 wxProgressDialog
*progress
;
492 int cnt
= m_Data
->GetIndexCnt();
493 int div
= (cnt
/ PROGRESS_STEP
) + 1;
495 wxHtmlContentsItem
* index
= m_Data
->GetIndex();
498 progress
= new wxProgressDialog(_("Building index list..."), wxEmptyString
,
499 cnt
, this, wxPD_APP_MODAL
| wxPD_CAN_ABORT
|
501 for (int i
= 0; i
< cnt
; i
++) {
502 if (show_progress
&& ((i
% div
) == 0)) {
503 proginfo
.Printf(_("Added %d/%d items"), i
, cnt
);
504 if (! progress
->Update(i
, proginfo
))
508 m_IndexBox
-> Append(index
[i
].m_Name
, (char*)(index
+ i
));
515 void wxHtmlHelpFrame::CreateSearch()
517 if (! (m_SearchList
&& m_SearchChoice
))
519 m_SearchList
-> Clear();
520 m_SearchChoice
-> Clear();
521 m_SearchChoice
-> Append(_("all books"));
522 const wxHtmlBookRecArray
& bookrec
= m_Data
->GetBookRecArray();
523 int i
, cnt
= bookrec
.GetCount();
524 for (i
= 0; i
< cnt
; i
++)
525 m_SearchChoice
->Append(bookrec
[i
].GetTitle());
526 m_SearchChoice
->SetSelection(0);
530 void wxHtmlHelpFrame::RefreshLists(bool show_progress
)
532 CreateContents(show_progress
);
533 CreateIndex(show_progress
);
537 void wxHtmlHelpFrame::ReadCustomization(wxConfigBase
*cfg
, const wxString
& path
)
542 if (path
!= wxEmptyString
) {
543 oldpath
= cfg
-> GetPath();
544 cfg
-> SetPath(path
);
547 m_Cfg
.navig_on
= cfg
-> Read("hcNavigPanel", m_Cfg
.navig_on
) != 0;
548 m_Cfg
.sashpos
= cfg
-> Read("hcSashPos", m_Cfg
.sashpos
);
549 m_Cfg
.x
= cfg
-> Read("hcX", m_Cfg
.x
);
550 m_Cfg
.y
= cfg
-> Read("hcY", m_Cfg
.y
);
551 m_Cfg
.w
= cfg
-> Read("hcW", m_Cfg
.w
);
552 m_Cfg
.h
= cfg
-> Read("hcH", m_Cfg
.h
);
555 m_HtmlWin
->ReadCustomization(cfg
, path
);
557 if (path
!= wxEmptyString
)
558 cfg
-> SetPath(oldpath
);
561 void wxHtmlHelpFrame::WriteCustomization(wxConfigBase
*cfg
, const wxString
& path
)
566 if (path
!= wxEmptyString
) {
567 oldpath
= cfg
-> GetPath();
568 cfg
-> SetPath(path
);
571 cfg
-> Write("hcNavigPanel", m_Cfg
.navig_on
);
572 cfg
-> Write("hcSashPos", (long)m_Cfg
.sashpos
);
573 cfg
-> Write("hcX", (long)m_Cfg
.x
);
574 cfg
-> Write("hcY", (long)m_Cfg
.y
);
575 cfg
-> Write("hcW", (long)m_Cfg
.w
);
576 cfg
-> Write("hcH", (long)m_Cfg
.h
);
579 m_HtmlWin
->WriteCustomization(cfg
, path
);
581 if (path
!= wxEmptyString
)
582 cfg
-> SetPath(oldpath
);
591 void wxHtmlHelpFrame::OnToolbar(wxCommandEvent
& event
)
593 switch (event
.GetId()) {
594 case wxID_HTML_BACK
:
595 m_HtmlWin
-> HistoryBack();
597 case wxID_HTML_FORWARD
:
598 m_HtmlWin
-> HistoryForward();
600 case wxID_HTML_PANEL
:
601 if (! (m_Splitter
&& m_NavigPan
))
603 if (m_Splitter
-> IsSplit()) {
604 m_Cfg
.sashpos
= m_Splitter
-> GetSashPosition();
605 m_Splitter
-> Unsplit(m_NavigPan
);
606 m_Cfg
.navig_on
= FALSE
;
608 m_NavigPan
-> Show(TRUE
);
609 m_HtmlWin
-> Show(TRUE
);
610 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
611 m_Cfg
.navig_on
= TRUE
;
619 void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent
& event
)
621 wxHtmlHelpTreeItemData
*pg
;
623 pg
= (wxHtmlHelpTreeItemData
*) m_ContentsBox
-> GetItemData(event
.GetItem());
624 if (pg
) m_HtmlWin
-> LoadPage(pg
-> GetPage());
629 void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent
& WXUNUSED(event
))
631 wxHtmlContentsItem
*it
= (wxHtmlContentsItem
*) m_IndexBox
-> GetClientData(m_IndexBox
-> GetSelection());
632 m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
637 void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent
& WXUNUSED(event
))
639 wxHtmlContentsItem
*it
= (wxHtmlContentsItem
*) m_SearchList
-> GetClientData(m_SearchList
-> GetSelection());
640 if (it
) m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
643 void wxHtmlHelpFrame::OnSearch(wxCommandEvent
& WXUNUSED(event
))
645 wxString sr
= m_SearchText
-> GetLineText(0);
647 if (sr
!= wxEmptyString
) KeywordSearch(sr
);
650 void wxHtmlHelpFrame::OnCloseWindow(wxCloseEvent
& evt
)
652 GetSize(&m_Cfg
.w
, &m_Cfg
.h
);
653 GetPosition(&m_Cfg
.x
, &m_Cfg
.y
);
655 if (m_Splitter
&& m_Cfg
.navig_on
) m_Cfg
.sashpos
= m_Splitter
-> GetSashPosition();
658 WriteCustomization(m_Config
, m_ConfigRoot
);
663 BEGIN_EVENT_TABLE(wxHtmlHelpFrame
, wxFrame
)
664 EVT_TOOL_RANGE(wxID_HTML_PANEL
, wxID_HTML_FORWARD
, wxHtmlHelpFrame::OnToolbar
)
665 EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL
, wxHtmlHelpFrame::OnContentsSel
)
666 EVT_LISTBOX(wxID_HTML_INDEXLIST
, wxHtmlHelpFrame::OnIndexSel
)
667 EVT_LISTBOX(wxID_HTML_SEARCHLIST
, wxHtmlHelpFrame::OnSearchSel
)
668 EVT_BUTTON(wxID_HTML_SEARCHBUTTON
, wxHtmlHelpFrame::OnSearch
)
669 EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT
, wxHtmlHelpFrame::OnSearch
)
670 EVT_CLOSE(wxHtmlHelpFrame::OnCloseWindow
)