X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f96b60aa86807f84399dce2fec7d4b68832182d8..3251b8346678b487755102e2ddb5f2071ee1f1ca:/src/generic/helphtml.cpp?ds=sidebyside diff --git a/src/generic/helphtml.cpp b/src/generic/helphtml.cpp index 3c546e1bd2..8378a1496f 100644 --- a/src/generic/helphtml.cpp +++ b/src/generic/helphtml.cpp @@ -19,12 +19,16 @@ #pragma hdrstop #endif +#if wxUSE_HELP + #ifndef WX_PRECOMP #include "wx/setup.h" #include "wx/string.h" #include "wx/utils.h" #include "wx/list.h" #include "wx/intl.h" + #include "wx/msgdlg.h" + #include "wx/choicdlg.h" #endif #include "wx/helpbase.h" @@ -32,12 +36,27 @@ #include #include +#ifndef __MWERKS__ #include +#endif -#ifndef __WINDOWS__ +#if !defined(__WINDOWS__) && !defined(__OS2__) #include #endif +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +/// Name for map file. +#define WXEXTHELP_MAPFILE _T("wxhelp.map") +/// Maximum line length in map file. +#define WXEXTHELP_BUFLEN 512 +/// Character introducing comments/documentation field in map file. +#define WXEXTHELP_COMMENTCHAR ';' + +#define CONTENTS_ID 0 + class wxExtHelpMapEntry : public wxObject { public: @@ -67,12 +86,12 @@ wxHTMLHelpControllerBase::DeleteList() { if(m_MapList) { - wxNode *node = m_MapList->First(); + wxNode *node = m_MapList->GetFirst(); while (node) { - delete (wxExtHelpMapEntry *)node->Data(); + delete (wxExtHelpMapEntry *)node->GetData(); delete node; - node = m_MapList->First(); + node = m_MapList->GetFirst(); } delete m_MapList; m_MapList = (wxList*) NULL; @@ -114,7 +133,11 @@ wxHTMLHelpControllerBase::LoadFile(const wxString& ifile) wxChar* f = wxGetWorkingDirectory(); file = f; delete[] f; // wxGetWorkingDirectory returns new memory +#ifdef __WXMAC__ + file << ifile; +#else file << WXEXTHELP_SEPARATOR << ifile; +#endif } else file = ifile; @@ -135,7 +158,7 @@ wxHTMLHelpControllerBase::LoadFile(const wxString& ifile) { newfile = WXEXTHELP_SEPARATOR; const wxChar *cptr = wxGetLocale()->GetName().c_str(); - while(*cptr && *cptr != _T('_')) + while(*cptr && *cptr != wxT('_')) newfile << *(cptr++); if(wxDirExists(newfile)) file = newfile; @@ -158,7 +181,7 @@ wxHTMLHelpControllerBase::LoadFile(const wxString& ifile) m_MapList = new wxList; m_NumOfEntries = 0; - FILE *input = fopen(mapFile.fn_str(),"rt"); + FILE *input = wxFopen(mapFile,wxT("rt")); if(! input) return FALSE; do @@ -172,15 +195,15 @@ wxHTMLHelpControllerBase::LoadFile(const wxString& ifile) break; // error for(i=0; isdigit(buffer[i])||isspace(buffer[i])||buffer[i]=='-'; i++) ; // find begin of URL - url = ""; + url = wxT(""); while(buffer[i] && ! isspace(buffer[i]) && buffer[i] != WXEXTHELP_COMMENTCHAR) - url << buffer[i++]; + url << (wxChar) buffer[i++]; while(buffer[i] && buffer[i] != WXEXTHELP_COMMENTCHAR) i++; - doc = ""; + doc = wxT(""); if(buffer[i]) - doc = (buffer + i + 1); // skip the comment character + doc = wxString::FromAscii( (buffer + i + 1) ); // skip the comment character m_MapList->Append(new wxExtHelpMapEntry(id,url,doc)); m_NumOfEntries++; } @@ -197,8 +220,31 @@ wxHTMLHelpControllerBase::DisplayContents() { if(! m_NumOfEntries) return FALSE; - wxBusyCursor b; // display a busy cursor - return KeywordSearch(""); + + wxString contents; + wxNode *node = m_MapList->GetFirst(); + wxExtHelpMapEntry *entry; + while(node) + { + entry = (wxExtHelpMapEntry *)node->GetData(); + if(entry->id == CONTENTS_ID) + { + contents = entry->url; + break; + } + node = node->GetNext(); + } + + bool rc = FALSE; + wxString file; + file << m_MapFile << WXEXTHELP_SEPARATOR << contents; + if(file.Contains(wxT('#'))) + file = file.BeforeLast(wxT('#')); + if(contents.Length() && wxFileExists(file)) + rc = DisplaySection(CONTENTS_ID); + + // if not found, open homemade toc: + return rc ? TRUE : KeywordSearch(wxT("")); } bool @@ -208,18 +254,28 @@ wxHTMLHelpControllerBase::DisplaySection(int sectionNo) return FALSE; wxBusyCursor b; // display a busy cursor - wxNode *node = m_MapList->First(); + wxNode *node = m_MapList->GetFirst(); wxExtHelpMapEntry *entry; while(node) { - entry = (wxExtHelpMapEntry *)node->Data(); + entry = (wxExtHelpMapEntry *)node->GetData(); if(entry->id == sectionNo) return DisplayHelp(entry->url); - node = node->Next(); + node = node->GetNext(); } return FALSE; } +bool wxHTMLHelpControllerBase::DisplaySection(const wxString& section) +{ + bool isFilename = (section.Find(wxT(".htm")) != -1); + + if (isFilename) + return DisplayHelp(section); + else + return KeywordSearch(section); +} + bool wxHTMLHelpControllerBase::DisplayBlock(long blockNo) { @@ -232,7 +288,6 @@ wxHTMLHelpControllerBase::KeywordSearch(const wxString& k) if(! m_NumOfEntries) return FALSE; - wxBusyCursor b; // display a busy cursor wxString *choices = new wxString[m_NumOfEntries]; wxString *urls = new wxString[m_NumOfEntries]; wxString compA, compB; @@ -240,28 +295,31 @@ wxHTMLHelpControllerBase::KeywordSearch(const wxString& k) int idx = 0, j; bool rc; bool showAll = k.IsEmpty(); - wxNode *node = m_MapList->First(); + wxNode *node = m_MapList->GetFirst(); wxExtHelpMapEntry *entry; - compA = k; compA.LowerCase(); // we compare case insensitive - while(node) { - entry = (wxExtHelpMapEntry *)node->Data(); - compB = entry->doc; compB.LowerCase(); - if((showAll || compB.Contains(k)) && ! compB.IsEmpty()) + wxBusyCursor b; // display a busy cursor + compA = k; compA.LowerCase(); // we compare case insensitive + while(node) { - urls[idx] = entry->url; - // doesn't work: - // choices[idx] = (**i).doc.Contains((**i).doc.Before(WXEXTHELP_COMMENTCHAR)); - //if(choices[idx].IsEmpty()) // didn't contain the ';' - // choices[idx] = (**i).doc; - choices[idx] = ""; - for(j=0;entry->doc.c_str()[j] - && entry->doc.c_str()[j] != WXEXTHELP_COMMENTCHAR; j++) - choices[idx] << entry->doc.c_str()[j]; - idx++; + entry = (wxExtHelpMapEntry *)node->GetData(); + compB = entry->doc; compB.LowerCase(); + if((showAll || compB.Contains(k)) && ! compB.IsEmpty()) + { + urls[idx] = entry->url; + // doesn't work: + // choices[idx] = (**i).doc.Contains((**i).doc.Before(WXEXTHELP_COMMENTCHAR)); + //if(choices[idx].IsEmpty()) // didn't contain the ';' + // choices[idx] = (**i).doc; + choices[idx] = wxT(""); + for(j=0;entry->doc.c_str()[j] + && entry->doc.c_str()[j] != WXEXTHELP_COMMENTCHAR; j++) + choices[idx] << entry->doc.c_str()[j]; + idx++; + } + node = node->GetNext(); } - node = node->Next(); } if(idx == 1) @@ -299,3 +357,4 @@ wxHTMLHelpControllerBase::OnQuit() { } +#endif // wxUSE_HELP