From 892aeafc2a0212b4c3bebcaddd96a42cdd307afd Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Wed, 2 May 2001 23:08:47 +0000 Subject: [PATCH] 1) some cleanup in wxHtmlWindow, moved private structures out of headers 2) added wxHtmlProcessor git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9978 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/html/htmlproc.h | 56 ++++++++++++ include/wx/html/htmlwin.h | 86 ++++++++---------- src/html/htmlwin.cpp | 175 ++++++++++++++++++++++++++++++------- 3 files changed, 235 insertions(+), 82 deletions(-) create mode 100644 include/wx/html/htmlproc.h diff --git a/include/wx/html/htmlproc.h b/include/wx/html/htmlproc.h new file mode 100644 index 0000000000..fecd1562c6 --- /dev/null +++ b/include/wx/html/htmlproc.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmlprep.h +// Purpose: HTML processor +// Author: Vaclav Slavik +// RCS-ID: $Id$ +// Copyright: (c) 2001 Vaclav Slavik +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_HTMLPREP_H_ +#define _WX_HTMLPREP_H_ + +#ifdef __GNUG__ +#pragma interface "htmlprep.h" +// (implementation is in htmlwin.cpp, there's no htmlprep.cpp!) +#endif + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/string.h" + +// Priority of preprocessor in the chain. The higher, the earlier it is used +enum +{ + wxHTML_PRIORITY_DONTCARE = 128, // if the order doesn't matter, use this + // priority + wxHTML_PRIORITY_SYSTEM = 256 // >=256 is only for wxHTML's internals +}; + +// Classes derived from this class serve as simple text processors for +// wxHtmlWindow. wxHtmlWindow runs HTML markup through all registered +// processors before displaying it, thus allowing for on-the-fly +// modifications of the markup. + +class WXDLLEXPORT wxHtmlProcessor : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlProcessor) + +public: + wxHtmlProcessor() : wxObject() {} + virtual ~wxHtmlProcessor() {} + + // Process input text and return processed result + virtual wxString Process(const wxString& text) const = 0; + + // Return priority value of this processor. The higher, the sooner + // is the processor applied to the text. + virtual int GetPriority() const { return wxHTML_PRIORITY_DONTCARE; } +}; + +#endif // wxUSE_HTML + +#endif // _WX_HTMLPROC_H_ diff --git a/include/wx/html/htmlwin.h b/include/wx/html/htmlwin.h index 75585561b6..2c8ebf7763 100644 --- a/include/wx/html/htmlwin.h +++ b/include/wx/html/htmlwin.h @@ -27,6 +27,11 @@ #include "wx/filesys.h" #include "wx/html/htmlfilt.h" +class WXDLLEXPORT wxHtmlProcessor; + +class wxHtmlWinModule; +class wxHtmlHistoryArray; +class wxHtmlProcessorList; //-------------------------------------------------------------------------------- // wxHtmlWindow @@ -39,28 +44,6 @@ // SetPage(text) or LoadPage(filename). //-------------------------------------------------------------------------------- - -// item of history list -class WXDLLEXPORT HtmlHistoryItem : public wxObject -{ -public: - HtmlHistoryItem(const wxString& p, const wxString& a) {m_Page = p, m_Anchor = a, m_Pos = 0;} - int GetPos() const {return m_Pos;} - void SetPos(int p) {m_Pos = p;} - const wxString& GetPage() const {return m_Page;} - const wxString& GetAnchor() const {return m_Anchor;} - -private: - wxString m_Page; - wxString m_Anchor; - int m_Pos; -}; - - -WX_DECLARE_EXPORTED_OBJARRAY(HtmlHistoryItem, HtmlHistoryArray); - -class wxHtmlWinModule; - class WXDLLEXPORT wxHtmlWindow : public wxScrolledWindow { DECLARE_DYNAMIC_CLASS(wxHtmlWindow) @@ -147,6 +130,11 @@ public: // Returns a pointer to the parser. wxHtmlWinParser *GetParser() const { return m_Parser; } + + // Adds HTML processor to this instance of wxHtmlWindow: + void AddProcessor(wxHtmlProcessor *processor); + // Adds HTML processor to wxHtmlWindow class as whole: + static void AddSharedProcessor(wxHtmlProcessor *processor); protected: // Scrolls to anchor of this name. (Anchor is #news @@ -167,63 +155,65 @@ protected: // Returns new filter (will be stored into m_DefaultFilter variable) virtual wxHtmlFilter *GetDefaultFilter() {return new wxHtmlFilterPlainText;} + // cleans static variables static void CleanUpStatics(); - // cleans static variables - protected: + // This is pointer to the first cell in parsed data. + // (Note: the first cell is usually top one = all other cells are sub-cells of this one) wxHtmlContainerCell *m_Cell; - // This is pointer to the first cell in parsed data. - // (Note: the first cell is usually top one = all other cells are sub-cells of this one) + // parser which is used to parse HTML input. + // Each wxHtmlWindow has it's own parser because sharing one global + // parser would be problematic (because of reentrancy) wxHtmlWinParser *m_Parser; - // parser which is used to parse HTML input. - // Each wxHtmlWindow has it's own parser because sharing one global - // parser would be problematic (because of reentrancy) + // contains name of actualy opened page or empty string if no page opened wxString m_OpenedPage; - // contains name of actualy opened page or empty string if no page opened + // contains name of current anchor within m_OpenedPage wxString m_OpenedAnchor; - // contains name of current anchor within m_OpenedPage + // contains title of actualy opened page or empty string if no tag wxString m_OpenedPageTitle; - // contains title of actualy opened page or empty string if no <TITLE> tag + // class for opening files (file system) wxFileSystem* m_FS; - // class for opening files (file system) wxFrame *m_RelatedFrame; wxString m_TitleFormat; + // frame in which page title should be displayed & number of it's statusbar + // reserved for usage with this html window int m_RelatedStatusBar; - // frame in which page title should be displayed & number of it's statusbar - // reserved for usage with this html window + // borders (free space between text and window borders) + // defaults to 10 pixels. int m_Borders; - // borders (free space between text and window borders) - // defaults to 10 pixels. int m_Style; private: + // a flag indicated if mouse moved + // (if TRUE we will try to change cursor in last call to OnIdle) bool m_tmpMouseMoved; - // a flag indicated if mouse moved - // (if TRUE we will try to change cursor in last call to OnIdle) + // contains last link name wxHtmlLinkInfo *m_tmpLastLink; - // contains last link name + // if >0 contents of the window is not redrawn + // (in order to avoid ugly blinking) int m_tmpCanDrawLocks; - // if >0 contents of the window is not redrawn - // (in order to avoid ugly blinking) + // list of HTML filters static wxList m_Filters; - // list of HTML filters + // this filter is used when no filter is able to read some file static wxHtmlFilter *m_DefaultFilter; - // this filter is used when no filter is able to read some file static wxCursor *s_cur_hand; static wxCursor *s_cur_arrow; - HtmlHistoryArray m_History; + wxHtmlHistoryArray *m_History; + // browser history int m_HistoryPos; - // browser history + // if this FLAG is false, items are not added to history bool m_HistoryOn; - // if this FLAG is false, items are not added to history - + + // html processors array: + wxHtmlProcessorList *m_Processors; + static wxHtmlProcessorList *m_SharedProcessors; DECLARE_EVENT_TABLE() }; diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 5f14c0e508..1d84af92a4 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -9,7 +9,8 @@ #ifdef __GNUG__ -#pragma implementation +#pragma implementation "htmlwin.h" +#pragma implementation "htmlproc.h" #endif #include "wx/wxprec.h" @@ -27,17 +28,46 @@ #include "wx/html/htmlwin.h" #include "wx/html/forcelnk.h" +#include "wx/html/htmlproc.h" #include "wx/log.h" +#include "wx/arrimpl.cpp" +#include "wx/list.h" +#include "wx/listimpl.cpp" + +//----------------------------------------------------------------------------- +// wxHtmlHistoryItem +//----------------------------------------------------------------------------- + +// item of history list +class WXDLLEXPORT wxHtmlHistoryItem : public wxObject +{ +public: + wxHtmlHistoryItem(const wxString& p, const wxString& a) {m_Page = p, m_Anchor = a, m_Pos = 0;} + int GetPos() const {return m_Pos;} + void SetPos(int p) {m_Pos = p;} + const wxString& GetPage() const {return m_Page;} + const wxString& GetAnchor() const {return m_Anchor;} + +private: + wxString m_Page; + wxString m_Anchor; + int m_Pos; +}; //----------------------------------------------------------------------------- -// wxHtmlWindow +// our private arrays: //----------------------------------------------------------------------------- +WX_DECLARE_OBJARRAY(wxHtmlHistoryItem, wxHtmlHistoryArray); +WX_DEFINE_OBJARRAY(wxHtmlHistoryArray); +WX_DECLARE_LIST(wxHtmlProcessor, wxHtmlProcessorList); +WX_DEFINE_LIST(wxHtmlProcessorList); -#include "wx/arrimpl.cpp" -WX_DEFINE_OBJARRAY(HtmlHistoryArray) +//----------------------------------------------------------------------------- +// wxHtmlWindow +//----------------------------------------------------------------------------- wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, @@ -49,7 +79,7 @@ wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_FS = new wxFileSystem(); m_RelatedStatusBar = -1; m_RelatedFrame = NULL; - m_TitleFormat = "%s"; + m_TitleFormat = wxT("%s"); m_OpenedPage = m_OpenedAnchor = m_OpenedPageTitle = wxEmptyString; m_Cell = NULL; m_Parser = new wxHtmlWinParser(this); @@ -57,6 +87,8 @@ wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, SetBorders(10); m_HistoryPos = -1; m_HistoryOn = TRUE; + m_History = new wxHtmlHistoryArray; + m_Processors = NULL; m_Style = style; SetPage(wxT("<html><body></body></html>")); } @@ -71,6 +103,8 @@ wxHtmlWindow::~wxHtmlWindow() delete m_Parser; delete m_FS; + delete m_History; + delete m_Processors; } @@ -95,7 +129,8 @@ void wxHtmlWindow::SetFonts(wxString normal_face, wxString fixed_face, const int wxString op = m_OpenedPage; m_Parser->SetFonts(normal_face, fixed_face, sizes); - SetPage(wxT("<html><body></body></html>")); // fonts changed => contents invalid + // fonts changed => contents invalid, so reload the page: + SetPage(wxT("<html><body></body></html>")); if (!op.IsEmpty()) LoadPage(op); } @@ -103,8 +138,36 @@ void wxHtmlWindow::SetFonts(wxString normal_face, wxString fixed_face, const int bool wxHtmlWindow::SetPage(const wxString& source) { - wxClientDC *dc = new wxClientDC(this); + wxString newsrc(source); + + // pass HTML through registered processors: + if (m_Processors || m_SharedProcessors) + { + wxHtmlProcessorList::Node *nodeL, *nodeS; + int prL, prS; + + nodeL = (m_Processors) ? m_Processors->GetFirst() : NULL; + nodeS = (m_SharedProcessors) ? m_SharedProcessors->GetFirst() : NULL; + + while (nodeL || nodeS) + { + prL = (nodeL) ? nodeL->GetData()->GetPriority() : -1; + prS = (nodeS) ? nodeS->GetData()->GetPriority() : -1; + if (prL > prS) + { + newsrc = nodeL->GetData()->Process(newsrc); + nodeL = nodeL->GetNext(); + } + else // prL <= prS + { + newsrc = nodeS->GetData()->Process(newsrc); + nodeS = nodeS->GetNext(); + } + } + } + // ...and run the parser on it: + wxClientDC *dc = new wxClientDC(this); dc->SetMapMode(wxMM_TEXT); SetBackgroundColour(wxColour(0xFF, 0xFF, 0xFF)); m_OpenedPage = m_OpenedAnchor = m_OpenedPageTitle = wxEmptyString; @@ -114,12 +177,13 @@ bool wxHtmlWindow::SetPage(const wxString& source) delete m_Cell; m_Cell = NULL; } - m_Cell = (wxHtmlContainerCell*) m_Parser->Parse(source); + m_Cell = (wxHtmlContainerCell*) m_Parser->Parse(newsrc); delete dc; m_Cell->SetIndent(m_Borders, wxHTML_INDENT_ALL, wxHTML_UNITS_PIXELS); m_Cell->SetAlignHor(wxHTML_ALIGN_CENTER); CreateLayout(); - if (m_tmpCanDrawLocks == 0) Refresh(); + if (m_tmpCanDrawLocks == 0) + Refresh(); return TRUE; } @@ -138,7 +202,7 @@ bool wxHtmlWindow::LoadPage(const wxString& location) { int x, y; ViewStart(&x, &y); - m_History[m_HistoryPos].SetPos(y); + (*m_History)[m_HistoryPos].SetPos(y); } if (location[0] == wxT('#')) // local anchor @@ -233,12 +297,12 @@ bool wxHtmlWindow::LoadPage(const wxString& location) if (m_HistoryOn) // add this page to history there: { - int c = m_History.GetCount() - (m_HistoryPos + 1); + int c = m_History->GetCount() - (m_HistoryPos + 1); m_HistoryPos++; for (int i = 0; i < c; i++) - m_History.Remove(m_HistoryPos); - m_History.Add(new HtmlHistoryItem(m_OpenedPage, m_OpenedAnchor)); + m_History->Remove(m_HistoryPos); + m_History->Add(new wxHtmlHistoryItem(m_OpenedPage, m_OpenedAnchor)); } if (m_OpenedPageTitle == wxEmptyString) @@ -342,10 +406,10 @@ void wxHtmlWindow::ReadCustomization(wxConfigBase *cfg, wxString path) cfg->SetPath(path); } - m_Borders = cfg->Read("wxHtmlWindow/Borders", m_Borders); - p_fff = cfg->Read("wxHtmlWindow/FontFaceFixed", m_Parser->m_FontFaceFixed); - p_ffn = cfg->Read("wxHtmlWindow/FontFaceNormal", m_Parser->m_FontFaceNormal); - for (int i = 0; i < 7; i++) + m_Borders = cfg->Read(wxT("wxHtmlWindow/Borders"), m_Borders); + p_fff = cfg->Read(wxT("wxHtmlWindow/FontFaceFixed"), m_Parser->m_FontFaceFixed); + p_ffn = cfg->Read(wxT("wxHtmlWindow/FontFaceNormal"), m_Parser->m_FontFaceNormal); + for (int i = 0; i < 7; i++) { tmp.Printf(wxT("wxHtmlWindow/FontsSize%i"), i); p_fontsizes[i] = cfg->Read(tmp, m_Parser->m_FontsSizes[i]); @@ -369,10 +433,10 @@ void wxHtmlWindow::WriteCustomization(wxConfigBase *cfg, wxString path) cfg->SetPath(path); } - cfg->Write("wxHtmlWindow/Borders", (long) m_Borders); - cfg->Write("wxHtmlWindow/FontFaceFixed", m_Parser->m_FontFaceFixed); - cfg->Write("wxHtmlWindow/FontFaceNormal", m_Parser->m_FontFaceNormal); - for (int i = 0; i < 7; i++) + cfg->Write(wxT("wxHtmlWindow/Borders"), (long) m_Borders); + cfg->Write(wxT("wxHtmlWindow/FontFaceFixed"), m_Parser->m_FontFaceFixed); + cfg->Write(wxT("wxHtmlWindow/FontFaceNormal"), m_Parser->m_FontFaceNormal); + for (int i = 0; i < 7; i++) { tmp.Printf(wxT("wxHtmlWindow/FontsSize%i"), i); cfg->Write(tmp, (long) m_Parser->m_FontsSizes[i]); @@ -393,13 +457,13 @@ bool wxHtmlWindow::HistoryBack() // store scroll position into history item: int x, y; ViewStart(&x, &y); - m_History[m_HistoryPos].SetPos(y); + (*m_History)[m_HistoryPos].SetPos(y); // go to previous position: m_HistoryPos--; - l = m_History[m_HistoryPos].GetPage(); - a = m_History[m_HistoryPos].GetAnchor(); + l = (*m_History)[m_HistoryPos].GetPage(); + a = (*m_History)[m_HistoryPos].GetAnchor(); m_HistoryOn = FALSE; m_tmpCanDrawLocks++; if (a == wxEmptyString) LoadPage(l); @@ -407,7 +471,7 @@ bool wxHtmlWindow::HistoryBack() m_HistoryOn = TRUE; wxYield(); m_tmpCanDrawLocks--; - Scroll(0, m_History[m_HistoryPos].GetPos()); + Scroll(0, (*m_History)[m_HistoryPos].GetPos()); Refresh(); return TRUE; } @@ -424,13 +488,13 @@ bool wxHtmlWindow::HistoryForward() wxString a, l; if (m_HistoryPos == -1) return FALSE; - if (m_HistoryPos >= (int)m_History.GetCount() - 1)return FALSE; + if (m_HistoryPos >= (int)m_History->GetCount() - 1)return FALSE; m_OpenedPage = wxEmptyString; // this will disable adding new entry into history in LoadPage() m_HistoryPos++; - l = m_History[m_HistoryPos].GetPage(); - a = m_History[m_HistoryPos].GetAnchor(); + l = (*m_History)[m_HistoryPos].GetPage(); + a = (*m_History)[m_HistoryPos].GetAnchor(); m_HistoryOn = FALSE; m_tmpCanDrawLocks++; if (a == wxEmptyString) LoadPage(l); @@ -438,7 +502,7 @@ bool wxHtmlWindow::HistoryForward() m_HistoryOn = TRUE; wxYield(); m_tmpCanDrawLocks--; - Scroll(0, m_History[m_HistoryPos].GetPos()); + Scroll(0, (*m_History)[m_HistoryPos].GetPos()); Refresh(); return TRUE; } @@ -446,32 +510,75 @@ bool wxHtmlWindow::HistoryForward() bool wxHtmlWindow::HistoryCanForward() { if (m_HistoryPos == -1) return FALSE; - if (m_HistoryPos >= (int)m_History.GetCount() - 1)return FALSE; + if (m_HistoryPos >= (int)m_History->GetCount() - 1)return FALSE; return TRUE ; } void wxHtmlWindow::HistoryClear() { - m_History.Empty(); + m_History->Empty(); m_HistoryPos = -1; } +void wxHtmlWindow::AddProcessor(wxHtmlProcessor *processor) +{ + if (!m_Processors) + { + m_Processors = new wxHtmlProcessorList; + m_Processors->DeleteContents(TRUE); + } + wxHtmlProcessorList::Node *node; + + for (node = m_Processors->GetFirst(); node; node = node->GetNext()) + { + if (processor->GetPriority() > node->GetData()->GetPriority()) + { + m_Processors->Insert(node, processor); + break; + } + } +} + +/*static */ void wxHtmlWindow::AddSharedProcessor(wxHtmlProcessor *processor) +{ + if (!m_SharedProcessors) + { + m_SharedProcessors = new wxHtmlProcessorList; + m_SharedProcessors->DeleteContents(TRUE); + } + wxHtmlProcessorList::Node *node; + + for (node = m_SharedProcessors->GetFirst(); node; node = node->GetNext()) + { + if (processor->GetPriority() > node->GetData()->GetPriority()) + { + m_SharedProcessors->Insert(node, processor); + break; + } + } +} + wxList wxHtmlWindow::m_Filters; wxHtmlFilter *wxHtmlWindow::m_DefaultFilter = NULL; wxCursor *wxHtmlWindow::s_cur_hand = NULL; wxCursor *wxHtmlWindow::s_cur_arrow = NULL; +wxHtmlProcessorList *wxHtmlWindow::m_SharedProcessors = NULL; void wxHtmlWindow::CleanUpStatics() { - if (m_DefaultFilter) delete m_DefaultFilter; + delete m_DefaultFilter; m_DefaultFilter = NULL; m_Filters.DeleteContents(TRUE); m_Filters.Clear(); - if (s_cur_hand) delete s_cur_hand; - if (s_cur_arrow) delete s_cur_arrow; + + delete m_SharedProcessors; + m_SharedProcessors = NULL; + + delete s_cur_hand; + delete s_cur_arrow; } -- 2.45.2