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