]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix/hack 1.
authorJulian Smart <julian@anthemion.co.uk>
Thu, 19 Apr 2001 16:17:15 +0000 (16:17 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Thu, 19 Apr 2001 16:17:15 +0000 (16:17 +0000)
========

At present, if you wish to load a .hhc file instead of add books manually, you can only have one book - UNLESS you omit the outer <ul> </ul>. Then the contents will appear to have more than book, although in fact it's just one book that's displayed on level zero and therefore get the Book icons.

However, you'll also get a dummy 'book' with the name of the project but no children. So my hack detects whether the .hhc file is trying to add books at level zero, and if so, throws away the first 'book', so that only the hhc-specified books get shown.

So the end result is that our hhc file can specify multiple sections that don't all hang off one dummy book node which itself hangs off the root node -- which is a UI pain!

Fix 2.
====

I changed  the test

        if (!m_Page.IsEmpty())

to

        if (tag.GetParam("TYPE") == "text/sitemap")

at around L.120 of helpdata.cpp as suggested in the comment, so we don't have to specify a URL for the node to be valid. Sometimes you don't want a URL in a contents item. I've added some tests to stop it complaining if you click on a URL-less item.

Feature enhancement/Hack 3.
======================

I've added wxHtmlHelpController::SetBookBasePath so that the .hhp/.hhc files don't have to be in the same hierarchy as the HTML files.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9792 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/html/helpctrl.h
include/wx/html/helpdata.h
src/html/helpctrl.cpp
src/html/helpdata.cpp
src/html/helpfrm.cpp

index b1808aa4bdcbcf1d7dffc18bbc9b5ca39203c950..f168680ad5b5b300e18b858e864de1f4ccbbf7c6 100644 (file)
@@ -83,6 +83,10 @@ class WXDLLEXPORT wxHtmlHelpController : public wxHelpControllerBase // wxEvtHan
         virtual wxFrame *GetFrameParameters(wxSize *size = NULL,
                                    wxPoint *pos = NULL,
                                    bool *newFrameEachTime = NULL);
         virtual wxFrame *GetFrameParameters(wxSize *size = NULL,
                                    wxPoint *pos = NULL,
                                    bool *newFrameEachTime = NULL);
+
+        // Sets the specified book or all books to have the given base path
+        virtual void SetBookBasePath(const wxString& basePath, int which = -1);
+
         virtual bool Quit() ;
         virtual void OnQuit() {};
 
         virtual bool Quit() ;
         virtual void OnQuit() {};
 
index e5b96e3965236842df61e4e791529a0fc0d6a4e1..2f6b2b534e3913ec766ddaba2574b937d28646db 100644 (file)
@@ -54,6 +54,10 @@ class WXDLLEXPORT wxHtmlBookRecord : public wxObject
         int GetContentsStart() const { return m_ContentsStart; }
         int GetContentsEnd() const { return m_ContentsEnd; }
 
         int GetContentsStart() const { return m_ContentsStart; }
         int GetContentsEnd() const { return m_ContentsEnd; }
 
+        void SetTitle(const wxString& title) { m_Title = title; }
+        void SetBasePath(const wxString& path) { m_BasePath = path; }
+        void SetStart(const wxString& start) { m_Start = start; }
+
     protected:
         wxString m_BasePath;
         wxString m_Title;
     protected:
         wxString m_BasePath;
         wxString m_Title;
index 31a5df2dd6754da78967e07c0476a8a0a180080a..39245191477f7604c8b9f68664a7706945842abd 100644 (file)
@@ -248,5 +248,20 @@ bool wxHtmlHelpController::Quit()
     return TRUE;
 }
 
     return TRUE;
 }
 
+// Sets the specified book or all books to have the given base path
+void wxHtmlHelpController::SetBookBasePath(const wxString& basePath, int which)
+{
+    size_t i;
+    for (i = 0; i < m_helpData.GetBookRecArray().Count(); i++ )
+    {
+        if (i == (size_t) which || which == -1)
+        {
+            wxHtmlBookRecord& book = m_helpData.GetBookRecArray()[i];
+            book.SetBasePath(basePath);
+        }
+        if (i == (size_t) which)
+            return;
+    }
+}
 
 #endif
 
 #endif
index c0e111ba76c18e7b0fb5f8cb862a4065b3e8a57a..1cea81737bb821487b20b1ac786cb127b630a538 100644 (file)
@@ -91,11 +91,12 @@ class HP_TagHandler : public wxHtmlTagHandler
         wxHtmlContentsItem *m_Items;
         int m_ItemsCnt;
         wxHtmlBookRecord *m_Book;
         wxHtmlContentsItem *m_Items;
         int m_ItemsCnt;
         wxHtmlBookRecord *m_Book;
+        bool m_firstTime; // For checking if we're adding sections at level zero, so we 'delete' the first one
 
     public:
         HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler() 
                { m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString; 
 
     public:
         HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler() 
                { m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString; 
-                     m_Level = 0; m_ID = -1; }
+                     m_Level = 0; m_ID = -1; m_firstTime = TRUE; }
         wxString GetSupportedTags() { return wxT("UL,OBJECT,PARAM"); }
         bool HandleTag(const wxHtmlTag& tag);
         void WriteOut(wxHtmlContentsItem*& array, int& size);
         wxString GetSupportedTags() { return wxT("UL,OBJECT,PARAM"); }
         bool HandleTag(const wxHtmlTag& tag);
         void WriteOut(wxHtmlContentsItem*& array, int& size);
@@ -117,10 +118,10 @@ bool HP_TagHandler::HandleTag(const wxHtmlTag& tag)
         m_Name = m_Page = wxEmptyString;
         ParseInner(tag);
 
         m_Name = m_Page = wxEmptyString;
         ParseInner(tag);
 
-        if (!m_Page.IsEmpty())
-        /* should be 'if (tag.GetParam("TYPE") == "text/sitemap")'
-           but this works fine. Valid HHW's file may contain only two
-           object tags:
+        if (tag.GetParam("TYPE") == "text/sitemap")
+
+        // if (!m_Page.IsEmpty())
+        /* Valid HHW's file may contain only two object tags:
            
            <OBJECT type="text/site properties">
                <param name="ImageType" value="Folder">
            
            <OBJECT type="text/site properties">
                <param name="ImageType" value="Folder">
@@ -137,8 +138,18 @@ bool HP_TagHandler::HandleTag(const wxHtmlTag& tag)
            condition because text/site properties does not contain Local param
         */
         {
            condition because text/site properties does not contain Local param
         */
         {
-            if (m_ItemsCnt % wxHTML_REALLOC_STEP == 0)
-                m_Items = (wxHtmlContentsItem*) realloc(m_Items, (m_ItemsCnt + wxHTML_REALLOC_STEP) * sizeof(wxHtmlContentsItem));
+            // We're reading in items at level zero, which must mean we want to specify
+            // our own 'books', so chuck out the first (empty) one that AddBook already
+            // created
+            if (m_firstTime && (m_Level == 0) && (m_ItemsCnt > 0))
+            {
+                m_ItemsCnt --;
+            }
+            else
+            {
+                if (m_ItemsCnt % wxHTML_REALLOC_STEP == 0)
+                    m_Items = (wxHtmlContentsItem*) realloc(m_Items, (m_ItemsCnt + wxHTML_REALLOC_STEP) * sizeof(wxHtmlContentsItem));
+            }
             m_Items[m_ItemsCnt].m_Level = m_Level;
             m_Items[m_ItemsCnt].m_ID = m_ID;
             m_Items[m_ItemsCnt].m_Page = new wxChar[m_Page.Length() + 1];
             m_Items[m_ItemsCnt].m_Level = m_Level;
             m_Items[m_ItemsCnt].m_ID = m_ID;
             m_Items[m_ItemsCnt].m_Page = new wxChar[m_Page.Length() + 1];
@@ -147,6 +158,8 @@ bool HP_TagHandler::HandleTag(const wxHtmlTag& tag)
             wxStrcpy(m_Items[m_ItemsCnt].m_Name, m_Name.c_str());
             m_Items[m_ItemsCnt].m_Book = m_Book;
             m_ItemsCnt++;
             wxStrcpy(m_Items[m_ItemsCnt].m_Name, m_Name.c_str());
             m_Items[m_ItemsCnt].m_Book = m_Book;
             m_ItemsCnt++;
+
+            m_firstTime = FALSE;
         }
 
         return TRUE;
         }
 
         return TRUE;
index 9914d5817ff3c8e263827e2ed38f3d84404d62ae..d4bdeeeaf1f70e8af33c1740a6329f8f3876659b 100644 (file)
@@ -1100,8 +1100,11 @@ void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event)
                 if (ha && ha->m_Index > 0)
                 {
                     wxHtmlContentsItem *it = m_Data->GetContents() + (ha->m_Index - 1);
                 if (ha && ha->m_Index > 0)
                 {
                     wxHtmlContentsItem *it = m_Data->GetContents() + (ha->m_Index - 1);
-                    m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
-                    NotifyPageChanged();
+                    if (it->m_Page[0] != 0)
+                    {
+                        m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
+                        NotifyPageChanged();
+                    }
                 }
             }
             break;
                 }
             }
             break;
@@ -1125,8 +1128,11 @@ void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event)
                     while (ind >= 0 && it->m_Level != level) ind--, it--;
                     if (ind >= 0)
                     {
                     while (ind >= 0 && it->m_Level != level) ind--, it--;
                     if (ind >= 0)
                     {
-                        m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
-                        NotifyPageChanged();
+                        if (it->m_Page[0] != 0)
+                        {
+                            m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
+                            NotifyPageChanged();
+                        }
                     }
                 }
             }
                     }
                 }
             }
@@ -1149,8 +1155,12 @@ void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event)
                     wxHtmlContentsItem *it = m_Data->GetContents() + (ha->m_Index + 1);
 
                     while (it->m_Book->GetBasePath() + it->m_Page == adr) it++;
                     wxHtmlContentsItem *it = m_Data->GetContents() + (ha->m_Index + 1);
 
                     while (it->m_Book->GetBasePath() + it->m_Page == adr) it++;
-                    m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
-                    NotifyPageChanged();
+
+                    if (it->m_Page[0] != 0)
+                    {
+                        m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
+                        NotifyPageChanged();
+                    }
                 }
             }
             break;
                 }
             }
             break;
@@ -1270,7 +1280,8 @@ void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent& event)
     {
         it = m_Data->GetContents() + (pg->m_Id);
         m_UpdateContents = FALSE;
     {
         it = m_Data->GetContents() + (pg->m_Id);
         m_UpdateContents = FALSE;
-        m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
+        if (it->m_Page[0] != 0)
+            m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
         m_UpdateContents = TRUE;
     }
 }
         m_UpdateContents = TRUE;
     }
 }
@@ -1280,7 +1291,8 @@ void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent& event)
 void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent& WXUNUSED(event))
 {
     wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_IndexList->GetClientData(m_IndexList->GetSelection());
 void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent& WXUNUSED(event))
 {
     wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_IndexList->GetClientData(m_IndexList->GetSelection());
-    m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
+    if (it->m_Page[0] != 0)
+        m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
     NotifyPageChanged();
 }
 
     NotifyPageChanged();
 }
 
@@ -1318,7 +1330,8 @@ void wxHtmlHelpFrame::OnIndexFind(wxCommandEvent& event)
                 displ++;
                 if (first)
                        {
                 displ++;
                 if (first)
                        {
-                    m_HtmlWin->LoadPage(index[i].m_Book->GetBasePath() + index[i].m_Page);
+                    if (index[i].m_Page[0] != 0)
+                        m_HtmlWin->LoadPage(index[i].m_Book->GetBasePath() + index[i].m_Page);
                     NotifyPageChanged();
                     first = FALSE;
                 }
                     NotifyPageChanged();
                     first = FALSE;
                 }
@@ -1348,7 +1361,8 @@ void wxHtmlHelpFrame::OnIndexAll(wxCommandEvent& WXUNUSED(event))
         m_IndexList->Append(index[i].m_Name, (char*)(index + i));
         if (first)
            {
         m_IndexList->Append(index[i].m_Name, (char*)(index + i));
         if (first)
            {
-            m_HtmlWin->LoadPage(index[i].m_Book->GetBasePath() + index[i].m_Page);
+            if (index[i].m_Page[0] != 0)
+                m_HtmlWin->LoadPage(index[i].m_Book->GetBasePath() + index[i].m_Page);
             NotifyPageChanged();
             first = FALSE;
         }
             NotifyPageChanged();
             first = FALSE;
         }
@@ -1365,7 +1379,8 @@ void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent& WXUNUSED(event))
     wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_SearchList->GetClientData(m_SearchList->GetSelection());
     if (it)
     {
     wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_SearchList->GetClientData(m_SearchList->GetSelection());
     if (it)
     {
-        m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
+        if (it->m_Page[0] != 0)
+            m_HtmlWin->LoadPage(it->m_Book->GetBasePath() + it->m_Page);
         NotifyPageChanged();
     }
 }
         NotifyPageChanged();
     }
 }