X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/020707bba9c960c155f4257d9a027d6aecdae5b8..a8cb1a4947bbbf5e18ce52448f4c3bb4cff4daee:/src/html/helpfrm.cpp diff --git a/src/html/helpfrm.cpp b/src/html/helpfrm.cpp index ab924b7ab7..3f403439b6 100644 --- a/src/html/helpfrm.cpp +++ b/src/html/helpfrm.cpp @@ -9,10 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "helpfrm.h" -#endif - // For compilers that support precompilation, includes "wx.h" #include "wx/wxprec.h" @@ -59,6 +55,7 @@ #include "wx/spinctrl.h" #include "wx/dynarray.h" #include "wx/choicdlg.h" +#include "wx/settings.h" // what is considered "small index"? #define INDEX_IS_SMALL 100 @@ -110,7 +107,11 @@ class wxHtmlHelpHashData : public wxObject class wxHtmlHelpHtmlWindow : public wxHtmlWindow { public: - wxHtmlHelpHtmlWindow(wxHtmlHelpFrame *fr, wxWindow *parent) : wxHtmlWindow(parent), m_Frame(fr) {} + wxHtmlHelpHtmlWindow(wxHtmlHelpFrame *fr, wxWindow *parent) + : wxHtmlWindow(parent), m_Frame(fr) + { + SetStandardFonts(); + } virtual void OnLinkClicked(const wxHtmlLinkInfo& link) { @@ -120,6 +121,22 @@ class wxHtmlHelpHtmlWindow : public wxHtmlWindow m_Frame->NotifyPageChanged(); } + // Returns full location with anchor (helper) + static wxString GetOpenedPageWithAnchor(wxHtmlWindow *win) + { + if(!win) + return wxEmptyString; + + wxString an = win->GetOpenedAnchor(); + wxString pg = win->GetOpenedPage(); + if(!an.empty()) + { + pg << wxT("#"); + pg << an; + } + return pg; + } + private: wxHtmlHelpFrame *m_Frame; @@ -131,7 +148,7 @@ class wxHtmlHelpHtmlWindow : public wxHtmlWindow // wxHtmlHelpFrame::m_mergedIndex //--------------------------------------------------------------------------- -WX_DEFINE_ARRAY(const wxHtmlHelpDataItem*, wxHtmlHelpDataItemPtrArray); +WX_DEFINE_ARRAY_PTR(const wxHtmlHelpDataItem*, wxHtmlHelpDataItemPtrArray); struct wxHtmlHelpMergedIndexItem { @@ -154,12 +171,12 @@ void wxHtmlHelpFrame::UpdateMergedIndex() size_t len = items.size(); wxHtmlHelpMergedIndexItem *history[128] = {NULL}; - + for (size_t i = 0; i < len; i++) { const wxHtmlHelpDataItem& item = items[i]; wxASSERT_MSG( item.level < 128, _T("nested index entries too deep") ); - + if (history[item.level] && history[item.level]->items[0]->name == item.name) { @@ -175,10 +192,10 @@ void wxHtmlHelpFrame::UpdateMergedIndex() mi->parent = (item.level == 0) ? NULL : history[item.level - 1]; history[item.level] = mi; merged.Add(mi); - } + } } } - + //--------------------------------------------------------------------------- // wxHtmlHelpFrame @@ -237,6 +254,10 @@ void wxHtmlHelpFrame::Init(wxHtmlHelpData* data) m_DataCreated = true; } + m_ContentsPage = 0; + m_IndexPage = 0; + m_SearchPage = 0; + m_ContentsBox = NULL; m_IndexList = NULL; m_IndexButton = NULL; @@ -260,7 +281,7 @@ void wxHtmlHelpFrame::Init(wxHtmlHelpData* data) m_Config = NULL; m_ConfigRoot = wxEmptyString; - m_Cfg.x = m_Cfg.y = 0; + m_Cfg.x = m_Cfg.y = wxDefaultCoord; m_Cfg.w = 700; m_Cfg.h = 480; m_Cfg.sashpos = 240; @@ -298,9 +319,15 @@ bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, m_hfStyle = style; wxImageList *ContentsImageList = new wxImageList(16, 16); - ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_BOOK, wxART_HELP_BROWSER)); - ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_FOLDER, wxART_HELP_BROWSER)); - ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_PAGE, wxART_HELP_BROWSER)); + ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_BOOK, + wxART_HELP_BROWSER, + wxSize(16, 16))); + ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_FOLDER, + wxART_HELP_BROWSER, + wxSize(16, 16))); + ContentsImageList->Add(wxArtProvider::GetIcon(wxART_HELP_PAGE, + wxART_HELP_BROWSER, + wxSize(16, 16))); // Do the config in two steps. We read the HtmlWindow customization after we // create the window. @@ -328,6 +355,8 @@ bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, wxMenu* helpMenu = new wxMenu; helpMenu->Append(wxID_ABOUT, _("&About...")); + // Ensures we don't get an empty help menu + helpMenu->Append(wxID_HELP_CONTENTS, _("&About...")); menuBar->Append(fileMenu,_("&File")); menuBar->Append(helpMenu,_("&Help")); @@ -336,7 +365,9 @@ bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, int notebook_page = 0; +#if wxUSE_STATUSBAR CreateStatusBar(); +#endif // wxUSE_STATUSBAR #if wxUSE_TOOLBAR // toolbar? @@ -375,7 +406,9 @@ bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, } m_HtmlWin->SetRelatedFrame(this, m_TitleFormat); +#if wxUSE_STATUSBAR m_HtmlWin->SetRelatedStatusBar(0); +#endif // wxUSE_STATUSBAR if ( m_Config ) m_HtmlWin->ReadCustomization(m_Config, m_ConfigRoot); @@ -403,10 +436,10 @@ bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, wxBitmapButton *bmpbt1, *bmpbt2; bmpbt1 = new wxBitmapButton(dummy, wxID_HTML_BOOKMARKSADD, wxArtProvider::GetBitmap(wxART_ADD_BOOKMARK, - wxART_HELP_BROWSER)); + wxART_BUTTON)); bmpbt2 = new wxBitmapButton(dummy, wxID_HTML_BOOKMARKSREMOVE, wxArtProvider::GetBitmap(wxART_DEL_BOOKMARK, - wxART_HELP_BROWSER)); + wxART_BUTTON)); #if wxUSE_TOOLTIPS bmpbt1->SetToolTip(_("Add current page to bookmarks")); bmpbt2->SetToolTip(_("Remove current page from bookmarks")); @@ -423,9 +456,16 @@ bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, m_ContentsBox = new wxTreeCtrl(dummy, wxID_HTML_TREECTRL, wxDefaultPosition, wxDefaultSize, +#ifdef __WXGTK20__ wxSUNKEN_BORDER | wxTR_HAS_BUTTONS | wxTR_HIDE_ROOT | - wxTR_LINES_AT_ROOT); + wxTR_NO_LINES +#else + wxSUNKEN_BORDER | + wxTR_HAS_BUTTONS | wxTR_HIDE_ROOT | + wxTR_LINES_AT_ROOT +#endif + ); m_ContentsBox->AssignImageList(ContentsImageList); @@ -490,7 +530,7 @@ bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); m_SearchChoice = new wxChoice(dummy, wxID_HTML_SEARCHCHOICE, - wxDefaultPosition, wxDefaultSize); + wxDefaultPosition, wxSize(125,wxDefaultCoord)); m_SearchCaseSensitive = new wxCheckBox(dummy, wxID_ANY, _("Case sensitive")); m_SearchWholeWords = new wxCheckBox(dummy, wxID_ANY, _("Whole words only")); m_SearchButton = new wxButton(dummy, wxID_HTML_SEARCHBUTTON, _("Search")); @@ -553,6 +593,8 @@ bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, wxHtmlHelpFrame::~wxHtmlHelpFrame() { + delete m_mergedIndex; + // PopEventHandler(); // wxhtmlhelpcontroller (not any more!) if (m_DataCreated) delete m_Data; @@ -573,23 +615,23 @@ wxHtmlHelpFrame::~wxHtmlHelpFrame() void wxHtmlHelpFrame::AddToolbarButtons(wxToolBar *toolBar, int style) { wxBitmap wpanelBitmap = - wxArtProvider::GetBitmap(wxART_HELP_SIDE_PANEL, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_HELP_SIDE_PANEL, wxART_TOOLBAR); wxBitmap wbackBitmap = - wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR); wxBitmap wforwardBitmap = - wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_TOOLBAR); wxBitmap wupnodeBitmap = - wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR); wxBitmap wupBitmap = - wxArtProvider::GetBitmap(wxART_GO_UP, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_GO_UP, wxART_TOOLBAR); wxBitmap wdownBitmap = - wxArtProvider::GetBitmap(wxART_GO_DOWN, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_GO_DOWN, wxART_TOOLBAR); wxBitmap wopenBitmap = - wxArtProvider::GetBitmap(wxART_FILE_OPEN, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_FILE_OPEN, wxART_TOOLBAR); wxBitmap wprintBitmap = - wxArtProvider::GetBitmap(wxART_PRINT, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_PRINT, wxART_TOOLBAR); wxBitmap woptionsBitmap = - wxArtProvider::GetBitmap(wxART_HELP_SETTINGS, wxART_HELP_BROWSER); + wxArtProvider::GetBitmap(wxART_HELP_SETTINGS, wxART_TOOLBAR); wxASSERT_MSG( (wpanelBitmap.Ok() && wbackBitmap.Ok() && wforwardBitmap.Ok() && wupnodeBitmap.Ok() && @@ -600,26 +642,26 @@ void wxHtmlHelpFrame::AddToolbarButtons(wxToolBar *toolBar, int style) toolBar->AddTool(wxID_HTML_PANEL, wpanelBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Show/hide navigation panel")); toolBar->AddSeparator(); toolBar->AddTool(wxID_HTML_BACK, wbackBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Go back")); toolBar->AddTool(wxID_HTML_FORWARD, wforwardBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Go forward")); toolBar->AddSeparator(); toolBar->AddTool(wxID_HTML_UPNODE, wupnodeBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Go one level up in document hierarchy")); toolBar->AddTool(wxID_HTML_UP, wupBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Previous page")); toolBar->AddTool(wxID_HTML_DOWN, wdownBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Next page")); if ((style & wxHF_PRINT) || (style & wxHF_OPEN_FILES)) @@ -627,19 +669,19 @@ void wxHtmlHelpFrame::AddToolbarButtons(wxToolBar *toolBar, int style) if (style & wxHF_OPEN_FILES) toolBar->AddTool(wxID_HTML_OPENFILE, wopenBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Open HTML document")); #if wxUSE_PRINTING_ARCHITECTURE if (style & wxHF_PRINT) toolBar->AddTool(wxID_HTML_PRINT, wprintBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Print this page")); #endif toolBar->AddSeparator(); toolBar->AddTool(wxID_HTML_OPTIONS, woptionsBitmap, wxNullBitmap, - false, -1, -1, (wxObject *) NULL, + false, wxDefaultCoord, wxDefaultCoord, (wxObject *) NULL, _("Display options dialog")); } #endif //wxUSE_TOOLBAR @@ -656,7 +698,7 @@ void wxHtmlHelpFrame::SetTitleFormat(const wxString& format) bool wxHtmlHelpFrame::Display(const wxString& x) { wxString url = m_Data->FindPageByName(x); - if (!url.IsEmpty()) + if (!url.empty()) { m_HtmlWin->LoadPage(url); NotifyPageChanged(); @@ -669,7 +711,7 @@ bool wxHtmlHelpFrame::Display(const wxString& x) bool wxHtmlHelpFrame::Display(const int id) { wxString url = m_Data->FindPageById(id); - if (!url.IsEmpty()) + if (!url.empty()) { m_HtmlWin->LoadPage(url); NotifyPageChanged(); @@ -694,12 +736,12 @@ bool wxHtmlHelpFrame::DisplayContents() m_Cfg.navig_on = true; } - m_NavigNotebook->SetSelection(0); + m_NavigNotebook->SetSelection(m_ContentsPage); if (m_Data->GetBookRecArray().GetCount() > 0) { wxHtmlBookRecord& book = m_Data->GetBookRecArray()[0]; - if (!book.GetStart().IsEmpty()) + if (!book.GetStart().empty()) m_HtmlWin->LoadPage(book.GetFullPath(book.GetStart())); } @@ -720,12 +762,12 @@ bool wxHtmlHelpFrame::DisplayIndex() m_Splitter->SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos); } - m_NavigNotebook->SetSelection(1); + m_NavigNotebook->SetSelection(m_IndexPage); if (m_Data->GetBookRecArray().GetCount() > 0) { wxHtmlBookRecord& book = m_Data->GetBookRecArray()[0]; - if (!book.GetStart().IsEmpty()) + if (!book.GetStart().empty()) m_HtmlWin->LoadPage(book.GetFullPath(book.GetStart())); } @@ -890,7 +932,7 @@ bool wxHtmlHelpFrame::KeywordSearch(const wxString& keyword, case wxHELP_SEARCH_INDEX: { - wxHtmlHelpMergedIndexItem* it = + wxHtmlHelpMergedIndexItem* it = (wxHtmlHelpMergedIndexItem*) m_IndexList->GetClientData(0); if (it) DisplayIndexItem(it); @@ -913,9 +955,9 @@ void wxHtmlHelpFrame::CreateContents() WX_CLEAR_HASH_TABLE(*m_PagesHash); delete m_PagesHash; } - + const wxHtmlHelpDataItems& contents = m_Data->GetContentsArray(); - + size_t cnt = contents.size(); m_PagesHash = new wxHashTable(wxKEY_STRING, 2 * cnt); @@ -923,10 +965,10 @@ void wxHtmlHelpFrame::CreateContents() const int MAX_ROOTS = 64; wxTreeItemId roots[MAX_ROOTS]; // VS: this array holds information about whether we've set item icon at - // given level. This is neccessary because m_Data has flat structure + // given level. This is necessary because m_Data has a flat structure // and there's no way of recognizing if some item has subitems or not. // We set the icon later: when we find an item with level=n, we know - // that the last item with level=n-1 was folder with subitems, so we + // that the last item with level=n-1 was afolder with subitems, so we // set its icon accordingly bool imaged[MAX_ROOTS]; m_ContentsBox->DeleteAllItems(); @@ -942,9 +984,9 @@ void wxHtmlHelpFrame::CreateContents() { if (m_hfStyle & wxHF_MERGE_BOOKS) // VS: we don't want book nodes, books' content should - // appear under tree's root. This line will create "fake" + // appear under tree's root. This line will create a "fake" // record about book node so that the rest of this look - // will believe there really _is_ book node and will + // will believe there really _is_ a book node and will // behave correctly. roots[1] = roots[0]; else @@ -968,7 +1010,7 @@ void wxHtmlHelpFrame::CreateContents() m_PagesHash->Put(it->GetFullPath(), new wxHtmlHelpHashData(i, roots[it->level + 1])); - // Set the icon for the node one level up in the hiearachy, + // Set the icon for the node one level up in the hierarchy, // unless already done (see comment above imaged[] declaration) if (!imaged[it->level]) { @@ -1145,7 +1187,7 @@ void wxHtmlHelpFrame::WriteCustomization(wxConfigBase *cfg, const wxString& path -static void SetFontsToHtmlWin(wxHtmlWindow *win, wxString scalf, wxString fixf, int size) +static void SetFontsToHtmlWin(wxHtmlWindow *win, const wxString& scalf, const wxString& fixf, int size) { int f_sizes[7]; f_sizes[0] = int(size * 0.6); @@ -1178,11 +1220,11 @@ public: sizer->Add(new wxStaticText(this, wxID_ANY, _("Font size:"))); sizer->Add(NormalFont = new wxComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, - wxSize(200, 200), + wxSize(200, wxDefaultCoord), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY)); sizer->Add(FixedFont = new wxComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, - wxSize(200, 200), + wxSize(200, wxDefaultCoord), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY)); sizer->Add(FontSize = new wxSpinCtrl(this, wxID_ANY)); @@ -1198,9 +1240,9 @@ public: wxBoxSizer *sizer2 = new wxBoxSizer(wxHORIZONTAL); wxButton *ok; - sizer2->Add(ok = new wxButton(this, wxID_OK, _("OK")), 0, wxALL, 10); + sizer2->Add(ok = new wxButton(this, wxID_OK), 0, wxALL, 10); ok->SetDefault(); - sizer2->Add(new wxButton(this, wxID_CANCEL, _("Cancel")), 0, wxALL, 10); + sizer2->Add(new wxButton(this, wxID_CANCEL), 0, wxALL, 10); topsizer->Add(sizer2, 0, wxALIGN_RIGHT); SetSizer(topsizer); @@ -1271,7 +1313,7 @@ void wxHtmlHelpFrame::OptionsDialog() enu.EnumerateFacenames(); m_NormalFonts = new wxArrayString; *m_NormalFonts = *enu.GetFacenames(); - m_NormalFonts->Sort(wxStringSortAscending); + m_NormalFonts->Sort(); // ascending sort } if (m_FixedFonts == NULL) { @@ -1279,7 +1321,7 @@ void wxHtmlHelpFrame::OptionsDialog() enu.EnumerateFacenames(wxFONTENCODING_SYSTEM, true /*enum fixed width only*/); m_FixedFonts = new wxArrayString; *m_FixedFonts = *enu.GetFacenames(); - m_FixedFonts->Sort(wxStringSortAscending); + m_FixedFonts->Sort(); // ascending sort } // VS: We want to show the font that is actually used by wxHtmlWindow. @@ -1327,12 +1369,11 @@ void wxHtmlHelpFrame::NotifyPageChanged() { if (m_UpdateContents && m_PagesHash) { - wxString an = m_HtmlWin->GetOpenedAnchor(); - wxHtmlHelpHashData *ha; - if (an.IsEmpty()) - ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage()); - else - ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage() + wxT("#") + an); + wxString page = wxHtmlHelpHtmlWindow::GetOpenedPageWithAnchor(m_HtmlWin); + wxHtmlHelpHashData *ha = NULL; + if (!page.empty()) + ha = (wxHtmlHelpHashData*) m_PagesHash->Get(page); + if (ha) { bool olduc = m_UpdateContents; @@ -1382,12 +1423,10 @@ void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event) case wxID_HTML_UP : if (m_PagesHash) { - wxString an = m_HtmlWin->GetOpenedAnchor(); - wxHtmlHelpHashData *ha; - if (an.IsEmpty()) - ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage()); - else - ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage() + wxT("#") + an); + wxString page = wxHtmlHelpHtmlWindow::GetOpenedPageWithAnchor(m_HtmlWin); + wxHtmlHelpHashData *ha = NULL; + if (!page.empty()) + ha = (wxHtmlHelpHashData*) m_PagesHash->Get(page); if (ha && ha->m_Index > 0) { const wxHtmlHelpDataItem& it = m_Data->GetContentsArray()[ha->m_Index - 1]; @@ -1403,23 +1442,21 @@ void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event) case wxID_HTML_UPNODE : if (m_PagesHash) { - wxString an = m_HtmlWin->GetOpenedAnchor(); - wxHtmlHelpHashData *ha; - if (an.IsEmpty()) - ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage()); - else - ha = (wxHtmlHelpHashData*) m_PagesHash->Get(m_HtmlWin->GetOpenedPage() + wxT("#") + an); + wxString page = wxHtmlHelpHtmlWindow::GetOpenedPageWithAnchor(m_HtmlWin); + wxHtmlHelpHashData *ha = NULL; + if (!page.empty()) + ha = (wxHtmlHelpHashData*) m_PagesHash->Get(page); if (ha && ha->m_Index > 0) { - int level = + int level = m_Data->GetContentsArray()[ha->m_Index].level - 1; int ind = ha->m_Index - 1; - const wxHtmlHelpDataItem *it = + const wxHtmlHelpDataItem *it = &m_Data->GetContentsArray()[ind]; while (ind >= 0 && it->level != level) { - ind--, it--; + ind--; it = &m_Data->GetContentsArray()[ind]; } if (ind >= 0) @@ -1437,21 +1474,17 @@ void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event) case wxID_HTML_DOWN : if (m_PagesHash) { - wxString an = m_HtmlWin->GetOpenedAnchor(); - wxString adr; - wxHtmlHelpHashData *ha; - - if (an.IsEmpty()) adr = m_HtmlWin->GetOpenedPage(); - else adr = m_HtmlWin->GetOpenedPage() + wxT("#") + an; - - ha = (wxHtmlHelpHashData*) m_PagesHash->Get(adr); + wxString page = wxHtmlHelpHtmlWindow::GetOpenedPageWithAnchor(m_HtmlWin); + wxHtmlHelpHashData *ha = NULL; + if (!page.empty()) + ha = (wxHtmlHelpHashData*) m_PagesHash->Get(page); const wxHtmlHelpDataItems& contents = m_Data->GetContentsArray(); if (ha && ha->m_Index < (int)contents.size() - 1) { size_t idx = ha->m_Index + 1; - while (contents[idx].GetFullPath() == adr) idx++; + while (contents[idx].GetFullPath() == page) idx++; if (!contents[idx].page.empty()) { @@ -1550,7 +1583,7 @@ void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event) filemask, wxOPEN | wxFILE_MUST_EXIST, this); - if (!s.IsEmpty()) + if (!s.empty()) { wxString ext = s.Right(4).Lower(); if (ext == _T(".zip") || ext == _T(".htb") || @@ -1593,7 +1626,7 @@ void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent& event) void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent& WXUNUSED(event)) { - wxHtmlHelpMergedIndexItem *it = (wxHtmlHelpMergedIndexItem*) + wxHtmlHelpMergedIndexItem *it = (wxHtmlHelpMergedIndexItem*) m_IndexList->GetClientData(m_IndexList->GetSelection()); if (it) DisplayIndexItem(it); @@ -1626,8 +1659,13 @@ void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent& event) if (displ++ == 0) { - m_IndexList->SetSelection(0); - DisplayIndexItem(&index[i]); + // don't automatically show topic selector if this + // item points to multiple pages: + if (index[i].items.size() == 1) + { + m_IndexList->SetSelection(0); + DisplayIndexItem(&index[i]); + } } // if this is nested item of the index, show its parent(s) @@ -1636,7 +1674,7 @@ void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent& event) wxHtmlHelpMergedIndexItem *parent = index[i].parent; while (parent) { - if (pos == 0 || + if (pos == 0 || (index.Index(*(wxHtmlHelpMergedIndexItem*)m_IndexList->GetClientData(pos-1))) < index.Index(*parent)) { m_IndexList->Insert(parent->name, @@ -1645,6 +1683,19 @@ void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent& event) } else break; } + + // finally, it the item we just added is itself a parent for + // other items, show them as well, because they are refinements + // of the displayed index entry (i.e. it is implicitly contained + // in them: "foo" with parent "bar" reads as "bar, foo"): + int level = index[i].items[0]->level; + i++; + while (i < cnt && index[i].items[0]->level > level) + { + m_IndexList->Append(index[i].name, (char*)(&index[i])); + i++; + } + i--; } } @@ -1671,7 +1722,12 @@ void wxHtmlHelpFrame::OnIndexAll(wxCommandEvent& WXUNUSED(event)) m_IndexList->Append(index[i].name, (char*)(&index[i])); if (first) { - DisplayIndexItem(&index[i]); + // don't automatically show topic selector if this + // item points to multiple pages: + if (index[i].items.size() == 1) + { + DisplayIndexItem(&index[i]); + } first = false; } } @@ -1768,9 +1824,9 @@ BEGIN_EVENT_TABLE(wxHtmlHelpFrame, wxFrame) #ifdef __WXMAC__ EVT_MENU(wxID_CLOSE, wxHtmlHelpFrame::OnClose) EVT_MENU(wxID_ABOUT, wxHtmlHelpFrame::OnAbout) + EVT_MENU(wxID_HELP_CONTENTS, wxHtmlHelpFrame::OnAbout) #endif END_EVENT_TABLE() #endif // wxUSE_WXHTML_HELP -