X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f84c635dc03a42048661e5fe89d1a0c0e047408..65608e3bb0a1efea84af1aafbf3e05a05285766e:/src/generic/helpwxht.cpp?ds=sidebyside diff --git a/src/generic/helpwxht.cpp b/src/generic/helpwxht.cpp index 7de0850b59..9218355067 100644 --- a/src/generic/helpwxht.cpp +++ b/src/generic/helpwxht.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: helpext.cpp -// Purpose: an external help controller for wxWindows +// Name: helpwxht.cpp +// Purpose: A help controller using the wxHTML classes // Author: Karsten Ballueder // Modified by: // Created: 04/01/98 @@ -19,14 +19,16 @@ # pragma hdrstop #endif -#if wxUSE_HTML +#if wxUSE_HTML && wxUSE_STREAMS #ifndef WX_PRECOMP -# include "wx/string.h" -# include "wx/utils.h" -# include "wx/list.h" -# include "wx/intl.h" -# include "wx/layout.h" + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/list.h" + #include "wx/intl.h" + #include "wx/layout.h" + #include "wx/combobox.h" + #include "wx/button.h" #endif #include "wx/helpbase.h" @@ -35,25 +37,60 @@ #include #include +#ifndef __MWERKS__ #include +#endif -#ifndef __WINDOWS__ +#if !defined(__WINDOWS__) && !defined(__OS2__) # include #endif IMPLEMENT_CLASS(wxHelpControllerHtml, wxHTMLHelpControllerBase) /** - This class implements help via an external browser. + This class implements help via wxHTML. It requires the name of a directory containing the documentation and a file mapping numerical Section numbers to relative URLS. */ -#define FRAME_WIDTH 400 +class wxForceHtmlFilter : public wxHtmlFilter +{ +public: + virtual wxString ReadFile(const wxFSFile& file) const + { + wxInputStream *s = file.GetStream(); + char *src; + wxString doc; + + if (s == NULL) return wxEmptyString; + src = new char[s -> GetSize()+1]; + src[s -> GetSize()] = 0; + s -> Read(src, s -> GetSize()); + doc = src; + delete [] src; + return doc; + } + + virtual bool CanRead(const wxFSFile& file) const + { + wxString filename = file.GetLocation(); + if(filename.Length() >= 5 && + ( + filename.Right(4).MakeUpper() == ".HTM" || + filename.Right(5).MakeUpper() == ".HTML")) + return TRUE; + else + return FALSE; + } +}; + +#define FRAME_WIDTH 500 #define FRAME_HEIGHT 400 #define LAYOUT_X_MARGIN 2 #define LAYOUT_Y_MARGIN 2 #define OFFSET 10 +#define BUTTON_WIDTH 70 +#define MAX_COMBO_ENTRIES 25 class wxHelpFrame : public wxFrame { @@ -63,17 +100,43 @@ public: wxHelpControllerHtml *controller); ~wxHelpFrame(); void OnClose(wxCloseEvent &ev); + void OnButton(wxCommandEvent &ev); bool LoadPage(const wxString &url) { return m_htmlwin->LoadPage(url); } private: wxHelpControllerHtml *m_controller; wxHtmlWindow *m_htmlwin; + wxHtmlFilter *m_filter; + wxComboBox *m_combo; + long m_IdBack, m_IdFwd, m_IdContents, m_IdCombo, m_IdSearch; DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(wxHelpFrame, wxFrame) EVT_CLOSE(wxHelpFrame::OnClose) + EVT_BUTTON(-1, wxHelpFrame::OnButton) END_EVENT_TABLE() + +void +wxHelpFrame::OnButton(wxCommandEvent &ev) +{ + long id =ev.GetId(); + + if(id == m_IdBack) + m_htmlwin->HistoryBack(); + else if(id == m_IdFwd) + m_htmlwin->HistoryForward(); + else if(id == m_IdContents) + m_controller->DisplayContents(); + else if(id == m_IdSearch) + { + wxString str = m_combo->GetValue(); + if(m_combo->FindString(str) == -1 && m_combo->Number() < MAX_COMBO_ENTRIES) + m_combo->Append(str); + m_controller->KeywordSearch(str); + } +} + wxHelpFrame::wxHelpFrame(wxWindow *parent, int id, const wxString &title, const wxPoint &pos, const wxSize &size, @@ -85,15 +148,78 @@ wxHelpFrame::wxHelpFrame(wxWindow *parent, int id, m_htmlwin = new wxHtmlWindow(this,-1,wxDefaultPosition,wxSize(FRAME_WIDTH, FRAME_HEIGHT)); + m_IdBack = wxWindow::NewControlId(); + m_IdFwd = wxWindow::NewControlId(); + m_IdContents = wxWindow::NewControlId(); + m_IdCombo = wxWindow::NewControlId(); + m_IdSearch = wxWindow::NewControlId(); + + wxButton *btn_back = new wxButton(this, m_IdBack, _("Back")); + wxButton *btn_fwd = new wxButton(this, m_IdFwd, _("Forward")); + wxButton *btn_contents = new wxButton(this, m_IdContents, _("Contents")); + m_combo = new wxComboBox(this, m_IdCombo); + wxButton *btn_search = new wxButton(this, m_IdSearch, _("Search")); + + m_filter = new wxForceHtmlFilter; + wxLayoutConstraints *c; c = new wxLayoutConstraints; c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN); - c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN); + c->width.Absolute(BUTTON_WIDTH); c->top.SameAs(this, wxTop, 2*LAYOUT_Y_MARGIN); + c->height.AsIs(); + btn_back->SetConstraints(c); + + c = new wxLayoutConstraints; + c->left.SameAs(btn_back, wxRight, 2*LAYOUT_X_MARGIN); + c->width.Absolute(BUTTON_WIDTH); + c->top.SameAs(this, wxTop, 2*LAYOUT_Y_MARGIN); + c->height.AsIs(); + btn_fwd->SetConstraints(c); + + c = new wxLayoutConstraints; + c->left.SameAs(btn_fwd, wxRight, 2*LAYOUT_X_MARGIN); + c->width.Absolute(BUTTON_WIDTH); + c->top.SameAs(this, wxTop, 2*LAYOUT_Y_MARGIN); + c->height.AsIs(); + btn_contents->SetConstraints(c); + + c = new wxLayoutConstraints; + c->left.SameAs(btn_contents, wxRight, 2*LAYOUT_X_MARGIN); + c->width.Absolute(3*BUTTON_WIDTH); + c->top.SameAs(this, wxTop, 2*LAYOUT_Y_MARGIN); + c->height.AsIs(); + m_combo->SetConstraints(c); + + c = new wxLayoutConstraints; + c->left.SameAs(m_combo, wxRight, 2*LAYOUT_X_MARGIN); + c->width.Absolute(BUTTON_WIDTH); + c->top.SameAs(this, wxTop, 2*LAYOUT_Y_MARGIN); + c->height.AsIs(); + btn_search->SetConstraints(c); + + + c = new wxLayoutConstraints; + c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN); + c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN); + c->top.SameAs(btn_back, wxBottom, 2*LAYOUT_Y_MARGIN); c->bottom.SameAs(this, wxBottom, 2*LAYOUT_Y_MARGIN); m_htmlwin->SetConstraints(c); SetAutoLayout(TRUE); + CreateStatusBar(); + + m_htmlwin->SetRelatedFrame(this, title); + m_htmlwin->SetRelatedStatusBar(0); + m_htmlwin->AddFilter(m_filter); + +#ifdef __WXMOTIF__ + // Motif needs a nudge to get it to resize properly + // when shown + wxSizeEvent event(size, GetId()); + GetEventHandler()->ProcessEvent(event); +#endif + Show(TRUE); } @@ -102,7 +228,7 @@ wxHelpFrame::~wxHelpFrame() } void -wxHelpFrame::OnClose(wxCloseEvent &ev) +wxHelpFrame::OnClose(wxCloseEvent &WXUNUSED(ev)) { wxASSERT(m_controller); m_controller->m_Frame = NULL; @@ -122,7 +248,7 @@ wxHelpControllerHtml::wxHelpControllerHtml(void) m_Frame = NULL; m_offset = 0; - SetFrameParameters(_("Help"), + SetFrameParameters(_("Help: %s"), wxSize(FRAME_WIDTH, FRAME_HEIGHT), wxDefaultPosition); } @@ -141,7 +267,7 @@ wxHelpControllerHtml::~wxHelpControllerHtml(void) #endif bool -wxHelpControllerHtml::DisplayHelp(wxString const &relativeURL) +wxHelpControllerHtml::DisplayHelp(const wxString &relativeURL) { wxBusyCursor b; // display a busy cursor @@ -161,6 +287,7 @@ wxHelpControllerHtml::DisplayHelp(wxString const &relativeURL) } } + m_Frame->Raise(); return m_Frame->LoadPage(url); } @@ -177,14 +304,15 @@ wxHelpControllerHtml::SetFrameParameters(const wxString &title, m_NewFrameEachTime = newFrame; } -void -wxHelpControllerHtml::GetFrameParameters(wxSize *size = NULL, - wxPoint *pos = NULL, - bool *newframe = NULL) +wxFrame * +wxHelpControllerHtml::GetFrameParameters(wxSize *size, + wxPoint *pos, + bool *newframe) { if(size) *size = m_FrameSize; if(pos) *pos = m_FramePosition; if(newframe) *newframe = m_NewFrameEachTime; + return m_Frame; } #endif // wxUSE_HTML