]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/helpwnd.cpp
#4479: wx.ComboBox needs a SetFont method
[wxWidgets.git] / src / html / helpwnd.cpp
index 5686f0bab5e39701d9babb5e69d1a382304f0dbd..778594052f6dc2717def1ee6d9fd920f7a71b62d 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        helpwnd.cpp
+// Name:        src/html/helpwnd.cpp
 // Purpose:     wxHtmlHelpWindow
 // Notes:       Based on htmlhelp.cpp, implementing a monolithic
 //              HTML Help controller class,  by Vaclav Slavik
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #if wxUSE_WXHTML_HELP
 
-#ifndef WXPRECOMP
+#ifndef WX_PRECOMP
+    #include "wx/object.h"
+    #include "wx/dynarray.h"
     #include "wx/intl.h"
     #include "wx/log.h"
+    #if wxUSE_STREAMS
+        #include "wx/stream.h"
+    #endif
 
-    #include "wx/object.h"
     #include "wx/sizer.h"
 
     #include "wx/bmpbuttn.h"
     #include "wx/statbox.h"
     #include "wx/radiobox.h"
-#endif // WXPRECOMP
-
-#ifdef __WXMAC__
     #include "wx/menu.h"
+    #include "wx/settings.h"
     #include "wx/msgdlg.h"
-#endif
+    #include "wx/textctrl.h"
+    #include "wx/toolbar.h"
+    #include "wx/choicdlg.h"
+    #include "wx/filedlg.h"
+#endif // WX_PRECOMP
 
 #include "wx/html/helpfrm.h"
 #include "wx/html/helpdlg.h"
 #include "wx/html/helpctrl.h"
-#include "wx/textctrl.h"
 #include "wx/notebook.h"
 #include "wx/imaglist.h"
 #include "wx/treectrl.h"
 #include "wx/html/htmlwin.h"
 #include "wx/busyinfo.h"
 #include "wx/progdlg.h"
-#include "wx/toolbar.h"
 #include "wx/fontenum.h"
-#include "wx/stream.h"
-#include "wx/filedlg.h"
 #include "wx/artprov.h"
 #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
@@ -94,7 +93,7 @@ class wxHtmlHelpHashData : public wxObject
     public:
         wxHtmlHelpHashData(int index, wxTreeItemId id) : wxObject()
             { m_Index = index; m_Id = id;}
-        ~wxHtmlHelpHashData() {}
+        virtual ~wxHtmlHelpHashData() {}
 
         int m_Index;
         wxTreeItemId m_Id;
@@ -105,53 +104,54 @@ class wxHtmlHelpHashData : public wxObject
 // wxHtmlHelpHtmlWindow (private)
 //--------------------------------------------------------------------------
 
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_HTMLWINDOW_URL_CLICKED)
-IMPLEMENT_DYNAMIC_CLASS(wxHtmlWindowEvent, wxNotifyEvent)
 
 class wxHtmlHelpHtmlWindow : public wxHtmlWindow
 {
-    public:
-        wxHtmlHelpHtmlWindow(wxHtmlHelpWindow *win, wxWindow *parent)
-            : wxHtmlWindow(parent), m_Window(win)
-        {
-            SetStandardFonts();
-        }
+public:
+    wxHtmlHelpHtmlWindow(wxHtmlHelpWindow *win, wxWindow *parent, wxWindowID id = wxID_ANY,
+                         const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = wxHW_DEFAULT_STYLE)
+        : wxHtmlWindow(parent, id, pos, sz, style), m_Window(win)
+    {
+        SetStandardFonts();
+    }
 
-        virtual void OnLinkClicked(const wxHtmlLinkInfo& link)
-        {
-            wxHtmlWindowEvent event(wxEVT_COMMAND_HTMLWINDOW_URL_CLICKED, GetId());
-            event.SetURL(link.GetHref());
-            if (!ProcessEvent(event))
-            {
-                wxHtmlWindow::OnLinkClicked(link);
-            }
-            const wxMouseEvent *e = link.GetEvent();
-            if (e == NULL || e->LeftUp())
-                m_Window->NotifyPageChanged();
-        }
+    void OnLink(wxHtmlLinkEvent& ev)
+    {
+        const wxMouseEvent *e = ev.GetLinkInfo().GetEvent();
+        if (e == NULL || e->LeftUp())
+            m_Window->NotifyPageChanged();
 
-        // Returns full location with anchor (helper)
-        static wxString GetOpenedPageWithAnchor(wxHtmlWindow *win)
-        {
-            if(!win)
-                return wxEmptyString;
+        // skip the event so that normal processing (i.e. following the link)
+        // is done:
+        ev.Skip();
+    }
 
-            wxString an = win->GetOpenedAnchor();
-            wxString pg = win->GetOpenedPage();
-            if(!an.empty())
-            {
-                pg << wxT("#");
-                pg << an;
-            }
-            return pg;
+    // 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("#") << an;
         }
+        return pg;
+    }
 
-    private:
-        wxHtmlHelpWindow *m_Window;
+private:
+    wxHtmlHelpWindow *m_Window;
 
     DECLARE_NO_COPY_CLASS(wxHtmlHelpHtmlWindow)
+    DECLARE_EVENT_TABLE()
 };
 
+BEGIN_EVENT_TABLE(wxHtmlHelpHtmlWindow, wxHtmlWindow)
+    EVT_HTML_LINK_CLICKED(wxID_ANY, wxHtmlHelpHtmlWindow::OnLink)
+END_EVENT_TABLE()
+
 
 //---------------------------------------------------------------------------
 // wxHtmlHelpWindow::m_mergedIndex
@@ -315,17 +315,6 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
 {
     m_hfStyle = helpStyle;
 
-    wxImageList *ContentsImageList = new wxImageList(16, 16);
-    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.
     if (m_Config)
@@ -342,13 +331,13 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
     // The sizer for the whole top-level window.
     wxSizer *topWindowSizer = new wxBoxSizer(wxVERTICAL);
     SetSizer(topWindowSizer);
-    SetAutoLayout(TRUE);
+    SetAutoLayout(true);
 
 #if wxUSE_TOOLBAR
     // toolbar?
     if (helpStyle & (wxHF_TOOLBAR | wxHF_FLAT_TOOLBAR))
     {
-        wxToolBar *toolBar = new wxToolBar(this, -1, wxDefaultPosition, wxDefaultSize,
+        wxToolBar *toolBar = new wxToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
                                            wxNO_BORDER | wxTB_HORIZONTAL |
                                            wxTB_DOCKABLE | wxTB_NODIVIDER |
                                            (helpStyle & wxHF_FLAT_TOOLBAR ? wxTB_FLAT : 0));
@@ -362,6 +351,14 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
 
     wxSizer *navigSizer = NULL;
 
+#ifdef __WXMSW__
+    wxBorder htmlWindowBorder = GetDefaultBorder();
+    if (htmlWindowBorder == wxBORDER_SUNKEN)
+        htmlWindowBorder = wxBORDER_SIMPLE;
+#else
+    wxBorder htmlWindowBorder = wxBORDER_SIMPLE;
+#endif
+
     if (helpStyle & (wxHF_CONTENTS | wxHF_INDEX | wxHF_SEARCH))
     {
         // traditional help controller; splitter window with html page on the
@@ -370,10 +367,13 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
 
         topWindowSizer->Add(m_Splitter, 1, wxEXPAND);
 
-        m_HtmlWin = new wxHtmlHelpHtmlWindow(this, m_Splitter);
+        m_HtmlWin = new wxHtmlHelpHtmlWindow(this, m_Splitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_DEFAULT_STYLE|htmlWindowBorder);
         m_NavigPan = new wxPanel(m_Splitter, wxID_ANY);
         m_NavigNotebook = new wxNotebook(m_NavigPan, wxID_HTML_NOTEBOOK,
                                          wxDefaultPosition, wxDefaultSize);
+#ifdef __WXMAC__
+        m_NavigNotebook->SetWindowVariant(wxWINDOW_VARIANT_SMALL);
+#endif
 
         navigSizer = new wxBoxSizer(wxVERTICAL);
         navigSizer->Add(m_NavigNotebook, 1, wxEXPAND);
@@ -383,7 +383,7 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
     else
     {
         // only html window, no notebook with index,contents etc
-        m_HtmlWin = new wxHtmlWindow(this);
+        m_HtmlWin = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_DEFAULT_STYLE|htmlWindowBorder);
         topWindowSizer->Add(m_HtmlWin, 1, wxEXPAND);
     }
 
@@ -394,6 +394,9 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
     if ( helpStyle & wxHF_CONTENTS )
     {
         wxWindow *dummy = new wxPanel(m_NavigNotebook, wxID_HTML_INDEXPAGE);
+#ifdef __WXMAC__
+        dummy->SetWindowVariant(wxWINDOW_VARIANT_NORMAL);
+#endif
         wxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
 
         topsizer->Add(0, 10);
@@ -445,6 +448,17 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
 #endif
                                        );
 
+        wxImageList *ContentsImageList = new wxImageList(16, 16);
+        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)));
+
         m_ContentsBox->AssignImageList(ContentsImageList);
 
         topsizer->Add(m_ContentsBox, 1,
@@ -459,6 +473,9 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
     if ( helpStyle & wxHF_INDEX )
     {
         wxWindow *dummy = new wxPanel(m_NavigNotebook, wxID_HTML_INDEXPAGE);
+#ifdef __WXMAC__
+        dummy->SetWindowVariant(wxWINDOW_VARIANT_NORMAL);
+#endif
         wxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
 
         dummy->SetSizer(topsizer);
@@ -499,6 +516,9 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
     if ( helpStyle & wxHF_SEARCH )
     {
         wxWindow *dummy = new wxPanel(m_NavigNotebook, wxID_HTML_INDEXPAGE);
+#ifdef __WXMAC__
+        dummy->SetWindowVariant(wxWINDOW_VARIANT_NORMAL);
+#endif
         wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
 
         dummy->SetSizer(sizer);
@@ -572,6 +592,9 @@ bool wxHtmlHelpWindow::Create(wxWindow* parent, wxWindowID id,
 
 wxHtmlHelpWindow::~wxHtmlHelpWindow()
 {
+    if ( m_helpController )
+        m_helpController->SetHelpWindow(NULL);
+
     delete m_mergedIndex;
 
     // PopEventHandler(); // wxhtmlhelpcontroller (not any more!)
@@ -807,6 +830,8 @@ void wxHtmlHelpWindow::DisplayIndexItem(const wxHtmlHelpMergedIndexItem *it)
 bool wxHtmlHelpWindow::KeywordSearch(const wxString& keyword,
                                     wxHelpSearchMode mode)
 {
+    wxCHECK_MSG( !keyword.empty(), false, "must have a non empty keyword" );
+
     if (mode == wxHELP_SEARCH_ALL)
     {
         if ( !(m_SearchList &&
@@ -874,7 +899,7 @@ bool wxHtmlHelpWindow::KeywordSearch(const wxString& keyword,
         }
 
         m_SearchButton->Enable();
-        m_SearchText->SetSelection(0, keyword.Length());
+        m_SearchText->SetSelection(0, keyword.length());
         m_SearchText->SetFocus();
     }
     else if (mode == wxHELP_SEARCH_INDEX)
@@ -885,8 +910,7 @@ bool wxHtmlHelpWindow::KeywordSearch(const wxString& keyword,
         m_IndexButtonAll->Disable();
         m_IndexText->SetValue(keyword);
 
-        wxCommandEvent dummy;
-        OnIndexFind(dummy); // what a hack...
+        DoIndexFind();
         m_IndexButton->Enable();
         m_IndexButtonAll->Enable();
         foundcnt = m_IndexList->GetCount();
@@ -1201,8 +1225,8 @@ public:
                       wxSize(200, wxDefaultCoord),
                       0, NULL, wxCB_DROPDOWN | wxCB_READONLY));
 
-        sizer->Add(FontSize = new wxSpinCtrl(this, wxID_ANY));
-        FontSize->SetRange(2, 100);
+        sizer->Add(FontSize = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition,
+                      wxDefaultSize, wxSP_ARROW_KEYS, 2, 100, 2, _T("wxSpinCtrl")));
 
         topsizer->Add(sizer, 0, wxLEFT|wxRIGHT|wxTOP, 10);
 
@@ -1283,18 +1307,14 @@ void wxHtmlHelpWindow::OptionsDialog()
 
     if (m_NormalFonts == NULL)
     {
-        wxFontEnumerator enu;
-        enu.EnumerateFacenames();
-        m_NormalFonts = new wxArrayString;
-        *m_NormalFonts = *enu.GetFacenames();
+        m_NormalFonts = new wxArrayString(wxFontEnumerator::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 = new wxArrayString(
+                    wxFontEnumerator::GetFacenames(wxFONTENCODING_SYSTEM,
+                    true /*enum fixed width only*/));
         m_FixedFonts->Sort(); // ascending sort
     }
 
@@ -1504,7 +1524,9 @@ void wxHtmlHelpWindow::OnToolbar(wxCommandEvent& event)
                 {
                     m_BookmarksNames.RemoveAt(pos);
                     m_BookmarksPages.RemoveAt(pos);
-                    m_Bookmarks->Delete(m_Bookmarks->GetSelection());
+                    pos = m_Bookmarks->GetSelection();
+                    wxASSERT_MSG( pos != wxNOT_FOUND , wxT("Unknown bookmark position") ) ;
+                    m_Bookmarks->Delete((unsigned int)pos);
                 }
             }
             break;
@@ -1537,7 +1559,7 @@ void wxHtmlHelpWindow::OnToolbar(wxCommandEvent& event)
                                             wxEmptyString,
                                             wxEmptyString,
                                             filemask,
-                                            wxOPEN | wxFILE_MUST_EXIST,
+                                            wxFD_OPEN | wxFD_FILE_MUST_EXIST,
                                             this);
                 if (!s.empty())
                 {
@@ -1584,13 +1606,18 @@ void wxHtmlHelpWindow::OnIndexSel(wxCommandEvent& WXUNUSED(event))
         DisplayIndexItem(it);
 }
 
-void wxHtmlHelpWindow::OnIndexFind(wxCommandEvent& event)
+void wxHtmlHelpWindow::OnIndexFind(wxCommandEvent& WXUNUSED(event))
+{
+    DoIndexFind();
+}
+
+void wxHtmlHelpWindow::DoIndexFind()
 {
     wxString sr = m_IndexText->GetLineText(0);
     sr.MakeLower();
     if (sr == wxEmptyString)
     {
-        OnIndexAll(event);
+        DoIndexAll();
     }
     else
     {
@@ -1654,12 +1681,17 @@ void wxHtmlHelpWindow::OnIndexFind(wxCommandEvent& event)
         cnttext.Printf(_("%i of %i"), displ, cnt);
         m_IndexCountInfo->SetLabel(cnttext);
 
-        m_IndexText->SetSelection(0, sr.Length());
+        m_IndexText->SetSelection(0, sr.length());
         m_IndexText->SetFocus();
     }
 }
 
 void wxHtmlHelpWindow::OnIndexAll(wxCommandEvent& WXUNUSED(event))
+{
+    DoIndexAll();
+}
+
+void wxHtmlHelpWindow::DoIndexAll()
 {
     wxBusyCursor bcur;
 
@@ -1709,11 +1741,11 @@ void wxHtmlHelpWindow::OnSearch(wxCommandEvent& WXUNUSED(event))
 
 void wxHtmlHelpWindow::OnBookmarksSel(wxCommandEvent& WXUNUSED(event))
 {
-    wxString sr = m_Bookmarks->GetStringSelection();
-
-    if (sr != wxEmptyString && sr != _("(bookmarks)"))
+    wxString str = m_Bookmarks->GetStringSelection();
+    int idx = m_BookmarksNames.Index(str);
+    if (!str.empty() && str != _("(bookmarks)") && idx != wxNOT_FOUND)
     {
-       m_HtmlWin->LoadPage(m_BookmarksPages[m_BookmarksNames.Index(sr)]);
+       m_HtmlWin->LoadPage(m_BookmarksPages[(size_t)idx]);
        NotifyPageChanged();
     }
 }