From fa10c70ceb3a08a11302c00c9f0e29941174a21b Mon Sep 17 00:00:00 2001
From: Julian Smart <julian@anthemion.co.uk>
Date: Sun, 6 Jul 2003 17:52:42 +0000
Subject: [PATCH] Added wxHtmlPrintout::AddFilter so the same filters used for
 viewing HTML can be used for printing it.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21711 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt           |  2 ++
 docs/latex/wx/htprint.tex  |  7 +++++
 include/wx/html/htmprint.h | 10 ++++++
 src/html/htmprint.cpp      | 64 ++++++++++++++++++++++++++++----------
 4 files changed, 66 insertions(+), 17 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index d8c86d74e3..0a0e079207 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -96,6 +96,8 @@ All GUI ports:
   to allow better rich text support.
 - implemented wxFlexGridSizer::Show() (Wade Brainerd)
 - Added m_ prefix to wxColourData and wxFontData members
+- Added wxHtmlPrintout::AddFilter so HTML printing can be subject to
+  custom filters as well as HTML viewing.
 
 Unix:
 
diff --git a/docs/latex/wx/htprint.tex b/docs/latex/wx/htprint.tex
index a996c185ad..197a57cd3a 100644
--- a/docs/latex/wx/htprint.tex
+++ b/docs/latex/wx/htprint.tex
@@ -27,6 +27,13 @@ This class serves as printout class for HTML documents.
 Constructor. 
 
 
+\membersection{wxHtmlPrintout::AddFilter}\label{wxhtmlprintoutaddfilter}
+
+\func{static void}{AddFilter}{\param{wxHtmlFilter* }{filter}}
+
+Adds a filter to the static list of filters for wxHtmlPrintout. See \helpref{wxHtmlFilter}{wxhtmlfilter} for
+further information.
+
 \membersection{wxHtmlPrintout::SetFonts}\label{wxhtmlprintoutsetfonts}
 
 \func{void}{SetFonts}{\param{wxString }{normal\_face}, \param{wxString }{fixed\_face}, \param{const int }{*sizes = NULL}}
diff --git a/include/wx/html/htmprint.h b/include/wx/html/htmprint.h
index eabe41acf4..4cb723c388 100644
--- a/include/wx/html/htmprint.h
+++ b/include/wx/html/htmprint.h
@@ -21,6 +21,7 @@
 
 #include "wx/html/htmlcell.h"
 #include "wx/html/winpars.h"
+#include "wx/html/htmlfilt.h"
 
 #include "wx/print.h"
 #include "wx/printdlg.h"
@@ -152,6 +153,12 @@ public:
     void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
     bool OnBeginDocument(int startPage, int endPage);
 
+    // Adds input filter
+    static void AddFilter(wxHtmlFilter *filter);
+
+    // Cleanup
+    static void CleanUpStatics();
+
 private:
 
     void RenderPage(wxDC *dc, int page);
@@ -174,6 +181,9 @@ private:
     wxHtmlDCRenderer *m_Renderer, *m_RendererHdr;
     float m_MarginTop, m_MarginBottom, m_MarginLeft, m_MarginRight, m_MarginSpace;
 
+    // list of HTML filters
+    static wxList m_Filters;
+
     DECLARE_NO_COPY_CLASS(wxHtmlPrintout)
 };
 
diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp
index 121503447e..6f4912caee 100644
--- a/src/html/htmprint.cpp
+++ b/src/html/htmprint.cpp
@@ -36,6 +36,7 @@
 #include "wx/html/htmprint.h"
 #include "wx/wxhtml.h"
 #include "wx/wfstream.h"
+#include "wx/module.h"
 
 
 //--------------------------------------------------------------------------------
@@ -139,25 +140,12 @@ int wxHtmlDCRenderer::GetTotalHeight()
 }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 //--------------------------------------------------------------------------------
 // wxHtmlPrintout
 //--------------------------------------------------------------------------------
 
 
+wxList wxHtmlPrintout::m_Filters;
 
 wxHtmlPrintout::wxHtmlPrintout(const wxString& title) : wxPrintout(title)
 {
@@ -179,7 +167,17 @@ wxHtmlPrintout::~wxHtmlPrintout()
     delete m_RendererHdr;
 }
 
+void wxHtmlPrintout::CleanUpStatics()
+{
+    m_Filters.DeleteContents(TRUE);
+    m_Filters.Clear();
+}
 
+// Adds input filter
+void wxHtmlPrintout::AddFilter(wxHtmlFilter *filter)
+{
+    m_Filters.Append(filter);
+}
 
 bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage)
 {
@@ -291,9 +289,26 @@ void wxHtmlPrintout::SetHtmlFile(const wxString& htmlfile)
         return;
     }
 
-    wxHtmlFilterHTML filter;
-    wxString doc = filter.ReadFile(*ff);
-    
+    bool done = FALSE;
+    wxHtmlFilterHTML defaultFilter;
+    wxString doc;
+
+    wxNode* node = m_Filters.GetFirst();
+    while (node)
+    {
+        wxHtmlFilter *h = (wxHtmlFilter*) node->GetData();
+        if (h->CanRead(*ff))
+        {
+            doc = h->ReadFile(*ff);
+            done = TRUE;
+            break;
+        }
+        node = node->GetNext();
+    }
+
+    if (!done)
+        doc = defaultFilter.ReadFile(*ff);
+        
     SetHtmlText(doc, htmlfile, FALSE);
     delete ff;
 }
@@ -627,6 +642,21 @@ wxHtmlPrintout *wxHtmlEasyPrinting::CreatePrintout()
     return p;
 }
 
+// A module to allow initialization/cleanup
+// without calling these functions from app.cpp or from
+// the user's application.
+
+class wxHtmlPrintingModule: public wxModule
+{
+DECLARE_DYNAMIC_CLASS(wxHtmlPrintingModule)
+public:
+    wxHtmlPrintingModule() : wxModule() {}
+    bool OnInit() { return TRUE; }
+    void OnExit() { wxHtmlPrintout::CleanUpStatics(); }
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxHtmlPrintingModule, wxModule)
+
 
 // This hack forces the linker to always link in m_* files
 // (wxHTML doesn't work without handlers from these files)
-- 
2.50.0

