helpfrm.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,837 行 · 第 1/4 页
CPP
1,837 行
if (ha)
{
bool olduc = m_UpdateContents;
m_UpdateContents = false;
m_ContentsBox->SelectItem(ha->m_Id);
m_ContentsBox->EnsureVisible(ha->m_Id);
m_UpdateContents = olduc;
}
}
}
/*
EVENT HANDLING :
*/
void wxHtmlHelpFrame::OnActivate(wxActivateEvent& event)
{
// This saves one mouse click when using the
// wxHTML for context sensitive help systems
#ifndef __WXGTK__
// NB: wxActivateEvent is a bit broken in wxGTK
// and is sometimes sent when it should not be
if (event.GetActive() && m_HtmlWin)
m_HtmlWin->SetFocus();
#endif
event.Skip();
}
void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event)
{
switch (event.GetId())
{
case wxID_HTML_BACK :
m_HtmlWin->HistoryBack();
NotifyPageChanged();
break;
case wxID_HTML_FORWARD :
m_HtmlWin->HistoryForward();
NotifyPageChanged();
break;
case wxID_HTML_UP :
if (m_PagesHash)
{
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];
if (!it.page.empty())
{
m_HtmlWin->LoadPage(it.GetFullPath());
NotifyPageChanged();
}
}
}
break;
case wxID_HTML_UPNODE :
if (m_PagesHash)
{
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 =
m_Data->GetContentsArray()[ha->m_Index].level - 1;
int ind = ha->m_Index - 1;
const wxHtmlHelpDataItem *it =
&m_Data->GetContentsArray()[ind];
while (ind >= 0 && it->level != level)
{
ind--;
it = &m_Data->GetContentsArray()[ind];
}
if (ind >= 0)
{
if (!it->page.empty())
{
m_HtmlWin->LoadPage(it->GetFullPath());
NotifyPageChanged();
}
}
}
}
break;
case wxID_HTML_DOWN :
if (m_PagesHash)
{
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() == page) idx++;
if (!contents[idx].page.empty())
{
m_HtmlWin->LoadPage(contents[idx].GetFullPath());
NotifyPageChanged();
}
}
}
break;
case wxID_HTML_PANEL :
{
if (! (m_Splitter && m_NavigPan))
return ;
if (m_Splitter->IsSplit())
{
m_Cfg.sashpos = m_Splitter->GetSashPosition();
m_Splitter->Unsplit(m_NavigPan);
m_Cfg.navig_on = false;
}
else
{
m_NavigPan->Show();
m_HtmlWin->Show();
m_Splitter->SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
m_Cfg.navig_on = true;
}
}
break;
case wxID_HTML_OPTIONS :
OptionsDialog();
break;
case wxID_HTML_BOOKMARKSADD :
{
wxString item;
wxString url;
item = m_HtmlWin->GetOpenedPageTitle();
url = m_HtmlWin->GetOpenedPage();
if (item == wxEmptyString)
item = url.AfterLast(wxT('/'));
if (m_BookmarksPages.Index(url) == wxNOT_FOUND)
{
m_Bookmarks->Append(item);
m_BookmarksNames.Add(item);
m_BookmarksPages.Add(url);
}
}
break;
case wxID_HTML_BOOKMARKSREMOVE :
{
wxString item;
int pos;
item = m_Bookmarks->GetStringSelection();
pos = m_BookmarksNames.Index(item);
if (pos != wxNOT_FOUND)
{
m_BookmarksNames.RemoveAt(pos);
m_BookmarksPages.RemoveAt(pos);
m_Bookmarks->Delete(m_Bookmarks->GetSelection());
}
}
break;
#if wxUSE_PRINTING_ARCHITECTURE
case wxID_HTML_PRINT :
{
if (m_Printer == NULL)
m_Printer = new wxHtmlEasyPrinting(_("Help Printing"), this);
if (!m_HtmlWin->GetOpenedPage())
wxLogWarning(_("Cannot print empty page."));
else
m_Printer->PrintFile(m_HtmlWin->GetOpenedPage());
}
break;
#endif
case wxID_HTML_OPENFILE :
{
wxString filemask = wxString(
_("HTML files (*.html;*.htm)|*.html;*.htm|")) +
_("Help books (*.htb)|*.htb|Help books (*.zip)|*.zip|") +
_("HTML Help Project (*.hhp)|*.hhp|") +
#if wxUSE_LIBMSPACK
_("Compressed HTML Help file (*.chm)|*.chm|") +
#endif
_("All files (*.*)|*");
wxString s = wxFileSelector(_("Open HTML document"),
wxEmptyString,
wxEmptyString,
wxEmptyString,
filemask,
wxOPEN | wxFILE_MUST_EXIST,
this);
if (!s.empty())
{
wxString ext = s.Right(4).Lower();
if (ext == _T(".zip") || ext == _T(".htb") ||
#if wxUSE_LIBMSPACK
ext == _T(".chm") ||
#endif
ext == _T(".hhp"))
{
wxBusyCursor bcur;
m_Data->AddBook(s);
RefreshLists();
}
else
m_HtmlWin->LoadPage(s);
}
}
break;
}
}
void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent& event)
{
wxHtmlHelpTreeItemData *pg;
pg = (wxHtmlHelpTreeItemData*) m_ContentsBox->GetItemData(event.GetItem());
if (pg && m_UpdateContents)
{
const wxHtmlHelpDataItems& contents = m_Data->GetContentsArray();
m_UpdateContents = false;
if (!contents[pg->m_Id].page.empty())
m_HtmlWin->LoadPage(contents[pg->m_Id].GetFullPath());
m_UpdateContents = true;
}
}
void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent& WXUNUSED(event))
{
wxHtmlHelpMergedIndexItem *it = (wxHtmlHelpMergedIndexItem*)
m_IndexList->GetClientData(m_IndexList->GetSelection());
if (it)
DisplayIndexItem(it);
}
void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent& event)
{
wxString sr = m_IndexText->GetLineText(0);
sr.MakeLower();
if (sr == wxEmptyString)
{
OnIndexAll(event);
}
else
{
wxBusyCursor bcur;
m_IndexList->Clear();
const wxHtmlHelpMergedIndex& index = *m_mergedIndex;
size_t cnt = index.size();
int displ = 0;
for (size_t i = 0; i < cnt; i++)
{
if (index[i].name.Lower().find(sr) != wxString::npos)
{
int pos = m_IndexList->Append(index[i].name,
(char*)(&index[i]));
if (displ++ == 0)
{
// 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)
// as well, otherwise it would not be clear what entry is
// shown:
wxHtmlHelpMergedIndexItem *parent = index[i].parent;
while (parent)
{
if (pos == 0 ||
(index.Index(*(wxHtmlHelpMergedIndexItem*)m_IndexList->GetClientData(pos-1))) < index.Index(*parent))
{
m_IndexList->Insert(parent->name,
pos, (char*)parent);
parent = parent->parent;
}
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--;
}
}
wxString cnttext;
cnttext.Printf(_("%i of %i"), displ, cnt);
m_IndexCountInfo->SetLabel(cnttext);
m_IndexText->SetSelection(0, sr.Length());
m_IndexText->SetFocus();
}
}
void wxHtmlHelpFrame::OnIndexAll(wxCommandEvent& WXUNUSED(event))
{
wxBusyCursor bcur;
m_IndexList->Clear();
const wxHtmlHelpMergedIndex& index = *m_mergedIndex;
size_t cnt = index.size();
bool first = true;
for (size_t i = 0; i < cnt; i++)
{
m_IndexList->Append(index[i].name, (char*)(&index[i]));
if (first)
{
// don't automatically show topic selector if this
// item points to multiple pages:
if (index[i].items.size() == 1)
{
DisplayIndexItem(&index[i]);
}
first = false;
}
}
wxString cnttext;
cnttext.Printf(_("%i of %i"), cnt, cnt);
m_IndexCountInfo->SetLabel(cnttext);
}
void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent& WXUNUSED(event))
{
wxHtmlHelpDataItem *it = (wxHtmlHelpDataItem*) m_SearchList->GetClientData(m_SearchList->GetSelection());
if (it)
{
if (!it->page.empty())
m_HtmlWin->LoadPage(it->GetFullPath());
NotifyPageChanged();
}
}
void wxHtmlHelpFrame::OnSearch(wxCommandEvent& WXUNUSED(event))
{
wxString sr = m_SearchText->GetLineText(0);
if (!sr.empty())
KeywordSearch(sr, wxHELP_SEARCH_ALL);
}
void wxHtmlHelpFrame::OnBookmarksSel(wxCommandEvent& WXUNUSED(event))
{
wxString sr = m_Bookmarks->GetStringSelection();
if (sr != wxEmptyString && sr != _("(bookmarks)"))
{
m_HtmlWin->LoadPage(m_BookmarksPages[m_BookmarksNames.Index(sr)]);
NotifyPageChanged();
}
}
void wxHtmlHelpFrame::OnCloseWindow(wxCloseEvent& evt)
{
GetSize(&m_Cfg.w, &m_Cfg.h);
GetPosition(&m_Cfg.x, &m_Cfg.y);
#ifdef __WXGTK__
if (IsGrabbed())
{
RemoveGrab();
}
#endif
if (m_Splitter && m_Cfg.navig_on) m_Cfg.sashpos = m_Splitter->GetSashPosition();
if (m_Config)
WriteCustomization(m_Config, m_ConfigRoot);
if (m_helpController && m_helpController->IsKindOf(CLASSINFO(wxHtmlHelpController)))
{
((wxHtmlHelpController*) m_helpController)->OnCloseFrame(evt);
}
evt.Skip();
}
#ifdef __WXMAC__
void wxHtmlHelpFrame::OnClose(wxCommandEvent& event)
{
Close(true);
}
void wxHtmlHelpFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox(wxT("wxWidgets HTML Help Viewer (c) 1998-2004, Vaclav Slavik et al"), wxT("HelpView"),
wxICON_INFORMATION|wxOK, this);
}
#endif
BEGIN_EVENT_TABLE(wxHtmlHelpFrame, wxFrame)
EVT_ACTIVATE(wxHtmlHelpFrame::OnActivate)
EVT_TOOL_RANGE(wxID_HTML_PANEL, wxID_HTML_OPTIONS, wxHtmlHelpFrame::OnToolbar)
EVT_BUTTON(wxID_HTML_BOOKMARKSREMOVE, wxHtmlHelpFrame::OnToolbar)
EVT_BUTTON(wxID_HTML_BOOKMARKSADD, wxHtmlHelpFrame::OnToolbar)
EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL, wxHtmlHelpFrame::OnContentsSel)
EVT_LISTBOX(wxID_HTML_INDEXLIST, wxHtmlHelpFrame::OnIndexSel)
EVT_LISTBOX(wxID_HTML_SEARCHLIST, wxHtmlHelpFrame::OnSearchSel)
EVT_BUTTON(wxID_HTML_SEARCHBUTTON, wxHtmlHelpFrame::OnSearch)
EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT, wxHtmlHelpFrame::OnSearch)
EVT_BUTTON(wxID_HTML_INDEXBUTTON, wxHtmlHelpFrame::OnIndexFind)
EVT_TEXT_ENTER(wxID_HTML_INDEXTEXT, wxHtmlHelpFrame::OnIndexFind)
EVT_BUTTON(wxID_HTML_INDEXBUTTONALL, wxHtmlHelpFrame::OnIndexAll)
EVT_COMBOBOX(wxID_HTML_BOOKMARKSLIST, wxHtmlHelpFrame::OnBookmarksSel)
EVT_CLOSE(wxHtmlHelpFrame::OnCloseWindow)
#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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?