X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f84c635dc03a42048661e5fe89d1a0c0e047408..aa8fb7a0164e989e09d2b78867633399a740f1d3:/src/generic/helpwxht.cpp diff --git a/src/generic/helpwxht.cpp b/src/generic/helpwxht.cpp index 7de0850b59..1fdb91028c 100644 --- a/src/generic/helpwxht.cpp +++ b/src/generic/helpwxht.cpp @@ -27,6 +27,7 @@ # include "wx/list.h" # include "wx/intl.h" # include "wx/layout.h" +# include "wx/combobox.h" #endif #include "wx/helpbase.h" @@ -35,7 +36,9 @@ #include #include +#ifndef __MWERKS__ #include +#endif #ifndef __WINDOWS__ # include @@ -44,16 +47,49 @@ 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 +99,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 +147,71 @@ 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); + Show(TRUE); } @@ -122,7 +240,7 @@ wxHelpControllerHtml::wxHelpControllerHtml(void) m_Frame = NULL; m_offset = 0; - SetFrameParameters(_("Help"), + SetFrameParameters(_("Help: %s"), wxSize(FRAME_WIDTH, FRAME_HEIGHT), wxDefaultPosition); } @@ -161,6 +279,7 @@ wxHelpControllerHtml::DisplayHelp(wxString const &relativeURL) } } + m_Frame->Raise(); return m_Frame->LoadPage(url); } @@ -177,14 +296,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