]> git.saurik.com Git - wxWidgets.git/blob - src/html/helpfrm.cpp
usleep() prototype added for solaris
[wxWidgets.git] / src / html / helpfrm.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: helpfrm.cpp
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
7 // RCS-ID: $Id$
8 // Copyright: (c) Harm van der Heijden and Vaclav Slavik
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h"
17
18 #include "wx/wxprec.h"
19
20 #ifdef __BORLANDC__
21 #pragma hdrstop
22 #endif
23
24 #include "wx/defs.h"
25
26 #if wxUSE_HTML
27 #ifndef WXPRECOMP
28 #include "wx/wx.h"
29 #endif
30
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"
41
42 // Bitmaps:
43
44 #ifndef __WXMSW__
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"
53 #endif
54
55 #include "wx/stream.h"
56
57 // number of times that the contents/index creation progress dialog
58 // is updated.
59 #define PROGRESS_STEP 40
60
61 //--------------------------------------------------------------------------
62 // wxHtmlHelpTreeItemData
63 //--------------------------------------------------------------------------
64
65 class wxHtmlHelpTreeItemData : public wxTreeItemData
66 {
67 private:
68 wxString m_Page;
69
70 public:
71 wxHtmlHelpTreeItemData(wxHtmlContentsItem *it) : wxTreeItemData()
72 {
73 m_Page = it -> m_Book -> GetBasePath() + it -> m_Page;
74 }
75 const wxString& GetPage() { return m_Page; }
76 };
77
78 //---------------------------------------------------------------------------
79 // wxHtmlHelpFrame
80 //---------------------------------------------------------------------------
81
82 IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpFrame, wxFrame)
83
84 wxHtmlHelpFrame::wxHtmlHelpFrame(wxWindow* parent, wxWindowID id, const wxString& title,
85 int style, wxHtmlHelpData* data)
86 {
87 Init(data);
88 Create(parent, id, title, style);
89 }
90
91 void wxHtmlHelpFrame::Init(wxHtmlHelpData* data)
92 {
93 if (data) {
94 m_Data = data;
95 m_DataCreated = FALSE;
96 } else {
97 m_Data = new wxHtmlHelpData();
98 m_DataCreated = TRUE;
99 }
100
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));
106
107 m_ContentsBox = NULL;
108 m_IndexBox = NULL;
109 m_SearchList = NULL;
110 m_SearchButton = NULL;
111 m_SearchText = NULL;
112 m_SearchChoice = NULL;
113 m_Splitter = NULL;
114 m_NavigPan = NULL;
115 m_HtmlWin = NULL;
116 m_Config = NULL;
117 m_ConfigRoot = wxEmptyString;
118
119 m_Cfg.x = m_Cfg.y = 0;
120 m_Cfg.w = 700;
121 m_Cfg.h = 480;
122 m_Cfg.sashpos = 240;
123 m_Cfg.navig_on = TRUE;
124 }
125
126 // Create: builds the GUI components.
127 // with the style flag it's possible to toggle the toolbar, contents, index and search
128 // controls.
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)
134
135 bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, const wxString& title,
136 int style)
137 {
138 // Do the config in two steps. We read the HtmlWindow customization after we
139 // create the window.
140 if (m_Config)
141 ReadCustomization(m_Config, m_ConfigRoot);
142
143 wxFrame::Create(parent, id, _("Help"), wxPoint(m_Cfg.x, m_Cfg.y), wxSize(m_Cfg.w, m_Cfg.h));
144
145 #if defined(__WXMSW__) || (__WXPM__)
146 wxIcon frameIcon("wxhelp", wxBITMAP_TYPE_ICO_RESOURCE, 32, 32);
147 #else
148 wxIcon frameIcon(help_xpm);
149 #endif
150 if (frameIcon.Ok())
151 SetIcon(frameIcon);
152
153 GetPosition(&m_Cfg.x, &m_Cfg.y);
154
155 SetIcon(wxICON(help));
156
157 int notebook_page = 0;
158
159 CreateStatusBar();
160
161 // toolbar?
162 if (style & wxHF_TOOLBAR) {
163 wxToolBar *toolBar = CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL | /*wxTB_FLAT | */
164 wxTB_DOCKABLE);
165 toolBar -> SetMargins(2, 2);
166 wxBitmap* toolBarBitmaps[3];
167
168 #if defined(__WXMSW__) || (__WXPM__)
169 toolBarBitmaps[0] = new wxBitmap("panel");
170 toolBarBitmaps[1] = new wxBitmap("back");
171 toolBarBitmaps[2] = new wxBitmap("forward");
172 int width = 24;
173 #else
174 toolBarBitmaps[0] = new wxBitmap(panel_xpm);
175 toolBarBitmaps[1] = new wxBitmap(back_xpm);
176 toolBarBitmaps[2] = new wxBitmap(forward_xpm);
177 int width = 16;
178 #endif
179
180 int currentX = 5;
181
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;
195
196 toolBar -> Realize();
197
198 // Can delete the bitmaps since they're reference counted
199 for (int i = 0; i < 3; i++)
200 delete toolBarBitmaps[i];
201 }
202
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);
207
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);
213 }
214
215 m_HtmlWin -> SetRelatedFrame(this, m_TitleFormat);
216 m_HtmlWin -> SetRelatedStatusBar(0);
217 if (m_Config)
218 m_HtmlWin -> ReadCustomization(m_Config, m_ConfigRoot);
219
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++;
228 }
229
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++;
244 }
245
246 // search list panel?
247 if (style & wxHF_SEARCH) {
248 wxWindow *dummy = new wxPanel(m_NavigPan, wxID_HTML_SEARCHPAGE);
249
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);
255 b1 -> height.AsIs();
256 m_SearchText -> SetConstraints(b1);
257
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);
262 b2 -> width.AsIs();
263 b2 -> height.AsIs();
264 m_SearchButton -> SetConstraints(b2);
265
266 wxLayoutConstraints *b3 = new wxLayoutConstraints;
267 m_SearchList = new wxListBox(dummy, wxID_HTML_SEARCHLIST, wxDefaultPosition, wxDefaultSize, 0);
268 b3 -> top.Below (m_SearchButton, 10);
269 b3 -> left.SameAs (dummy, wxLeft, 0);
270 b3 -> right.SameAs (dummy, wxRight, 0);
271 b3 -> bottom.SameAs (dummy, wxBottom, 0);
272 m_SearchList -> SetConstraints(b3);
273
274 wxLayoutConstraints *b4 = new wxLayoutConstraints;
275 m_SearchChoice = new wxChoice(dummy, wxID_HTML_SEARCHCHOICE, wxDefaultPosition,
276 wxDefaultSize);
277 b4 -> top.Below (m_SearchText, 10);
278 b4 -> left.SameAs (m_SearchButton, wxRight, 10);
279 b4 -> right.SameAs (dummy, wxRight, 10);
280 b4 -> height.AsIs();
281 m_SearchChoice -> SetConstraints(b4);
282
283 dummy -> SetAutoLayout(TRUE);
284 dummy -> Layout();
285 m_NavigPan -> AddPage(dummy, _("Search"));
286 m_SearchPage = notebook_page++;
287 }
288 m_HtmlWin -> Show(TRUE);
289
290 //RefreshLists();
291
292 // showtime
293 if (m_NavigPan && m_Splitter) {
294 m_Splitter -> SetMinimumPaneSize(20);
295 if (m_Cfg.navig_on) {
296 m_NavigPan -> Show(TRUE);
297 m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
298 }
299 else {
300 m_NavigPan -> Show(FALSE);
301 m_Splitter -> Initialize(m_HtmlWin);
302 }
303 }
304 return TRUE;
305 }
306
307 wxHtmlHelpFrame::~wxHtmlHelpFrame()
308 {
309 delete m_ContentsImageList;
310 if (m_DataCreated)
311 delete m_Data;
312 }
313
314 bool wxHtmlHelpFrame::Display(const wxString& x)
315 {
316 wxString url = m_Data->FindPageByName(x);
317 if (! url.IsEmpty()) {
318 m_HtmlWin->LoadPage(url);
319 return TRUE;
320 }
321 return FALSE;
322 }
323
324 bool wxHtmlHelpFrame::Display(const int id)
325 {
326 wxString url = m_Data->FindPageById(id);
327 if (! url.IsEmpty()) {
328 m_HtmlWin->LoadPage(url);
329 return TRUE;
330 }
331 return FALSE;
332 }
333
334
335
336 bool wxHtmlHelpFrame::DisplayContents()
337 {
338 if (! m_ContentsBox)
339 return FALSE;
340 if (!m_Splitter -> IsSplit()) {
341 m_NavigPan -> Show(TRUE);
342 m_HtmlWin -> Show(TRUE);
343 m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
344 m_Cfg.navig_on = TRUE;
345 }
346 m_NavigPan -> SetSelection(0);
347 return TRUE;
348 }
349
350
351
352 bool wxHtmlHelpFrame::DisplayIndex()
353 {
354 if (! m_IndexBox)
355 return FALSE;
356 if (!m_Splitter -> IsSplit()) {
357 m_NavigPan -> Show(TRUE);
358 m_HtmlWin -> Show(TRUE);
359 m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
360 }
361 m_NavigPan -> SetSelection(1);
362 return TRUE;
363 }
364
365 bool wxHtmlHelpFrame::KeywordSearch(const wxString& keyword)
366 {
367 if (! (m_SearchList && m_SearchButton && m_SearchText && m_SearchChoice))
368 return FALSE;
369
370 int foundcnt = 0;
371 wxString foundstr;
372 wxString book = wxEmptyString;
373
374 if (!m_Splitter -> IsSplit()) {
375 m_NavigPan -> Show(TRUE);
376 m_HtmlWin -> Show(TRUE);
377 m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
378 }
379 m_NavigPan -> SetSelection(m_SearchPage);
380 m_SearchList -> Clear();
381 m_SearchText -> SetValue(keyword);
382 m_SearchButton -> Enable(FALSE);
383
384 if (m_SearchChoice->GetSelection() != 0)
385 book = m_SearchChoice->GetStringSelection();
386
387 wxHtmlSearchStatus status(m_Data, keyword, book);
388
389 wxProgressDialog progress(_("Searching..."), _("No matching page found yet"),
390 status.GetMaxIndex(), this,
391 wxPD_APP_MODAL | wxPD_CAN_ABORT | wxPD_AUTO_HIDE);
392
393 while (status.IsActive()) {
394 if (progress.Update(status.GetCurIndex()) == FALSE)
395 break;
396 if (status.Search()) {
397 foundstr.Printf(_("Found %i matches"), ++foundcnt);
398 progress.Update(status.GetCurIndex(), foundstr);
399 m_SearchList -> Append(status.GetName(), status.GetContentsItem());
400 }
401 wxYield();
402 }
403
404 m_SearchButton -> Enable(TRUE);
405 m_SearchText -> SetSelection(0, keyword.Length());
406 m_SearchText -> SetFocus();
407 if (foundcnt) {
408 wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_SearchList -> GetClientData(0);
409 if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
410 }
411 return (foundcnt > 0);
412 }
413
414 #define MAX_ROOTS 64
415
416 void wxHtmlHelpFrame::CreateContents(bool show_progress)
417 {
418 if (! m_ContentsBox)
419 return ;
420
421 wxProgressDialog *progress;
422 wxString proginfo;
423
424 m_ContentsBox->Clear();
425
426 int cnt = m_Data->GetContentsCnt();
427 int div = (cnt / PROGRESS_STEP) + 1;
428 int i;
429
430 wxHtmlContentsItem *it = m_Data->GetContents();
431
432 if (show_progress)
433 progress = new wxProgressDialog(_("Building contents tree..."), wxEmptyString,
434 cnt, this, wxPD_APP_MODAL | wxPD_CAN_ABORT |
435 wxPD_AUTO_HIDE);
436
437 wxTreeItemId roots[MAX_ROOTS];
438 bool imaged[MAX_ROOTS];
439
440 m_ContentsBox -> DeleteAllItems();
441 roots[0] = m_ContentsBox -> AddRoot(_("(Help)"));
442 m_ContentsBox -> SetItemImage(roots[0], IMG_RootFolder);
443 m_ContentsBox -> SetItemSelectedImage(roots[0], IMG_RootFolder);
444 imaged[0] = TRUE;
445
446 for (i = 0; i < cnt; i++, it++) {
447 if (show_progress && ((i % div) == 0)) {
448 proginfo.Printf(_("Added %d/%d items"), i, cnt);
449 if (! progress->Update(i, proginfo))
450 break;
451 wxYield();
452 }
453 roots[it -> m_Level + 1] = m_ContentsBox -> AppendItem(
454 roots[it -> m_Level], it -> m_Name, IMG_Page, -1,
455 new wxHtmlHelpTreeItemData(it));
456
457 if (it -> m_Level == 0) {
458 m_ContentsBox -> SetItemBold(roots[1], TRUE);
459 m_ContentsBox -> SetItemImage(roots[1], IMG_Book);
460 m_ContentsBox -> SetItemSelectedImage(roots[1], IMG_Book);
461 imaged[1] = TRUE;
462 } else imaged[it -> m_Level + 1] = FALSE;
463
464 if (!imaged[it -> m_Level]) {
465 m_ContentsBox -> SetItemImage(roots[it -> m_Level], IMG_Folder);
466 m_ContentsBox -> SetItemSelectedImage(roots[it -> m_Level], IMG_Folder);
467 imaged[it -> m_Level] = TRUE;
468 }
469 }
470 if (show_progress)
471 delete progress;
472 m_ContentsBox -> Expand(roots[0]);
473 }
474
475
476 void wxHtmlHelpFrame::CreateIndex(bool show_progress)
477 {
478 if (! m_IndexBox)
479 return ;
480
481 wxProgressDialog *progress;
482 wxString proginfo;
483
484 m_IndexBox->Clear();
485
486 int cnt = m_Data->GetIndexCnt();
487 int div = (cnt / PROGRESS_STEP) + 1;
488
489 wxHtmlContentsItem* index = m_Data->GetIndex();
490
491 if (show_progress)
492 progress = new wxProgressDialog(_("Building index list..."), wxEmptyString,
493 cnt, this, wxPD_APP_MODAL | wxPD_CAN_ABORT |
494 wxPD_AUTO_HIDE);
495 for (int i = 0; i < cnt; i++) {
496 if (show_progress && ((i % div) == 0)) {
497 proginfo.Printf(_("Added %d/%d items"), i, cnt);
498 if (! progress->Update(i, proginfo))
499 break;
500 wxYield();
501 }
502 m_IndexBox -> Append(index[i].m_Name, (char*)(index + i));
503 }
504
505 if (show_progress)
506 delete progress;
507 }
508
509 void wxHtmlHelpFrame::CreateSearch()
510 {
511 if (! (m_SearchList && m_SearchChoice))
512 return ;
513 m_SearchList -> Clear();
514 m_SearchChoice -> Clear();
515 m_SearchChoice -> Append(_("all books"));
516 const wxHtmlBookRecArray& bookrec = m_Data->GetBookRecArray();
517 int i, cnt = bookrec.GetCount();
518 for (i = 0; i < cnt; i++)
519 m_SearchChoice->Append(bookrec[i].GetTitle());
520 m_SearchChoice->SetSelection(0);
521 }
522
523
524 void wxHtmlHelpFrame::RefreshLists(bool show_progress)
525 {
526 CreateContents(show_progress);
527 CreateIndex(show_progress);
528 CreateSearch();
529 }
530
531 void wxHtmlHelpFrame::ReadCustomization(wxConfigBase *cfg, const wxString& path)
532 {
533 wxString oldpath;
534 wxString tmp;
535
536 if (path != wxEmptyString) {
537 oldpath = cfg -> GetPath();
538 cfg -> SetPath(path);
539 }
540
541 m_Cfg.navig_on = cfg -> Read("hcNavigPanel", m_Cfg.navig_on) != 0;
542 m_Cfg.sashpos = cfg -> Read("hcSashPos", m_Cfg.sashpos);
543 m_Cfg.x = cfg -> Read("hcX", m_Cfg.x);
544 m_Cfg.y = cfg -> Read("hcY", m_Cfg.y);
545 m_Cfg.w = cfg -> Read("hcW", m_Cfg.w);
546 m_Cfg.h = cfg -> Read("hcH", m_Cfg.h);
547
548 if (m_HtmlWin)
549 m_HtmlWin->ReadCustomization(cfg, path);
550
551 if (path != wxEmptyString)
552 cfg -> SetPath(oldpath);
553 }
554
555 void wxHtmlHelpFrame::WriteCustomization(wxConfigBase *cfg, const wxString& path)
556 {
557 wxString oldpath;
558 wxString tmp;
559
560 if (path != wxEmptyString) {
561 oldpath = cfg -> GetPath();
562 cfg -> SetPath(path);
563 }
564
565 cfg -> Write("hcNavigPanel", m_Cfg.navig_on);
566 cfg -> Write("hcSashPos", (long)m_Cfg.sashpos);
567 cfg -> Write("hcX", (long)m_Cfg.x);
568 cfg -> Write("hcY", (long)m_Cfg.y);
569 cfg -> Write("hcW", (long)m_Cfg.w);
570 cfg -> Write("hcH", (long)m_Cfg.h);
571
572 if (m_HtmlWin)
573 m_HtmlWin->WriteCustomization(cfg, path);
574
575 if (path != wxEmptyString)
576 cfg -> SetPath(oldpath);
577 }
578
579
580 /*
581 EVENT HANDLING :
582 */
583
584
585 void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event)
586 {
587 switch (event.GetId()) {
588 case wxID_HTML_BACK :
589 m_HtmlWin -> HistoryBack();
590 break;
591 case wxID_HTML_FORWARD :
592 m_HtmlWin -> HistoryForward();
593 break;
594 case wxID_HTML_PANEL :
595 if (! (m_Splitter && m_NavigPan))
596 return ;
597 if (m_Splitter -> IsSplit()) {
598 m_Cfg.sashpos = m_Splitter -> GetSashPosition();
599 m_Splitter -> Unsplit(m_NavigPan);
600 m_Cfg.navig_on = FALSE;
601 } else {
602 m_NavigPan -> Show(TRUE);
603 m_HtmlWin -> Show(TRUE);
604 m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
605 m_Cfg.navig_on = TRUE;
606 }
607 break;
608 }
609 }
610
611
612
613 void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent& event)
614 {
615 wxHtmlHelpTreeItemData *pg;
616
617 pg = (wxHtmlHelpTreeItemData*) m_ContentsBox -> GetItemData(event.GetItem());
618 if (pg) m_HtmlWin -> LoadPage(pg -> GetPage());
619 }
620
621
622
623 void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent& WXUNUSED(event))
624 {
625 wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_IndexBox -> GetClientData(m_IndexBox -> GetSelection());
626 m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
627 }
628
629
630
631 void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent& WXUNUSED(event))
632 {
633 wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_SearchList -> GetClientData(m_SearchList -> GetSelection());
634 if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
635 }
636
637 void wxHtmlHelpFrame::OnSearch(wxCommandEvent& WXUNUSED(event))
638 {
639 wxString sr = m_SearchText -> GetLineText(0);
640
641 if (sr != wxEmptyString) KeywordSearch(sr);
642 }
643
644 void wxHtmlHelpFrame::OnCloseWindow(wxCloseEvent& evt)
645 {
646 GetSize(&m_Cfg.w, &m_Cfg.h);
647 GetPosition(&m_Cfg.x, &m_Cfg.y);
648
649 if (m_Splitter && m_Cfg.navig_on) m_Cfg.sashpos = m_Splitter -> GetSashPosition();
650
651 if (m_Config)
652 WriteCustomization(m_Config, m_ConfigRoot);
653
654 evt.Skip();
655 }
656
657 BEGIN_EVENT_TABLE(wxHtmlHelpFrame, wxFrame)
658 EVT_TOOL_RANGE(wxID_HTML_PANEL, wxID_HTML_FORWARD, wxHtmlHelpFrame::OnToolbar)
659 EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL, wxHtmlHelpFrame::OnContentsSel)
660 EVT_LISTBOX(wxID_HTML_INDEXLIST, wxHtmlHelpFrame::OnIndexSel)
661 EVT_LISTBOX(wxID_HTML_SEARCHLIST, wxHtmlHelpFrame::OnSearchSel)
662 EVT_BUTTON(wxID_HTML_SEARCHBUTTON, wxHtmlHelpFrame::OnSearch)
663 EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT, wxHtmlHelpFrame::OnSearch)
664 EVT_CLOSE(wxHtmlHelpFrame::OnCloseWindow)
665 END_EVENT_TABLE()
666
667 #endif