1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxHtmlHelpFrame
4 // Notes: Based on htmlhelp.cpp, implementing a monolithic
5 // HTML Help controller class, by Vaclav Slavik
6 // Author: Harm van der Heijden and Vaclav Slavik
8 // Copyright: (c) Harm van der Heijden and Vaclav Slavik
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation
16 // For compilers that support precompilation, includes "wx.h"
18 #include "wx/wxprec.h"
31 #include "wx/html/helpfrm.h"
32 #include "wx/notebook.h"
33 #include "wx/imaglist.h"
34 #include "wx/treectrl.h"
35 #include "wx/tokenzr.h"
36 #include "wx/wfstream.h"
37 #include "wx/html/htmlwin.h"
38 #include "wx/busyinfo.h"
39 #include "wx/progdlg.h"
40 #include "wx/toolbar.h"
41 #include "wx/fontenum.h"
42 #include "wx/stream.h"
43 #include "wx/filedlg.h"
48 #include "bitmaps/wpanel.xpm"
49 #include "bitmaps/wback.xpm"
50 #include "bitmaps/wforward.xpm"
51 #include "bitmaps/wbook.xpm"
52 #include "bitmaps/woptions.xpm"
53 #include "bitmaps/wfolder.xpm"
54 #include "bitmaps/wpage.xpm"
55 #include "bitmaps/whelp.xpm"
56 #include "bitmaps/whlproot.xpm"
57 #include "bitmaps/wbkadd.xpm"
58 #include "bitmaps/wbkdel.xpm"
59 #include "bitmaps/wup.xpm"
60 #include "bitmaps/wupnode.xpm"
61 #include "bitmaps/wdown.xpm"
62 #include "bitmaps/wopen.xpm"
63 #include "bitmaps/wprint.xpm"
67 // what is considered "small index"?
68 #define INDEX_IS_SMALL 100
71 //--------------------------------------------------------------------------
72 // wxHtmlHelpTreeItemData (private)
73 //--------------------------------------------------------------------------
75 class wxHtmlHelpTreeItemData
: public wxTreeItemData
78 wxHtmlHelpTreeItemData(int id
) : wxTreeItemData()
85 //--------------------------------------------------------------------------
86 // wxHtmlHelpHashData (private)
87 //--------------------------------------------------------------------------
89 class wxHtmlHelpHashData
: public wxObject
92 wxHtmlHelpHashData(int index
, wxTreeItemId id
) : wxObject()
93 { m_Index
= index
; m_Id
= id
;}
100 //--------------------------------------------------------------------------
101 // wxHtmlHelpHtmlWindow (private)
102 //--------------------------------------------------------------------------
104 class wxHtmlHelpHtmlWindow
: public wxHtmlWindow
107 wxHtmlHelpHtmlWindow(wxHtmlHelpFrame
*fr
, wxWindow
*parent
) : wxHtmlWindow(parent
), m_Frame(fr
) {}
109 virtual void OnLinkClicked(const wxHtmlLinkInfo
& link
)
111 wxHtmlWindow::OnLinkClicked(link
);
112 m_Frame
-> NotifyPageChanged();
116 wxHtmlHelpFrame
*m_Frame
;
121 //---------------------------------------------------------------------------
123 //---------------------------------------------------------------------------
125 IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpFrame
, wxFrame
)
127 wxHtmlHelpFrame::wxHtmlHelpFrame(wxWindow
* parent
, wxWindowID id
, const wxString
& title
,
128 int style
, wxHtmlHelpData
* data
)
131 Create(parent
, id
, title
, style
);
134 void wxHtmlHelpFrame::Init(wxHtmlHelpData
* data
)
138 m_DataCreated
= FALSE
;
140 m_Data
= new wxHtmlHelpData();
141 m_DataCreated
= TRUE
;
144 m_ContentsImageList
= new wxImageList(16, 16);
145 m_ContentsImageList
-> Add(wxICON(wbook
));
146 m_ContentsImageList
-> Add(wxICON(wfolder
));
147 m_ContentsImageList
-> Add(wxICON(wpage
));
148 m_ContentsImageList
-> Add(wxICON(whlproot
));
150 m_ContentsBox
= NULL
;
152 m_IndexButton
= NULL
;
153 m_IndexButtonAll
= NULL
;
156 m_SearchButton
= NULL
;
158 m_SearchChoice
= NULL
;
159 m_IndexCountInfo
= NULL
;
164 m_SearchCaseSensitive
= NULL
;
165 m_SearchWholeWords
= NULL
;
168 m_ConfigRoot
= wxEmptyString
;
170 m_Cfg
.x
= m_Cfg
.y
= 0;
174 m_Cfg
.navig_on
= TRUE
;
176 m_NormalFonts
= m_FixedFonts
= NULL
;
177 m_NormalFace
= m_FixedFace
= wxEmptyString
;
180 #if wxUSE_PRINTING_ARCHITECTURE
185 m_UpdateContents
= TRUE
;
188 // Create: builds the GUI components.
189 // with the style flag it's possible to toggle the toolbar, contents, index and search
191 // m_HtmlWin will *always* be created, but it's important to realize that
192 // m_ContentsBox, m_IndexList, m_SearchList, m_SearchButton, m_SearchText and
193 // m_SearchButton may be NULL.
194 // moreover, if no contents, index or searchpage is needed, m_Splitter and
195 // m_NavigPan will be NULL too (with m_HtmlWin directly connected to the frame)
197 bool wxHtmlHelpFrame::Create(wxWindow
* parent
, wxWindowID id
, const wxString
& title
,
200 // Do the config in two steps. We read the HtmlWindow customization after we
201 // create the window.
203 ReadCustomization(m_Config
, m_ConfigRoot
);
205 wxFrame::Create(parent
, id
, _("Help"), wxPoint(m_Cfg
.x
, m_Cfg
.y
), wxSize(m_Cfg
.w
, m_Cfg
.h
), wxDEFAULT_FRAME_STYLE
, "wxHtmlHelp");
207 GetPosition(&m_Cfg
.x
, &m_Cfg
.y
);
209 SetIcon(wxICON(whelp
));
211 int notebook_page
= 0;
216 if (style
& wxHF_TOOLBAR
) {
217 wxToolBar
*toolBar
= CreateToolBar(wxNO_BORDER
| wxTB_HORIZONTAL
| wxTB_DOCKABLE
);
218 toolBar
->SetMargins( 2, 2 );
219 AddToolbarButtons(toolBar
, style
);
220 toolBar
-> Realize();
223 if (style
& (wxHF_CONTENTS
| wxHF_INDEX
| wxHF_SEARCH
)) {
224 // traditional help controller; splitter window with html page on the
225 // right and a notebook containing various pages on the left
226 m_Splitter
= new wxSplitterWindow(this);
228 m_HtmlWin
= new wxHtmlHelpHtmlWindow(this, m_Splitter
);
229 m_NavigPan
= new wxNotebook(m_Splitter
, wxID_HTML_NOTEBOOK
,
230 wxDefaultPosition
, wxDefaultSize
);
231 } else { // only html window, no notebook with index,contents etc
232 m_HtmlWin
= new wxHtmlWindow(this);
235 m_HtmlWin
-> SetRelatedFrame(this, m_TitleFormat
);
236 m_HtmlWin
-> SetRelatedStatusBar(0);
238 m_HtmlWin
-> ReadCustomization(m_Config
, m_ConfigRoot
);
240 // contents tree panel?
241 if (style
& wxHF_CONTENTS
) {
242 wxWindow
*dummy
= new wxPanel(m_NavigPan
, wxID_HTML_INDEXPAGE
);
244 if (style
& wxHF_BOOKMARKS
) {
245 wxLayoutConstraints
*b1
= new wxLayoutConstraints
;
246 wxBitmapButton
*bmpbt
= new wxBitmapButton(dummy
, wxID_HTML_BOOKMARKSREMOVE
, wxBITMAP(wbkdel
), wxDefaultPosition
, wxSize(20,20));
248 b1
-> top
.SameAs (dummy
, wxTop
, 10);
249 b1
-> right
.SameAs (dummy
, wxRight
, 10);
252 bmpbt
-> SetConstraints(b1
);
254 wxLayoutConstraints
*b2
= new wxLayoutConstraints
;
255 wxBitmapButton
*bmpbt2
= new wxBitmapButton(dummy
, wxID_HTML_BOOKMARKSADD
, wxBITMAP(wbkadd
), wxDefaultPosition
, wxSize(20,20));
257 b2
-> top
.SameAs (dummy
, wxTop
, 10);
258 b2
-> right
.LeftOf (bmpbt
, 2);
261 bmpbt2
-> SetConstraints(b2
);
264 bmpbt
-> SetToolTip(_("Remove current page from bookmarks"));
265 bmpbt2
-> SetToolTip(_("Add current page to bookmarks"));
266 #endif //wxUSE_TOOLTIPS
268 wxLayoutConstraints
*b3
= new wxLayoutConstraints
;
269 m_Bookmarks
= new wxComboBox(dummy
, wxID_HTML_BOOKMARKSLIST
, wxEmptyString
,
270 wxDefaultPosition
, wxDefaultSize
, 0, NULL
, wxCB_READONLY
| wxCB_SORT
);
271 m_Bookmarks
-> Append(_("(bookmarks)"));
272 for (unsigned i
= 0; i
< m_BookmarksNames
.GetCount(); i
++)
273 m_Bookmarks
-> Append(m_BookmarksNames
[i
]);
274 m_Bookmarks
-> SetSelection(0);
276 b3
-> centreY
.SameAs (bmpbt2
, wxCentreY
);
277 b3
-> left
.SameAs (dummy
, wxLeft
, 10);
278 b3
-> right
.LeftOf (bmpbt2
, 5);
280 m_Bookmarks
-> SetConstraints(b3
);
283 wxLayoutConstraints
*b4
= new wxLayoutConstraints
;
284 m_ContentsBox
= new wxTreeCtrl(dummy
, wxID_HTML_TREECTRL
,
285 wxDefaultPosition
, wxDefaultSize
,
286 wxTR_HAS_BUTTONS
| wxSUNKEN_BORDER
);
287 m_ContentsBox
-> SetImageList(m_ContentsImageList
);
289 b4
-> top
.Below (m_Bookmarks
, 10);
290 b4
-> left
.SameAs (dummy
, wxLeft
, 0);
291 b4
-> right
.SameAs (dummy
, wxRight
, 0);
292 b4
-> bottom
.SameAs (dummy
, wxBottom
, 0);
293 m_ContentsBox
-> SetConstraints(b4
);
295 dummy
-> SetAutoLayout(TRUE
);
298 m_NavigPan
-> AddPage(dummy
, _("Contents"));
303 m_ContentsBox
= new wxTreeCtrl(m_NavigPan
, wxID_HTML_TREECTRL
,
304 wxDefaultPosition
, wxDefaultSize
,
305 wxTR_HAS_BUTTONS
| wxSUNKEN_BORDER
);
306 m_ContentsBox
-> SetImageList(m_ContentsImageList
);
307 m_NavigPan
-> AddPage(m_ContentsBox
, _("Contents"));
310 m_ContentsPage
= notebook_page
++;
313 // index listbox panel?
314 if (style
& wxHF_INDEX
) {
315 wxWindow
*dummy
= new wxPanel(m_NavigPan
, wxID_HTML_INDEXPAGE
);
317 wxLayoutConstraints
*b1
= new wxLayoutConstraints
;
318 m_IndexText
= new wxTextCtrl(dummy
, wxID_HTML_INDEXTEXT
, wxEmptyString
, wxDefaultPosition
, wxDefaultSize
, wxTE_PROCESS_ENTER
);
319 b1
-> top
.SameAs (dummy
, wxTop
, 10);
320 b1
-> left
.SameAs (dummy
, wxLeft
, 10);
321 b1
-> right
.SameAs (dummy
, wxRight
, 10);
323 m_IndexText
-> SetConstraints(b1
);
325 wxLayoutConstraints
*b4
= new wxLayoutConstraints
;
326 m_IndexButtonAll
= new wxButton(dummy
, wxID_HTML_INDEXBUTTONALL
, _("Show all"));
328 b4
-> top
.Below (m_IndexText
, 10);
329 b4
-> right
.SameAs (dummy
, wxRight
, 10);
332 m_IndexButtonAll
-> SetConstraints(b4
);
334 wxLayoutConstraints
*b2
= new wxLayoutConstraints
;
335 m_IndexButton
= new wxButton(dummy
, wxID_HTML_INDEXBUTTON
, _("Find"));
336 b2
-> top
.Below (m_IndexText
, 10);
337 b2
-> right
.LeftOf (m_IndexButtonAll
, 10);
340 m_IndexButton
-> SetConstraints(b2
);
342 wxLayoutConstraints
*b5
= new wxLayoutConstraints
;
343 m_IndexCountInfo
= new wxStaticText(dummy
, wxID_HTML_COUNTINFO
, wxEmptyString
, wxDefaultPosition
, wxDefaultSize
, wxALIGN_RIGHT
| wxST_NO_AUTORESIZE
);
345 b5
-> top
.Below (m_IndexButton
, 5);
346 b5
-> right
.SameAs (dummy
, wxRight
, 10);
347 b5
-> left
.SameAs (dummy
, wxLeft
, 10);
349 m_IndexCountInfo
-> SetConstraints(b5
);
351 wxLayoutConstraints
*b3
= new wxLayoutConstraints
;
352 m_IndexList
= new wxListBox(dummy
, wxID_HTML_INDEXLIST
, wxDefaultPosition
, wxDefaultSize
, 0, NULL
, wxLB_SINGLE
);
353 b3
-> top
.Below (m_IndexCountInfo
, 5);
354 b3
-> left
.SameAs (dummy
, wxLeft
, 0);
355 b3
-> right
.SameAs (dummy
, wxRight
, 0);
356 b3
-> bottom
.SameAs (dummy
, wxBottom
, 0);
357 m_IndexList
-> SetConstraints(b3
);
360 m_IndexButtonAll
-> SetToolTip(_("Show all items in index"));
361 m_IndexButton
-> SetToolTip(_("Display all index items that contain given substring. Search is case insensitive."));
362 #endif //wxUSE_TOOLTIPS
364 dummy
-> SetAutoLayout(TRUE
);
367 m_NavigPan
-> AddPage(dummy
, _("Index"));
368 m_IndexPage
= notebook_page
++;
371 // search list panel?
372 if (style
& wxHF_SEARCH
) {
373 wxWindow
*dummy
= new wxPanel(m_NavigPan
, wxID_HTML_SEARCHPAGE
);
375 wxLayoutConstraints
*b1
= new wxLayoutConstraints
;
376 m_SearchText
= new wxTextCtrl(dummy
, wxID_HTML_SEARCHTEXT
, wxEmptyString
, wxDefaultPosition
, wxDefaultSize
, wxTE_PROCESS_ENTER
);
377 b1
-> top
.SameAs (dummy
, wxTop
, 10);
378 b1
-> left
.SameAs (dummy
, wxLeft
, 10);
379 b1
-> right
.SameAs (dummy
, wxRight
, 10);
381 m_SearchText
-> SetConstraints(b1
);
383 wxLayoutConstraints
*b4
= new wxLayoutConstraints
;
384 m_SearchChoice
= new wxChoice(dummy
, wxID_HTML_SEARCHCHOICE
, wxDefaultPosition
,
386 b4
-> top
.Below (m_SearchText
, 10);
387 b4
-> left
.SameAs (dummy
, wxLeft
, 10);
388 b4
-> right
.SameAs (dummy
, wxRight
, 10);
390 m_SearchChoice
-> SetConstraints(b4
);
392 wxLayoutConstraints
*b5
= new wxLayoutConstraints
;
393 m_SearchCaseSensitive
= new wxCheckBox(dummy
, -1, _("Case sensitive"));
394 b5
-> top
.Below (m_SearchChoice
, 10);
395 b5
-> left
.SameAs (dummy
, wxLeft
, 10);
397 b5
-> height
.AsIs ();
398 m_SearchCaseSensitive
-> SetConstraints(b5
);
400 wxLayoutConstraints
*b6
= new wxLayoutConstraints
;
401 m_SearchWholeWords
= new wxCheckBox(dummy
, -1, _("Whole words only"));
402 b6
-> top
.Below (m_SearchCaseSensitive
, 0);
403 b6
-> left
.SameAs (dummy
, wxLeft
, 10);
405 b6
-> height
.AsIs ();
406 m_SearchWholeWords
-> SetConstraints(b6
);
408 wxLayoutConstraints
*b2
= new wxLayoutConstraints
;
409 m_SearchButton
= new wxButton(dummy
, wxID_HTML_SEARCHBUTTON
, _("Search"));
411 m_SearchButton
-> SetToolTip(_("Search contents of help book(s) for all occurences of the text you typed above"));
412 #endif //wxUSE_TOOLTIPS
413 b2
-> top
.Below (m_SearchWholeWords
, 0);
414 b2
-> right
.SameAs (dummy
, wxRight
, 10);
417 m_SearchButton
-> SetConstraints(b2
);
419 wxLayoutConstraints
*b3
= new wxLayoutConstraints
;
420 m_SearchList
= new wxListBox(dummy
, wxID_HTML_SEARCHLIST
, wxDefaultPosition
, wxDefaultSize
, 0, NULL
, wxLB_SINGLE
);
421 b3
-> top
.Below (m_SearchButton
, 10);
422 b3
-> left
.SameAs (dummy
, wxLeft
, 0);
423 b3
-> right
.SameAs (dummy
, wxRight
, 0);
424 b3
-> bottom
.SameAs (dummy
, wxBottom
, 0);
425 m_SearchList
-> SetConstraints(b3
);
427 dummy
-> SetAutoLayout(TRUE
);
429 m_NavigPan
-> AddPage(dummy
, _("Search"));
430 m_SearchPage
= notebook_page
++;
432 m_HtmlWin
-> Show(TRUE
);
437 if (m_NavigPan
&& m_Splitter
) {
438 m_Splitter
-> SetMinimumPaneSize(20);
440 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
442 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
443 m_Splitter
-> Unsplit();
445 if (m_Cfg
.navig_on
) {
446 m_NavigPan
-> Show(TRUE
);
447 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
450 m_NavigPan
-> Show(FALSE
);
451 m_Splitter
-> Initialize(m_HtmlWin
);
457 wxHtmlHelpFrame::~wxHtmlHelpFrame()
459 PopEventHandler(); // wxhtmlhelpcontroller
460 delete m_ContentsImageList
;
463 if (m_NormalFonts
) delete m_NormalFonts
;
464 if (m_FixedFonts
) delete m_FixedFonts
;
465 if (m_PagesHash
) delete m_PagesHash
;
469 void wxHtmlHelpFrame::AddToolbarButtons(wxToolBar
*toolBar
, int style
)
471 toolBar
-> AddTool(wxID_HTML_PANEL
, wxBITMAP(wpanel
), wxNullBitmap
,
472 FALSE
, -1, -1, (wxObject
*) NULL
,
473 _("Show/hide navigation panel"));
475 toolBar
-> AddSeparator();
476 toolBar
-> AddTool(wxID_HTML_BACK
, wxBITMAP(wback
), wxNullBitmap
,
477 FALSE
, -1, -1, (wxObject
*) NULL
,
479 toolBar
-> AddTool(wxID_HTML_FORWARD
, wxBITMAP(wforward
), wxNullBitmap
,
480 FALSE
, -1, -1, (wxObject
*) NULL
,
482 toolBar
-> AddSeparator();
484 toolBar
-> AddTool(wxID_HTML_UPNODE
, wxBITMAP(wupnode
), wxNullBitmap
,
485 FALSE
, -1, -1, (wxObject
*) NULL
,
486 _("Go one level up in document hierarchy"));
487 toolBar
-> AddTool(wxID_HTML_UP
, wxBITMAP(wup
), wxNullBitmap
,
488 FALSE
, -1, -1, (wxObject
*) NULL
,
490 toolBar
-> AddTool(wxID_HTML_DOWN
, wxBITMAP(wdown
), wxNullBitmap
,
491 FALSE
, -1, -1, (wxObject
*) NULL
,
494 if ((style
& wxHF_PRINT
) || (style
& wxHF_OPENFILES
))
495 toolBar
-> AddSeparator();
497 if (style
& wxHF_OPENFILES
)
498 toolBar
-> AddTool(wxID_HTML_OPENFILE
, wxBITMAP(wopen
), wxNullBitmap
,
499 FALSE
, -1, -1, (wxObject
*) NULL
,
500 _("Open HTML document"));
502 #if wxUSE_PRINTING_ARCHITECTURE
503 if (style
& wxHF_PRINT
)
504 toolBar
-> AddTool(wxID_HTML_PRINT
, wxBITMAP(wprint
), wxNullBitmap
,
505 FALSE
, -1, -1, (wxObject
*) NULL
,
506 _("Print this page"));
509 toolBar
-> AddSeparator();
510 toolBar
-> AddTool(wxID_HTML_OPTIONS
, wxBITMAP(woptions
), wxNullBitmap
,
511 FALSE
, -1, -1, (wxObject
*) NULL
,
512 _("Display options dialog"));
516 void wxHtmlHelpFrame::SetTitleFormat(const wxString
& format
)
519 m_HtmlWin
->SetRelatedFrame(this, format
);
520 m_TitleFormat
= format
;
524 bool wxHtmlHelpFrame::Display(const wxString
& x
)
526 wxString url
= m_Data
->FindPageByName(x
);
527 if (! url
.IsEmpty()) {
528 m_HtmlWin
->LoadPage(url
);
535 bool wxHtmlHelpFrame::Display(const int id
)
537 wxString url
= m_Data
->FindPageById(id
);
538 if (! url
.IsEmpty()) {
539 m_HtmlWin
->LoadPage(url
);
548 bool wxHtmlHelpFrame::DisplayContents()
552 if (!m_Splitter
-> IsSplit()) {
553 m_NavigPan
-> Show(TRUE
);
554 m_HtmlWin
-> Show(TRUE
);
555 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
556 m_Cfg
.navig_on
= TRUE
;
558 m_NavigPan
-> SetSelection(0);
564 bool wxHtmlHelpFrame::DisplayIndex()
568 if (!m_Splitter
-> IsSplit()) {
569 m_NavigPan
-> Show(TRUE
);
570 m_HtmlWin
-> Show(TRUE
);
571 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
573 m_NavigPan
-> SetSelection(1);
579 bool wxHtmlHelpFrame::KeywordSearch(const wxString
& keyword
)
581 if (! (m_SearchList
&& m_SearchButton
&& m_SearchText
&& m_SearchChoice
))
584 int foundcnt
= 0, curi
;
586 wxString book
= wxEmptyString
;
588 if (!m_Splitter
-> IsSplit()) {
589 m_NavigPan
-> Show(TRUE
);
590 m_HtmlWin
-> Show(TRUE
);
591 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
593 m_NavigPan
-> SetSelection(m_SearchPage
);
594 m_SearchList
-> Clear();
595 m_SearchText
-> SetValue(keyword
);
596 m_SearchButton
-> Enable(FALSE
);
598 if (m_SearchChoice
->GetSelection() != 0)
599 book
= m_SearchChoice
->GetStringSelection();
601 wxHtmlSearchStatus
status(m_Data
, keyword
,
602 m_SearchCaseSensitive
-> GetValue(), m_SearchWholeWords
-> GetValue(),
605 wxProgressDialog
progress(_("Searching..."), _("No matching page found yet"),
606 status
.GetMaxIndex(), this,
607 wxPD_APP_MODAL
| wxPD_CAN_ABORT
| wxPD_AUTO_HIDE
| wxGA_SMOOTH
);
609 while (status
.IsActive()) {
610 curi
= status
.GetCurIndex();
611 if (curi
% 32 == 0 && progress
.Update(curi
) == FALSE
)
613 if (status
.Search()) {
614 foundstr
.Printf(_("Found %i matches"), ++foundcnt
);
615 progress
.Update(status
.GetCurIndex(), foundstr
);
616 m_SearchList
-> Append(status
.GetName(), status
.GetContentsItem());
620 m_SearchButton
-> Enable(TRUE
);
621 m_SearchText
-> SetSelection(0, keyword
.Length());
622 m_SearchText
-> SetFocus();
624 wxHtmlContentsItem
*it
= (wxHtmlContentsItem
*) m_SearchList
-> GetClientData(0);
627 m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
631 return (foundcnt
> 0);
636 void wxHtmlHelpFrame::CreateContents()
641 m_ContentsBox
->Clear();
643 if (m_PagesHash
) delete m_PagesHash
;
644 m_PagesHash
= new wxHashTable(wxKEY_STRING
, 2 * m_Data
-> GetContentsCnt());
645 m_PagesHash
-> DeleteContents(TRUE
);
647 int cnt
= m_Data
->GetContentsCnt();
650 wxHtmlContentsItem
*it
;
652 wxTreeItemId roots
[MAX_ROOTS
];
653 bool imaged
[MAX_ROOTS
];
655 m_ContentsBox
-> DeleteAllItems();
656 roots
[0] = m_ContentsBox
-> AddRoot(_("(Help)"));
657 m_ContentsBox
-> SetItemImage(roots
[0], IMG_RootFolder
);
658 m_ContentsBox
-> SetItemSelectedImage(roots
[0], IMG_RootFolder
);
661 for (it
= m_Data
->GetContents(), i
= 0; i
< cnt
; i
++, it
++) {
662 roots
[it
-> m_Level
+ 1] = m_ContentsBox
-> AppendItem(
663 roots
[it
-> m_Level
], it
-> m_Name
, IMG_Page
, -1,
664 new wxHtmlHelpTreeItemData(i
));
665 m_PagesHash
-> Put(it
-> m_Book
-> GetBasePath() + it
-> m_Page
,
666 new wxHtmlHelpHashData(i
, roots
[it
-> m_Level
+ 1]));
668 if (it
-> m_Level
== 0) {
669 m_ContentsBox
-> SetItemBold(roots
[1], TRUE
);
670 m_ContentsBox
-> SetItemImage(roots
[1], IMG_Book
);
671 m_ContentsBox
-> SetItemSelectedImage(roots
[1], IMG_Book
);
673 } else imaged
[it
-> m_Level
+ 1] = FALSE
;
675 if (!imaged
[it
-> m_Level
]) {
676 m_ContentsBox
-> SetItemImage(roots
[it
-> m_Level
], IMG_Folder
);
677 m_ContentsBox
-> SetItemSelectedImage(roots
[it
-> m_Level
], IMG_Folder
);
678 imaged
[it
-> m_Level
] = TRUE
;
681 m_ContentsBox
-> Expand(roots
[0]);
685 void wxHtmlHelpFrame::CreateIndex()
690 m_IndexList
->Clear();
692 int cnt
= m_Data
->GetIndexCnt();
695 if (cnt
> INDEX_IS_SMALL
) cnttext
.Printf(_("%i of %i"), 0, cnt
);
696 else cnttext
.Printf(_("%i of %i"), cnt
, cnt
);
697 m_IndexCountInfo
-> SetLabel(cnttext
);
698 if (cnt
> INDEX_IS_SMALL
) return;
700 wxHtmlContentsItem
* index
= m_Data
->GetIndex();
702 for (int i
= 0; i
< cnt
; i
++)
703 m_IndexList
-> Append(index
[i
].m_Name
, (char*)(index
+ i
));
706 void wxHtmlHelpFrame::CreateSearch()
708 if (! (m_SearchList
&& m_SearchChoice
))
710 m_SearchList
-> Clear();
711 m_SearchChoice
-> Clear();
712 m_SearchChoice
-> Append(_("Search in all books"));
713 const wxHtmlBookRecArray
& bookrec
= m_Data
->GetBookRecArray();
714 int i
, cnt
= bookrec
.GetCount();
715 for (i
= 0; i
< cnt
; i
++)
716 m_SearchChoice
->Append(bookrec
[i
].GetTitle());
717 m_SearchChoice
->SetSelection(0);
721 void wxHtmlHelpFrame::RefreshLists()
728 void wxHtmlHelpFrame::ReadCustomization(wxConfigBase
*cfg
, const wxString
& path
)
733 if (path
!= wxEmptyString
) {
734 oldpath
= cfg
-> GetPath();
735 cfg
-> SetPath(_T("/") + path
);
738 m_Cfg
.navig_on
= cfg
-> Read(wxT("hcNavigPanel"), m_Cfg
.navig_on
) != 0;
739 m_Cfg
.sashpos
= cfg
-> Read(wxT("hcSashPos"), m_Cfg
.sashpos
);
740 m_Cfg
.x
= cfg
-> Read(wxT("hcX"), m_Cfg
.x
);
741 m_Cfg
.y
= cfg
-> Read(wxT("hcY"), m_Cfg
.y
);
742 m_Cfg
.w
= cfg
-> Read(wxT("hcW"), m_Cfg
.w
);
743 m_Cfg
.h
= cfg
-> Read(wxT("hcH"), m_Cfg
.h
);
745 m_FixedFace
= cfg
-> Read(wxT("hcFixedFace"), m_FixedFace
);
746 m_NormalFace
= cfg
-> Read(wxT("hcNormalFace"), m_NormalFace
);
747 m_FontSize
= cfg
-> Read(wxT("hcFontSize"), m_FontSize
);
754 cnt
= cfg
-> Read(wxT("hcBookmarksCnt"), 0L);
756 m_BookmarksNames
.Clear();
757 m_BookmarksPages
.Clear();
759 m_Bookmarks
-> Clear();
760 m_Bookmarks
-> Append(_("(bookmarks)"));
763 for (i
= 0; i
< cnt
; i
++) {
764 val
.Printf(wxT("hcBookmark_%i"), i
);
765 s
= cfg
-> Read(val
);
766 m_BookmarksNames
.Add(s
);
767 if (m_Bookmarks
) m_Bookmarks
-> Append(s
);
768 val
.Printf(wxT("hcBookmark_%i_url"), i
);
769 s
= cfg
-> Read(val
);
770 m_BookmarksPages
.Add(s
);
776 m_HtmlWin
->ReadCustomization(cfg
);
778 if (path
!= wxEmptyString
)
779 cfg
-> SetPath(oldpath
);
782 void wxHtmlHelpFrame::WriteCustomization(wxConfigBase
*cfg
, const wxString
& path
)
787 if (path
!= wxEmptyString
) {
788 oldpath
= cfg
-> GetPath();
789 cfg
-> SetPath(_T("/") + path
);
792 cfg
-> Write(wxT("hcNavigPanel"), m_Cfg
.navig_on
);
793 cfg
-> Write(wxT("hcSashPos"), (long)m_Cfg
.sashpos
);
794 cfg
-> Write(wxT("hcX"), (long)m_Cfg
.x
);
795 cfg
-> Write(wxT("hcY"), (long)m_Cfg
.y
);
796 cfg
-> Write(wxT("hcW"), (long)m_Cfg
.w
);
797 cfg
-> Write(wxT("hcH"), (long)m_Cfg
.h
);
798 cfg
-> Write(wxT("hcFixedFace"), m_FixedFace
);
799 cfg
-> Write(wxT("hcNormalFace"), m_NormalFace
);
800 cfg
-> Write(wxT("hcFontSize"), (long)m_FontSize
);
804 int cnt
= m_BookmarksNames
.GetCount();
807 cfg
-> Write(wxT("hcBookmarksCnt"), (long)cnt
);
808 for (i
= 0; i
< cnt
; i
++) {
809 val
.Printf(wxT("hcBookmark_%i"), i
);
810 cfg
-> Write(val
, m_BookmarksNames
[i
]);
811 val
.Printf(wxT("hcBookmark_%i_url"), i
);
812 cfg
-> Write(val
, m_BookmarksPages
[i
]);
817 m_HtmlWin
->WriteCustomization(cfg
);
819 if (path
!= wxEmptyString
)
820 cfg
-> SetPath(oldpath
);
827 static void SetFontsToHtmlWin(wxHtmlWindow
*win
, wxString scalf
, wxString fixf
, int size
)
829 static int f_sizes
[5][7] =
831 { 6, 7, 9, 12, 14, 16, 19},
832 { 8, 9, 12, 14, 16, 19, 22},
833 {10, 12, 14, 16, 19, 24, 32},
834 {14, 16, 18, 24, 32, 38, 45},
835 {16, 20, 24, 32, 38, 45, 50}
838 win
-> SetFonts(scalf
, fixf
, f_sizes
[size
]);
842 class wxHtmlHelpFrameOptionsDialog
: public wxDialog
845 wxComboBox
*NormalFont
, *FixedFont
;
846 wxRadioBox
*RadioBox
;
847 wxHtmlWindow
*TestWin
;
849 wxHtmlHelpFrameOptionsDialog(wxWindow
*parent
) : wxDialog(parent
, -1, wxString(_("Help Browser Options")))
851 wxString choices
[5] = {_("very small"), _("small"), _("medium"), _("large"), _("very large")};
852 wxBoxSizer
*topsizer
, *sizer
, *sizer2
;
854 topsizer
= new wxBoxSizer(wxVERTICAL
);
856 sizer
= new wxBoxSizer(wxHORIZONTAL
);
858 sizer2
= new wxStaticBoxSizer( new wxStaticBox(this, -1, _("Normal font:")), wxVERTICAL
);
859 sizer2
-> Add(NormalFont
= new wxComboBox(this, -1, wxEmptyString
, wxDefaultPosition
,
861 0, NULL
, wxCB_DROPDOWN
| wxCB_READONLY
),
862 1, wxEXPAND
| wxLEFT
| wxRIGHT
, 10);
864 sizer
-> Add(sizer2
, 0, wxEXPAND
| wxLEFT
|wxRIGHT
|wxTOP
, 10);
866 sizer2
= new wxStaticBoxSizer( new wxStaticBox(this, -1, _("Fixed font:")), wxVERTICAL
);
867 sizer2
-> Add(FixedFont
= new wxComboBox(this, -1, wxEmptyString
, wxDefaultPosition
,
869 0, NULL
, wxCB_DROPDOWN
| wxCB_READONLY
),
870 1, wxEXPAND
| wxLEFT
| wxRIGHT
, 10);
872 sizer
-> Add(sizer2
, 0, wxEXPAND
| wxLEFT
|wxRIGHT
|wxTOP
, 10);
874 topsizer
-> Add(sizer
);
876 topsizer
-> Add(RadioBox
= new wxRadioBox(this, -1, _("Font size:"),
877 wxDefaultPosition
, wxDefaultSize
, 5, choices
, 5),
878 0, wxEXPAND
| wxLEFT
|wxRIGHT
|wxTOP
, 10);
880 topsizer
-> Add(new wxStaticText(this, -1, _("Preview:")),
881 0, wxLEFT
| wxTOP
, 10);
882 topsizer
-> Add(TestWin
= new wxHtmlWindow(this, -1, wxDefaultPosition
, wxSize(-1, 150)),
883 1, wxEXPAND
| wxLEFT
|wxTOP
|wxRIGHT
, 10);
885 sizer
= new wxBoxSizer(wxHORIZONTAL
);
886 sizer
-> Add(new wxButton(this, wxID_OK
, _("OK")), 0, wxALL
, 10);
887 sizer
-> Add(new wxButton(this, wxID_CANCEL
, _("Cancel")), 0, wxALL
, 10);
888 topsizer
-> Add(sizer
, 0, wxALIGN_RIGHT
);
892 topsizer
-> Fit(this);
900 SetFontsToHtmlWin(TestWin
,
901 NormalFont
-> GetStringSelection(),
902 FixedFont
-> GetStringSelection(),
903 RadioBox
-> GetSelection());
904 TestWin
-> SetPage(_("<html><body>"
905 "Normal face<br>(and <u>underlined</u>. <i>Italic face.</i> "
906 "<b>Bold face.</b> <b><i>Bold italic face.</i></b><br>"
907 "<font size=-2>font size -2</font><br>"
908 "<font size=-1>font size -1</font><br>"
909 "<font size=+0>font size +0</font><br>"
910 "<font size=+1>font size +1</font><br>"
911 "<font size=+2>font size +2</font><br>"
912 "<font size=+3>font size +3</font><br>"
913 "<font size=+4>font size +4</font><br>"
915 "<p><tt>Fixed size face.<br> <b>bold</b> <i>italic</i> "
916 "<b><i>bold italic <u>underlined</u></i></b><br>"
917 "<font size=-2>font size -2</font><br>"
918 "<font size=-1>font size -1</font><br>"
919 "<font size=+0>font size +0</font><br>"
920 "<font size=+1>font size +1</font><br>"
921 "<font size=+2>font size +2</font><br>"
922 "<font size=+3>font size +3</font><br>"
923 "<font size=+4>font size +4</font></tt>"
927 void OnUpdate(wxCommandEvent
& event
)
932 DECLARE_EVENT_TABLE()
935 BEGIN_EVENT_TABLE(wxHtmlHelpFrameOptionsDialog
, wxDialog
)
936 EVT_COMBOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate
)
937 EVT_RADIOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate
)
941 void wxHtmlHelpFrame::OptionsDialog()
943 wxHtmlHelpFrameOptionsDialog
dlg(this);
946 if (m_NormalFonts
== NULL
) {
947 wxFontEnumerator enu
;
948 enu
.EnumerateFacenames();
949 m_NormalFonts
= new wxArrayString
;
950 *m_NormalFonts
= *enu
.GetFacenames();
951 m_NormalFonts
-> Sort();
953 if (m_FixedFonts
== NULL
) {
954 wxFontEnumerator enu
;
955 enu
.EnumerateFacenames(wxFONTENCODING_SYSTEM
, TRUE
);
956 m_FixedFonts
= new wxArrayString
;
957 *m_FixedFonts
= *enu
.GetFacenames();
958 m_FixedFonts
-> Sort();
961 for (i
= 0; i
< m_NormalFonts
-> GetCount(); i
++)
962 dlg
.NormalFont
-> Append((*m_NormalFonts
)[i
]);
963 for (i
= 0; i
< m_FixedFonts
-> GetCount(); i
++)
964 dlg
.FixedFont
-> Append((*m_FixedFonts
)[i
]);
965 if (!m_NormalFace
.IsEmpty()) dlg
.NormalFont
-> SetStringSelection(m_NormalFace
);
966 else dlg
.NormalFont
-> SetSelection(0);
967 if (!m_FixedFace
.IsEmpty()) dlg
.FixedFont
-> SetStringSelection(m_FixedFace
);
968 else dlg
.FixedFont
-> SetSelection(0);
969 dlg
.RadioBox
-> SetSelection(m_FontSize
);
972 if (dlg
.ShowModal() == wxID_OK
) {
973 m_NormalFace
= dlg
.NormalFont
-> GetStringSelection();
974 m_FixedFace
= dlg
.FixedFont
-> GetStringSelection();
975 m_FontSize
= dlg
.RadioBox
-> GetSelection();
976 SetFontsToHtmlWin(m_HtmlWin
, m_NormalFace
, m_FixedFace
, m_FontSize
);
982 void wxHtmlHelpFrame::NotifyPageChanged()
984 if (m_UpdateContents
&& m_PagesHash
)
986 wxString an
= m_HtmlWin
-> GetOpenedAnchor();
987 wxHtmlHelpHashData
*ha
;
989 ha
= (wxHtmlHelpHashData
*) m_PagesHash
-> Get(m_HtmlWin
-> GetOpenedPage());
991 ha
= (wxHtmlHelpHashData
*) m_PagesHash
-> Get(m_HtmlWin
-> GetOpenedPage() + wxT("#") + an
);
994 bool olduc
= m_UpdateContents
;
995 m_UpdateContents
= FALSE
;
996 m_ContentsBox
-> SelectItem(ha
-> m_Id
);
997 m_ContentsBox
-> EnsureVisible(ha
-> m_Id
);
998 m_UpdateContents
= olduc
;
1010 void wxHtmlHelpFrame::OnToolbar(wxCommandEvent
& event
)
1012 switch (event
.GetId()) {
1014 case wxID_HTML_BACK
:
1015 m_HtmlWin
-> HistoryBack();
1016 NotifyPageChanged();
1019 case wxID_HTML_FORWARD
:
1020 m_HtmlWin
-> HistoryForward();
1021 NotifyPageChanged();
1027 wxString an
= m_HtmlWin
-> GetOpenedAnchor();
1028 wxHtmlHelpHashData
*ha
;
1030 ha
= (wxHtmlHelpHashData
*) m_PagesHash
-> Get(m_HtmlWin
-> GetOpenedPage());
1032 ha
= (wxHtmlHelpHashData
*) m_PagesHash
-> Get(m_HtmlWin
-> GetOpenedPage() + wxT("#") + an
);
1033 if (ha
&& ha
-> m_Index
> 0)
1035 wxHtmlContentsItem
*it
= m_Data
-> GetContents() + (ha
-> m_Index
- 1);
1036 m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
1037 NotifyPageChanged();
1042 case wxID_HTML_UPNODE
:
1045 wxString an
= m_HtmlWin
-> GetOpenedAnchor();
1046 wxHtmlHelpHashData
*ha
;
1048 ha
= (wxHtmlHelpHashData
*) m_PagesHash
-> Get(m_HtmlWin
-> GetOpenedPage());
1050 ha
= (wxHtmlHelpHashData
*) m_PagesHash
-> Get(m_HtmlWin
-> GetOpenedPage() + wxT("#") + an
);
1051 if (ha
&& ha
-> m_Index
> 0)
1053 int level
= m_Data
-> GetContents()[ha
-> m_Index
].m_Level
- 1;
1054 wxHtmlContentsItem
*it
;
1055 int ind
= ha
-> m_Index
- 1;
1057 it
= m_Data
-> GetContents() + ind
;
1058 while (ind
>= 0 && it
-> m_Level
!= level
) ind
--, it
--;
1061 m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
1062 NotifyPageChanged();
1068 case wxID_HTML_DOWN
:
1071 wxString an
= m_HtmlWin
-> GetOpenedAnchor();
1073 wxHtmlHelpHashData
*ha
;
1075 if (an
.IsEmpty()) adr
= m_HtmlWin
-> GetOpenedPage();
1076 else adr
= m_HtmlWin
-> GetOpenedPage() + wxT("#") + an
;
1078 ha
= (wxHtmlHelpHashData
*) m_PagesHash
-> Get(adr
);
1080 if (ha
&& ha
-> m_Index
< m_Data
-> GetContentsCnt() - 1)
1082 wxHtmlContentsItem
*it
= m_Data
-> GetContents() + (ha
-> m_Index
+ 1);
1084 while (it
-> m_Book
-> GetBasePath() + it
-> m_Page
== adr
) it
++;
1085 m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
1086 NotifyPageChanged();
1091 case wxID_HTML_PANEL
:
1093 if (! (m_Splitter
&& m_NavigPan
))
1095 if (m_Splitter
-> IsSplit()) {
1096 m_Cfg
.sashpos
= m_Splitter
-> GetSashPosition();
1097 m_Splitter
-> Unsplit(m_NavigPan
);
1098 m_Cfg
.navig_on
= FALSE
;
1100 m_NavigPan
-> Show(TRUE
);
1101 m_HtmlWin
-> Show(TRUE
);
1102 m_Splitter
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
);
1103 m_Cfg
.navig_on
= TRUE
;
1108 case wxID_HTML_OPTIONS
:
1112 case wxID_HTML_BOOKMARKSADD
:
1117 item
= m_HtmlWin
-> GetOpenedPageTitle();
1118 url
= m_HtmlWin
-> GetOpenedPage();
1119 if (item
== wxEmptyString
) item
= url
.AfterLast(wxT('/'));
1120 if (m_BookmarksPages
.Index(url
) == wxNOT_FOUND
) {
1121 m_Bookmarks
-> Append(item
);
1122 m_BookmarksNames
.Add(item
);
1123 m_BookmarksPages
.Add(url
);
1128 case wxID_HTML_BOOKMARKSREMOVE
:
1133 item
= m_Bookmarks
-> GetStringSelection();
1134 pos
= m_BookmarksNames
.Index(item
);
1135 if (pos
!= wxNOT_FOUND
) {
1136 m_BookmarksNames
.Remove(pos
);
1137 m_BookmarksPages
.Remove(pos
);
1138 m_Bookmarks
-> Delete(m_Bookmarks
-> GetSelection());
1143 #if wxUSE_PRINTING_ARCHITECTURE
1144 case wxID_HTML_PRINT
:
1146 if (m_Printer
== NULL
)
1147 m_Printer
= new wxHtmlEasyPrinting(_("Help Printing"), this);
1148 m_Printer
-> PrintFile(m_HtmlWin
-> GetOpenedPage());
1153 case wxID_HTML_OPENFILE
:
1155 wxString s
= wxFileSelector(_("Open HTML document"), wxEmptyString
, wxEmptyString
, wxEmptyString
,
1156 wxT("HTML files (*.htm)|*.htm|HTML files (*.html)|*.html|"
1157 "Help books (*.htb)|*.htb|Help books (*.zip)|*.zip|"
1158 "HTML Help Project (*.hhp)|*.hhp|"
1159 "All files (*.*)|*"),
1160 wxOPEN
| wxFILE_MUST_EXIST
, this);
1163 wxString ext
= s
.Right(4).Lower();
1164 if (ext
== _T(".zip") || ext
== _T(".htb") || ext
== _T(".hhp"))
1167 m_Data
-> AddBook(s
);
1171 m_HtmlWin
-> LoadPage(s
);
1180 void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent
& event
)
1182 wxHtmlHelpTreeItemData
*pg
;
1183 wxHtmlContentsItem
*it
;
1185 pg
= (wxHtmlHelpTreeItemData
*) m_ContentsBox
-> GetItemData(event
.GetItem());
1187 if (pg
&& m_UpdateContents
)
1189 it
= m_Data
-> GetContents() + (pg
-> m_Id
);
1190 m_UpdateContents
= FALSE
;
1191 m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
1192 m_UpdateContents
= TRUE
;
1198 void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent
& WXUNUSED(event
))
1200 wxHtmlContentsItem
*it
= (wxHtmlContentsItem
*) m_IndexList
-> GetClientData(m_IndexList
-> GetSelection());
1201 m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
1202 NotifyPageChanged();
1206 void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent
& event
)
1208 wxString sr
= m_IndexText
-> GetLineText(0);
1210 if (sr
== wxEmptyString
)
1215 const wxChar
*cstr
= sr
.c_str();
1216 wxChar mybuff
[512], *ptr
;
1219 m_IndexList
->Clear();
1220 int cnt
= m_Data
->GetIndexCnt();
1221 wxHtmlContentsItem
* index
= m_Data
->GetIndex();
1224 for (int i
= 0; i
< cnt
; i
++)
1226 wxStrncpy(mybuff
, index
[i
].m_Name
, 512);
1228 for (ptr
= mybuff
; *ptr
!= 0; ptr
++)
1229 if (*ptr
>= 'A' && *ptr
<= 'Z') *ptr
-= 'A' - 'a';
1230 if (wxStrstr(mybuff
, cstr
) != NULL
) {
1231 m_IndexList
-> Append(index
[i
].m_Name
, (char*)(index
+ i
));
1234 m_HtmlWin
-> LoadPage(index
[i
].m_Book
-> GetBasePath() + index
[i
].m_Page
);
1235 NotifyPageChanged();
1242 cnttext
.Printf(_("%i of %i"), displ
, cnt
);
1243 m_IndexCountInfo
-> SetLabel(cnttext
);
1245 m_IndexText
-> SetSelection(0, sr
.Length());
1246 m_IndexText
-> SetFocus();
1250 void wxHtmlHelpFrame::OnIndexAll(wxCommandEvent
& WXUNUSED(event
))
1254 m_IndexList
->Clear();
1255 int cnt
= m_Data
->GetIndexCnt();
1257 wxHtmlContentsItem
* index
= m_Data
->GetIndex();
1259 for (int i
= 0; i
< cnt
; i
++) {
1260 m_IndexList
-> Append(index
[i
].m_Name
, (char*)(index
+ i
));
1262 m_HtmlWin
-> LoadPage(index
[i
].m_Book
-> GetBasePath() + index
[i
].m_Page
);
1263 NotifyPageChanged();
1269 cnttext
.Printf(_("%i of %i"), cnt
, cnt
);
1270 m_IndexCountInfo
-> SetLabel(cnttext
);
1274 void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent
& WXUNUSED(event
))
1276 wxHtmlContentsItem
*it
= (wxHtmlContentsItem
*) m_SearchList
-> GetClientData(m_SearchList
-> GetSelection());
1279 m_HtmlWin
-> LoadPage(it
-> m_Book
-> GetBasePath() + it
-> m_Page
);
1280 NotifyPageChanged();
1284 void wxHtmlHelpFrame::OnSearch(wxCommandEvent
& WXUNUSED(event
))
1286 wxString sr
= m_SearchText
-> GetLineText(0);
1288 if (sr
!= wxEmptyString
) KeywordSearch(sr
);
1291 void wxHtmlHelpFrame::OnBookmarksSel(wxCommandEvent
& WXUNUSED(event
))
1293 wxString sr
= m_Bookmarks
-> GetStringSelection();
1295 if (sr
!= wxEmptyString
&& sr
!= _("(bookmarks)"))
1297 m_HtmlWin
-> LoadPage(m_BookmarksPages
[m_BookmarksNames
.Index(sr
)]);
1298 NotifyPageChanged();
1302 void wxHtmlHelpFrame::OnCloseWindow(wxCloseEvent
& evt
)
1304 GetSize(&m_Cfg
.w
, &m_Cfg
.h
);
1305 GetPosition(&m_Cfg
.x
, &m_Cfg
.y
);
1307 if (m_Splitter
&& m_Cfg
.navig_on
) m_Cfg
.sashpos
= m_Splitter
-> GetSashPosition();
1310 WriteCustomization(m_Config
, m_ConfigRoot
);
1315 BEGIN_EVENT_TABLE(wxHtmlHelpFrame
, wxFrame
)
1316 EVT_TOOL_RANGE(wxID_HTML_PANEL
, wxID_HTML_OPTIONS
, wxHtmlHelpFrame::OnToolbar
)
1317 EVT_BUTTON(wxID_HTML_BOOKMARKSREMOVE
, wxHtmlHelpFrame::OnToolbar
)
1318 EVT_BUTTON(wxID_HTML_BOOKMARKSADD
, wxHtmlHelpFrame::OnToolbar
)
1319 EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL
, wxHtmlHelpFrame::OnContentsSel
)
1320 EVT_LISTBOX(wxID_HTML_INDEXLIST
, wxHtmlHelpFrame::OnIndexSel
)
1321 EVT_LISTBOX(wxID_HTML_SEARCHLIST
, wxHtmlHelpFrame::OnSearchSel
)
1322 EVT_BUTTON(wxID_HTML_SEARCHBUTTON
, wxHtmlHelpFrame::OnSearch
)
1323 EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT
, wxHtmlHelpFrame::OnSearch
)
1324 EVT_BUTTON(wxID_HTML_INDEXBUTTON
, wxHtmlHelpFrame::OnIndexFind
)
1325 EVT_TEXT_ENTER(wxID_HTML_INDEXTEXT
, wxHtmlHelpFrame::OnIndexFind
)
1326 EVT_BUTTON(wxID_HTML_INDEXBUTTONALL
, wxHtmlHelpFrame::OnIndexAll
)
1327 EVT_COMBOBOX(wxID_HTML_BOOKMARKSLIST
, wxHtmlHelpFrame::OnBookmarksSel
)
1328 EVT_CLOSE(wxHtmlHelpFrame::OnCloseWindow
)