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" 
  46 #include "bitmaps/wpanel.xpm" 
  47 #include "bitmaps/wback.xpm" 
  48 #include "bitmaps/wforward.xpm" 
  49 #include "bitmaps/wbook.xpm" 
  50 #include "bitmaps/woptions.xpm" 
  51 #include "bitmaps/wfolder.xpm" 
  52 #include "bitmaps/wpage.xpm" 
  53 #include "bitmaps/whelp.xpm" 
  54 #include "bitmaps/whlproot.xpm" 
  55 #include "bitmaps/wbkadd.xpm" 
  56 #include "bitmaps/wbkdel.xpm" 
  59 #include "wx/stream.h" 
  61 // number of times that the contents/index creation progress dialog 
  63 #define PROGRESS_STEP 40 
  65 // what is considered "small index"? 
  66 #define INDEX_IS_SMALL 100 
  69 //-------------------------------------------------------------------------- 
  70 // wxHtmlHelpTreeItemData (private) 
  71 //-------------------------------------------------------------------------- 
  73 class wxHtmlHelpTreeItemData 
: public wxTreeItemData
 
  79         wxHtmlHelpTreeItemData(wxHtmlContentsItem 
*it
) : wxTreeItemData() 
  81                 m_Page 
= it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
; 
  83         const wxString
& GetPage() { return m_Page
; } 
  89 //--------------------------------------------------------------------------- 
  91 //--------------------------------------------------------------------------- 
  93 IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpFrame
, wxFrame
) 
  95 wxHtmlHelpFrame::wxHtmlHelpFrame(wxWindow
* parent
, wxWindowID id
, const wxString
& title
, 
  96                                  int style
, wxHtmlHelpData
* data
) 
  99     Create(parent
, id
, title
, style
); 
 102 void wxHtmlHelpFrame::Init(wxHtmlHelpData
* data
) 
 106         m_DataCreated 
= FALSE
; 
 108         m_Data 
= new wxHtmlHelpData(); 
 109         m_DataCreated 
= TRUE
; 
 112     m_ContentsImageList 
= new wxImageList(16, 16); 
 113     m_ContentsImageList 
-> Add(wxICON(wbook
)); 
 114     m_ContentsImageList 
-> Add(wxICON(wfolder
)); 
 115     m_ContentsImageList 
-> Add(wxICON(wpage
)); 
 116     m_ContentsImageList 
-> Add(wxICON(whlproot
)); 
 118     m_ContentsBox 
= NULL
; 
 120     m_IndexButton 
= NULL
; 
 121     m_IndexButtonAll 
= NULL
; 
 124     m_SearchButton 
= NULL
; 
 126     m_SearchChoice 
= NULL
; 
 132     m_ConfigRoot 
= wxEmptyString
; 
 134     m_Cfg
.x 
= m_Cfg
.y 
= 0; 
 138     m_Cfg
.navig_on 
= TRUE
; 
 140     m_NormalFonts 
= m_FixedFonts 
= NULL
; 
 142     m_NormalFace 
= m_FixedFace 
= wxEmptyString
; 
 145 // Create: builds the GUI components. 
 146 // with the style flag it's possible to toggle the toolbar, contents, index and search 
 148 // m_HtmlWin will *always* be created, but it's important to realize that 
 149 // m_ContentsBox, m_IndexList, m_SearchList, m_SearchButton, m_SearchText and 
 150 // m_SearchButton may be NULL. 
 151 // moreover, if no contents, index or searchpage is needed, m_Splitter and 
 152 // m_NavigPan will be NULL too (with m_HtmlWin directly connected to the frame) 
 154 bool wxHtmlHelpFrame::Create(wxWindow
* parent
, wxWindowID id
, const wxString
& title
, 
 157     // Do the config in two steps. We read the HtmlWindow customization after we 
 158     // create the window. 
 160         ReadCustomization(m_Config
, m_ConfigRoot
); 
 162     wxFrame::Create(parent
, id
, _("Help"), wxPoint(m_Cfg
.x
, m_Cfg
.y
), wxSize(m_Cfg
.w
, m_Cfg
.h
), wxDEFAULT_FRAME_STYLE
, "wxHtmlHelp"); 
 164     GetPosition(&m_Cfg
.x
, &m_Cfg
.y
); 
 166     SetIcon(wxICON(whelp
)); 
 168     int notebook_page 
= 0; 
 173     if (style 
& wxHF_TOOLBAR
) { 
 174         wxToolBar 
*toolBar 
= CreateToolBar(wxNO_BORDER 
| wxTB_HORIZONTAL 
| wxTB_DOCKABLE
); 
 175         toolBar
->SetMargins( 2, 2 ); 
 177         toolBar 
-> AddTool(wxID_HTML_PANEL
, wxBITMAP(wpanel
), wxNullBitmap
, 
 178                            FALSE
, -1, -1, (wxObject 
*) NULL
, 
 179                            _("Show/hide navigation panel")); 
 180         toolBar 
-> AddSeparator(); 
 181         toolBar 
-> AddTool(wxID_HTML_BACK
, wxBITMAP(wback
), wxNullBitmap
, 
 182                            FALSE
, -1, -1, (wxObject 
*) NULL
, 
 183                            _("Go back to the previous HTML page")); 
 184         toolBar 
-> AddTool(wxID_HTML_FORWARD
, wxBITMAP(wforward
), wxNullBitmap
, 
 185                            FALSE
, -1, -1, (wxObject 
*) NULL
, 
 186                            _("Go forward to the next HTML page")); 
 187         toolBar 
-> AddSeparator(); 
 189         if (style 
& wxHF_BOOKMARKS
) { 
 190             m_Bookmarks 
= new wxComboBox(toolBar
, wxID_HTML_BOOKMARKSLIST
, wxEmptyString
,  
 191                                          wxDefaultPosition
, wxSize(300,-1), 0, NULL
, wxCB_READONLY 
| wxCB_SORT
); 
 192             m_Bookmarks 
-> Append(_("<bookmarks>")); 
 193             for (unsigned i 
= 0; i 
< m_BookmarksNames
.GetCount(); i
++) 
 194                 m_Bookmarks 
-> Append(m_BookmarksNames
[i
]); 
 195             m_Bookmarks 
-> SetSelection(0); 
 196             toolBar 
-> AddControl(m_Bookmarks
); 
 198             toolBar 
-> AddSeparator(); 
 200             toolBar 
-> AddTool(wxID_HTML_BOOKMARKSADD
, wxBITMAP(wbkadd
), wxNullBitmap
, 
 201                                FALSE
, -1, -1, (wxObject 
*) NULL
, 
 202                                _("Add current page to bookmarks")); 
 203             toolBar 
-> AddTool(wxID_HTML_BOOKMARKSREMOVE
, wxBITMAP(wbkdel
), wxNullBitmap
, 
 204                                FALSE
, -1, -1, (wxObject 
*) NULL
, 
 205                                _("Remove current page from bookmarks")); 
 208         toolBar 
-> AddSeparator(); 
 209         toolBar 
-> AddTool(wxID_HTML_OPTIONS
, wxBITMAP(woptions
), wxNullBitmap
, 
 210                            FALSE
, -1, -1, (wxObject 
*) NULL
, 
 211                            _("Display options dialog")); 
 213         toolBar 
-> Realize(); 
 216     if (style 
& (wxHF_CONTENTS 
| wxHF_INDEX 
| wxHF_SEARCH
)) { 
 217         // traditional help controller; splitter window with html page on the 
 218         // right and a notebook containing various pages on the left 
 219         m_Splitter 
= new wxSplitterWindow(this); 
 221         m_HtmlWin 
= new wxHtmlWindow(m_Splitter
); 
 222         m_NavigPan 
= new wxNotebook(m_Splitter
, wxID_HTML_NOTEBOOK
, 
 223                                     wxDefaultPosition
, wxDefaultSize
); 
 224     } else { // only html window, no notebook with index,contents etc 
 225         m_HtmlWin 
= new wxHtmlWindow(this); 
 228     m_HtmlWin 
-> SetRelatedFrame(this, m_TitleFormat
); 
 229     m_HtmlWin 
-> SetRelatedStatusBar(0); 
 231         m_HtmlWin 
-> ReadCustomization(m_Config
, m_ConfigRoot
); 
 233     // contents tree panel? 
 234     if (style 
& wxHF_CONTENTS
) { 
 235         m_ContentsBox 
= new wxTreeCtrl(m_NavigPan
, wxID_HTML_TREECTRL
, 
 236                                        wxDefaultPosition
, wxDefaultSize
, 
 237                                        wxTR_HAS_BUTTONS 
| wxSUNKEN_BORDER
); 
 238         m_ContentsBox 
-> SetImageList(m_ContentsImageList
); 
 239         m_NavigPan 
-> AddPage(m_ContentsBox
, _("Contents")); 
 240         m_ContentsPage 
= notebook_page
++; 
 243     // index listbox panel? 
 244     if (style 
& wxHF_INDEX
) { 
 245         wxWindow 
*dummy 
= new wxPanel(m_NavigPan
, wxID_HTML_INDEXPAGE
); 
 247         wxLayoutConstraints 
*b1 
= new wxLayoutConstraints
; 
 248         m_IndexText 
= new wxTextCtrl(dummy
, wxID_HTML_INDEXTEXT
, wxEmptyString
, wxDefaultPosition
, wxDefaultSize
, wxTE_PROCESS_ENTER
); 
 249         b1 
-> top
.SameAs (dummy
, wxTop
, 10); 
 250         b1 
-> left
.SameAs (dummy
, wxLeft
, 10); 
 251         b1 
-> right
.SameAs (dummy
, wxRight
, 10); 
 253         m_IndexText 
-> SetConstraints(b1
); 
 255         wxLayoutConstraints 
*b4 
= new wxLayoutConstraints
; 
 256         m_IndexButtonAll 
= new wxButton(dummy
, wxID_HTML_INDEXBUTTONALL
, _("Show all")); 
 258         b4 
-> top
.Below (m_IndexText
, 10); 
 259         b4 
-> right
.SameAs (dummy
, wxRight
, 10); 
 262         m_IndexButtonAll 
-> SetConstraints(b4
); 
 264         wxLayoutConstraints 
*b2 
= new wxLayoutConstraints
; 
 265         m_IndexButton 
= new wxButton(dummy
, wxID_HTML_INDEXBUTTON
, _("Find")); 
 266         b2 
-> top
.Below (m_IndexText
, 10); 
 267         b2 
-> right
.LeftOf (m_IndexButtonAll
, 10); 
 270         m_IndexButton 
-> SetConstraints(b2
); 
 272         wxLayoutConstraints 
*b3 
= new wxLayoutConstraints
; 
 273         m_IndexList 
= new wxListBox(dummy
, wxID_HTML_INDEXLIST
, wxDefaultPosition
, wxDefaultSize
, 0, NULL
, wxLB_SINGLE 
| wxLB_ALWAYS_SB
); 
 274         b3 
-> top
.Below (m_IndexButton
, 10); 
 275         b3 
-> left
.SameAs (dummy
, wxLeft
, 0); 
 276         b3 
-> right
.SameAs (dummy
, wxRight
, 0); 
 277         b3 
-> bottom
.SameAs (dummy
, wxBottom
, 0); 
 278         m_IndexList 
-> SetConstraints(b3
); 
 281         m_IndexButtonAll 
-> SetToolTip(_("Show all items in index")); 
 282         m_IndexButton 
-> SetToolTip(_("Display all index items that contain given substring. Note that this is case sensitive, so 'window' and 'Window' is something else!")); 
 283 #endif //wxUSE_TOOLTIPS 
 285         dummy 
-> SetAutoLayout(TRUE
); 
 288         m_NavigPan 
-> AddPage(dummy
, _("Index")); 
 289         m_IndexPage 
= notebook_page
++; 
 292     // search list panel? 
 293     if (style 
& wxHF_SEARCH
) { 
 294         wxWindow 
*dummy 
= new wxPanel(m_NavigPan
, wxID_HTML_SEARCHPAGE
); 
 296         wxLayoutConstraints 
*b1 
= new wxLayoutConstraints
; 
 297         m_SearchText 
= new wxTextCtrl(dummy
, wxID_HTML_SEARCHTEXT
, wxEmptyString
, wxDefaultPosition
, wxDefaultSize
, wxTE_PROCESS_ENTER
); 
 298         b1 
-> top
.SameAs (dummy
, wxTop
, 10); 
 299         b1 
-> left
.SameAs (dummy
, wxLeft
, 10); 
 300         b1 
-> right
.SameAs (dummy
, wxRight
, 10); 
 302         m_SearchText 
-> SetConstraints(b1
); 
 304         wxLayoutConstraints 
*b2 
= new wxLayoutConstraints
; 
 305         m_SearchButton 
= new wxButton(dummy
, wxID_HTML_SEARCHBUTTON
, _("Search")); 
 307         m_SearchButton 
-> SetToolTip(_("Search contents of help book(s) for all occurences of the text you typed above")); 
 308 #endif //wxUSE_TOOLTIPS 
 309         b2 
-> top
.Below (m_SearchText
, 10); 
 310         b2 
-> left
.SameAs (dummy
, wxLeft
, 10); 
 313         m_SearchButton 
-> SetConstraints(b2
); 
 315         wxLayoutConstraints 
*b4 
= new wxLayoutConstraints
; 
 316         m_SearchChoice 
= new wxChoice(dummy
, wxID_HTML_SEARCHCHOICE
, wxDefaultPosition
, 
 318         b4 
-> top
.Below (m_SearchText
, 10); 
 319         b4 
-> left
.SameAs (m_SearchButton
, wxRight
, 10); 
 320         b4 
-> right
.SameAs (dummy
, wxRight
, 10); 
 322         m_SearchChoice 
-> SetConstraints(b4
); 
 324         wxLayoutConstraints 
*b3 
= new wxLayoutConstraints
; 
 325         m_SearchList 
= new wxListBox(dummy
, wxID_HTML_SEARCHLIST
, wxDefaultPosition
, wxDefaultSize
, 0, NULL
, wxLB_SINGLE 
| wxLB_ALWAYS_SB
); 
 326         b3 
-> top
.Below (m_SearchButton
, 10); 
 327         b3 
-> left
.SameAs (dummy
, wxLeft
, 0); 
 328         b3 
-> right
.SameAs (dummy
, wxRight
, 0); 
 329         b3 
-> bottom
.SameAs (dummy
, wxBottom
, 0); 
 330         m_SearchList 
-> SetConstraints(b3
); 
 332         dummy 
-> SetAutoLayout(TRUE
); 
 334         m_NavigPan 
-> AddPage(dummy
, _("Search")); 
 335         m_SearchPage 
= notebook_page
++; 
 337     m_HtmlWin 
-> Show(TRUE
); 
 342     if (m_NavigPan 
&& m_Splitter
) { 
 343         m_Splitter 
-> SetMinimumPaneSize(20); 
 345             m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 347             m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 348             m_Splitter 
-> Unsplit(); 
 350         if (m_Cfg
.navig_on
) { 
 351             m_NavigPan 
-> Show(TRUE
); 
 352             m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 355             m_NavigPan 
-> Show(FALSE
); 
 356             m_Splitter 
-> Initialize(m_HtmlWin
); 
 362 wxHtmlHelpFrame::~wxHtmlHelpFrame() 
 364     delete m_ContentsImageList
; 
 367     if (m_NormalFonts
) delete m_NormalFonts
; 
 368     if (m_FixedFonts
) delete m_FixedFonts
; 
 371 bool wxHtmlHelpFrame::Display(const wxString
& x
) 
 373     wxString url 
= m_Data
->FindPageByName(x
); 
 374     if (! url
.IsEmpty()) { 
 375         m_HtmlWin
->LoadPage(url
); 
 381 bool wxHtmlHelpFrame::Display(const int id
) 
 383     wxString url 
= m_Data
->FindPageById(id
); 
 384     if (! url
.IsEmpty()) { 
 385         m_HtmlWin
->LoadPage(url
); 
 393 bool wxHtmlHelpFrame::DisplayContents() 
 397     if (!m_Splitter 
-> IsSplit()) { 
 398         m_NavigPan 
-> Show(TRUE
); 
 399         m_HtmlWin 
-> Show(TRUE
); 
 400         m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 401         m_Cfg
.navig_on 
= TRUE
; 
 403     m_NavigPan 
-> SetSelection(0); 
 409 bool wxHtmlHelpFrame::DisplayIndex() 
 413     if (!m_Splitter 
-> IsSplit()) { 
 414         m_NavigPan 
-> Show(TRUE
); 
 415         m_HtmlWin 
-> Show(TRUE
); 
 416         m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 418     m_NavigPan 
-> SetSelection(1); 
 422 bool wxHtmlHelpFrame::KeywordSearch(const wxString
& keyword
) 
 424     if (! (m_SearchList 
&& m_SearchButton 
&& m_SearchText 
&& m_SearchChoice
)) 
 429     wxString book 
= wxEmptyString
; 
 431     if (!m_Splitter 
-> IsSplit()) { 
 432         m_NavigPan 
-> Show(TRUE
); 
 433         m_HtmlWin 
-> Show(TRUE
); 
 434         m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 436     m_NavigPan 
-> SetSelection(m_SearchPage
); 
 437     m_SearchList 
-> Clear(); 
 438     m_SearchText 
-> SetValue(keyword
); 
 439     m_SearchButton 
-> Enable(FALSE
); 
 441     if (m_SearchChoice
->GetSelection() != 0) 
 442         book 
= m_SearchChoice
->GetStringSelection(); 
 444     wxHtmlSearchStatus 
status(m_Data
, keyword
, book
); 
 446     wxProgressDialog 
progress(_("Searching..."), _("No matching page found yet"), 
 447                               status
.GetMaxIndex(), this, 
 448                               wxPD_APP_MODAL 
| wxPD_CAN_ABORT 
| wxPD_AUTO_HIDE
); 
 450     while (status
.IsActive()) { 
 451         if (progress
.Update(status
.GetCurIndex()) == FALSE
) 
 453         if (status
.Search()) { 
 454             foundstr
.Printf(_("Found %i matches"), ++foundcnt
); 
 455             progress
.Update(status
.GetCurIndex(), foundstr
); 
 456             m_SearchList 
-> Append(status
.GetName(), status
.GetContentsItem()); 
 461     m_SearchButton 
-> Enable(TRUE
); 
 462     m_SearchText 
-> SetSelection(0, keyword
.Length()); 
 463     m_SearchText 
-> SetFocus(); 
 465         wxHtmlContentsItem 
*it 
= (wxHtmlContentsItem
*) m_SearchList 
-> GetClientData(0); 
 466         if (it
) m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
 468     return (foundcnt 
> 0); 
 473 void wxHtmlHelpFrame::CreateContents(bool show_progress
) 
 478     wxProgressDialog 
*progress 
= NULL
; 
 481     m_ContentsBox
->Clear(); 
 483     int cnt 
= m_Data
->GetContentsCnt(); 
 484     int div 
= (cnt 
/ PROGRESS_STEP
) + 1; 
 487     wxHtmlContentsItem 
*it
; 
 490         progress 
= new wxProgressDialog(_("Building contents tree..."), wxEmptyString
, 
 491                                         cnt
, this, wxPD_APP_MODAL 
| wxPD_CAN_ABORT 
| 
 494     wxTreeItemId roots
[MAX_ROOTS
]; 
 495     bool imaged
[MAX_ROOTS
]; 
 497     m_ContentsBox 
-> DeleteAllItems(); 
 498     roots
[0] = m_ContentsBox 
-> AddRoot(_("(Help)")); 
 499     m_ContentsBox 
-> SetItemImage(roots
[0], IMG_RootFolder
); 
 500     m_ContentsBox 
-> SetItemSelectedImage(roots
[0], IMG_RootFolder
); 
 503     for (it 
= m_Data
->GetContents(), i 
= 0; i 
< cnt
; i
++, it
++) { 
 504         if (show_progress 
&& ((i 
% div
) == 0)) { 
 505             proginfo
.Printf(_("Added %d/%d items"), i
, cnt
); 
 506             if (! progress
->Update(i
, proginfo
)) 
 510         roots
[it 
-> m_Level 
+ 1] =  m_ContentsBox 
-> AppendItem( 
 511                                        roots
[it 
-> m_Level
], it 
-> m_Name
, IMG_Page
, -1, 
 512                                        new wxHtmlHelpTreeItemData(it
)); 
 514         if (it 
-> m_Level 
== 0) { 
 515             m_ContentsBox 
-> SetItemBold(roots
[1], TRUE
); 
 516             m_ContentsBox 
-> SetItemImage(roots
[1], IMG_Book
); 
 517             m_ContentsBox 
-> SetItemSelectedImage(roots
[1], IMG_Book
); 
 519         } else imaged
[it 
-> m_Level 
+ 1] = FALSE
; 
 521         if (!imaged
[it 
-> m_Level
]) { 
 522             m_ContentsBox 
-> SetItemImage(roots
[it 
-> m_Level
], IMG_Folder
); 
 523             m_ContentsBox 
-> SetItemSelectedImage(roots
[it 
-> m_Level
], IMG_Folder
); 
 524             imaged
[it 
-> m_Level
] = TRUE
; 
 529     m_ContentsBox 
-> Expand(roots
[0]); 
 533 void wxHtmlHelpFrame::CreateIndex(bool show_progress
) 
 538     wxProgressDialog 
*progress 
= NULL
; 
 541     m_IndexList
->Clear(); 
 543     int cnt 
= m_Data
->GetIndexCnt(); 
 545     if (cnt 
> INDEX_IS_SMALL
) return; 
 547     int div 
= (cnt 
/ PROGRESS_STEP
) + 1; 
 549     wxHtmlContentsItem
* index 
= m_Data
->GetIndex(); 
 552         progress 
= new wxProgressDialog(_("Building index list..."), wxEmptyString
, 
 553                                         cnt
, this, wxPD_APP_MODAL 
| wxPD_CAN_ABORT 
| 
 555     for (int i 
= 0; i 
< cnt
; i
++) { 
 556         if (show_progress 
&& ((i 
% div
) == 0)) { 
 557             proginfo
.Printf(_("Added %d/%d items"), i
, cnt
); 
 558             if (! progress
->Update(i
, proginfo
)) 
 562         m_IndexList 
-> Append(index
[i
].m_Name
, (char*)(index 
+ i
)); 
 569 void wxHtmlHelpFrame::CreateSearch() 
 571     if (! (m_SearchList 
&& m_SearchChoice
)) 
 573     m_SearchList 
-> Clear(); 
 574     m_SearchChoice 
-> Clear(); 
 575     m_SearchChoice 
-> Append(_("all books")); 
 576     const wxHtmlBookRecArray
& bookrec 
= m_Data
->GetBookRecArray(); 
 577     int i
, cnt 
= bookrec
.GetCount(); 
 578     for (i 
= 0; i 
< cnt
; i
++) 
 579         m_SearchChoice
->Append(bookrec
[i
].GetTitle()); 
 580     m_SearchChoice
->SetSelection(0); 
 584 void wxHtmlHelpFrame::RefreshLists(bool show_progress
) 
 586     CreateContents(show_progress
); 
 587     CreateIndex(show_progress
); 
 591 void wxHtmlHelpFrame::ReadCustomization(wxConfigBase 
*cfg
, const wxString
& path
) 
 596     if (path 
!= wxEmptyString
) { 
 597         oldpath 
= cfg 
-> GetPath(); 
 598         cfg 
-> SetPath(path
); 
 601     m_Cfg
.navig_on 
= cfg 
-> Read("hcNavigPanel", m_Cfg
.navig_on
) != 0; 
 602     m_Cfg
.sashpos 
= cfg 
-> Read("hcSashPos", m_Cfg
.sashpos
); 
 603     m_Cfg
.x 
= cfg 
-> Read("hcX", m_Cfg
.x
); 
 604     m_Cfg
.y 
= cfg 
-> Read("hcY", m_Cfg
.y
); 
 605     m_Cfg
.w 
= cfg 
-> Read("hcW", m_Cfg
.w
); 
 606     m_Cfg
.h 
= cfg 
-> Read("hcH", m_Cfg
.h
); 
 608     m_FixedFace 
= cfg 
-> Read("hcFixedFace", m_FixedFace
); 
 609     m_NormalFace 
= cfg 
-> Read("hcNormalFace", m_NormalFace
); 
 610     m_FontSize 
= cfg 
-> Read("hcFontSize", m_FontSize
); 
 617         cnt 
= cfg 
-> Read("hcBookmarksCnt", 0L); 
 619             m_BookmarksNames
.Clear(); 
 620             m_BookmarksPages
.Clear(); 
 622                 m_Bookmarks 
-> Clear(); 
 623                 m_Bookmarks 
-> Append(_("<bookmarks>")); 
 626             for (i 
= 0; i 
< cnt
; i
++) { 
 627                 val
.Printf(wxT("hcBookmark_%i"), i
); 
 628                 s 
= cfg 
-> Read(val
); 
 629                 m_BookmarksNames
.Add(s
); 
 630                 if (m_Bookmarks
) m_Bookmarks 
-> Append(s
); 
 631                 val
.Printf(wxT("hcBookmark_%i_url"), i
); 
 632                 s 
= cfg 
-> Read(val
); 
 633                 m_BookmarksPages
.Add(s
); 
 639         m_HtmlWin
->ReadCustomization(cfg
, path
); 
 641     if (path 
!= wxEmptyString
) 
 642         cfg 
-> SetPath(oldpath
); 
 645 void wxHtmlHelpFrame::WriteCustomization(wxConfigBase 
*cfg
, const wxString
& path
) 
 650     if (path 
!= wxEmptyString
) { 
 651         oldpath 
= cfg 
-> GetPath(); 
 652         cfg 
-> SetPath(path
); 
 655     cfg 
-> Write("hcNavigPanel", m_Cfg
.navig_on
); 
 656     cfg 
-> Write("hcSashPos", (long)m_Cfg
.sashpos
); 
 657     cfg 
-> Write("hcX", (long)m_Cfg
.x
); 
 658     cfg 
-> Write("hcY", (long)m_Cfg
.y
); 
 659     cfg 
-> Write("hcW", (long)m_Cfg
.w
); 
 660     cfg 
-> Write("hcH", (long)m_Cfg
.h
); 
 661     cfg 
-> Write("hcFixedFace", m_FixedFace
); 
 662     cfg 
-> Write("hcNormalFace", m_NormalFace
); 
 663     cfg 
-> Write("hcFontSize", (long)m_FontSize
); 
 667         int cnt 
= m_BookmarksNames
.GetCount(); 
 670         cfg 
-> Write("hcBookmarksCnt", (long)cnt
); 
 671         for (i 
= 0; i 
< cnt
; i
++) { 
 672             val
.Printf(wxT("hcBookmark_%i"), i
); 
 673             cfg 
-> Write(val
, m_BookmarksNames
[i
]); 
 674             val
.Printf(wxT("hcBookmark_%i_url"), i
); 
 675             cfg 
-> Write(val
, m_BookmarksPages
[i
]); 
 680         m_HtmlWin
->WriteCustomization(cfg
, path
); 
 682     if (path 
!= wxEmptyString
) 
 683         cfg 
-> SetPath(oldpath
); 
 690 static void SetFontsToHtmlWin(wxHtmlWindow 
*win
, wxString scalf
, wxString fixf
, int size
) 
 692     static int f_sizes
[3][7] =  
 694             { 8,  9, 12, 14, 16, 19, 22}, 
 695             {10, 12, 14, 16, 19, 24, 32}, 
 696             {14, 16, 18, 24, 32, 38, 45} 
 699     win 
-> SetFonts(scalf
, fixf
, f_sizes
[size
]); 
 703 class wxHtmlHelpFrameOptionsDialog 
: public wxDialog
 
 706         wxComboBox 
*NormalFont
, *FixedFont
; 
 707         wxRadioBox 
*RadioBox
; 
 708         wxHtmlWindow 
*TestWin
; 
 710         wxHtmlHelpFrameOptionsDialog(wxWindow 
*parent
) : wxDialog(parent
, -1, wxString(_("Help Browser Options"))) 
 712                 wxString choices
[3] = {_("small"), _("medium"), _("large")}; 
 713                 wxBoxSizer 
*topsizer
, *sizer
, *sizer2
; 
 715                 topsizer 
= new wxBoxSizer(wxVERTICAL
); 
 717                 sizer 
= new wxBoxSizer(wxHORIZONTAL
); 
 719                 sizer2 
= new wxStaticBoxSizer( new wxStaticBox(this, -1, _("Normal font:")), wxVERTICAL
); 
 720                 sizer2 
-> Add(NormalFont 
= new wxComboBox(this, -1, wxEmptyString
, wxDefaultPosition
,  
 722                               0, NULL
, wxCB_DROPDOWN 
| wxCB_READONLY
), 
 723                               1, wxEXPAND 
| wxLEFT 
| wxRIGHT
, 10); 
 725                 sizer 
-> Add(sizer2
, 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10); 
 727                 sizer2 
= new wxStaticBoxSizer( new wxStaticBox(this, -1, _("Fixed font:")), wxVERTICAL
); 
 728                 sizer2 
-> Add(FixedFont 
= new wxComboBox(this, -1, wxEmptyString
, wxDefaultPosition
,  
 730                               0, NULL
, wxCB_DROPDOWN 
| wxCB_READONLY
),  
 731                               1, wxEXPAND 
| wxLEFT 
| wxRIGHT
, 10); 
 733                 sizer 
-> Add(sizer2
, 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10); 
 735                 topsizer 
-> Add(sizer
); 
 737                 topsizer 
-> Add(RadioBox 
= new wxRadioBox(this, -1, _("Font size:"),  
 738                                                           wxDefaultPosition
, wxDefaultSize
, 3, choices
, 3),  
 739                                 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10); 
 741                 topsizer 
-> Add(new wxStaticText(this, -1, _("Preview:")),  
 742                                 0, wxLEFT 
| wxTOP
, 10); 
 743                 topsizer 
-> Add(TestWin 
= new wxHtmlWindow(this, -1, wxDefaultPosition
, wxSize(-1, 150)),  
 744                                 1, wxEXPAND 
| wxLEFT
|wxTOP
|wxRIGHT
, 10); 
 746                 sizer 
= new wxBoxSizer(wxHORIZONTAL
); 
 747                 sizer 
-> Add(new wxButton(this, wxID_OK
, _("OK")), 0, wxALL
, 10); 
 748                 sizer 
-> Add(new wxButton(this, wxID_CANCEL
, _("Cancel")), 0, wxALL
, 10); 
 749                 topsizer 
-> Add(sizer
, 0, wxALIGN_RIGHT
); 
 753                 topsizer 
-> Fit(this); 
 761                 SetFontsToHtmlWin(TestWin
,  
 762                                   NormalFont 
-> GetStringSelection(), 
 763                                   FixedFont 
-> GetStringSelection(), 
 764                                   RadioBox 
-> GetSelection()); 
 765                 TestWin 
-> SetPage(_("<html><body>" 
 766                                    "Normal face<br>(and <u>underlined</u>. <i>Italic face.</i> " 
 767                                    "<b>Bold face.</b> <b><i>Bold italic face.</i></b><br>" 
 768                                    "<font size=-2>font size -2</font><br>" 
 769                                    "<font size=-1>font size -1</font><br>" 
 770                                    "<font size=+0>font size +0</font><br>" 
 771                                    "<font size=+1>font size +1</font><br>" 
 772                                    "<font size=+2>font size +2</font><br>" 
 773                                    "<font size=+3>font size +3</font><br>" 
 774                                    "<font size=+4>font size +4</font><br>" 
 776                                    "<p><tt>Fixed size face.<br> <b>bold</b> <i>italic</i> " 
 777                                    "<b><i>bold italic <u>underlined</u></i></b><br>" 
 778                                    "<font size=-2>font size -2</font><br>" 
 779                                    "<font size=-1>font size -1</font><br>" 
 780                                    "<font size=+0>font size +0</font><br>" 
 781                                    "<font size=+1>font size +1</font><br>" 
 782                                    "<font size=+2>font size +2</font><br>" 
 783                                    "<font size=+3>font size +3</font><br>" 
 784                                    "<font size=+4>font size +4</font></tt>" 
 788         void OnUpdate(wxCloseEvent
& event
) 
 793         DECLARE_EVENT_TABLE() 
 796 BEGIN_EVENT_TABLE(wxHtmlHelpFrameOptionsDialog
, wxDialog
) 
 797     EVT_COMBOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate
) 
 798     EVT_RADIOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate
) 
 802 void wxHtmlHelpFrame::OptionsDialog() 
 804     wxHtmlHelpFrameOptionsDialog 
dlg(this); 
 807     if (m_NormalFonts 
== NULL
) { 
 808         wxFontEnumerator enu
; 
 809         enu
.EnumerateFacenames(); 
 810         m_NormalFonts 
= new wxArrayString
; 
 811         *m_NormalFonts 
= *enu
.GetFacenames(); 
 812         m_NormalFonts 
-> Sort(); 
 814     if (m_FixedFonts 
== NULL
) { 
 815         wxFontEnumerator enu
; 
 816         enu
.EnumerateFacenames(wxFONTENCODING_SYSTEM
, TRUE
); 
 817         m_FixedFonts 
= new wxArrayString
; 
 818         *m_FixedFonts 
= *enu
.GetFacenames(); 
 819         m_FixedFonts 
-> Sort(); 
 822     for (i 
= 0; i 
< m_NormalFonts 
-> GetCount(); i
++) 
 823         dlg
.NormalFont 
-> Append((*m_NormalFonts
)[i
]); 
 824     for (i 
= 0; i 
< m_FixedFonts 
-> GetCount(); i
++) 
 825         dlg
.FixedFont 
-> Append((*m_FixedFonts
)[i
]); 
 826     if (!m_NormalFace
.IsEmpty()) dlg
.NormalFont 
-> SetStringSelection(m_NormalFace
); 
 827     else dlg
.NormalFont 
-> SetSelection(0); 
 828     if (!m_FixedFace
.IsEmpty()) dlg
.FixedFont 
-> SetStringSelection(m_FixedFace
); 
 829     else dlg
.FixedFont 
-> SetSelection(0); 
 830     dlg
.RadioBox 
-> SetSelection(m_FontSize
); 
 833     if (dlg
.ShowModal() == wxID_OK
) { 
 834         m_NormalFace 
= dlg
.NormalFont 
-> GetStringSelection(); 
 835         m_FixedFace 
= dlg
.FixedFont 
-> GetStringSelection(); 
 836         m_FontSize 
= dlg
.RadioBox 
-> GetSelection(); 
 837         SetFontsToHtmlWin(m_HtmlWin
, m_NormalFace
, m_FixedFace
, m_FontSize
); 
 850 void wxHtmlHelpFrame::OnToolbar(wxCommandEvent
& event
) 
 852     switch (event
.GetId()) { 
 854         case wxID_HTML_BACK 
: 
 855             m_HtmlWin 
-> HistoryBack(); 
 858         case wxID_HTML_FORWARD 
: 
 859             m_HtmlWin 
-> HistoryForward(); 
 862         case wxID_HTML_PANEL 
: 
 863             if (! (m_Splitter 
&& m_NavigPan
)) 
 865             if (m_Splitter 
-> IsSplit()) { 
 866                 m_Cfg
.sashpos 
= m_Splitter 
-> GetSashPosition(); 
 867                 m_Splitter 
-> Unsplit(m_NavigPan
); 
 868                 m_Cfg
.navig_on 
= FALSE
; 
 870                 m_NavigPan 
-> Show(TRUE
); 
 871                 m_HtmlWin 
-> Show(TRUE
); 
 872                 m_Splitter 
-> SplitVertically(m_NavigPan
, m_HtmlWin
, m_Cfg
.sashpos
); 
 873                 m_Cfg
.navig_on 
= TRUE
; 
 877         case wxID_HTML_OPTIONS 
: 
 881         case wxID_HTML_BOOKMARKSADD 
:  
 886                 item 
= m_HtmlWin 
-> GetOpenedPageTitle(); 
 887                 url 
= m_HtmlWin 
-> GetOpenedPage(); 
 888                 if (item 
== wxEmptyString
) item 
= url
.AfterLast(wxT('/')); 
 889                 if (m_BookmarksPages
.Index(url
) == wxNOT_FOUND
) { 
 890                     m_Bookmarks 
-> Append(item
); 
 891                     m_BookmarksNames
.Add(item
); 
 892                     m_BookmarksPages
.Add(url
); 
 897         case wxID_HTML_BOOKMARKSREMOVE 
:  
 902                 item 
= m_Bookmarks 
-> GetStringSelection(); 
 903                 pos 
= m_BookmarksNames
.Index(item
); 
 904                 if (pos 
!= wxNOT_FOUND
) { 
 905                     m_BookmarksNames
.Remove(pos
); 
 906                     m_BookmarksPages
.Remove(pos
); 
 907                     m_Bookmarks 
-> Delete(m_Bookmarks 
-> GetSelection()); 
 916 void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent
& event
) 
 918     wxHtmlHelpTreeItemData 
*pg
; 
 920     pg 
= (wxHtmlHelpTreeItemData
*) m_ContentsBox 
-> GetItemData(event
.GetItem()); 
 921     if (pg
) m_HtmlWin 
-> LoadPage(pg 
-> GetPage()); 
 926 void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent
& WXUNUSED(event
)) 
 928     wxHtmlContentsItem 
*it 
= (wxHtmlContentsItem
*) m_IndexList 
-> GetClientData(m_IndexList 
-> GetSelection()); 
 929     m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
 933 void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent
& event
) 
 935     wxString sr 
= m_IndexText 
-> GetLineText(0); 
 936     if (sr 
== wxEmptyString
)  
 941         const wxChar 
*cstr 
= sr
.c_str(); 
 944         m_IndexList
->Clear(); 
 945         int cnt 
= m_Data
->GetIndexCnt(); 
 946         wxHtmlContentsItem
* index 
= m_Data
->GetIndex(); 
 948         for (int i 
= 0; i 
< cnt
; i
++) 
 949             if (wxStrstr(index
[i
].m_Name
, cstr
) != NULL
) { 
 950                 m_IndexList 
-> Append(index
[i
].m_Name
, (char*)(index 
+ i
)); 
 952                     m_HtmlWin 
-> LoadPage(index
[i
].m_Book 
-> GetBasePath() + index
[i
].m_Page
); 
 957         m_IndexText 
-> SetSelection(0, sr
.Length()); 
 958         m_IndexText 
-> SetFocus(); 
 962 void wxHtmlHelpFrame::OnIndexAll(wxCommandEvent
& WXUNUSED(event
)) 
 966     m_IndexList
->Clear(); 
 967     int cnt 
= m_Data
->GetIndexCnt(); 
 969     wxHtmlContentsItem
* index 
= m_Data
->GetIndex(); 
 971     for (int i 
= 0; i 
< cnt
; i
++) { 
 972         m_IndexList 
-> Append(index
[i
].m_Name
, (char*)(index 
+ i
)); 
 974             m_HtmlWin 
-> LoadPage(index
[i
].m_Book 
-> GetBasePath() + index
[i
].m_Page
); 
 981 void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent
& WXUNUSED(event
)) 
 983     wxHtmlContentsItem 
*it 
= (wxHtmlContentsItem
*) m_SearchList 
-> GetClientData(m_SearchList 
-> GetSelection()); 
 984     if (it
) m_HtmlWin 
-> LoadPage(it 
-> m_Book 
-> GetBasePath() + it 
-> m_Page
); 
 987 void wxHtmlHelpFrame::OnSearch(wxCommandEvent
& WXUNUSED(event
)) 
 989     wxString sr 
= m_SearchText 
-> GetLineText(0); 
 991     if (sr 
!= wxEmptyString
) KeywordSearch(sr
); 
 994 void wxHtmlHelpFrame::OnBookmarksSel(wxCommandEvent
& WXUNUSED(event
)) 
 996     wxString sr 
= m_Bookmarks 
-> GetStringSelection(); 
 998     if (sr 
!= wxEmptyString 
&& sr 
!= _("<bookmarks>")) 
 999         m_HtmlWin 
-> LoadPage(m_BookmarksPages
[m_BookmarksNames
.Index(sr
)]); 
1002 void wxHtmlHelpFrame::OnCloseWindow(wxCloseEvent
& evt
) 
1004     GetSize(&m_Cfg
.w
, &m_Cfg
.h
); 
1005     GetPosition(&m_Cfg
.x
, &m_Cfg
.y
); 
1007     if (m_Splitter 
&& m_Cfg
.navig_on
) m_Cfg
.sashpos 
= m_Splitter 
-> GetSashPosition(); 
1010         WriteCustomization(m_Config
, m_ConfigRoot
); 
1015 BEGIN_EVENT_TABLE(wxHtmlHelpFrame
, wxFrame
) 
1016     EVT_TOOL_RANGE(wxID_HTML_PANEL
, wxID_HTML_BOOKMARKSREMOVE
, wxHtmlHelpFrame::OnToolbar
) 
1017     EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL
, wxHtmlHelpFrame::OnContentsSel
) 
1018     EVT_LISTBOX(wxID_HTML_INDEXLIST
, wxHtmlHelpFrame::OnIndexSel
) 
1019     EVT_LISTBOX(wxID_HTML_SEARCHLIST
, wxHtmlHelpFrame::OnSearchSel
) 
1020     EVT_BUTTON(wxID_HTML_SEARCHBUTTON
, wxHtmlHelpFrame::OnSearch
) 
1021     EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT
, wxHtmlHelpFrame::OnSearch
) 
1022     EVT_BUTTON(wxID_HTML_INDEXBUTTON
, wxHtmlHelpFrame::OnIndexFind
) 
1023     EVT_TEXT_ENTER(wxID_HTML_INDEXTEXT
, wxHtmlHelpFrame::OnIndexFind
) 
1024     EVT_BUTTON(wxID_HTML_INDEXBUTTONALL
, wxHtmlHelpFrame::OnIndexAll
) 
1025     EVT_COMBOBOX(wxID_HTML_BOOKMARKSLIST
, wxHtmlHelpFrame::OnBookmarksSel
) 
1026     EVT_CLOSE(wxHtmlHelpFrame::OnCloseWindow
)