+
+
+
+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, -1, wxString(_("Help Browser Options")))
+    {
+        wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
+        wxFlexGridSizer *sizer = new wxFlexGridSizer(2, 3, 2, 5);
+
+        sizer->Add(new wxStaticText(this, -1, _("Normal font:")));
+        sizer->Add(new wxStaticText(this, -1, _("Fixed font:")));
+        sizer->Add(new wxStaticText(this, -1, _("Font size:")));
+
+        sizer->Add(NormalFont = new wxComboBox(this, -1, wxEmptyString, wxDefaultPosition,
+                      wxSize(200, 200),
+                      0, NULL, wxCB_DROPDOWN | wxCB_READONLY));
+
+        sizer->Add(FixedFont = new wxComboBox(this, -1, wxEmptyString, wxDefaultPosition,
+                      wxSize(200, 200),
+                      0, NULL, wxCB_DROPDOWN | wxCB_READONLY));
+
+        sizer->Add(FontSize = new wxSpinCtrl(this, -1));
+        FontSize->SetRange(2, 100);
+
+        topsizer->Add(sizer, 0, wxLEFT|wxRIGHT|wxTOP, 10);
+
+        topsizer->Add(new wxStaticText(this, -1, _("Preview:")),
+                        0, wxLEFT | wxTOP, 10);
+        topsizer->Add(TestWin = new wxHtmlWindow(this, -1, 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, _("OK")), 0, wxALL, 10);
+        ok->SetDefault();
+        sizer2->Add(new wxButton(this, wxID_CANCEL, _("Cancel")), 0, wxALL, 10);
+        topsizer->Add(sizer2, 0, wxALIGN_RIGHT);
+
+        SetAutoLayout(TRUE);
+        SetSizer(topsizer);
+        topsizer->Fit(this);
+        Centre(wxBOTH);
+    }
+
+
+    void UpdateTestWin()
+    {
+        wxBusyCursor bcur;
+        SetFontsToHtmlWin(TestWin,
+                          NormalFont->GetStringSelection(),
+                          FixedFont->GetStringSelection(),
+                          FontSize->GetValue());
+        TestWin->SetPage(_(
+"<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>\
+<font size=-2>font size -2</font><br>\
+<font size=-1>font size -1</font><br>\
+<font size=+0>font size +0</font><br>\
+<font size=+1>font size +1</font><br>\
+<font size=+2>font size +2</font><br>\
+<font size=+3>font size +3</font><br>\
+<font size=+4>font size +4</font><br>\
+<td>\
+<p><tt>Fixed size face.<br> <b>bold</b> <i>italic</i> \
+<b><i>bold italic <u>underlined</u></i></b><br>\
+<font size=-2>font size -2</font><br>\
+<font size=-1>font size -1</font><br>\
+<font size=+0>font size +0</font><br>\
+<font size=+1>font size +1</font><br>\
+<font size=+2>font size +2</font><br>\
+<font size=+3>font size +3</font><br>\
+<font size=+4>font size +4</font></tt>\
+</table></body></html>"
+                          ));
+    }
+
+    void OnUpdate(wxCommandEvent& WXUNUSED(event))
+    {
+        UpdateTestWin();
+    }
+
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxHtmlHelpFrameOptionsDialog, wxDialog)
+    EVT_COMBOBOX(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate)
+    EVT_SPINCTRL(-1, wxHtmlHelpFrameOptionsDialog::OnUpdate)
+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();
+    }
+    if (m_FixedFonts == NULL)
+    {
+        wxFontEnumerator enu;
+        enu.EnumerateFacenames(wxFONTENCODING_SYSTEM, TRUE);
+        m_FixedFonts = new wxArrayString;
+        *m_FixedFonts = *enu.GetFacenames();
+        m_FixedFonts->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 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);
+        if (ha)
+        {
+            bool olduc = m_UpdateContents;
+            m_UpdateContents = FALSE;
+            m_ContentsBox->SelectItem(ha->m_Id);
+            m_ContentsBox->EnsureVisible(ha->m_Id);
+            m_UpdateContents = olduc;
+        }
+    }
+}
+
+
+