]> git.saurik.com Git - wxWidgets.git/blame - src/html/helpfrm.cpp
Applied patch [ 597398 ] Generic MDI, wxNotebook based.
[wxWidgets.git] / src / html / helpfrm.cpp
CommitLineData
8ec2b484
HH
1/////////////////////////////////////////////////////////////////////////////
2// Name: helpfrm.cpp
3// Purpose: wxHtmlHelpFrame
d5bb85a0 4// Notes: Based on htmlhelp.cpp, implementing a monolithic
8ec2b484
HH
5// HTML Help controller class, by Vaclav Slavik
6// Author: Harm van der Heijden and Vaclav Slavik
69941f05 7// RCS-ID: $Id$
8ec2b484
HH
8// Copyright: (c) Harm van der Heijden and Vaclav Slavik
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
1aedb1dd 13#pragma implementation "helpfrm.h"
8ec2b484
HH
14#endif
15
c32bfc10
VS
16// For compilers that support precompilation, includes "wx.h"
17
8ec2b484
HH
18#include "wx/wxprec.h"
19
20#ifdef __BORLANDC__
21#pragma hdrstop
22#endif
23
3379ed37 24#if wxUSE_WXHTML_HELP
07b8d7ec 25
8ec2b484 26#ifndef WXPRECOMP
07b8d7ec
VZ
27 #include "wx/intl.h"
28 #include "wx/log.h"
29
30 #include "wx/object.h"
07b8d7ec
VZ
31 #include "wx/sizer.h"
32
33 #include "wx/bmpbuttn.h"
34 #include "wx/statbox.h"
35 #include "wx/radiobox.h"
36#endif // WXPRECOMP
8ec2b484
HH
37
38#include "wx/html/helpfrm.h"
b4414c1f 39#include "wx/html/helpctrl.h"
618a5e38 40#include "wx/textctrl.h"
8ec2b484
HH
41#include "wx/notebook.h"
42#include "wx/imaglist.h"
43#include "wx/treectrl.h"
44#include "wx/tokenzr.h"
45#include "wx/wfstream.h"
46#include "wx/html/htmlwin.h"
47#include "wx/busyinfo.h"
48#include "wx/progdlg.h"
2bd5bbc9 49#include "wx/toolbar.h"
83efdf33 50#include "wx/fontenum.h"
0646614d
VS
51#include "wx/stream.h"
52#include "wx/filedlg.h"
f435c1f0 53#include "wx/artprov.h"
8ec2b484 54
f0b6a33f
VS
55// what is considered "small index"?
56#define INDEX_IS_SMALL 100
57
9806a47c
JS
58/* Motif defines this as a macro */
59#ifdef Below
60#undef Below
61#endif
f0b6a33f 62
8ec2b484 63//--------------------------------------------------------------------------
382e6efe 64// wxHtmlHelpTreeItemData (private)
8ec2b484
HH
65//--------------------------------------------------------------------------
66
67class wxHtmlHelpTreeItemData : public wxTreeItemData
68{
0646614d 69 public:
da4cc40c
DW
70#if defined(__VISAGECPP__)
71// VA needs a default ctor for some reason....
72 wxHtmlHelpTreeItemData() : wxTreeItemData()
73 { m_Id = 0; }
74#endif
0646614d
VS
75 wxHtmlHelpTreeItemData(int id) : wxTreeItemData()
76 { m_Id = id;}
77
78 int m_Id;
79};
8ec2b484 80
0646614d
VS
81
82//--------------------------------------------------------------------------
83// wxHtmlHelpHashData (private)
84//--------------------------------------------------------------------------
85
86class wxHtmlHelpHashData : public wxObject
87{
8ec2b484 88 public:
0646614d
VS
89 wxHtmlHelpHashData(int index, wxTreeItemId id) : wxObject()
90 { m_Index = index; m_Id = id;}
f5ba273e 91 ~wxHtmlHelpHashData() {}
f6bcfd97 92
0646614d
VS
93 int m_Index;
94 wxTreeItemId m_Id;
8ec2b484
HH
95};
96
382e6efe 97
0646614d
VS
98//--------------------------------------------------------------------------
99// wxHtmlHelpHtmlWindow (private)
100//--------------------------------------------------------------------------
101
102class wxHtmlHelpHtmlWindow : public wxHtmlWindow
103{
104 public:
105 wxHtmlHelpHtmlWindow(wxHtmlHelpFrame *fr, wxWindow *parent) : wxHtmlWindow(parent), m_Frame(fr) {}
106
107 virtual void OnLinkClicked(const wxHtmlLinkInfo& link)
108 {
109 wxHtmlWindow::OnLinkClicked(link);
4f9297b0 110 m_Frame->NotifyPageChanged();
0646614d
VS
111 }
112
f6bcfd97 113 private:
0646614d
VS
114 wxHtmlHelpFrame *m_Frame;
115};
116
382e6efe
VS
117
118
8ec2b484
HH
119//---------------------------------------------------------------------------
120// wxHtmlHelpFrame
121//---------------------------------------------------------------------------
122
576507e2
VS
123// Command IDs :
124enum
125{
126 //wxID_HTML_HELPFRAME = wxID_HIGHEST + 1,
127 wxID_HTML_PANEL = wxID_HIGHEST + 2,
128 wxID_HTML_BACK,
129 wxID_HTML_FORWARD,
130 wxID_HTML_UPNODE,
131 wxID_HTML_UP,
132 wxID_HTML_DOWN,
133 wxID_HTML_PRINT,
134 wxID_HTML_OPENFILE,
135 wxID_HTML_OPTIONS,
136 wxID_HTML_BOOKMARKSLIST,
137 wxID_HTML_BOOKMARKSADD,
138 wxID_HTML_BOOKMARKSREMOVE,
139 wxID_HTML_TREECTRL,
140 wxID_HTML_INDEXPAGE,
141 wxID_HTML_INDEXLIST,
142 wxID_HTML_INDEXTEXT,
143 wxID_HTML_INDEXBUTTON,
144 wxID_HTML_INDEXBUTTONALL,
145 wxID_HTML_NOTEBOOK,
146 wxID_HTML_SEARCHPAGE,
147 wxID_HTML_SEARCHTEXT,
148 wxID_HTML_SEARCHLIST,
149 wxID_HTML_SEARCHBUTTON,
150 wxID_HTML_SEARCHCHOICE,
151 wxID_HTML_COUNTINFO
152};
153
154
8ec2b484
HH
155IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpFrame, wxFrame)
156
157wxHtmlHelpFrame::wxHtmlHelpFrame(wxWindow* parent, wxWindowID id, const wxString& title,
d5bb85a0 158 int style, wxHtmlHelpData* data)
8ec2b484
HH
159{
160 Init(data);
161 Create(parent, id, title, style);
162}
d5bb85a0 163
8ec2b484
HH
164void wxHtmlHelpFrame::Init(wxHtmlHelpData* data)
165{
da4cc40c 166 if (data)
4f9297b0 167 {
d5bb85a0
VS
168 m_Data = data;
169 m_DataCreated = FALSE;
da4cc40c 170 } else
4f9297b0 171 {
d5bb85a0
VS
172 m_Data = new wxHtmlHelpData();
173 m_DataCreated = TRUE;
8ec2b484
HH
174 }
175
8ec2b484 176 m_ContentsBox = NULL;
f0b6a33f
VS
177 m_IndexList = NULL;
178 m_IndexButton = NULL;
179 m_IndexButtonAll = NULL;
180 m_IndexText = NULL;
8ec2b484
HH
181 m_SearchList = NULL;
182 m_SearchButton = NULL;
183 m_SearchText = NULL;
184 m_SearchChoice = NULL;
240c2873 185 m_IndexCountInfo = NULL;
8ec2b484
HH
186 m_Splitter = NULL;
187 m_NavigPan = NULL;
5229b11d 188 m_NavigNotebook = NULL;
8ec2b484 189 m_HtmlWin = NULL;
382e6efe 190 m_Bookmarks = NULL;
c4971147
VS
191 m_SearchCaseSensitive = NULL;
192 m_SearchWholeWords = NULL;
193
8ec2b484
HH
194 m_Config = NULL;
195 m_ConfigRoot = wxEmptyString;
196
197 m_Cfg.x = m_Cfg.y = 0;
d5bb85a0
VS
198 m_Cfg.w = 700;
199 m_Cfg.h = 480;
8ec2b484
HH
200 m_Cfg.sashpos = 240;
201 m_Cfg.navig_on = TRUE;
83efdf33
VS
202
203 m_NormalFonts = m_FixedFonts = NULL;
83efdf33 204 m_NormalFace = m_FixedFace = wxEmptyString;
0646614d 205 m_FontSize = 1;
f6bcfd97 206
0646614d
VS
207#if wxUSE_PRINTING_ARCHITECTURE
208 m_Printer = NULL;
209#endif
210
211 m_PagesHash = NULL;
212 m_UpdateContents = TRUE;
b4414c1f 213 m_helpController = (wxHelpControllerBase*) NULL;
8ec2b484
HH
214}
215
d5bb85a0
VS
216// Create: builds the GUI components.
217// with the style flag it's possible to toggle the toolbar, contents, index and search
218// controls.
219// m_HtmlWin will *always* be created, but it's important to realize that
f0b6a33f 220// m_ContentsBox, m_IndexList, m_SearchList, m_SearchButton, m_SearchText and
d5bb85a0
VS
221// m_SearchButton may be NULL.
222// moreover, if no contents, index or searchpage is needed, m_Splitter and
223// m_NavigPan will be NULL too (with m_HtmlWin directly connected to the frame)
224
3379ed37 225bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id,
576507e2 226 const wxString& WXUNUSED(title), int style)
8ec2b484 227{
576507e2
VS
228 m_hfStyle = style;
229
8fd2b35c 230 wxImageList *ContentsImageList = new wxImageList(16, 16);
f435c1f0
VS
231 ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_BOOK, wxART_HELP_BROWSER));
232 ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_FOLDER, wxART_HELP_BROWSER));
233 ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_PAGE, wxART_HELP_BROWSER));
8fd2b35c 234
8ec2b484
HH
235 // Do the config in two steps. We read the HtmlWindow customization after we
236 // create the window.
d5bb85a0
VS
237 if (m_Config)
238 ReadCustomization(m_Config, m_ConfigRoot);
8ec2b484 239
5229b11d
VS
240 wxFrame::Create(parent, id, _("Help"),
241 wxPoint(m_Cfg.x, m_Cfg.y), wxSize(m_Cfg.w, m_Cfg.h),
242 wxDEFAULT_FRAME_STYLE, wxT("wxHtmlHelp"));
8ec2b484 243
5c172c17
VS
244 GetPosition(&m_Cfg.x, &m_Cfg.y);
245
79683a13 246 SetIcon(wxArtProvider::GetIcon(wxART_HELP, wxART_HELP_BROWSER));
9ffdee80 247
8ec2b484
HH
248 int notebook_page = 0;
249
250 CreateStatusBar();
251
252 // toolbar?
576507e2 253 if (style & (wxHF_TOOLBAR | wxHF_FLAT_TOOLBAR))
4f9297b0 254 {
f6bcfd97
BP
255 wxToolBar *toolBar = CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL |
256 wxTB_DOCKABLE |
576507e2 257 (style & wxHF_FLAT_TOOLBAR ? wxTB_FLAT : 0));
00655497 258 toolBar->SetMargins( 2, 2 );
b854b7b8 259 AddToolbarButtons(toolBar, style);
4f9297b0 260 toolBar->Realize();
8ec2b484 261 }
d5bb85a0 262
5229b11d
VS
263 wxSizer *navigSizer = NULL;
264
da4cc40c 265 if (style & (wxHF_CONTENTS | wxHF_INDEX | wxHF_SEARCH))
4f9297b0 266 {
d5bb85a0
VS
267 // traditional help controller; splitter window with html page on the
268 // right and a notebook containing various pages on the left
269 m_Splitter = new wxSplitterWindow(this);
270
0646614d 271 m_HtmlWin = new wxHtmlHelpHtmlWindow(this, m_Splitter);
5229b11d
VS
272 m_NavigPan = new wxPanel(m_Splitter, -1);
273 m_NavigNotebook = new wxNotebook(m_NavigPan, wxID_HTML_NOTEBOOK,
274 wxDefaultPosition, wxDefaultSize);
275 wxNotebookSizer *nbs = new wxNotebookSizer(m_NavigNotebook);
276
277 navigSizer = new wxBoxSizer(wxVERTICAL);
278 navigSizer->Add(nbs, 1, wxEXPAND);
279
280 m_NavigPan->SetAutoLayout(TRUE);
281 m_NavigPan->SetSizer(navigSizer);
da4cc40c
DW
282 }
283 else
4f9297b0 284 { // only html window, no notebook with index,contents etc
d5bb85a0 285 m_HtmlWin = new wxHtmlWindow(this);
8ec2b484
HH
286 }
287
4f9297b0
VS
288 m_HtmlWin->SetRelatedFrame(this, m_TitleFormat);
289 m_HtmlWin->SetRelatedStatusBar(0);
5229b11d 290 if ( m_Config )
4f9297b0 291 m_HtmlWin->ReadCustomization(m_Config, m_ConfigRoot);
8ec2b484
HH
292
293 // contents tree panel?
5229b11d 294 if ( style & wxHF_CONTENTS )
4f9297b0 295 {
5229b11d
VS
296 wxWindow *dummy = new wxPanel(m_NavigNotebook, wxID_HTML_INDEXPAGE);
297 wxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
298
299 topsizer->Add(0, 10);
c7c72b41 300
5229b11d
VS
301 dummy->SetAutoLayout(TRUE);
302 dummy->SetSizer(topsizer);
303
5229b11d 304 if ( style & wxHF_BOOKMARKS )
3379ed37 305 {
5229b11d
VS
306 m_Bookmarks = new wxComboBox(dummy, wxID_HTML_BOOKMARKSLIST,
307 wxEmptyString,
308 wxDefaultPosition, wxDefaultSize,
309 0, NULL, wxCB_READONLY | wxCB_SORT);
4f9297b0 310 m_Bookmarks->Append(_("(bookmarks)"));
ae80f837 311 for (unsigned i = 0; i < m_BookmarksNames.GetCount(); i++)
4f9297b0
VS
312 m_Bookmarks->Append(m_BookmarksNames[i]);
313 m_Bookmarks->SetSelection(0);
ae80f837 314
5229b11d
VS
315 wxBitmapButton *bmpbt1, *bmpbt2;
316 bmpbt1 = new wxBitmapButton(dummy, wxID_HTML_BOOKMARKSADD,
f435c1f0
VS
317 wxArtProvider::GetBitmap(wxART_ADD_BOOKMARK,
318 wxART_HELP_BROWSER));
5229b11d 319 bmpbt2 = new wxBitmapButton(dummy, wxID_HTML_BOOKMARKSREMOVE,
f435c1f0
VS
320 wxArtProvider::GetBitmap(wxART_DEL_BOOKMARK,
321 wxART_HELP_BROWSER));
5229b11d
VS
322#if wxUSE_TOOLTIPS
323 bmpbt1->SetToolTip(_("Add current page to bookmarks"));
324 bmpbt2->SetToolTip(_("Remove current page from bookmarks"));
325#endif // wxUSE_TOOLTIPS
326
327 wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
328
f435c1f0
VS
329 sizer->Add(m_Bookmarks, 1, wxALIGN_CENTRE_VERTICAL | wxRIGHT, 5);
330 sizer->Add(bmpbt1, 0, wxALIGN_CENTRE_VERTICAL | wxRIGHT, 2);
331 sizer->Add(bmpbt2, 0, wxALIGN_CENTRE_VERTICAL, 0);
5229b11d
VS
332
333 topsizer->Add(sizer, 0, wxEXPAND | wxLEFT | wxBOTTOM | wxRIGHT, 10);
ae80f837
VS
334 }
335
5229b11d
VS
336 m_ContentsBox = new wxTreeCtrl(dummy, wxID_HTML_TREECTRL,
337 wxDefaultPosition, wxDefaultSize,
e0952648
VS
338 wxSUNKEN_BORDER |
339 wxTR_HAS_BUTTONS | wxTR_HIDE_ROOT |
340 wxTR_LINES_AT_ROOT);
341
5229b11d
VS
342 m_ContentsBox->AssignImageList(ContentsImageList);
343
344 topsizer->Add(m_ContentsBox, 1, wxEXPAND | wxLEFT | wxBOTTOM | wxRIGHT, 2);
ae80f837 345
5229b11d 346 m_NavigNotebook->AddPage(dummy, _("Contents"));
d5bb85a0 347 m_ContentsPage = notebook_page++;
8ec2b484
HH
348 }
349
350 // index listbox panel?
5229b11d 351 if ( style & wxHF_INDEX )
4f9297b0 352 {
5229b11d
VS
353 wxWindow *dummy = new wxPanel(m_NavigNotebook, wxID_HTML_INDEXPAGE);
354 wxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
355
356 dummy->SetAutoLayout(TRUE);
357 dummy->SetSizer(topsizer);
358
359 m_IndexText = new wxTextCtrl(dummy, wxID_HTML_INDEXTEXT, wxEmptyString,
360 wxDefaultPosition, wxDefaultSize,
361 wxTE_PROCESS_ENTER);
f0b6a33f 362 m_IndexButton = new wxButton(dummy, wxID_HTML_INDEXBUTTON, _("Find"));
5229b11d
VS
363 m_IndexButtonAll = new wxButton(dummy, wxID_HTML_INDEXBUTTONALL,
364 _("Show all"));
365 m_IndexCountInfo = new wxStaticText(dummy, wxID_HTML_COUNTINFO,
366 wxEmptyString, wxDefaultPosition,
367 wxDefaultSize,
368 wxALIGN_RIGHT | wxST_NO_AUTORESIZE);
369 m_IndexList = new wxListBox(dummy, wxID_HTML_INDEXLIST,
370 wxDefaultPosition, wxDefaultSize,
371 0, NULL, wxLB_SINGLE);
f0b6a33f 372
7618e374 373#if wxUSE_TOOLTIPS
4f9297b0 374 m_IndexButton->SetToolTip(_("Display all index items that contain given substring. Search is case insensitive."));
5229b11d 375 m_IndexButtonAll->SetToolTip(_("Show all items in index"));
7618e374
VS
376#endif //wxUSE_TOOLTIPS
377
5229b11d
VS
378 topsizer->Add(m_IndexText, 0, wxEXPAND | wxALL, 10);
379 wxSizer *btsizer = new wxBoxSizer(wxHORIZONTAL);
380 btsizer->Add(m_IndexButton, 0, wxRIGHT, 2);
381 btsizer->Add(m_IndexButtonAll);
382 topsizer->Add(btsizer, 0,
383 wxALIGN_RIGHT | wxLEFT | wxRIGHT | wxBOTTOM, 10);
384 topsizer->Add(m_IndexCountInfo, 0, wxEXPAND | wxLEFT | wxRIGHT, 2);
385 topsizer->Add(m_IndexList, 1, wxEXPAND | wxALL, 2);
f0b6a33f 386
5229b11d 387 m_NavigNotebook->AddPage(dummy, _("Index"));
d5bb85a0 388 m_IndexPage = notebook_page++;
8ec2b484
HH
389 }
390
391 // search list panel?
5229b11d 392 if ( style & wxHF_SEARCH )
4f9297b0 393 {
5229b11d
VS
394 wxWindow *dummy = new wxPanel(m_NavigNotebook, wxID_HTML_INDEXPAGE);
395 wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
c4971147 396
5229b11d
VS
397 dummy->SetAutoLayout(TRUE);
398 dummy->SetSizer(sizer);
399
400 m_SearchText = new wxTextCtrl(dummy, wxID_HTML_SEARCHTEXT,
401 wxEmptyString,
402 wxDefaultPosition, wxDefaultSize,
403 wxTE_PROCESS_ENTER);
404 m_SearchChoice = new wxChoice(dummy, wxID_HTML_SEARCHCHOICE,
405 wxDefaultPosition, wxDefaultSize);
406 m_SearchCaseSensitive = new wxCheckBox(dummy, -1, _("Case sensitive"));
c4971147 407 m_SearchWholeWords = new wxCheckBox(dummy, -1, _("Whole words only"));
ae80f837
VS
408 m_SearchButton = new wxButton(dummy, wxID_HTML_SEARCHBUTTON, _("Search"));
409#if wxUSE_TOOLTIPS
4f9297b0 410 m_SearchButton->SetToolTip(_("Search contents of help book(s) for all occurences of the text you typed above"));
ae80f837 411#endif //wxUSE_TOOLTIPS
5229b11d
VS
412 m_SearchList = new wxListBox(dummy, wxID_HTML_SEARCHLIST,
413 wxDefaultPosition, wxDefaultSize,
414 0, NULL, wxLB_SINGLE);
415
416 sizer->Add(m_SearchText, 0, wxEXPAND | wxALL, 10);
417 sizer->Add(m_SearchChoice, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 10);
418 sizer->Add(m_SearchCaseSensitive, 0, wxLEFT | wxRIGHT, 10);
419 sizer->Add(m_SearchWholeWords, 0, wxLEFT | wxRIGHT, 10);
420 sizer->Add(m_SearchButton, 0, wxALL | wxALIGN_RIGHT, 8);
421 sizer->Add(m_SearchList, 1, wxALL | wxEXPAND, 2);
422
423 m_NavigNotebook->AddPage(dummy, _("Search"));
d5bb85a0 424 m_SearchPage = notebook_page++;
8ec2b484 425 }
5229b11d 426
4f9297b0 427 m_HtmlWin->Show(TRUE);
f6bcfd97 428
b5a7b000 429 RefreshLists();
8ec2b484 430
5229b11d
VS
431 if ( navigSizer )
432 {
433 navigSizer->SetSizeHints(m_NavigPan);
434 m_NavigPan->Layout();
435 }
436
8ec2b484 437 // showtime
5229b11d 438 if ( m_NavigPan && m_Splitter )
4f9297b0
VS
439 {
440 m_Splitter->SetMinimumPaneSize(20);
5229b11d 441 if ( m_Cfg.navig_on )
4f9297b0 442 m_Splitter->SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
4f9297b0 443
5229b11d 444 if ( m_Cfg.navig_on )
3379ed37 445 {
4f9297b0
VS
446 m_NavigPan->Show(TRUE);
447 m_Splitter->SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
c32bfc10 448 }
da4cc40c 449 else
3379ed37 450 {
4f9297b0
VS
451 m_NavigPan->Show(FALSE);
452 m_Splitter->Initialize(m_HtmlWin);
68364659 453 }
8ec2b484 454 }
5229b11d 455
8ec2b484
HH
456 return TRUE;
457}
458
459wxHtmlHelpFrame::~wxHtmlHelpFrame()
460{
b4414c1f 461 // PopEventHandler(); // wxhtmlhelpcontroller (not any more!)
8ec2b484 462 if (m_DataCreated)
d5bb85a0 463 delete m_Data;
83efdf33
VS
464 if (m_NormalFonts) delete m_NormalFonts;
465 if (m_FixedFonts) delete m_FixedFonts;
70aedad6 466 if (m_PagesHash) delete m_PagesHash;
8ec2b484
HH
467}
468
b854b7b8
VS
469
470void wxHtmlHelpFrame::AddToolbarButtons(wxToolBar *toolBar, int style)
471{
f435c1f0
VS
472 wxBitmap wpanelBitmap =
473 wxArtProvider::GetBitmap(wxART_HELP_SIDE_PANEL, wxART_HELP_BROWSER);
474 wxBitmap wbackBitmap =
475 wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_HELP_BROWSER);
476 wxBitmap wforwardBitmap =
477 wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_HELP_BROWSER);
478 wxBitmap wupnodeBitmap =
479 wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_HELP_BROWSER);
480 wxBitmap wupBitmap =
481 wxArtProvider::GetBitmap(wxART_GO_UP, wxART_HELP_BROWSER);
482 wxBitmap wdownBitmap =
483 wxArtProvider::GetBitmap(wxART_GO_DOWN, wxART_HELP_BROWSER);
484 wxBitmap wopenBitmap =
485 wxArtProvider::GetBitmap(wxART_FILE_OPEN, wxART_HELP_BROWSER);
486 wxBitmap wprintBitmap =
487 wxArtProvider::GetBitmap(wxART_PRINT, wxART_HELP_BROWSER);
488 wxBitmap woptionsBitmap =
489 wxArtProvider::GetBitmap(wxART_HELP_SETTINGS, wxART_HELP_BROWSER);
f6bcfd97
BP
490
491 wxASSERT_MSG( (wpanelBitmap.Ok() && wbackBitmap.Ok() &&
492 wforwardBitmap.Ok() && wupnodeBitmap.Ok() &&
493 wupBitmap.Ok() && wdownBitmap.Ok() &&
494 wopenBitmap.Ok() && wprintBitmap.Ok() &&
495 woptionsBitmap.Ok()),
496 wxT("One or more HTML help frame toolbar bitmap could not be loaded.")) ;
497
498
4f9297b0 499 toolBar->AddTool(wxID_HTML_PANEL, wpanelBitmap, wxNullBitmap,
b854b7b8
VS
500 FALSE, -1, -1, (wxObject *) NULL,
501 _("Show/hide navigation panel"));
0646614d 502
4f9297b0
VS
503 toolBar->AddSeparator();
504 toolBar->AddTool(wxID_HTML_BACK, wbackBitmap, wxNullBitmap,
b854b7b8 505 FALSE, -1, -1, (wxObject *) NULL,
0646614d 506 _("Go back"));
4f9297b0 507 toolBar->AddTool(wxID_HTML_FORWARD, wforwardBitmap, wxNullBitmap,
b854b7b8 508 FALSE, -1, -1, (wxObject *) NULL,
0646614d 509 _("Go forward"));
4f9297b0 510 toolBar->AddSeparator();
b854b7b8 511
4f9297b0 512 toolBar->AddTool(wxID_HTML_UPNODE, wupnodeBitmap, wxNullBitmap,
0646614d
VS
513 FALSE, -1, -1, (wxObject *) NULL,
514 _("Go one level up in document hierarchy"));
4f9297b0 515 toolBar->AddTool(wxID_HTML_UP, wupBitmap, wxNullBitmap,
0646614d
VS
516 FALSE, -1, -1, (wxObject *) NULL,
517 _("Previous page"));
4f9297b0 518 toolBar->AddTool(wxID_HTML_DOWN, wdownBitmap, wxNullBitmap,
0646614d
VS
519 FALSE, -1, -1, (wxObject *) NULL,
520 _("Next page"));
521
576507e2 522 if ((style & wxHF_PRINT) || (style & wxHF_OPEN_FILES))
4f9297b0 523 toolBar->AddSeparator();
f6bcfd97 524
576507e2 525 if (style & wxHF_OPEN_FILES)
4f9297b0 526 toolBar->AddTool(wxID_HTML_OPENFILE, wopenBitmap, wxNullBitmap,
0646614d
VS
527 FALSE, -1, -1, (wxObject *) NULL,
528 _("Open HTML document"));
529
530#if wxUSE_PRINTING_ARCHITECTURE
531 if (style & wxHF_PRINT)
4f9297b0 532 toolBar->AddTool(wxID_HTML_PRINT, wprintBitmap, wxNullBitmap,
0646614d
VS
533 FALSE, -1, -1, (wxObject *) NULL,
534 _("Print this page"));
535#endif
536
4f9297b0
VS
537 toolBar->AddSeparator();
538 toolBar->AddTool(wxID_HTML_OPTIONS, woptionsBitmap, wxNullBitmap,
b854b7b8
VS
539 FALSE, -1, -1, (wxObject *) NULL,
540 _("Display options dialog"));
541}
542
543
721ab905
VS
544void wxHtmlHelpFrame::SetTitleFormat(const wxString& format)
545{
546 if (m_HtmlWin)
547 m_HtmlWin->SetRelatedFrame(this, format);
548 m_TitleFormat = format;
549}
550
b854b7b8 551
8ec2b484
HH
552bool wxHtmlHelpFrame::Display(const wxString& x)
553{
554 wxString url = m_Data->FindPageByName(x);
da4cc40c 555 if (!url.IsEmpty())
4f9297b0 556 {
d5bb85a0 557 m_HtmlWin->LoadPage(url);
0646614d 558 NotifyPageChanged();
d5bb85a0 559 return TRUE;
8ec2b484
HH
560 }
561 return FALSE;
562}
563
564bool wxHtmlHelpFrame::Display(const int id)
565{
566 wxString url = m_Data->FindPageById(id);
da4cc40c 567 if (!url.IsEmpty())
4f9297b0 568 {
d5bb85a0 569 m_HtmlWin->LoadPage(url);
0646614d 570 NotifyPageChanged();
d5bb85a0 571 return TRUE;
8ec2b484
HH
572 }
573 return FALSE;
574}
575
576
577
578bool wxHtmlHelpFrame::DisplayContents()
579{
580 if (! m_ContentsBox)
d5bb85a0 581 return FALSE;
da4cc40c 582 if (!m_Splitter->IsSplit())
4f9297b0
VS
583 {
584 m_NavigPan->Show(TRUE);
585 m_HtmlWin->Show(TRUE);
586 m_Splitter->SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
c32bfc10 587 m_Cfg.navig_on = TRUE;
8ec2b484 588 }
5229b11d 589 m_NavigNotebook->SetSelection(0);
71d04f7f
JS
590 if (m_Data->GetBookRecArray().GetCount() > 0)
591 {
592 wxHtmlBookRecord& book = m_Data->GetBookRecArray()[0];
593 if (!book.GetStart().IsEmpty())
468ae730 594 m_HtmlWin->LoadPage(book.GetFullPath(book.GetStart()));
71d04f7f 595 }
8ec2b484
HH
596 return TRUE;
597}
598
599
600
601bool wxHtmlHelpFrame::DisplayIndex()
602{
f0b6a33f 603 if (! m_IndexList)
d5bb85a0 604 return FALSE;
da4cc40c 605 if (!m_Splitter->IsSplit())
4f9297b0
VS
606 {
607 m_NavigPan->Show(TRUE);
608 m_HtmlWin->Show(TRUE);
609 m_Splitter->SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
8ec2b484 610 }
5229b11d 611 m_NavigNotebook->SetSelection(1);
71d04f7f
JS
612 if (m_Data->GetBookRecArray().GetCount() > 0)
613 {
614 wxHtmlBookRecord& book = m_Data->GetBookRecArray()[0];
615 if (!book.GetStart().IsEmpty())
468ae730 616 m_HtmlWin->LoadPage(book.GetFullPath(book.GetStart()));
71d04f7f 617 }
8ec2b484
HH
618 return TRUE;
619}
620
b854b7b8
VS
621
622
8ec2b484
HH
623bool wxHtmlHelpFrame::KeywordSearch(const wxString& keyword)
624{
625 if (! (m_SearchList && m_SearchButton && m_SearchText && m_SearchChoice))
d5bb85a0 626 return FALSE;
8ec2b484 627
c4971147 628 int foundcnt = 0, curi;
8ec2b484
HH
629 wxString foundstr;
630 wxString book = wxEmptyString;
631
da4cc40c 632 if (!m_Splitter->IsSplit())
4f9297b0
VS
633 {
634 m_NavigPan->Show(TRUE);
635 m_HtmlWin->Show(TRUE);
636 m_Splitter->SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
8ec2b484 637 }
5229b11d 638 m_NavigNotebook->SetSelection(m_SearchPage);
4f9297b0
VS
639 m_SearchList->Clear();
640 m_SearchText->SetValue(keyword);
641 m_SearchButton->Enable(FALSE);
8ec2b484
HH
642
643 if (m_SearchChoice->GetSelection() != 0)
d5bb85a0 644 book = m_SearchChoice->GetStringSelection();
8ec2b484 645
f6bcfd97 646 wxHtmlSearchStatus status(m_Data, keyword,
4f9297b0 647 m_SearchCaseSensitive->GetValue(), m_SearchWholeWords->GetValue(),
c4971147 648 book);
8ec2b484 649
d5bb85a0
VS
650 wxProgressDialog progress(_("Searching..."), _("No matching page found yet"),
651 status.GetMaxIndex(), this,
b4414c1f 652 wxPD_APP_MODAL | wxPD_CAN_ABORT | wxPD_AUTO_HIDE);
8ec2b484 653
da4cc40c 654 while (status.IsActive())
4f9297b0 655 {
c4971147 656 curi = status.GetCurIndex();
b5a7b000 657 if (curi % 32 == 0 && progress.Update(curi) == FALSE)
d5bb85a0 658 break;
da4cc40c 659 if (status.Search())
3379ed37 660 {
d5bb85a0
VS
661 foundstr.Printf(_("Found %i matches"), ++foundcnt);
662 progress.Update(status.GetCurIndex(), foundstr);
4f9297b0 663 m_SearchList->Append(status.GetName(), status.GetContentsItem());
d5bb85a0 664 }
8ec2b484
HH
665 }
666
4f9297b0
VS
667 m_SearchButton->Enable(TRUE);
668 m_SearchText->SetSelection(0, keyword.Length());
669 m_SearchText->SetFocus();
da4cc40c 670 if (foundcnt)
4f9297b0
VS
671 {
672 wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_SearchList->GetClientData(0);
f6bcfd97 673 if (it)
0646614d 674 {
468ae730 675 m_HtmlWin->LoadPage(it->GetFullPath());
0646614d
VS
676 NotifyPageChanged();
677 }
8ec2b484
HH
678 }
679 return (foundcnt > 0);
680}
681
b5a7b000 682void wxHtmlHelpFrame::CreateContents()
8ec2b484
HH
683{
684 if (! m_ContentsBox)
d5bb85a0 685 return ;
8ec2b484 686
8ec2b484 687 m_ContentsBox->Clear();
f6bcfd97 688
0646614d 689 if (m_PagesHash) delete m_PagesHash;
4f9297b0
VS
690 m_PagesHash = new wxHashTable(wxKEY_STRING, 2 * m_Data->GetContentsCnt());
691 m_PagesHash->DeleteContents(TRUE);
8ec2b484
HH
692
693 int cnt = m_Data->GetContentsCnt();
8ec2b484
HH
694 int i;
695
83efdf33 696 wxHtmlContentsItem *it;
d5bb85a0 697
576507e2 698 const int MAX_ROOTS = 64;
8ec2b484 699 wxTreeItemId roots[MAX_ROOTS];
576507e2
VS
700 // VS: this array holds information about whether we've set item icon at
701 // given level. This is neccessary because m_Data has flat structure
702 // and there's no way of recognizing if some item has subitems or not.
703 // We set the icon later: when we find an item with level=n, we know
704 // that the last item with level=n-1 was folder with subitems, so we
705 // set its icon accordingly
3379ed37 706 bool imaged[MAX_ROOTS];
4f9297b0 707 m_ContentsBox->DeleteAllItems();
96873b79 708
e0952648 709 roots[0] = m_ContentsBox->AddRoot(_("(Help)"));
e0952648 710 imaged[0] = TRUE;
8ec2b484 711
da4cc40c 712 for (it = m_Data->GetContents(), i = 0; i < cnt; i++, it++)
4f9297b0 713 {
576507e2 714 // Handle books:
da4cc40c 715 if (it->m_Level == 0)
576507e2 716 {
e0952648
VS
717 if (m_hfStyle & wxHF_MERGE_BOOKS)
718 // VS: we don't want book nodes, books' content should
719 // appear under tree's root. This line will create "fake"
720 // record about book node so that the rest of this look
721 // will believe there really _is_ book node and will
722 // behave correctly.
723 roots[1] = roots[0];
724 else
576507e2 725 {
e0952648 726 roots[1] = m_ContentsBox->AppendItem(roots[0],
0c55409f 727 it->m_Name, IMG_Book, -1,
576507e2 728 new wxHtmlHelpTreeItemData(i));
0c55409f 729 m_ContentsBox->SetItemBold(roots[1], TRUE);
576507e2 730 }
e0952648 731 imaged[1] = TRUE;
4f9297b0 732 }
576507e2 733 // ...and their contents:
3379ed37 734 else
576507e2
VS
735 {
736 roots[it->m_Level + 1] = m_ContentsBox->AppendItem(
3379ed37 737 roots[it->m_Level], it->m_Name, IMG_Page,
576507e2 738 -1, new wxHtmlHelpTreeItemData(i));
3379ed37 739 imaged[it->m_Level + 1] = FALSE;
576507e2 740 }
4f9297b0 741
576507e2
VS
742 m_PagesHash->Put(it->GetFullPath(),
743 new wxHtmlHelpHashData(i, roots[it->m_Level + 1]));
744
745 // Set the icon for the node one level up in the hiearachy,
746 // unless already done (see comment above imaged[] declaration)
da4cc40c 747 if (!imaged[it->m_Level])
3379ed37 748 {
576507e2
VS
749 int image = IMG_Folder;
750 if (m_hfStyle & wxHF_ICONS_BOOK)
751 image = IMG_Book;
752 else if (m_hfStyle & wxHF_ICONS_BOOK_CHAPTER)
753 image = (it->m_Level == 1) ? IMG_Book : IMG_Folder;
754 m_ContentsBox->SetItemImage(roots[it->m_Level], image);
755 m_ContentsBox->SetItemSelectedImage(roots[it->m_Level], image);
4f9297b0 756 imaged[it->m_Level] = TRUE;
8ec2b484
HH
757 }
758 }
8ec2b484
HH
759}
760
761
b5a7b000 762void wxHtmlHelpFrame::CreateIndex()
8ec2b484 763{
f0b6a33f 764 if (! m_IndexList)
d5bb85a0 765 return ;
8ec2b484 766
f0b6a33f 767 m_IndexList->Clear();
8ec2b484
HH
768
769 int cnt = m_Data->GetIndexCnt();
f6bcfd97 770
240c2873
VS
771 wxString cnttext;
772 if (cnt > INDEX_IS_SMALL) cnttext.Printf(_("%i of %i"), 0, cnt);
773 else cnttext.Printf(_("%i of %i"), cnt, cnt);
4f9297b0 774 m_IndexCountInfo->SetLabel(cnttext);
f0b6a33f 775 if (cnt > INDEX_IS_SMALL) return;
f6bcfd97 776
8ec2b484
HH
777 wxHtmlContentsItem* index = m_Data->GetIndex();
778
f6bcfd97 779 for (int i = 0; i < cnt; i++)
4f9297b0 780 m_IndexList->Append(index[i].m_Name, (char*)(index + i));
8ec2b484
HH
781}
782
783void wxHtmlHelpFrame::CreateSearch()
784{
785 if (! (m_SearchList && m_SearchChoice))
d5bb85a0 786 return ;
4f9297b0
VS
787 m_SearchList->Clear();
788 m_SearchChoice->Clear();
789 m_SearchChoice->Append(_("Search in all books"));
8ec2b484
HH
790 const wxHtmlBookRecArray& bookrec = m_Data->GetBookRecArray();
791 int i, cnt = bookrec.GetCount();
d5bb85a0
VS
792 for (i = 0; i < cnt; i++)
793 m_SearchChoice->Append(bookrec[i].GetTitle());
8ec2b484
HH
794 m_SearchChoice->SetSelection(0);
795}
796
797
b5a7b000 798void wxHtmlHelpFrame::RefreshLists()
8ec2b484 799{
b5a7b000
VS
800 CreateContents();
801 CreateIndex();
8ec2b484
HH
802 CreateSearch();
803}
804
805void wxHtmlHelpFrame::ReadCustomization(wxConfigBase *cfg, const wxString& path)
806{
807 wxString oldpath;
808 wxString tmp;
809
da4cc40c 810 if (path != wxEmptyString)
4f9297b0
VS
811 {
812 oldpath = cfg->GetPath();
813 cfg->SetPath(_T("/") + path);
8ec2b484
HH
814 }
815
4f9297b0
VS
816 m_Cfg.navig_on = cfg->Read(wxT("hcNavigPanel"), m_Cfg.navig_on) != 0;
817 m_Cfg.sashpos = cfg->Read(wxT("hcSashPos"), m_Cfg.sashpos);
818 m_Cfg.x = cfg->Read(wxT("hcX"), m_Cfg.x);
819 m_Cfg.y = cfg->Read(wxT("hcY"), m_Cfg.y);
820 m_Cfg.w = cfg->Read(wxT("hcW"), m_Cfg.w);
821 m_Cfg.h = cfg->Read(wxT("hcH"), m_Cfg.h);
8ec2b484 822
4f9297b0
VS
823 m_FixedFace = cfg->Read(wxT("hcFixedFace"), m_FixedFace);
824 m_NormalFace = cfg->Read(wxT("hcNormalFace"), m_NormalFace);
825 m_FontSize = cfg->Read(wxT("hcFontSize"), m_FontSize);
83efdf33 826
382e6efe
VS
827 {
828 int i;
829 int cnt;
830 wxString val, s;
f6bcfd97 831
4f9297b0 832 cnt = cfg->Read(wxT("hcBookmarksCnt"), 0L);
da4cc40c 833 if (cnt != 0)
3379ed37 834 {
382e6efe
VS
835 m_BookmarksNames.Clear();
836 m_BookmarksPages.Clear();
da4cc40c 837 if (m_Bookmarks)
3379ed37 838 {
4f9297b0
VS
839 m_Bookmarks->Clear();
840 m_Bookmarks->Append(_("(bookmarks)"));
382e6efe 841 }
f6bcfd97 842
da4cc40c 843 for (i = 0; i < cnt; i++)
3379ed37 844 {
0413cec5 845 val.Printf(wxT("hcBookmark_%i"), i);
4f9297b0 846 s = cfg->Read(val);
382e6efe 847 m_BookmarksNames.Add(s);
4f9297b0 848 if (m_Bookmarks) m_Bookmarks->Append(s);
0413cec5 849 val.Printf(wxT("hcBookmark_%i_url"), i);
4f9297b0 850 s = cfg->Read(val);
382e6efe
VS
851 m_BookmarksPages.Add(s);
852 }
853 }
854 }
855
8ec2b484 856 if (m_HtmlWin)
3e5296e7 857 m_HtmlWin->ReadCustomization(cfg);
8ec2b484
HH
858
859 if (path != wxEmptyString)
4f9297b0 860 cfg->SetPath(oldpath);
8ec2b484
HH
861}
862
863void wxHtmlHelpFrame::WriteCustomization(wxConfigBase *cfg, const wxString& path)
864{
865 wxString oldpath;
866 wxString tmp;
8ec2b484 867
da4cc40c 868 if (path != wxEmptyString)
4f9297b0
VS
869 {
870 oldpath = cfg->GetPath();
871 cfg->SetPath(_T("/") + path);
8ec2b484
HH
872 }
873
4f9297b0
VS
874 cfg->Write(wxT("hcNavigPanel"), m_Cfg.navig_on);
875 cfg->Write(wxT("hcSashPos"), (long)m_Cfg.sashpos);
876 cfg->Write(wxT("hcX"), (long)m_Cfg.x);
877 cfg->Write(wxT("hcY"), (long)m_Cfg.y);
878 cfg->Write(wxT("hcW"), (long)m_Cfg.w);
879 cfg->Write(wxT("hcH"), (long)m_Cfg.h);
880 cfg->Write(wxT("hcFixedFace"), m_FixedFace);
881 cfg->Write(wxT("hcNormalFace"), m_NormalFace);
882 cfg->Write(wxT("hcFontSize"), (long)m_FontSize);
883
da4cc40c 884 if (m_Bookmarks)
4f9297b0 885 {
382e6efe
VS
886 int i;
887 int cnt = m_BookmarksNames.GetCount();
888 wxString val;
f6bcfd97 889
4f9297b0 890 cfg->Write(wxT("hcBookmarksCnt"), (long)cnt);
da4cc40c 891 for (i = 0; i < cnt; i++)
3379ed37 892 {
0413cec5 893 val.Printf(wxT("hcBookmark_%i"), i);
4f9297b0 894 cfg->Write(val, m_BookmarksNames[i]);
0413cec5 895 val.Printf(wxT("hcBookmark_%i_url"), i);
4f9297b0 896 cfg->Write(val, m_BookmarksPages[i]);
382e6efe
VS
897 }
898 }
8ec2b484
HH
899
900 if (m_HtmlWin)
3e5296e7 901 m_HtmlWin->WriteCustomization(cfg);
8ec2b484
HH
902
903 if (path != wxEmptyString)
4f9297b0 904 cfg->SetPath(oldpath);
8ec2b484
HH
905}
906
907
83efdf33
VS
908
909
910
8eb2940f 911static void SetFontsToHtmlWin(wxHtmlWindow *win, wxString scalf, wxString fixf, int size)
83efdf33 912{
f6bcfd97 913 static int f_sizes[5][7] =
83efdf33 914 {
0646614d 915 { 6, 7, 9, 12, 14, 16, 19},
f151e8b5 916 { 8, 9, 12, 14, 16, 19, 22},
83efdf33 917 {10, 12, 14, 16, 19, 24, 32},
0646614d
VS
918 {14, 16, 18, 24, 32, 38, 45},
919 {16, 20, 24, 32, 38, 45, 50}
83efdf33 920 };
f151e8b5 921
4f9297b0 922 win->SetFonts(scalf, fixf, f_sizes[size]);
83efdf33
VS
923}
924
925
926class wxHtmlHelpFrameOptionsDialog : public wxDialog
927{
928 public:
f151e8b5 929 wxComboBox *NormalFont, *FixedFont;
83efdf33
VS
930 wxRadioBox *RadioBox;
931 wxHtmlWindow *TestWin;
932
933 wxHtmlHelpFrameOptionsDialog(wxWindow *parent) : wxDialog(parent, -1, wxString(_("Help Browser Options")))
934 {
0646614d 935 wxString choices[5] = {_("very small"), _("small"), _("medium"), _("large"), _("very large")};
8eb2940f 936 wxBoxSizer *topsizer, *sizer, *sizer2;
83efdf33
VS
937
938 topsizer = new wxBoxSizer(wxVERTICAL);
939
940 sizer = new wxBoxSizer(wxHORIZONTAL);
941
6f67eafe 942 sizer2 = new wxStaticBoxSizer( new wxStaticBox(this, -1, _("Normal font:")), wxVERTICAL);
4f9297b0 943 sizer2->Add(NormalFont = new wxComboBox(this, -1, wxEmptyString, wxDefaultPosition,
f6bcfd97 944 wxSize(200, 200),
382e6efe 945 0, NULL, wxCB_DROPDOWN | wxCB_READONLY),
83efdf33
VS
946 1, wxEXPAND | wxLEFT | wxRIGHT, 10);
947
4f9297b0 948 sizer->Add(sizer2, 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10);
83efdf33 949
6f67eafe 950 sizer2 = new wxStaticBoxSizer( new wxStaticBox(this, -1, _("Fixed font:")), wxVERTICAL);
4f9297b0 951 sizer2->Add(FixedFont = new wxComboBox(this, -1, wxEmptyString, wxDefaultPosition,
f6bcfd97
BP
952 wxSize(200, 200),
953 0, NULL, wxCB_DROPDOWN | wxCB_READONLY),
83efdf33
VS
954 1, wxEXPAND | wxLEFT | wxRIGHT, 10);
955
4f9297b0 956 sizer->Add(sizer2, 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10);
83efdf33 957
4f9297b0 958 topsizer->Add(sizer);
83efdf33 959
4f9297b0 960 topsizer->Add(RadioBox = new wxRadioBox(this, -1, _("Font size:"),
f6bcfd97 961 wxDefaultPosition, wxDefaultSize, 5, choices, 5),
6f67eafe 962 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10);
f6bcfd97 963
4f9297b0 964 topsizer->Add(new wxStaticText(this, -1, _("Preview:")),
83efdf33 965 0, wxLEFT | wxTOP, 10);
33f71b3c 966 topsizer->Add(TestWin = new wxHtmlWindow(this, -1, wxDefaultPosition, wxSize(20, 150),
d6555231 967 wxHW_SCROLLBAR_AUTO | wxSUNKEN_BORDER),
6f67eafe 968 1, wxEXPAND | wxLEFT|wxTOP|wxRIGHT, 10);
83efdf33
VS
969
970 sizer = new wxBoxSizer(wxHORIZONTAL);
33f71b3c
VS
971 wxButton *ok;
972 sizer->Add(ok = new wxButton(this, wxID_OK, _("OK")), 0, wxALL, 10);
973 ok->SetDefault();
4f9297b0
VS
974 sizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel")), 0, wxALL, 10);
975 topsizer->Add(sizer, 0, wxALIGN_RIGHT);
83efdf33
VS
976
977 SetAutoLayout(TRUE);
978 SetSizer(topsizer);
4f9297b0 979 topsizer->Fit(this);
83efdf33
VS
980 Centre(wxBOTH);
981 }
f6bcfd97 982
83efdf33
VS
983
984 void UpdateTestWin()
985 {
986 wxBusyCursor bcur;
f6bcfd97 987 SetFontsToHtmlWin(TestWin,
4f9297b0
VS
988 NormalFont->GetStringSelection(),
989 FixedFont->GetStringSelection(),
990 RadioBox->GetSelection());
991 TestWin->SetPage(_(
f6bcfd97
BP
992"<html><body>\
993Normal face<br>(and <u>underlined</u>. <i>Italic face.</i> \
994<b>Bold face.</b> <b><i>Bold italic face.</i></b><br>\
995<font size=-2>font size -2</font><br>\
996<font size=-1>font size -1</font><br>\
997<font size=+0>font size +0</font><br>\
998<font size=+1>font size +1</font><br>\
999<font size=+2>font size +2</font><br>\
1000<font size=+3>font size +3</font><br>\
1001<font size=+4>font size +4</font><br>\
1002\
1003<p><tt>Fixed size face.<br> <b>bold</b> <i>italic</i> \
1004<b><i>bold italic <u>underlined</u></i></b><br>\
1005<font size=-2>font size -2</font><br>\
1006<font size=-1>font size -1</font><br>\
1007<font size=+0>font size +0</font><br>\
1008<font size=+1>font size +1</font><br>\
1009<font size=+2>font size +2</font><br>\
1010<font size=+3>font size +3</font><br>\
1011<font size=+4>font size +4</font></tt>\
1012</body></html>"
1013 ));
83efdf33
VS
1014 }
1015
33ac7e6f 1016 void OnUpdate(wxCommandEvent& WXUNUSED(event))
83efdf33
VS
1017 {
1018 UpdateTestWin();
1019 }
1020
1021 DECLARE_EVENT_TABLE()
1022};
1023
1024BEGIN_EVENT_TABLE(wxHtmlHelpFrameOptionsDialog, wxDialog)
f151e8b5 1025 EVT_COMBOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate)
83efdf33 1026 EVT_RADIOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate)
83efdf33
VS
1027END_EVENT_TABLE()
1028
1029
1030void wxHtmlHelpFrame::OptionsDialog()
1031{
1032 wxHtmlHelpFrameOptionsDialog dlg(this);
1033 unsigned i;
f6bcfd97 1034
da4cc40c 1035 if (m_NormalFonts == NULL)
4f9297b0 1036 {
83efdf33
VS
1037 wxFontEnumerator enu;
1038 enu.EnumerateFacenames();
1039 m_NormalFonts = new wxArrayString;
1040 *m_NormalFonts = *enu.GetFacenames();
4f9297b0 1041 m_NormalFonts->Sort();
83efdf33 1042 }
da4cc40c 1043 if (m_FixedFonts == NULL)
4f9297b0 1044 {
83efdf33
VS
1045 wxFontEnumerator enu;
1046 enu.EnumerateFacenames(wxFONTENCODING_SYSTEM, TRUE);
1047 m_FixedFonts = new wxArrayString;
1048 *m_FixedFonts = *enu.GetFacenames();
4f9297b0 1049 m_FixedFonts->Sort();
83efdf33 1050 }
f6bcfd97 1051
4f9297b0
VS
1052 for (i = 0; i < m_NormalFonts->GetCount(); i++)
1053 dlg.NormalFont->Append((*m_NormalFonts)[i]);
1054 for (i = 0; i < m_FixedFonts->GetCount(); i++)
1055 dlg.FixedFont->Append((*m_FixedFonts)[i]);
1056 if (!m_NormalFace.IsEmpty()) dlg.NormalFont->SetStringSelection(m_NormalFace);
1057 else dlg.NormalFont->SetSelection(0);
1058 if (!m_FixedFace.IsEmpty()) dlg.FixedFont->SetStringSelection(m_FixedFace);
1059 else dlg.FixedFont->SetSelection(0);
1060 dlg.RadioBox->SetSelection(m_FontSize);
83efdf33 1061 dlg.UpdateTestWin();
f6bcfd97 1062
da4cc40c 1063 if (dlg.ShowModal() == wxID_OK)
4f9297b0
VS
1064 {
1065 m_NormalFace = dlg.NormalFont->GetStringSelection();
1066 m_FixedFace = dlg.FixedFont->GetStringSelection();
1067 m_FontSize = dlg.RadioBox->GetSelection();
8eb2940f 1068 SetFontsToHtmlWin(m_HtmlWin, m_NormalFace, m_FixedFace, m_FontSize);
83efdf33
VS
1069 }
1070}
1071
1072
1073
0646614d
VS
1074void wxHtmlHelpFrame::NotifyPageChanged()
1075{
1076 if (m_UpdateContents && m_PagesHash)
1077 {
4f9297b0 1078 wxString an = m_HtmlWin->GetOpenedAnchor();
0646614d
VS
1079 wxHtmlHelpHashData *ha;
1080 if (an.IsEmpty())
4f9297b0 1081 ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage());
0646614d 1082 else
4f9297b0 1083 ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage() + wxT("#") + an);
0646614d
VS
1084 if (ha)
1085 {
1086 bool olduc = m_UpdateContents;
1087 m_UpdateContents = FALSE;
4f9297b0
VS
1088 m_ContentsBox->SelectItem(ha->m_Id);
1089 m_ContentsBox->EnsureVisible(ha->m_Id);
0646614d
VS
1090 m_UpdateContents = olduc;
1091 }
1092 }
1093}
1094
83efdf33
VS
1095
1096
8ec2b484
HH
1097/*
1098EVENT HANDLING :
1099*/
1100
1101
d45bc436
RR
1102void wxHtmlHelpFrame::OnActivate(wxActivateEvent& event)
1103{
1104 // This saves one mouse click when using the
1105 // wxHTML for context sensitive help systems
1106 if (event.GetActive() && m_HtmlWin)
1107 m_HtmlWin->SetFocus();
1108}
1109
8ec2b484
HH
1110void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event)
1111{
da4cc40c 1112 switch (event.GetId())
4f9297b0 1113 {
8ec2b484 1114 case wxID_HTML_BACK :
4f9297b0 1115 m_HtmlWin->HistoryBack();
0646614d 1116 NotifyPageChanged();
8ec2b484 1117 break;
382e6efe 1118
8ec2b484 1119 case wxID_HTML_FORWARD :
4f9297b0 1120 m_HtmlWin->HistoryForward();
0646614d
VS
1121 NotifyPageChanged();
1122 break;
f6bcfd97
BP
1123
1124 case wxID_HTML_UP :
1125 if (m_PagesHash)
0646614d 1126 {
4f9297b0 1127 wxString an = m_HtmlWin->GetOpenedAnchor();
0646614d
VS
1128 wxHtmlHelpHashData *ha;
1129 if (an.IsEmpty())
4f9297b0 1130 ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage());
0646614d 1131 else
4f9297b0
VS
1132 ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage() + wxT("#") + an);
1133 if (ha && ha->m_Index > 0)
0646614d 1134 {
4f9297b0 1135 wxHtmlContentsItem *it = m_Data->GetContents() + (ha->m_Index - 1);
7df9fbc3
JS
1136 if (it->m_Page[0] != 0)
1137 {
468ae730 1138 m_HtmlWin->LoadPage(it->GetFullPath());
7df9fbc3
JS
1139 NotifyPageChanged();
1140 }
0646614d
VS
1141 }
1142 }
1143 break;
1144
f6bcfd97
BP
1145 case wxID_HTML_UPNODE :
1146 if (m_PagesHash)
0646614d 1147 {
4f9297b0 1148 wxString an = m_HtmlWin->GetOpenedAnchor();
0646614d
VS
1149 wxHtmlHelpHashData *ha;
1150 if (an.IsEmpty())
4f9297b0 1151 ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage());
0646614d 1152 else
4f9297b0
VS
1153 ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage() + wxT("#") + an);
1154 if (ha && ha->m_Index > 0)
0646614d 1155 {
4f9297b0 1156 int level = m_Data->GetContents()[ha->m_Index].m_Level - 1;
0646614d 1157 wxHtmlContentsItem *it;
4f9297b0 1158 int ind = ha->m_Index - 1;
f6bcfd97 1159
4f9297b0
VS
1160 it = m_Data->GetContents() + ind;
1161 while (ind >= 0 && it->m_Level != level) ind--, it--;
0646614d
VS
1162 if (ind >= 0)
1163 {
7df9fbc3
JS
1164 if (it->m_Page[0] != 0)
1165 {
468ae730 1166 m_HtmlWin->LoadPage(it->GetFullPath());
7df9fbc3
JS
1167 NotifyPageChanged();
1168 }
0646614d
VS
1169 }
1170 }
1171 }
1172 break;
1173
f6bcfd97
BP
1174 case wxID_HTML_DOWN :
1175 if (m_PagesHash)
0646614d 1176 {
4f9297b0 1177 wxString an = m_HtmlWin->GetOpenedAnchor();
721ab905 1178 wxString adr;
0646614d 1179 wxHtmlHelpHashData *ha;
f6bcfd97 1180
4f9297b0
VS
1181 if (an.IsEmpty()) adr = m_HtmlWin->GetOpenedPage();
1182 else adr = m_HtmlWin->GetOpenedPage() + wxT("#") + an;
721ab905 1183
4f9297b0 1184 ha = (wxHtmlHelpHashData*) m_PagesHash->Get(adr);
0646614d 1185
4f9297b0 1186 if (ha && ha->m_Index < m_Data->GetContentsCnt() - 1)
0646614d 1187 {
4f9297b0 1188 wxHtmlContentsItem *it = m_Data->GetContents() + (ha->m_Index + 1);
f6bcfd97 1189
468ae730 1190 while (it->GetFullPath() == adr) it++;
7df9fbc3
JS
1191
1192 if (it->m_Page[0] != 0)
1193 {
468ae730 1194 m_HtmlWin->LoadPage(it->GetFullPath());
7df9fbc3
JS
1195 NotifyPageChanged();
1196 }
0646614d
VS
1197 }
1198 }
8ec2b484 1199 break;
382e6efe 1200
8ec2b484 1201 case wxID_HTML_PANEL :
0646614d
VS
1202 {
1203 if (! (m_Splitter && m_NavigPan))
1204 return ;
da4cc40c 1205 if (m_Splitter->IsSplit())
3379ed37 1206 {
4f9297b0
VS
1207 m_Cfg.sashpos = m_Splitter->GetSashPosition();
1208 m_Splitter->Unsplit(m_NavigPan);
0646614d 1209 m_Cfg.navig_on = FALSE;
da4cc40c 1210 }
3379ed37
VZ
1211 else
1212 {
4f9297b0
VS
1213 m_NavigPan->Show(TRUE);
1214 m_HtmlWin->Show(TRUE);
1215 m_Splitter->SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
0646614d
VS
1216 m_Cfg.navig_on = TRUE;
1217 }
8ec2b484
HH
1218 }
1219 break;
382e6efe 1220
83efdf33
VS
1221 case wxID_HTML_OPTIONS :
1222 OptionsDialog();
1223 break;
f6bcfd97
BP
1224
1225 case wxID_HTML_BOOKMARKSADD :
382e6efe
VS
1226 {
1227 wxString item;
1228 wxString url;
f6bcfd97 1229
4f9297b0
VS
1230 item = m_HtmlWin->GetOpenedPageTitle();
1231 url = m_HtmlWin->GetOpenedPage();
da4cc40c 1232 if (item == wxEmptyString)
3379ed37 1233 item = url.AfterLast(wxT('/'));
da4cc40c 1234 if (m_BookmarksPages.Index(url) == wxNOT_FOUND)
3379ed37 1235 {
4f9297b0 1236 m_Bookmarks->Append(item);
382e6efe
VS
1237 m_BookmarksNames.Add(item);
1238 m_BookmarksPages.Add(url);
1239 }
1240 }
1241 break;
f6bcfd97
BP
1242
1243 case wxID_HTML_BOOKMARKSREMOVE :
382e6efe
VS
1244 {
1245 wxString item;
1246 int pos;
f6bcfd97 1247
4f9297b0 1248 item = m_Bookmarks->GetStringSelection();
382e6efe 1249 pos = m_BookmarksNames.Index(item);
da4cc40c 1250 if (pos != wxNOT_FOUND)
3379ed37 1251 {
382e6efe
VS
1252 m_BookmarksNames.Remove(pos);
1253 m_BookmarksPages.Remove(pos);
4f9297b0 1254 m_Bookmarks->Delete(m_Bookmarks->GetSelection());
382e6efe
VS
1255 }
1256 }
1257 break;
0646614d
VS
1258
1259#if wxUSE_PRINTING_ARCHITECTURE
1260 case wxID_HTML_PRINT :
1261 {
f6bcfd97 1262 if (m_Printer == NULL)
0646614d 1263 m_Printer = new wxHtmlEasyPrinting(_("Help Printing"), this);
4f9297b0 1264 if (!m_HtmlWin->GetOpenedPage())
f5ba273e
VS
1265 wxLogWarning(_("Cannot print empty page."));
1266 else
4f9297b0 1267 m_Printer->PrintFile(m_HtmlWin->GetOpenedPage());
0646614d
VS
1268 }
1269 break;
1270#endif
1271
1272 case wxID_HTML_OPENFILE :
1273 {
f6bcfd97
BP
1274 wxString s = wxFileSelector(_("Open HTML document"),
1275 wxEmptyString,
1276 wxEmptyString,
1277 wxEmptyString,
1278 _(
1279"HTML files (*.htm)|*.htm|HTML files (*.html)|*.html|\
1280Help books (*.htb)|*.htb|Help books (*.zip)|*.zip|\
1281HTML Help Project (*.hhp)|*.hhp|\
1282All files (*.*)|*"
1283 ),
1284 wxOPEN | wxFILE_MUST_EXIST,
1285 this);
0646614d
VS
1286 if (!s.IsEmpty())
1287 {
1288 wxString ext = s.Right(4).Lower();
1289 if (ext == _T(".zip") || ext == _T(".htb") || ext == _T(".hhp"))
1290 {
1291 wxBusyCursor bcur;
4f9297b0 1292 m_Data->AddBook(s);
0646614d
VS
1293 RefreshLists();
1294 }
1295 else
4f9297b0 1296 m_HtmlWin->LoadPage(s);
0646614d
VS
1297 }
1298 }
1299 break;
8ec2b484
HH
1300 }
1301}
1302
1303
1304
1305void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent& event)
1306{
1307 wxHtmlHelpTreeItemData *pg;
0646614d 1308 wxHtmlContentsItem *it;
8ec2b484 1309
4f9297b0 1310 pg = (wxHtmlHelpTreeItemData*) m_ContentsBox->GetItemData(event.GetItem());
f6bcfd97
BP
1311
1312 if (pg && m_UpdateContents)
0646614d 1313 {
4f9297b0 1314 it = m_Data->GetContents() + (pg->m_Id);
0646614d 1315 m_UpdateContents = FALSE;
7df9fbc3 1316 if (it->m_Page[0] != 0)
468ae730 1317 m_HtmlWin->LoadPage(it->GetFullPath());
0646614d
VS
1318 m_UpdateContents = TRUE;
1319 }
8ec2b484
HH
1320}
1321
1322
1323
a4c97004 1324void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent& WXUNUSED(event))
8ec2b484 1325{
4f9297b0 1326 wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_IndexList->GetClientData(m_IndexList->GetSelection());
7df9fbc3 1327 if (it->m_Page[0] != 0)
468ae730 1328 m_HtmlWin->LoadPage(it->GetFullPath());
0646614d 1329 NotifyPageChanged();
8ec2b484
HH
1330}
1331
1332
f0b6a33f
VS
1333void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent& event)
1334{
4f9297b0 1335 wxString sr = m_IndexText->GetLineText(0);
240c2873 1336 sr.MakeLower();
f6bcfd97 1337 if (sr == wxEmptyString)
4f9297b0 1338 {
f0b6a33f 1339 OnIndexAll(event);
4f9297b0 1340 }
da4cc40c 1341 else
4f9297b0 1342 {
f0b6a33f
VS
1343 wxBusyCursor bcur;
1344 const wxChar *cstr = sr.c_str();
33ac7e6f 1345 wxChar mybuff[512];
3379ed37 1346 wxChar *ptr;
f0b6a33f 1347 bool first = TRUE;
f6bcfd97 1348
f0b6a33f
VS
1349 m_IndexList->Clear();
1350 int cnt = m_Data->GetIndexCnt();
1351 wxHtmlContentsItem* index = m_Data->GetIndex();
1352
240c2873 1353 int displ = 0;
f0b6a33f 1354 for (int i = 0; i < cnt; i++)
240c2873
VS
1355 {
1356 wxStrncpy(mybuff, index[i].m_Name, 512);
f6bcfd97
BP
1357 mybuff[511] = _T('\0');
1358 for (ptr = mybuff; *ptr != 0; ptr++)
1359 if (*ptr >= _T('A') && *ptr <= _T('Z'))
1360 *ptr -= (wxChar)(_T('A') - _T('a'));
da4cc40c 1361 if (wxStrstr(mybuff, cstr) != NULL)
3379ed37 1362 {
4f9297b0 1363 m_IndexList->Append(index[i].m_Name, (char*)(index + i));
240c2873 1364 displ++;
da4cc40c 1365 if (first)
3379ed37 1366 {
7df9fbc3 1367 if (index[i].m_Page[0] != 0)
468ae730 1368 m_HtmlWin->LoadPage(index[i].GetFullPath());
0646614d 1369 NotifyPageChanged();
f0b6a33f
VS
1370 first = FALSE;
1371 }
1372 }
240c2873
VS
1373 }
1374
1375 wxString cnttext;
1376 cnttext.Printf(_("%i of %i"), displ, cnt);
4f9297b0 1377 m_IndexCountInfo->SetLabel(cnttext);
f0b6a33f 1378
4f9297b0
VS
1379 m_IndexText->SetSelection(0, sr.Length());
1380 m_IndexText->SetFocus();
f0b6a33f
VS
1381 }
1382}
1383
1384void wxHtmlHelpFrame::OnIndexAll(wxCommandEvent& WXUNUSED(event))
1385{
1386 wxBusyCursor bcur;
f6bcfd97 1387
f0b6a33f
VS
1388 m_IndexList->Clear();
1389 int cnt = m_Data->GetIndexCnt();
1390 bool first = TRUE;
1391 wxHtmlContentsItem* index = m_Data->GetIndex();
1392
da4cc40c 1393 for (int i = 0; i < cnt; i++)
4f9297b0
VS
1394 {
1395 m_IndexList->Append(index[i].m_Name, (char*)(index + i));
da4cc40c 1396 if (first)
3379ed37 1397 {
7df9fbc3 1398 if (index[i].m_Page[0] != 0)
468ae730 1399 m_HtmlWin->LoadPage(index[i].GetFullPath());
0646614d 1400 NotifyPageChanged();
f0b6a33f
VS
1401 first = FALSE;
1402 }
1403 }
240c2873
VS
1404
1405 wxString cnttext;
1406 cnttext.Printf(_("%i of %i"), cnt, cnt);
4f9297b0 1407 m_IndexCountInfo->SetLabel(cnttext);
f0b6a33f
VS
1408}
1409
8ec2b484 1410
a4c97004 1411void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent& WXUNUSED(event))
8ec2b484 1412{
4f9297b0 1413 wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_SearchList->GetClientData(m_SearchList->GetSelection());
f6bcfd97 1414 if (it)
0646614d 1415 {
7df9fbc3 1416 if (it->m_Page[0] != 0)
468ae730 1417 m_HtmlWin->LoadPage(it->GetFullPath());
0646614d
VS
1418 NotifyPageChanged();
1419 }
8ec2b484
HH
1420}
1421
a4c97004 1422void wxHtmlHelpFrame::OnSearch(wxCommandEvent& WXUNUSED(event))
8ec2b484 1423{
4f9297b0 1424 wxString sr = m_SearchText->GetLineText(0);
8ec2b484
HH
1425
1426 if (sr != wxEmptyString) KeywordSearch(sr);
1427}
1428
382e6efe
VS
1429void wxHtmlHelpFrame::OnBookmarksSel(wxCommandEvent& WXUNUSED(event))
1430{
4f9297b0 1431 wxString sr = m_Bookmarks->GetStringSelection();
382e6efe 1432
ae80f837 1433 if (sr != wxEmptyString && sr != _("(bookmarks)"))
0646614d 1434 {
4f9297b0 1435 m_HtmlWin->LoadPage(m_BookmarksPages[m_BookmarksNames.Index(sr)]);
0646614d
VS
1436 NotifyPageChanged();
1437 }
382e6efe
VS
1438}
1439
8ec2b484
HH
1440void wxHtmlHelpFrame::OnCloseWindow(wxCloseEvent& evt)
1441{
68364659
VS
1442 GetSize(&m_Cfg.w, &m_Cfg.h);
1443 GetPosition(&m_Cfg.x, &m_Cfg.y);
5c172c17 1444
5152b0e5
JS
1445#ifdef __WXGTK__
1446 if (IsGrabbed())
1447 {
1448 RemoveGrab();
1449 }
1450#endif
1451
4f9297b0 1452 if (m_Splitter && m_Cfg.navig_on) m_Cfg.sashpos = m_Splitter->GetSashPosition();
68364659 1453
d5bb85a0
VS
1454 if (m_Config)
1455 WriteCustomization(m_Config, m_ConfigRoot);
68364659 1456
b4414c1f
JS
1457 if (m_helpController && m_helpController->IsKindOf(CLASSINFO(wxHtmlHelpController)))
1458 {
1459 ((wxHtmlHelpController*) m_helpController)->OnCloseFrame(evt);
1460 }
1461
8ec2b484
HH
1462 evt.Skip();
1463}
1464
1465BEGIN_EVENT_TABLE(wxHtmlHelpFrame, wxFrame)
d45bc436 1466 EVT_ACTIVATE(wxHtmlHelpFrame::OnActivate)
ae80f837
VS
1467 EVT_TOOL_RANGE(wxID_HTML_PANEL, wxID_HTML_OPTIONS, wxHtmlHelpFrame::OnToolbar)
1468 EVT_BUTTON(wxID_HTML_BOOKMARKSREMOVE, wxHtmlHelpFrame::OnToolbar)
1469 EVT_BUTTON(wxID_HTML_BOOKMARKSADD, wxHtmlHelpFrame::OnToolbar)
8ec2b484
HH
1470 EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL, wxHtmlHelpFrame::OnContentsSel)
1471 EVT_LISTBOX(wxID_HTML_INDEXLIST, wxHtmlHelpFrame::OnIndexSel)
1472 EVT_LISTBOX(wxID_HTML_SEARCHLIST, wxHtmlHelpFrame::OnSearchSel)
1473 EVT_BUTTON(wxID_HTML_SEARCHBUTTON, wxHtmlHelpFrame::OnSearch)
1474 EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT, wxHtmlHelpFrame::OnSearch)
f0b6a33f
VS
1475 EVT_BUTTON(wxID_HTML_INDEXBUTTON, wxHtmlHelpFrame::OnIndexFind)
1476 EVT_TEXT_ENTER(wxID_HTML_INDEXTEXT, wxHtmlHelpFrame::OnIndexFind)
1477 EVT_BUTTON(wxID_HTML_INDEXBUTTONALL, wxHtmlHelpFrame::OnIndexAll)
382e6efe 1478 EVT_COMBOBOX(wxID_HTML_BOOKMARKSLIST, wxHtmlHelpFrame::OnBookmarksSel)
f6bcfd97 1479 EVT_CLOSE(wxHtmlHelpFrame::OnCloseWindow)
8ec2b484
HH
1480END_EVENT_TABLE()
1481
3379ed37
VZ
1482#endif // wxUSE_WXHTML_HELP
1483