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
; 
 468 void wxHtmlHelpFrame::AddToolbarButtons(wxToolBar 
*toolBar
, int style
) 
 470     toolBar 
-> AddTool(wxID_HTML_PANEL
, wxBITMAP(wpanel
), wxNullBitmap
, 
 471                        FALSE
, -1, -1, (wxObject 
*) NULL
, 
 472                        _("Show/hide navigation panel")); 
 474     toolBar 
-> AddSeparator(); 
 475     toolBar 
-> AddTool(wxID_HTML_BACK
, wxBITMAP(wback
), wxNullBitmap
, 
 476                        FALSE
, -1, -1, (wxObject 
*) NULL
, 
 478     toolBar 
-> AddTool(wxID_HTML_FORWARD
, wxBITMAP(wforward
), wxNullBitmap
, 
 479                        FALSE
, -1, -1, (wxObject 
*) NULL
, 
 481     toolBar 
-> AddSeparator(); 
 483     toolBar 
-> AddTool(wxID_HTML_UPNODE
, wxBITMAP(wupnode
), wxNullBitmap
, 
 484                        FALSE
, -1, -1, (wxObject 
*) NULL
, 
 485                        _("Go one level up in document hierarchy")); 
 486     toolBar 
-> AddTool(wxID_HTML_UP
, wxBITMAP(wup
), wxNullBitmap
, 
 487                        FALSE
, -1, -1, (wxObject 
*) NULL
, 
 489     toolBar 
-> AddTool(wxID_HTML_DOWN
, wxBITMAP(wdown
), wxNullBitmap
, 
 490                        FALSE
, -1, -1, (wxObject 
*) NULL
, 
 493     if ((style 
& wxHF_PRINT
) || (style 
& wxHF_OPENFILES
)) 
 494         toolBar 
-> AddSeparator(); 
 496     if (style 
& wxHF_OPENFILES
) 
 497         toolBar 
-> AddTool(wxID_HTML_OPENFILE
, wxBITMAP(wopen
), wxNullBitmap
, 
 498                            FALSE
, -1, -1, (wxObject 
*) NULL
, 
 499                            _("Open HTML document")); 
 501 #if wxUSE_PRINTING_ARCHITECTURE 
 502     if (style 
& wxHF_PRINT
) 
 503         toolBar 
-> AddTool(wxID_HTML_PRINT
, wxBITMAP(wprint
), wxNullBitmap
, 
 504                            FALSE
, -1, -1, (wxObject 
*) NULL
, 
 505                            _("Print this page")); 
 508     toolBar 
-> AddSeparator(); 
 509     toolBar 
-> AddTool(wxID_HTML_OPTIONS
, wxBITMAP(woptions
), wxNullBitmap
, 
 510                        FALSE
, -1, -1, (wxObject 
*) NULL
, 
 511                        _("Display options dialog")); 
 515 void wxHtmlHelpFrame::SetTitleFormat(const wxString
& format
) 
 518         m_HtmlWin
->SetRelatedFrame(this, format
); 
 519     m_TitleFormat 
= format
; 
 523 bool wxHtmlHelpFrame::Display(const wxString
& x
) 
 525     wxString url 
= m_Data
->FindPageByName(x
); 
 526     if (! url
.IsEmpty()) { 
 527         m_HtmlWin
->LoadPage(url
); 
 534 bool wxHtmlHelpFrame::Display(const int id
) 
 536     wxString url 
= m_Data
->FindPageById(id
); 
 537     if (! url
.IsEmpty()) { 
 538         m_HtmlWin
->LoadPage(url
); 
 547 bool wxHtmlHelpFrame::DisplayContents() 
 551     if (!m_Splitter 
-> IsSplit()) { 
 552         m_NavigPan 
-> Show(TRUE
); 
 553         m_HtmlWin 
-> Show(TRUE
); 
 554         m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 555         m_Cfg
.navig_on 
= TRUE
; 
 557     m_NavigPan 
-> SetSelection(0); 
 563 bool wxHtmlHelpFrame::DisplayIndex() 
 567     if (!m_Splitter 
-> IsSplit()) { 
 568         m_NavigPan 
-> Show(TRUE
); 
 569         m_HtmlWin 
-> Show(TRUE
); 
 570         m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 572     m_NavigPan 
-> SetSelection(1); 
 578 bool wxHtmlHelpFrame::KeywordSearch(const wxString
& keyword
) 
 580     if (! (m_SearchList 
&& m_SearchButton 
&& m_SearchText 
&& m_SearchChoice
)) 
 583     int foundcnt 
= 0, curi
; 
 585     wxString book 
= wxEmptyString
; 
 587     if (!m_Splitter 
-> IsSplit()) { 
 588         m_NavigPan 
-> Show(TRUE
); 
 589         m_HtmlWin 
-> Show(TRUE
); 
 590         m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 592     m_NavigPan 
-> SetSelection(m_SearchPage
); 
 593     m_SearchList 
-> Clear(); 
 594     m_SearchText 
-> SetValue(keyword
); 
 595     m_SearchButton 
-> Enable(FALSE
); 
 597     if (m_SearchChoice
->GetSelection() != 0) 
 598         book 
= m_SearchChoice
->GetStringSelection(); 
 600     wxHtmlSearchStatus 
status(m_Data
, keyword
,  
 601                               m_SearchCaseSensitive 
-> GetValue(), m_SearchWholeWords 
-> GetValue(),  
 604     wxProgressDialog 
progress(_("Searching..."), _("No matching page found yet"), 
 605                               status
.GetMaxIndex(), this, 
 606                               wxPD_APP_MODAL 
| wxPD_CAN_ABORT 
| wxPD_AUTO_HIDE 
| wxGA_SMOOTH
); 
 608     while (status
.IsActive()) { 
 609         curi 
= status
.GetCurIndex(); 
 610         if (curi 
% 32 == 0 && progress
.Update(curi
) == FALSE
) 
 612         if (status
.Search()) { 
 613             foundstr
.Printf(_("Found %i matches"), ++foundcnt
); 
 614             progress
.Update(status
.GetCurIndex(), foundstr
); 
 615             m_SearchList 
-> Append(status
.GetName(), status
.GetContentsItem()); 
 619     m_SearchButton 
-> Enable(TRUE
); 
 620     m_SearchText 
-> SetSelection(0, keyword
.Length()); 
 621     m_SearchText 
-> SetFocus(); 
 623         wxHtmlContentsItem 
*it 
= (wxHtmlContentsItem
*) m_SearchList 
-> GetClientData(0); 
 626             m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
 630     return (foundcnt 
> 0); 
 635 void wxHtmlHelpFrame::CreateContents() 
 640     m_ContentsBox
->Clear(); 
 642     if (m_PagesHash
) delete m_PagesHash
; 
 643     m_PagesHash 
= new wxHashTable(wxKEY_STRING
, 2 * m_Data 
-> GetContentsCnt()); 
 644     m_PagesHash 
-> DeleteContents(TRUE
); 
 646     int cnt 
= m_Data
->GetContentsCnt(); 
 649     wxHtmlContentsItem 
*it
; 
 651     wxTreeItemId roots
[MAX_ROOTS
]; 
 652     bool imaged
[MAX_ROOTS
]; 
 654     m_ContentsBox 
-> DeleteAllItems(); 
 655     roots
[0] = m_ContentsBox 
-> AddRoot(_("(Help)")); 
 656     m_ContentsBox 
-> SetItemImage(roots
[0], IMG_RootFolder
); 
 657     m_ContentsBox 
-> SetItemSelectedImage(roots
[0], IMG_RootFolder
); 
 660     for (it 
= m_Data
->GetContents(), i 
= 0; i 
< cnt
; i
++, it
++) { 
 661         roots
[it 
-> m_Level 
+ 1] =  m_ContentsBox 
-> AppendItem( 
 662                                        roots
[it 
-> m_Level
], it 
-> m_Name
, IMG_Page
, -1, 
 663                                        new wxHtmlHelpTreeItemData(i
)); 
 664         m_PagesHash 
-> Put(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
,  
 665                            new wxHtmlHelpHashData(i
, roots
[it 
-> m_Level 
+ 1])); 
 667         if (it 
-> m_Level 
== 0) { 
 668             m_ContentsBox 
-> SetItemBold(roots
[1], TRUE
); 
 669             m_ContentsBox 
-> SetItemImage(roots
[1], IMG_Book
); 
 670             m_ContentsBox 
-> SetItemSelectedImage(roots
[1], IMG_Book
); 
 672         } else imaged
[it 
-> m_Level 
+ 1] = FALSE
; 
 674         if (!imaged
[it 
-> m_Level
]) { 
 675             m_ContentsBox 
-> SetItemImage(roots
[it 
-> m_Level
], IMG_Folder
); 
 676             m_ContentsBox 
-> SetItemSelectedImage(roots
[it 
-> m_Level
], IMG_Folder
); 
 677             imaged
[it 
-> m_Level
] = TRUE
; 
 680     m_ContentsBox 
-> Expand(roots
[0]); 
 684 void wxHtmlHelpFrame::CreateIndex() 
 689     m_IndexList
->Clear(); 
 691     int cnt 
= m_Data
->GetIndexCnt(); 
 694     if (cnt 
> INDEX_IS_SMALL
) cnttext
.Printf(_("%i of %i"), 0, cnt
); 
 695     else cnttext
.Printf(_("%i of %i"), cnt
, cnt
); 
 696     m_IndexCountInfo 
-> SetLabel(cnttext
); 
 697     if (cnt 
> INDEX_IS_SMALL
) return; 
 699     wxHtmlContentsItem
* index 
= m_Data
->GetIndex(); 
 701     for (int i 
= 0; i 
< cnt
; i
++)  
 702         m_IndexList 
-> Append(index
[i
].m_Name
, (char*)(index 
+ i
)); 
 705 void wxHtmlHelpFrame::CreateSearch() 
 707     if (! (m_SearchList 
&& m_SearchChoice
)) 
 709     m_SearchList 
-> Clear(); 
 710     m_SearchChoice 
-> Clear(); 
 711     m_SearchChoice 
-> Append(_("Search in all books")); 
 712     const wxHtmlBookRecArray
& bookrec 
= m_Data
->GetBookRecArray(); 
 713     int i
, cnt 
= bookrec
.GetCount(); 
 714     for (i 
= 0; i 
< cnt
; i
++) 
 715         m_SearchChoice
->Append(bookrec
[i
].GetTitle()); 
 716     m_SearchChoice
->SetSelection(0); 
 720 void wxHtmlHelpFrame::RefreshLists() 
 727 void wxHtmlHelpFrame::ReadCustomization(wxConfigBase 
*cfg
, const wxString
& path
) 
 732     if (path 
!= wxEmptyString
) { 
 733         oldpath 
= cfg 
-> GetPath(); 
 734         cfg 
-> SetPath(_T("/") + path
); 
 737     m_Cfg
.navig_on 
= cfg 
-> Read(wxT("hcNavigPanel"), m_Cfg
.navig_on
) != 0; 
 738     m_Cfg
.sashpos 
= cfg 
-> Read(wxT("hcSashPos"), m_Cfg
.sashpos
); 
 739     m_Cfg
.x 
= cfg 
-> Read(wxT("hcX"), m_Cfg
.x
); 
 740     m_Cfg
.y 
= cfg 
-> Read(wxT("hcY"), m_Cfg
.y
); 
 741     m_Cfg
.w 
= cfg 
-> Read(wxT("hcW"), m_Cfg
.w
); 
 742     m_Cfg
.h 
= cfg 
-> Read(wxT("hcH"), m_Cfg
.h
); 
 744     m_FixedFace 
= cfg 
-> Read(wxT("hcFixedFace"), m_FixedFace
); 
 745     m_NormalFace 
= cfg 
-> Read(wxT("hcNormalFace"), m_NormalFace
); 
 746     m_FontSize 
= cfg 
-> Read(wxT("hcFontSize"), m_FontSize
); 
 753         cnt 
= cfg 
-> Read(wxT("hcBookmarksCnt"), 0L); 
 755             m_BookmarksNames
.Clear(); 
 756             m_BookmarksPages
.Clear(); 
 758                 m_Bookmarks 
-> Clear(); 
 759                 m_Bookmarks 
-> Append(_("(bookmarks)")); 
 762             for (i 
= 0; i 
< cnt
; i
++) { 
 763                 val
.Printf(wxT("hcBookmark_%i"), i
); 
 764                 s 
= cfg 
-> Read(val
); 
 765                 m_BookmarksNames
.Add(s
); 
 766                 if (m_Bookmarks
) m_Bookmarks 
-> Append(s
); 
 767                 val
.Printf(wxT("hcBookmark_%i_url"), i
); 
 768                 s 
= cfg 
-> Read(val
); 
 769                 m_BookmarksPages
.Add(s
); 
 775         m_HtmlWin
->ReadCustomization(cfg
); 
 777     if (path 
!= wxEmptyString
) 
 778         cfg 
-> SetPath(oldpath
); 
 781 void wxHtmlHelpFrame::WriteCustomization(wxConfigBase 
*cfg
, const wxString
& path
) 
 786     if (path 
!= wxEmptyString
) { 
 787         oldpath 
= cfg 
-> GetPath(); 
 788         cfg 
-> SetPath(_T("/") + path
); 
 791     cfg 
-> Write(wxT("hcNavigPanel"), m_Cfg
.navig_on
); 
 792     cfg 
-> Write(wxT("hcSashPos"), (long)m_Cfg
.sashpos
); 
 793     cfg 
-> Write(wxT("hcX"), (long)m_Cfg
.x
); 
 794     cfg 
-> Write(wxT("hcY"), (long)m_Cfg
.y
); 
 795     cfg 
-> Write(wxT("hcW"), (long)m_Cfg
.w
); 
 796     cfg 
-> Write(wxT("hcH"), (long)m_Cfg
.h
); 
 797     cfg 
-> Write(wxT("hcFixedFace"), m_FixedFace
); 
 798     cfg 
-> Write(wxT("hcNormalFace"), m_NormalFace
); 
 799     cfg 
-> Write(wxT("hcFontSize"), (long)m_FontSize
); 
 803         int cnt 
= m_BookmarksNames
.GetCount(); 
 806         cfg 
-> Write(wxT("hcBookmarksCnt"), (long)cnt
); 
 807         for (i 
= 0; i 
< cnt
; i
++) { 
 808             val
.Printf(wxT("hcBookmark_%i"), i
); 
 809             cfg 
-> Write(val
, m_BookmarksNames
[i
]); 
 810             val
.Printf(wxT("hcBookmark_%i_url"), i
); 
 811             cfg 
-> Write(val
, m_BookmarksPages
[i
]); 
 816         m_HtmlWin
->WriteCustomization(cfg
); 
 818     if (path 
!= wxEmptyString
) 
 819         cfg 
-> SetPath(oldpath
); 
 826 static void SetFontsToHtmlWin(wxHtmlWindow 
*win
, wxString scalf
, wxString fixf
, int size
) 
 828     static int f_sizes
[5][7] =  
 830             { 6,  7,  9, 12, 14, 16, 19}, 
 831             { 8,  9, 12, 14, 16, 19, 22}, 
 832             {10, 12, 14, 16, 19, 24, 32}, 
 833             {14, 16, 18, 24, 32, 38, 45}, 
 834             {16, 20, 24, 32, 38, 45, 50} 
 837     win 
-> SetFonts(scalf
, fixf
, f_sizes
[size
]); 
 841 class wxHtmlHelpFrameOptionsDialog 
: public wxDialog
 
 844         wxComboBox 
*NormalFont
, *FixedFont
; 
 845         wxRadioBox 
*RadioBox
; 
 846         wxHtmlWindow 
*TestWin
; 
 848         wxHtmlHelpFrameOptionsDialog(wxWindow 
*parent
) : wxDialog(parent
, -1, wxString(_("Help Browser Options"))) 
 850                 wxString choices
[5] = {_("very small"), _("small"), _("medium"), _("large"), _("very large")}; 
 851                 wxBoxSizer 
*topsizer
, *sizer
, *sizer2
; 
 853                 topsizer 
= new wxBoxSizer(wxVERTICAL
); 
 855                 sizer 
= new wxBoxSizer(wxHORIZONTAL
); 
 857                 sizer2 
= new wxStaticBoxSizer( new wxStaticBox(this, -1, _("Normal font:")), wxVERTICAL
); 
 858                 sizer2 
-> Add(NormalFont 
= new wxComboBox(this, -1, wxEmptyString
, wxDefaultPosition
,  
 860                               0, NULL
, wxCB_DROPDOWN 
| wxCB_READONLY
), 
 861                               1, wxEXPAND 
| wxLEFT 
| wxRIGHT
, 10); 
 863                 sizer 
-> Add(sizer2
, 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10); 
 865                 sizer2 
= new wxStaticBoxSizer( new wxStaticBox(this, -1, _("Fixed font:")), wxVERTICAL
); 
 866                 sizer2 
-> Add(FixedFont 
= new wxComboBox(this, -1, wxEmptyString
, wxDefaultPosition
,  
 868                               0, NULL
, wxCB_DROPDOWN 
| wxCB_READONLY
),  
 869                               1, wxEXPAND 
| wxLEFT 
| wxRIGHT
, 10); 
 871                 sizer 
-> Add(sizer2
, 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10); 
 873                 topsizer 
-> Add(sizer
); 
 875                 topsizer 
-> Add(RadioBox 
= new wxRadioBox(this, -1, _("Font size:"),  
 876                                                           wxDefaultPosition
, wxDefaultSize
, 5, choices
, 5),  
 877                                 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10); 
 879                 topsizer 
-> Add(new wxStaticText(this, -1, _("Preview:")),  
 880                                 0, wxLEFT 
| wxTOP
, 10); 
 881                 topsizer 
-> Add(TestWin 
= new wxHtmlWindow(this, -1, wxDefaultPosition
, wxSize(-1, 150)),  
 882                                 1, wxEXPAND 
| wxLEFT
|wxTOP
|wxRIGHT
, 10); 
 884                 sizer 
= new wxBoxSizer(wxHORIZONTAL
); 
 885                 sizer 
-> Add(new wxButton(this, wxID_OK
, _("OK")), 0, wxALL
, 10); 
 886                 sizer 
-> Add(new wxButton(this, wxID_CANCEL
, _("Cancel")), 0, wxALL
, 10); 
 887                 topsizer 
-> Add(sizer
, 0, wxALIGN_RIGHT
); 
 891                 topsizer 
-> Fit(this); 
 899                 SetFontsToHtmlWin(TestWin
,  
 900                                   NormalFont 
-> GetStringSelection(), 
 901                                   FixedFont 
-> GetStringSelection(), 
 902                                   RadioBox 
-> GetSelection()); 
 903                 TestWin 
-> SetPage(_("<html><body>" 
 904                                    "Normal face<br>(and <u>underlined</u>. <i>Italic face.</i> " 
 905                                    "<b>Bold face.</b> <b><i>Bold italic face.</i></b><br>" 
 906                                    "<font size=-2>font size -2</font><br>" 
 907                                    "<font size=-1>font size -1</font><br>" 
 908                                    "<font size=+0>font size +0</font><br>" 
 909                                    "<font size=+1>font size +1</font><br>" 
 910                                    "<font size=+2>font size +2</font><br>" 
 911                                    "<font size=+3>font size +3</font><br>" 
 912                                    "<font size=+4>font size +4</font><br>" 
 914                                    "<p><tt>Fixed size face.<br> <b>bold</b> <i>italic</i> " 
 915                                    "<b><i>bold italic <u>underlined</u></i></b><br>" 
 916                                    "<font size=-2>font size -2</font><br>" 
 917                                    "<font size=-1>font size -1</font><br>" 
 918                                    "<font size=+0>font size +0</font><br>" 
 919                                    "<font size=+1>font size +1</font><br>" 
 920                                    "<font size=+2>font size +2</font><br>" 
 921                                    "<font size=+3>font size +3</font><br>" 
 922                                    "<font size=+4>font size +4</font></tt>" 
 926         void OnUpdate(wxCloseEvent
& event
) 
 931         DECLARE_EVENT_TABLE() 
 934 BEGIN_EVENT_TABLE(wxHtmlHelpFrameOptionsDialog
, wxDialog
) 
 935     EVT_COMBOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate
) 
 936     EVT_RADIOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate
) 
 940 void wxHtmlHelpFrame::OptionsDialog() 
 942     wxHtmlHelpFrameOptionsDialog 
dlg(this); 
 945     if (m_NormalFonts 
== NULL
) { 
 946         wxFontEnumerator enu
; 
 947         enu
.EnumerateFacenames(); 
 948         m_NormalFonts 
= new wxArrayString
; 
 949         *m_NormalFonts 
= *enu
.GetFacenames(); 
 950         m_NormalFonts 
-> Sort(); 
 952     if (m_FixedFonts 
== NULL
) { 
 953         wxFontEnumerator enu
; 
 954         enu
.EnumerateFacenames(wxFONTENCODING_SYSTEM
, TRUE
); 
 955         m_FixedFonts 
= new wxArrayString
; 
 956         *m_FixedFonts 
= *enu
.GetFacenames(); 
 957         m_FixedFonts 
-> Sort(); 
 960     for (i 
= 0; i 
< m_NormalFonts 
-> GetCount(); i
++) 
 961         dlg
.NormalFont 
-> Append((*m_NormalFonts
)[i
]); 
 962     for (i 
= 0; i 
< m_FixedFonts 
-> GetCount(); i
++) 
 963         dlg
.FixedFont 
-> Append((*m_FixedFonts
)[i
]); 
 964     if (!m_NormalFace
.IsEmpty()) dlg
.NormalFont 
-> SetStringSelection(m_NormalFace
); 
 965     else dlg
.NormalFont 
-> SetSelection(0); 
 966     if (!m_FixedFace
.IsEmpty()) dlg
.FixedFont 
-> SetStringSelection(m_FixedFace
); 
 967     else dlg
.FixedFont 
-> SetSelection(0); 
 968     dlg
.RadioBox 
-> SetSelection(m_FontSize
); 
 971     if (dlg
.ShowModal() == wxID_OK
) { 
 972         m_NormalFace 
= dlg
.NormalFont 
-> GetStringSelection(); 
 973         m_FixedFace 
= dlg
.FixedFont 
-> GetStringSelection(); 
 974         m_FontSize 
= dlg
.RadioBox 
-> GetSelection(); 
 975         SetFontsToHtmlWin(m_HtmlWin
, m_NormalFace
, m_FixedFace
, m_FontSize
); 
 981 void wxHtmlHelpFrame::NotifyPageChanged() 
 983     if (m_UpdateContents 
&& m_PagesHash
) 
 985         wxString an 
= m_HtmlWin 
-> GetOpenedAnchor(); 
 986         wxHtmlHelpHashData 
*ha
; 
 988             ha 
= (wxHtmlHelpHashData
*) m_PagesHash 
-> Get(m_HtmlWin 
-> GetOpenedPage()); 
 990             ha 
= (wxHtmlHelpHashData
*) m_PagesHash 
-> Get(m_HtmlWin 
-> GetOpenedPage() + wxT("#") + an
); 
 993             bool olduc 
= m_UpdateContents
; 
 994             m_UpdateContents 
= FALSE
; 
 995             m_ContentsBox 
-> SelectItem(ha 
-> m_Id
); 
 996             m_ContentsBox 
-> EnsureVisible(ha 
-> m_Id
); 
 997             m_UpdateContents 
= olduc
; 
1009 void wxHtmlHelpFrame::OnToolbar(wxCommandEvent
& event
) 
1011     switch (event
.GetId()) { 
1013         case wxID_HTML_BACK 
: 
1014             m_HtmlWin 
-> HistoryBack(); 
1015             NotifyPageChanged(); 
1018         case wxID_HTML_FORWARD 
: 
1019             m_HtmlWin 
-> HistoryForward(); 
1020             NotifyPageChanged(); 
1026                 wxString an 
= m_HtmlWin 
-> GetOpenedAnchor(); 
1027                 wxHtmlHelpHashData 
*ha
; 
1029                     ha 
= (wxHtmlHelpHashData
*) m_PagesHash 
-> Get(m_HtmlWin 
-> GetOpenedPage()); 
1031                     ha 
= (wxHtmlHelpHashData
*) m_PagesHash 
-> Get(m_HtmlWin 
-> GetOpenedPage() + wxT("#") + an
); 
1032                 if (ha 
&& ha 
-> m_Index 
> 0) 
1034                     wxHtmlContentsItem 
*it 
= m_Data 
-> GetContents() + (ha 
-> m_Index 
- 1); 
1035                     m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
1036                     NotifyPageChanged(); 
1041         case wxID_HTML_UPNODE 
:  
1044                 wxString an 
= m_HtmlWin 
-> GetOpenedAnchor(); 
1045                 wxHtmlHelpHashData 
*ha
; 
1047                     ha 
= (wxHtmlHelpHashData
*) m_PagesHash 
-> Get(m_HtmlWin 
-> GetOpenedPage()); 
1049                     ha 
= (wxHtmlHelpHashData
*) m_PagesHash 
-> Get(m_HtmlWin 
-> GetOpenedPage() + wxT("#") + an
); 
1050                 if (ha 
&& ha 
-> m_Index 
> 0) 
1052                     int level 
= m_Data 
-> GetContents()[ha 
-> m_Index
].m_Level 
- 1; 
1053                     wxHtmlContentsItem 
*it
; 
1054                     int ind 
= ha 
-> m_Index 
- 1; 
1056                     it 
= m_Data 
-> GetContents() + ind
; 
1057                     while (ind 
>= 0 && it 
-> m_Level 
!= level
) ind
--, it
--; 
1060                         m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
1061                         NotifyPageChanged(); 
1067         case wxID_HTML_DOWN 
:  
1070                 wxString an 
= m_HtmlWin 
-> GetOpenedAnchor(); 
1072                 wxHtmlHelpHashData 
*ha
; 
1074                 if (an
.IsEmpty()) adr 
= m_HtmlWin 
-> GetOpenedPage(); 
1075                 else adr 
= m_HtmlWin 
-> GetOpenedPage() + wxT("#") + an
; 
1077                 ha 
= (wxHtmlHelpHashData
*) m_PagesHash 
-> Get(adr
); 
1079                 if (ha 
&& ha 
-> m_Index 
< m_Data 
-> GetContentsCnt() - 1) 
1081                     wxHtmlContentsItem 
*it 
= m_Data 
-> GetContents() + (ha 
-> m_Index 
+ 1); 
1083                     while (it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page 
== adr
) it
++; 
1084                     m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
1085                     NotifyPageChanged(); 
1090         case wxID_HTML_PANEL 
: 
1092                 if (! (m_Splitter 
&& m_NavigPan
)) 
1094                 if (m_Splitter 
-> IsSplit()) { 
1095                     m_Cfg
.sashpos 
= m_Splitter 
-> GetSashPosition(); 
1096                     m_Splitter 
-> Unsplit(m_NavigPan
); 
1097                     m_Cfg
.navig_on 
= FALSE
; 
1099                     m_NavigPan 
-> Show(TRUE
); 
1100                     m_HtmlWin 
-> Show(TRUE
); 
1101                     m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
1102                     m_Cfg
.navig_on 
= TRUE
; 
1107         case wxID_HTML_OPTIONS 
: 
1111         case wxID_HTML_BOOKMARKSADD 
:  
1116                 item 
= m_HtmlWin 
-> GetOpenedPageTitle(); 
1117                 url 
= m_HtmlWin 
-> GetOpenedPage(); 
1118                 if (item 
== wxEmptyString
) item 
= url
.AfterLast(wxT('/')); 
1119                 if (m_BookmarksPages
.Index(url
) == wxNOT_FOUND
) { 
1120                     m_Bookmarks 
-> Append(item
); 
1121                     m_BookmarksNames
.Add(item
); 
1122                     m_BookmarksPages
.Add(url
); 
1127         case wxID_HTML_BOOKMARKSREMOVE 
:  
1132                 item 
= m_Bookmarks 
-> GetStringSelection(); 
1133                 pos 
= m_BookmarksNames
.Index(item
); 
1134                 if (pos 
!= wxNOT_FOUND
) { 
1135                     m_BookmarksNames
.Remove(pos
); 
1136                     m_BookmarksPages
.Remove(pos
); 
1137                     m_Bookmarks 
-> Delete(m_Bookmarks 
-> GetSelection()); 
1142 #if wxUSE_PRINTING_ARCHITECTURE 
1143         case wxID_HTML_PRINT 
: 
1145                 if (m_Printer 
== NULL
)  
1146                     m_Printer 
= new wxHtmlEasyPrinting(_("Help Printing"), this); 
1147                 m_Printer 
-> PrintFile(m_HtmlWin 
-> GetOpenedPage()); 
1152         case wxID_HTML_OPENFILE 
: 
1154                 wxString s 
= wxFileSelector(_("Open HTML document"), wxEmptyString
, wxEmptyString
, wxEmptyString
,  
1155                              wxT("HTML files (*.htm)|*.htm|HTML files (*.html)|*.html|" 
1156                                  "Help books (*.htb)|*.htb|Help books (*.zip)|*.zip|" 
1157                                  "HTML Help Project (*.hhp)|*.hhp|" 
1158                                  "All files (*.*)|*"), 
1159                              wxOPEN 
| wxFILE_MUST_EXIST
, this); 
1162                     wxString ext 
= s
.Right(4).Lower(); 
1163                     if (ext 
== _T(".zip") || ext 
== _T(".htb") || ext 
== _T(".hhp")) 
1166                         m_Data 
-> AddBook(s
); 
1170                         m_HtmlWin 
-> LoadPage(s
); 
1179 void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent
& event
) 
1181     wxHtmlHelpTreeItemData 
*pg
; 
1182     wxHtmlContentsItem 
*it
; 
1184     pg 
= (wxHtmlHelpTreeItemData
*) m_ContentsBox 
-> GetItemData(event
.GetItem()); 
1186     if (pg 
&& m_UpdateContents
)  
1188         it 
= m_Data 
-> GetContents() + (pg 
-> m_Id
); 
1189         m_UpdateContents 
= FALSE
; 
1190         m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
1191         m_UpdateContents 
= TRUE
; 
1197 void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent
& WXUNUSED(event
)) 
1199     wxHtmlContentsItem 
*it 
= (wxHtmlContentsItem
*) m_IndexList 
-> GetClientData(m_IndexList 
-> GetSelection()); 
1200     m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
1201     NotifyPageChanged(); 
1205 void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent
& event
) 
1207     wxString sr 
= m_IndexText 
-> GetLineText(0); 
1209     if (sr 
== wxEmptyString
)  
1214         const wxChar 
*cstr 
= sr
.c_str(); 
1215         wxChar mybuff
[512], *ptr
; 
1218         m_IndexList
->Clear(); 
1219         int cnt 
= m_Data
->GetIndexCnt(); 
1220         wxHtmlContentsItem
* index 
= m_Data
->GetIndex(); 
1223         for (int i 
= 0; i 
< cnt
; i
++) 
1225             wxStrncpy(mybuff
, index
[i
].m_Name
, 512); 
1227             for (ptr 
= mybuff
; *ptr 
!= 0; ptr
++)  
1228                 if (*ptr 
>= 'A' && *ptr 
<= 'Z') *ptr 
-= 'A' - 'a'; 
1229             if (wxStrstr(mybuff
, cstr
) != NULL
) { 
1230                 m_IndexList 
-> Append(index
[i
].m_Name
, (char*)(index 
+ i
)); 
1233                     m_HtmlWin 
-> LoadPage(index
[i
].m_Book 
-> GetBasePath() + index
[i
].m_Page
); 
1234                     NotifyPageChanged(); 
1241         cnttext
.Printf(_("%i of %i"), displ
, cnt
); 
1242         m_IndexCountInfo 
-> SetLabel(cnttext
); 
1244         m_IndexText 
-> SetSelection(0, sr
.Length()); 
1245         m_IndexText 
-> SetFocus(); 
1249 void wxHtmlHelpFrame::OnIndexAll(wxCommandEvent
& WXUNUSED(event
)) 
1253     m_IndexList
->Clear(); 
1254     int cnt 
= m_Data
->GetIndexCnt(); 
1256     wxHtmlContentsItem
* index 
= m_Data
->GetIndex(); 
1258     for (int i 
= 0; i 
< cnt
; i
++) { 
1259         m_IndexList 
-> Append(index
[i
].m_Name
, (char*)(index 
+ i
)); 
1261             m_HtmlWin 
-> LoadPage(index
[i
].m_Book 
-> GetBasePath() + index
[i
].m_Page
); 
1262             NotifyPageChanged(); 
1268     cnttext
.Printf(_("%i of %i"), cnt
, cnt
); 
1269     m_IndexCountInfo 
-> SetLabel(cnttext
); 
1273 void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent
& WXUNUSED(event
)) 
1275     wxHtmlContentsItem 
*it 
= (wxHtmlContentsItem
*) m_SearchList 
-> GetClientData(m_SearchList 
-> GetSelection()); 
1278         m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
1279         NotifyPageChanged(); 
1283 void wxHtmlHelpFrame::OnSearch(wxCommandEvent
& WXUNUSED(event
)) 
1285     wxString sr 
= m_SearchText 
-> GetLineText(0); 
1287     if (sr 
!= wxEmptyString
) KeywordSearch(sr
); 
1290 void wxHtmlHelpFrame::OnBookmarksSel(wxCommandEvent
& WXUNUSED(event
)) 
1292     wxString sr 
= m_Bookmarks 
-> GetStringSelection(); 
1294     if (sr 
!= wxEmptyString 
&& sr 
!= _("(bookmarks)")) 
1296        m_HtmlWin 
-> LoadPage(m_BookmarksPages
[m_BookmarksNames
.Index(sr
)]); 
1297        NotifyPageChanged(); 
1301 void wxHtmlHelpFrame::OnCloseWindow(wxCloseEvent
& evt
) 
1303     GetSize(&m_Cfg
.w
, &m_Cfg
.h
); 
1304     GetPosition(&m_Cfg
.x
, &m_Cfg
.y
); 
1306     if (m_Splitter 
&& m_Cfg
.navig_on
) m_Cfg
.sashpos 
= m_Splitter 
-> GetSashPosition(); 
1309         WriteCustomization(m_Config
, m_ConfigRoot
); 
1314 BEGIN_EVENT_TABLE(wxHtmlHelpFrame
, wxFrame
) 
1315     EVT_TOOL_RANGE(wxID_HTML_PANEL
, wxID_HTML_OPTIONS
, wxHtmlHelpFrame::OnToolbar
) 
1316     EVT_BUTTON(wxID_HTML_BOOKMARKSREMOVE
, wxHtmlHelpFrame::OnToolbar
) 
1317     EVT_BUTTON(wxID_HTML_BOOKMARKSADD
, wxHtmlHelpFrame::OnToolbar
) 
1318     EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL
, wxHtmlHelpFrame::OnContentsSel
) 
1319     EVT_LISTBOX(wxID_HTML_INDEXLIST
, wxHtmlHelpFrame::OnIndexSel
) 
1320     EVT_LISTBOX(wxID_HTML_SEARCHLIST
, wxHtmlHelpFrame::OnSearchSel
) 
1321     EVT_BUTTON(wxID_HTML_SEARCHBUTTON
, wxHtmlHelpFrame::OnSearch
) 
1322     EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT
, wxHtmlHelpFrame::OnSearch
) 
1323     EVT_BUTTON(wxID_HTML_INDEXBUTTON
, wxHtmlHelpFrame::OnIndexFind
) 
1324     EVT_TEXT_ENTER(wxID_HTML_INDEXTEXT
, wxHtmlHelpFrame::OnIndexFind
) 
1325     EVT_BUTTON(wxID_HTML_INDEXBUTTONALL
, wxHtmlHelpFrame::OnIndexAll
) 
1326     EVT_COMBOBOX(wxID_HTML_BOOKMARKSLIST
, wxHtmlHelpFrame::OnBookmarksSel
) 
1327     EVT_CLOSE(wxHtmlHelpFrame::OnCloseWindow
)