helpfrm.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,837 行 · 第 1/4 页
CPP
1,837 行
default:
wxFAIL_MSG( _T("unknown help search mode") );
// fall back
case wxHELP_SEARCH_ALL:
{
wxHtmlHelpDataItem *it =
(wxHtmlHelpDataItem*) m_SearchList->GetClientData(0);
if (it)
{
m_HtmlWin->LoadPage(it->GetFullPath());
NotifyPageChanged();
}
break;
}
case wxHELP_SEARCH_INDEX:
{
wxHtmlHelpMergedIndexItem* it =
(wxHtmlHelpMergedIndexItem*) m_IndexList->GetClientData(0);
if (it)
DisplayIndexItem(it);
break;
}
}
}
return foundcnt > 0;
}
void wxHtmlHelpFrame::CreateContents()
{
if (! m_ContentsBox)
return ;
if (m_PagesHash)
{
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);
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 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 afolder with subitems, so we
// set its icon accordingly
bool imaged[MAX_ROOTS];
m_ContentsBox->DeleteAllItems();
roots[0] = m_ContentsBox->AddRoot(_("(Help)"));
imaged[0] = true;
for (size_t i = 0; i < cnt; i++)
{
wxHtmlHelpDataItem *it = &contents[i];
// Handle books:
if (it->level == 0)
{
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 a "fake"
// record about book node so that the rest of this look
// will believe there really _is_ a book node and will
// behave correctly.
roots[1] = roots[0];
else
{
roots[1] = m_ContentsBox->AppendItem(roots[0],
it->name, IMG_Book, -1,
new wxHtmlHelpTreeItemData(i));
m_ContentsBox->SetItemBold(roots[1], true);
}
imaged[1] = true;
}
// ...and their contents:
else
{
roots[it->level + 1] = m_ContentsBox->AppendItem(
roots[it->level], it->name, IMG_Page,
-1, new wxHtmlHelpTreeItemData(i));
imaged[it->level + 1] = false;
}
m_PagesHash->Put(it->GetFullPath(),
new wxHtmlHelpHashData(i, roots[it->level + 1]));
// Set the icon for the node one level up in the hierarchy,
// unless already done (see comment above imaged[] declaration)
if (!imaged[it->level])
{
int image = IMG_Folder;
if (m_hfStyle & wxHF_ICONS_BOOK)
image = IMG_Book;
else if (m_hfStyle & wxHF_ICONS_BOOK_CHAPTER)
image = (it->level == 1) ? IMG_Book : IMG_Folder;
m_ContentsBox->SetItemImage(roots[it->level], image);
m_ContentsBox->SetItemImage(roots[it->level], image,
wxTreeItemIcon_Selected);
imaged[it->level] = true;
}
}
}
void wxHtmlHelpFrame::CreateIndex()
{
if (! m_IndexList)
return ;
m_IndexList->Clear();
size_t cnt = m_mergedIndex->size();
wxString cnttext;
if (cnt > INDEX_IS_SMALL)
cnttext.Printf(_("%i of %i"), 0, cnt);
else
cnttext.Printf(_("%i of %i"), cnt, cnt);
m_IndexCountInfo->SetLabel(cnttext);
if (cnt > INDEX_IS_SMALL)
return;
for (size_t i = 0; i < cnt; i++)
m_IndexList->Append((*m_mergedIndex)[i].name,
(char*)(&(*m_mergedIndex)[i]));
}
void wxHtmlHelpFrame::CreateSearch()
{
if (! (m_SearchList && m_SearchChoice))
return ;
m_SearchList->Clear();
m_SearchChoice->Clear();
m_SearchChoice->Append(_("Search in all books"));
const wxHtmlBookRecArray& bookrec = m_Data->GetBookRecArray();
int i, cnt = bookrec.GetCount();
for (i = 0; i < cnt; i++)
m_SearchChoice->Append(bookrec[i].GetTitle());
m_SearchChoice->SetSelection(0);
}
void wxHtmlHelpFrame::RefreshLists()
{
// Update m_mergedIndex:
UpdateMergedIndex();
// Update the controls
CreateContents();
CreateIndex();
CreateSearch();
}
void wxHtmlHelpFrame::ReadCustomization(wxConfigBase *cfg, const wxString& path)
{
wxString oldpath;
wxString tmp;
if (path != wxEmptyString)
{
oldpath = cfg->GetPath();
cfg->SetPath(_T("/") + path);
}
m_Cfg.navig_on = cfg->Read(wxT("hcNavigPanel"), m_Cfg.navig_on) != 0;
m_Cfg.sashpos = cfg->Read(wxT("hcSashPos"), m_Cfg.sashpos);
m_Cfg.x = cfg->Read(wxT("hcX"), m_Cfg.x);
m_Cfg.y = cfg->Read(wxT("hcY"), m_Cfg.y);
m_Cfg.w = cfg->Read(wxT("hcW"), m_Cfg.w);
m_Cfg.h = cfg->Read(wxT("hcH"), m_Cfg.h);
m_FixedFace = cfg->Read(wxT("hcFixedFace"), m_FixedFace);
m_NormalFace = cfg->Read(wxT("hcNormalFace"), m_NormalFace);
m_FontSize = cfg->Read(wxT("hcBaseFontSize"), m_FontSize);
{
int i;
int cnt;
wxString val, s;
cnt = cfg->Read(wxT("hcBookmarksCnt"), 0L);
if (cnt != 0)
{
m_BookmarksNames.Clear();
m_BookmarksPages.Clear();
if (m_Bookmarks)
{
m_Bookmarks->Clear();
m_Bookmarks->Append(_("(bookmarks)"));
}
for (i = 0; i < cnt; i++)
{
val.Printf(wxT("hcBookmark_%i"), i);
s = cfg->Read(val);
m_BookmarksNames.Add(s);
if (m_Bookmarks) m_Bookmarks->Append(s);
val.Printf(wxT("hcBookmark_%i_url"), i);
s = cfg->Read(val);
m_BookmarksPages.Add(s);
}
}
}
if (m_HtmlWin)
m_HtmlWin->ReadCustomization(cfg);
if (path != wxEmptyString)
cfg->SetPath(oldpath);
}
void wxHtmlHelpFrame::WriteCustomization(wxConfigBase *cfg, const wxString& path)
{
wxString oldpath;
wxString tmp;
if (path != wxEmptyString)
{
oldpath = cfg->GetPath();
cfg->SetPath(_T("/") + path);
}
cfg->Write(wxT("hcNavigPanel"), m_Cfg.navig_on);
cfg->Write(wxT("hcSashPos"), (long)m_Cfg.sashpos);
if ( !IsIconized() )
{
// Don't write if iconized as this would make the window
// disappear next time it is shown!
cfg->Write(wxT("hcX"), (long)m_Cfg.x);
cfg->Write(wxT("hcY"), (long)m_Cfg.y);
cfg->Write(wxT("hcW"), (long)m_Cfg.w);
cfg->Write(wxT("hcH"), (long)m_Cfg.h);
}
cfg->Write(wxT("hcFixedFace"), m_FixedFace);
cfg->Write(wxT("hcNormalFace"), m_NormalFace);
cfg->Write(wxT("hcBaseFontSize"), (long)m_FontSize);
if (m_Bookmarks)
{
int i;
int cnt = m_BookmarksNames.GetCount();
wxString val;
cfg->Write(wxT("hcBookmarksCnt"), (long)cnt);
for (i = 0; i < cnt; i++)
{
val.Printf(wxT("hcBookmark_%i"), i);
cfg->Write(val, m_BookmarksNames[i]);
val.Printf(wxT("hcBookmark_%i_url"), i);
cfg->Write(val, m_BookmarksPages[i]);
}
}
if (m_HtmlWin)
m_HtmlWin->WriteCustomization(cfg);
if (path != wxEmptyString)
cfg->SetPath(oldpath);
}
static void SetFontsToHtmlWin(wxHtmlWindow *win, wxString scalf, wxString fixf, int size)
{
int f_sizes[7];
f_sizes[0] = int(size * 0.6);
f_sizes[1] = int(size * 0.8);
f_sizes[2] = size;
f_sizes[3] = int(size * 1.2);
f_sizes[4] = int(size * 1.4);
f_sizes[5] = int(size * 1.6);
f_sizes[6] = int(size * 1.8);
win->SetFonts(scalf, fixf, f_sizes);
}
class wxHtmlHelpFrameOptionsDialog : public wxDialog
{
public:
wxComboBox *NormalFont, *FixedFont;
wxSpinCtrl *FontSize;
wxHtmlWindow *TestWin;
wxHtmlHelpFrameOptionsDialog(wxWindow *parent)
: wxDialog(parent, wxID_ANY, wxString(_("Help Browser Options")))
{
wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
wxFlexGridSizer *sizer = new wxFlexGridSizer(2, 3, 2, 5);
sizer->Add(new wxStaticText(this, wxID_ANY, _("Normal font:")));
sizer->Add(new wxStaticText(this, wxID_ANY, _("Fixed font:")));
sizer->Add(new wxStaticText(this, wxID_ANY, _("Font size:")));
sizer->Add(NormalFont = new wxComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition,
wxSize(200, wxDefaultCoord),
0, NULL, wxCB_DROPDOWN | wxCB_READONLY));
sizer->Add(FixedFont = new wxComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition,
wxSize(200, wxDefaultCoord),
0, NULL, wxCB_DROPDOWN | wxCB_READONLY));
sizer->Add(FontSize = new wxSpinCtrl(this, wxID_ANY));
FontSize->SetRange(2, 100);
topsizer->Add(sizer, 0, wxLEFT|wxRIGHT|wxTOP, 10);
topsizer->Add(new wxStaticText(this, wxID_ANY, _("Preview:")),
0, wxLEFT | wxTOP, 10);
topsizer->Add(TestWin = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxSize(20, 150),
wxHW_SCROLLBAR_AUTO | wxSUNKEN_BORDER),
1, wxEXPAND | wxLEFT|wxTOP|wxRIGHT, 10);
wxBoxSizer *sizer2 = new wxBoxSizer(wxHORIZONTAL);
wxButton *ok;
sizer2->Add(ok = new wxButton(this, wxID_OK), 0, wxALL, 10);
ok->SetDefault();
sizer2->Add(new wxButton(this, wxID_CANCEL), 0, wxALL, 10);
topsizer->Add(sizer2, 0, wxALIGN_RIGHT);
SetSizer(topsizer);
topsizer->Fit(this);
Centre(wxBOTH);
}
void UpdateTestWin()
{
wxBusyCursor bcur;
SetFontsToHtmlWin(TestWin,
NormalFont->GetStringSelection(),
FixedFont->GetStringSelection(),
FontSize->GetValue());
wxString content(_("font size"));
content = _T("<font size=-2>") + content + _T(" -2</font><br>")
_T("<font size=-1>") + content + _T(" -1</font><br>")
_T("<font size=+0>") + content + _T(" +0</font><br>")
_T("<font size=+1>") + content + _T(" +1</font><br>")
_T("<font size=+2>") + content + _T(" +2</font><br>")
_T("<font size=+3>") + content + _T(" +3</font><br>")
_T("<font size=+4>") + content + _T(" +4</font><br>") ;
content = wxString( _T("<html><body><table><tr><td>") ) +
_("Normal face<br>and <u>underlined</u>. ") +
_("<i>Italic face.</i> ") +
_("<b>Bold face.</b> ") +
_("<b><i>Bold italic face.</i></b><br>") +
content +
wxString( _T("</td><td><tt>") ) +
_("Fixed size face.<br> <b>bold</b> <i>italic</i> ") +
_("<b><i>bold italic <u>underlined</u></i></b><br>") +
content +
_T("</tt></td></tr></table></body></html>");
TestWin->SetPage( content );
}
void OnUpdate(wxCommandEvent& WXUNUSED(event))
{
UpdateTestWin();
}
void OnUpdateSpin(wxSpinEvent& WXUNUSED(event))
{
UpdateTestWin();
}
DECLARE_EVENT_TABLE()
DECLARE_NO_COPY_CLASS(wxHtmlHelpFrameOptionsDialog)
};
BEGIN_EVENT_TABLE(wxHtmlHelpFrameOptionsDialog, wxDialog)
EVT_COMBOBOX(wxID_ANY, wxHtmlHelpFrameOptionsDialog::OnUpdate)
EVT_SPINCTRL(wxID_ANY, wxHtmlHelpFrameOptionsDialog::OnUpdateSpin)
END_EVENT_TABLE()
void wxHtmlHelpFrame::OptionsDialog()
{
wxHtmlHelpFrameOptionsDialog dlg(this);
unsigned i;
if (m_NormalFonts == NULL)
{
wxFontEnumerator enu;
enu.EnumerateFacenames();
m_NormalFonts = new wxArrayString;
*m_NormalFonts = *enu.GetFacenames();
m_NormalFonts->Sort(); // ascending sort
}
if (m_FixedFonts == NULL)
{
wxFontEnumerator enu;
enu.EnumerateFacenames(wxFONTENCODING_SYSTEM, true /*enum fixed width only*/);
m_FixedFonts = new wxArrayString;
*m_FixedFonts = *enu.GetFacenames();
m_FixedFonts->Sort(); // ascending sort
}
// VS: We want to show the font that is actually used by wxHtmlWindow.
// If customization dialog wasn't used yet, facenames are empty and
// wxHtmlWindow uses default fonts -- let's find out what they
// are so that we can pass them to the dialog:
if (m_NormalFace.empty())
{
wxFont fnt(m_FontSize, wxSWISS, wxNORMAL, wxNORMAL, false);
m_NormalFace = fnt.GetFaceName();
}
if (m_FixedFace.empty())
{
wxFont fnt(m_FontSize, wxMODERN, wxNORMAL, wxNORMAL, false);
m_FixedFace = fnt.GetFaceName();
}
for (i = 0; i < m_NormalFonts->GetCount(); i++)
dlg.NormalFont->Append((*m_NormalFonts)[i]);
for (i = 0; i < m_FixedFonts->GetCount(); i++)
dlg.FixedFont->Append((*m_FixedFonts)[i]);
if (!m_NormalFace.empty())
dlg.NormalFont->SetStringSelection(m_NormalFace);
else
dlg.NormalFont->SetSelection(0);
if (!m_FixedFace.empty())
dlg.FixedFont->SetStringSelection(m_FixedFace);
else
dlg.FixedFont->SetSelection(0);
dlg.FontSize->SetValue(m_FontSize);
dlg.UpdateTestWin();
if (dlg.ShowModal() == wxID_OK)
{
m_NormalFace = dlg.NormalFont->GetStringSelection();
m_FixedFace = dlg.FixedFont->GetStringSelection();
m_FontSize = dlg.FontSize->GetValue();
SetFontsToHtmlWin(m_HtmlWin, m_NormalFace, m_FixedFace, m_FontSize);
}
}
void wxHtmlHelpFrame::NotifyPageChanged()
{
if (m_UpdateContents && m_PagesHash)
{
wxString page = wxHtmlHelpHtmlWindow::GetOpenedPageWithAnchor(m_HtmlWin);
wxHtmlHelpHashData *ha = NULL;
if (!page.empty())
ha = (wxHtmlHelpHashData*) m_PagesHash->Get(page);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?