From 3ce369e6876c49ad7a101ad222048bd5446b7125 Mon Sep 17 00:00:00 2001
From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= <vslavik@fastmail.fm>
Date: Sun, 17 Oct 1999 13:03:40 +0000
Subject: [PATCH] added HTML printing

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4030 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 Makefile.in                        |   5 +-
 distrib/msw/tmake/filelist.txt     |   2 +
 docs/latex/wx/classes.tex          |   3 +
 docs/latex/wx/htdcrend.tex         | 129 +++++++
 docs/latex/wx/hteasypr.tex         | 151 ++++++++
 docs/latex/wx/htmlprn.tex          |  67 +---
 docs/latex/wx/htprint.tex          |  96 +++++
 include/wx/html/htmprint.h         | 239 ++++++++++++
 samples/html/printing/Makefile.in  |   2 +-
 samples/html/printing/mondrian.xpm |  44 ---
 samples/html/printing/pic.png      | Bin 31315 -> 0 bytes
 samples/html/printing/printing.cpp | 430 +++++++++-------------
 samples/html/printing/printing.h   |  76 ----
 samples/html/printing/test.htm     | 300 +++++++++------
 src/html/htmprint.cpp              | 570 +++++++++++++++++++++++++++++
 src/msw/makefile.b32               |   2 +-
 src/msw/makefile.bcc               |   2 +-
 src/msw/makefile.dos               |   2 +-
 src/msw/makefile.g95               |   3 +-
 src/msw/makefile.sc                |   2 +-
 src/msw/makefile.vc                |   3 +-
 src/msw/makefile.wat               |   2 +-
 src/wxvc.dsp                       |   4 +
 src/wxvc6.dsp                      |   4 +
 src/wxvc_dll.dsp                   |   4 +
 25 files changed, 1586 insertions(+), 556 deletions(-)
 create mode 100644 docs/latex/wx/htdcrend.tex
 create mode 100644 docs/latex/wx/hteasypr.tex
 create mode 100644 docs/latex/wx/htprint.tex
 create mode 100644 include/wx/html/htmprint.h
 delete mode 100644 samples/html/printing/mondrian.xpm
 delete mode 100644 samples/html/printing/pic.png
 delete mode 100644 samples/html/printing/printing.h
 create mode 100644 src/html/htmprint.cpp

diff --git a/Makefile.in b/Makefile.in
index 2d7560d84a..31ccbd8703 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,5 +1,5 @@
 #
-# This file was automatically generated by tmake at 14:54, 1999/10/14
+# This file was automatically generated by tmake at 22:30, 1999/10/16
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T!
 
 #
@@ -607,6 +607,7 @@ HTML_HEADERS = \
 		html/htmlpars.h \
 		html/htmltag.h \
 		html/htmlwin.h \
+		html/htmprint.h \
 		html/m_templ.h \
 		html/winpars.h
 
@@ -1811,6 +1812,7 @@ HTMLOBJS = \
 		htmlpars.o \
 		htmltag.o \
 		htmlwin.o \
+		htmprint.o \
 		m_fonts.o \
 		m_hline.o \
 		m_image.o \
@@ -1831,6 +1833,7 @@ HTMLDEPS = \
 		htmlpars.d \
 		htmltag.d \
 		htmlwin.d \
+		htmprint.d \
 		m_fonts.d \
 		m_hline.d \
 		m_image.d \
diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt
index 5ddfbf0a73..44145dab9f 100644
--- a/distrib/msw/tmake/filelist.txt
+++ b/distrib/msw/tmake/filelist.txt
@@ -413,6 +413,7 @@ m_list.cpp	H
 m_pre.cpp	H
 m_tables.cpp	H
 search.cpp	H
+htmprint.cpp	H
 
 arrimpl.cpp	W
 listimpl.cpp	W
@@ -846,6 +847,7 @@ htmltag.h	L
 htmlwin.h	L
 winpars.h	L
 m_templ.h	L
+htmprint.h	L
 
 caret.h	N
 choicdgg.h	N
diff --git a/docs/latex/wx/classes.tex b/docs/latex/wx/classes.tex
index f52ddd10e6..b3b967630e 100644
--- a/docs/latex/wx/classes.tex
+++ b/docs/latex/wx/classes.tex
@@ -90,9 +90,12 @@
 \input htcell.tex
 \input htcolor.tex
 \input htcontnr.tex
+\input htdcrend.tex
+\input hteasypr.tex
 \input htfilter.tex
 \input hthelpct.tex
 \input htparser.tex
+\input htprint.tex
 \input httag.tex
 \input httaghnd.tex
 \input httagmod.tex
diff --git a/docs/latex/wx/htdcrend.tex b/docs/latex/wx/htdcrend.tex
new file mode 100644
index 0000000000..42858c8b0f
--- /dev/null
+++ b/docs/latex/wx/htdcrend.tex
@@ -0,0 +1,129 @@
+%
+% automatically generated by HelpGen from
+% htmprint.h at 17/Oct/99 12:48:02
+%
+
+
+\section{\class{wxHtmlDCRenderer}}\label{wxhtmldcrenderer}
+
+This class can render HTML document into specified area of DC. You can use it
+in your own printing code, although use of \helpref{wxHtmlEasyPrinting}{wxhtmleasyprinting}
+or \helpref{wxHtmlPrintout}{wxhtmlprintout} is strongly recommended.
+
+
+\wxheading{Derived from}
+
+\helpref{wxObject}{wxobject}
+
+
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxHtmlDCRenderer::wxHtmlDCRenderer}\label{wxhtmldcrendererwxhtmldcrenderer}
+
+\func{}{wxHtmlDCRenderer}{\void}
+
+Constructor.
+
+
+\membersection{wxHtmlDCRenderer::SetDC}\label{wxhtmldcrenderersetdc}
+
+\func{void}{SetDC}{\param{wxDC* }{dc}, \param{int }{maxwidth}}
+
+Assign DC instance to the renderer.
+
+\wxheading{Parameters}
+
+\docparam{maxwidth}{width of the area (on this DC) that is equivalent to screen's width, 
+in pixels (you should set it to page width minus margins). 
+
+{\bf Note:} In current implementation
+screen width is always 800 pixels : it gives best results and ensures (almost) same printed outputs
+across platforms and differently configured desktops.}
+
+Also see \helpref{SetSize}{wxhtmldcrenderersetsize}
+
+
+
+\membersection{wxHtmlDCRenderer::SetSize}\label{wxhtmldcrenderersetsize}
+
+\func{void}{SetSize}{\param{int }{width}, \param{int }{height}}
+
+Set size of output rectangle, in pixels. Note that you {\bf can't} change
+width of the rectangle between calls to \helpref{Render}{wxhtmldcrendererrender}! 
+(You can freely change height.)
+If you set width equal to maxwidth then HTML is rendered as if it were displayed in fullscreen.
+If you set width = 1/2 maxwidth the it is rendered as if it covered half the screen
+and so on.
+
+
+\membersection{wxHtmlDCRenderer::SetHtmlText}\label{wxhtmldcrenderersethtmltext}
+
+\func{void}{SetHtmlText}{\param{const wxString\& }{html}, \param{const wxString\& }{basepath = wxEmptyString}, \param{bool }{isdir = TRUE}}
+
+Assign text to the renderer. \helpref{Render}{wxhtmldcrendererrender} then draws 
+the text onto DC.
+
+
+\wxheading{Parameters}
+
+\docparam{html}{HTML text. (NOT file!)}
+
+\docparam{basepath}{base directory (html string would be stored there if it was in
+file). It is used to determine path for loading images, for example.}
+
+\docparam{isdir}{FALSE if basepath is filename, TRUE if it is directory name
+(see \helpref{wxFileSystem}{wxfilesystem} for detailed explanation)}
+
+
+\membersection{wxHtmlDCRenderer::Render}\label{wxhtmldcrendererrender}
+
+\func{int}{Render}{\param{int }{x}, \param{int }{y}, \param{int }{from = 0}, \param{int }{dont\_render = FALSE}}
+
+Renders HTML text to the DC.
+
+\wxheading{Parameters}
+
+
+\docparam{x,y}{ position of upper-left corner of printing rectangle (see \helpref{SetSize}{wxhtmldcrenderersetsize})}
+
+
+\docparam{from}{y-coordinate of the very first visible cell}
+
+\docparam{dont\_render}{if TRUE then this method only returns y coordinate of the next page
+and does not output anything}
+
+Returned value is y coordinate of first cell than didn't fit onto page.
+Use this value as {\it from} in next call to Render in order to print multipages
+document.
+
+
+\wxheading{Caution!}
+
+Following 3 methods {\bf must} always be called before any call to Render (preferably
+in this order):
+
+\begin{itemize}
+
+\item \helpref{SetDC}{wxhtmldcrenderersetdc}
+\item \helpref{SetSize}{wxhtmldcrenderersetsize}
+\item \helpref{SetHtmlText}{wxhtmldcrenderersethtmltext}
+
+\end{itemize}
+
+{\bf Render() changes DC's user scale and does NOT restore it!!}
+
+
+
+\membersection{wxHtmlDCRenderer::GetTotalHeight}\label{wxhtmldcrenderergettotalheight}
+
+\func{int}{GetTotalHeight}{\void}
+
+Returns height of the HTML text. This is important if area height (see \helpref{SetSize}{wxhtmldcrenderersetsize})
+is smaller that total height and thus the page cannot fit into it. In that case you're supposed to
+call \helpref{Render}{wxhtmldcrendererrender} as long as it's return value is smaller than GetTotalHeight's.
+
+
+
+
diff --git a/docs/latex/wx/hteasypr.tex b/docs/latex/wx/hteasypr.tex
new file mode 100644
index 0000000000..0b7c4192e4
--- /dev/null
+++ b/docs/latex/wx/hteasypr.tex
@@ -0,0 +1,151 @@
+%
+% automatically generated by HelpGen from
+% htmprint.h at 17/Oct/99 12:48:02
+%
+
+
+\section{\class{wxHtmlEasyPrinting}}\label{wxhtmleasyprinting}
+
+
+This class provides very simple interface to printing 
+architecture. It allows you to print HTML documents only
+with very few commands. 
+
+
+\wxheading{Note}
+Do not create this class on stack only. You should create an instance on app 
+startup and use this instance for all printing operations. The reason is that
+this class stores various settings in it.
+
+
+\wxheading{Derived from}
+
+\helpref{wxObject}{wxobject}
+
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxHtmlEasyPrinting::wxHtmlEasyPrinting}\label{wxhtmleasyprintingwxhtmleasyprinting}
+
+\func{}{wxHtmlEasyPrinting}{\param{const wxString\& }{name = "Printing"}, \param{wxFrame* }{parent\_frame = NULL}}
+
+Constructor.
+
+\wxheading{Parameters}
+
+\docparam{name}{Name of the printing. Used by preview frames and setup dialogs.}
+
+\docparam{parent\_frame}{pointer to the frame that will own preview frame and setup dialogs. May be NULL.}
+
+
+
+\membersection{wxHtmlEasyPrinting::PreviewFile}\label{wxhtmleasyprintingpreviewfile}
+
+\func{void}{PreviewFile}{\param{const wxString\& }{htmlfile}}
+
+Previews HTML file. 
+
+
+\membersection{wxHtmlEasyPrinting::PreviewText}\label{wxhtmleasyprintingpreviewtext}
+
+\func{void}{PreviewText}{\param{const wxString\& }{htmltext}, \param{const wxString\& }{basepath = wxEmptyString}}
+
+Previews HTML text (not file!). 
+
+\wxheading{Parameters}
+
+\docparam{htmltext}{HTML text.}
+
+\docparam{basepath}{base directory (html string would be stored there if it was in
+file). It is used to determine path for loading images, for example.}
+
+
+
+\membersection{wxHtmlEasyPrinting::PrintFile}\label{wxhtmleasyprintingprintfile}
+
+\func{void}{PrintFile}{\param{const wxString\& }{htmlfile}}
+
+Prints HTML file.
+
+
+\membersection{wxHtmlEasyPrinting::PrintText}\label{wxhtmleasyprintingprinttext}
+
+\func{void}{PrintText}{\param{const wxString\& }{htmltext}, \param{const wxString\& }{basepath = wxEmptyString}}
+
+Prints HTML text (not file!). 
+
+\wxheading{Parameters}
+
+\docparam{htmltext}{HTML text.}
+
+\docparam{basepath}{base directory (html string would be stored there if it was in
+file). It is used to determine path for loading images, for example.}
+
+
+\membersection{wxHtmlEasyPrinting::PrinterSetup}\label{wxhtmleasyprintingprintersetup}
+
+\func{void}{PrinterSetup}{\void}
+
+Displays printer setup dialog and allows the user to modify settings. 
+
+
+\membersection{wxHtmlEasyPrinting::PageSetup}\label{wxhtmleasyprintingpagesetup}
+
+\func{void}{PageSetup}{\void}
+
+Displays page setup dialog and allows the user to modify settings. 
+
+
+\membersection{wxHtmlEasyPrinting::SetHeader}\label{wxhtmleasyprintingsetheader}
+
+\func{void}{SetHeader}{\param{const wxString\& }{header}, \param{int }{pg = wxPAGE\_ALL}}
+
+Sets page header.
+
+\wxheading{Parameters}
+
+\docparam{header}{HTML text to be used as header. You can use macros in it:
+\begin{itemize}
+\item @PAGENUM@ is replaced by page number
+\item @PAGESCNT@ is replaced by total number of pages
+\end{itemize}
+}
+
+\docparam{pg}{one of wxPAGE\_ODD, wxPAGE\_EVEN and wxPAGE\_ALL constants.}
+
+
+\membersection{wxHtmlEasyPrinting::SetFooter}\label{wxhtmleasyprintingsetfooter}
+
+\func{void}{SetFooter}{\param{const wxString\& }{footer}, \param{int }{pg = wxPAGE\_ALL}}
+
+Sets page footer.
+
+\wxheading{Parameters}
+
+\docparam{footer}{HTML text to be used as footer. You can use macros in it:
+\begin{itemize}
+\item @PAGENUM@ is replaced by page number
+\item @PAGESCNT@ is replaced by total number of pages
+\end{itemize}
+}
+
+
+\docparam{pg}{one of wxPAGE\_ODD, wxPAGE\_EVEN and wxPAGE\_ALL constants.}
+
+
+
+
+\membersection{wxHtmlEasyPrinting::GetPrintData}\label{wxhtmleasyprintinggetprintdata}
+
+\func{wxPrintData*}{GetPrintData}{\void}
+
+Returns pointer to \helpref{wxPrintData}{wxprintdata} instance used by this class. You can
+set its parameters (via SetXXXX methods).
+
+\membersection{wxHtmlEasyPrinting::GetPageSetupData}\label{wxhtmleasyprintinggetpagesetupdata}
+
+\func{wxPageSetupDialogData*}{GetPageSetupData}{\void}
+
+Returns pointer to \helpref{wxPageSetupDialogData}{wxpagesetupdialogdata} instance used by 
+this class. You can set its parameters (via SetXXXX methods).
diff --git a/docs/latex/wx/htmlprn.tex b/docs/latex/wx/htmlprn.tex
index 0fea5d25ff..6ce81cf5cf 100644
--- a/docs/latex/wx/htmlprn.tex
+++ b/docs/latex/wx/htmlprn.tex
@@ -1,63 +1,14 @@
-\membersection{Printing}\label{printing}
+\membersection{HTML Printing}\label{printing}
 
-The wxHTML library provides printing facilities. 
+The wxHTML library provides printing facilities with several levels of complexity. 
 
-You can redirect output displayed by \helpref{wxHtmlWindow}{wxhtmlwindow}
-to the printer DC using this (or similar) code (see {\bf printing} sample for
-more details) :
+The easiest way to print an HTML document is to use 
+\helpref{wxHtmlEasyPrinting class}{wxhtmleasyprinting}. It lets you print HTML documents with only one 
+command and you don't have to care about wxPrintouts etc. at all. It is only simple wrapper around 
+\helpref{wxHtmlPrintout}{wxhtmlprintout}, normal wxWindows printout class.
 
-\begin{verbatim}
-//
-//  This method prints page number one to dc:
-//
 
-void MyPrintout::DrawPageOne(wxDC *dc)
-{
-  int leftMargin = 20;
-  int topMargin = 50;
-         // You must compute the margins there. 
-	 // Caution! These values are NOT in printer DC's units.
-	 // These values are in screen pixels.
-	 // (see bellow)
-
-  // Here we obtain internal cell representation of HTML document:
-  // (html is our pointer to wxHtmlWindow object)
-  wxHtmlContainerCell *cell = html -> GetInternalRepresentation();
-
-  // Now we have to check in case our real page size is reduced
-  // (e.g. because we're drawing to a print preview memory DC)
-  int pageWidth, pageHeight;
-  int w, h;
-  dc->GetSize(&w, &h);                        // DC size
-  GetPageSizePixels(&pageWidth, &pageHeight); // real size
-
-  // Now we must scale it. This equation will map wxHtmlWindow
-  // to page in this way:
-  // |--this is whole page as printed---------|
-  // |        |                      |        |
-  // |        |                      |        |
-  // |-margin-|-----wxHtmlWindow-----|-margin-|
-  //
-  // So page width is 2*leftMargin + [wxHtmlWindow size]
-  // (measured in screen pixels).
-  // We will scale the printer DC so that wxHtmlWindow's content
-  // spreads from left to right:
-  float scale = (float)(
-                  (float)(pageWidth) /
-                  (float)(2 * leftMargin + cell -> GetMaxLineWidth()));
-
-  // If printer pageWidth == current DC width, then this doesn't
-  // change. But w might be the preview bitmap width, so scale down.
-  float overallScale = scale * (float)(w/(float)pageWidth);
-
-  // Set the user scale so that our computations take effect:
-  dc->SetUserScale(overallScale, overallScale);
-  dc->SetBackgroundMode(wxTRANSPARENT);
-
-  // And this is - finally - HTML stuff:
-  cell -> Draw(*dc, leftMargin, topMargin, 0, cell -> GetHeight());
-}
-\end{verbatim}
-
-(Thanks to Julian Smart for sample)
+And finally there is low level class \helpref{wxHtmlDCRenderer}{wxhtmldcrenderer} which you can use to 
+render HTML into rectangular area on any DC. It supports rendering into multiple rectangles with same 
+width. (Most common use is placing one rectangle on each page or printing into two columns.)
 
diff --git a/docs/latex/wx/htprint.tex b/docs/latex/wx/htprint.tex
new file mode 100644
index 0000000000..a3bb4b60e2
--- /dev/null
+++ b/docs/latex/wx/htprint.tex
@@ -0,0 +1,96 @@
+%
+% automatically generated by HelpGen from
+% htmprint.h at 17/Oct/99 12:48:02
+%
+
+
+\section{\class{wxHtmlPrintout}}\label{wxhtmlprintout}
+
+This class serves as printout class for HTML documents.
+
+\wxheading{Derived from}
+
+\helpref{wxPrintout}{wxprintout}
+
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxHtmlPrintout::wxHtmlPrintout}\label{wxhtmlprintoutwxhtmlprintout}
+
+\func{}{wxHtmlPrintout}{\param{const wxString\& }{title = "Printout"}}
+
+Constructor. 
+
+
+
+\membersection{wxHtmlPrintout::SetHtmlText}\label{wxhtmlprintoutsethtmltext}
+
+\func{void}{SetHtmlText}{\param{const wxString\& }{html}, \param{const wxString\& }{basepath = wxEmptyString}, \param{bool }{isdir = TRUE}}
+
+Prepare the class for printing this HTML text.
+
+\wxheading{Parameters}
+
+\docparam{html}{HTML text. (NOT file!)}
+
+\docparam{basepath}{base directory (html string would be stored there if it was in
+file). It is used to determine path for loading images, for example.}
+
+\docparam{isdir}{FALSE if basepath is filename, TRUE if it is directory name
+(see \helpref{wxFileSystem}{wxfilesystem} for detailed explanation)}
+
+
+
+\membersection{wxHtmlPrintout::SetHtmlFile}\label{wxhtmlprintoutsethtmlfile}
+
+\func{void}{SetHtmlFile}{\param{const wxString\& }{htmlfile}}
+
+Prepare the class for printing this HTML {\bf file}. The file may be located on 
+any virtual file system or it may be normal file.
+
+
+
+\membersection{wxHtmlPrintout::SetHeader}\label{wxhtmlprintoutsetheader}
+
+\func{void}{SetHeader}{\param{const wxString\& }{header}, \param{int }{pg = wxPAGE\_ALL}}
+
+Sets page header.
+
+\wxheading{Parameters}
+
+\docparam{header}{HTML text to be used as header. You can use macros in it:
+\begin{itemize}
+\item @PAGENUM@ is replaced by page number
+\item @PAGESCNT@ is replaced by total number of pages
+\end{itemize}
+}
+
+\docparam{pg}{one of wxPAGE\_ODD, wxPAGE\_EVEN and wxPAGE\_ALL constants.}
+
+
+\membersection{wxHtmlPrintout::SetFooter}\label{wxhtmlprintoutsetfooter}
+
+\func{void}{SetFooter}{\param{const wxString\& }{footer}, \param{int }{pg = wxPAGE\_ALL}}
+
+Sets page footer.
+
+\wxheading{Parameters}
+
+\docparam{footer}{HTML text to be used as footer. You can use macros in it:
+\begin{itemize}
+\item @PAGENUM@ is replaced by page number
+\item @PAGESCNT@ is replaced by total number of pages
+\end{itemize}
+}
+
+\docparam{pg}{one of wxPAGE\_ODD, wxPAGE\_EVEN and wxPAGE\_ALL constants.}
+
+
+\membersection{wxHtmlPrintout::SetMargins}\label{wxhtmlprintoutsetmargins}
+
+\func{void}{SetMargins}{\param{float }{top = 25.2}, \param{float }{bottom = 25.2}, \param{float }{left = 25.2}, \param{float }{right = 25.2}, \param{float }{spaces = 5}}
+
+Sets margins in milimeters. Defaults to 1 inch for margins and 0.5cm for space
+between text and header and/or footer
+
diff --git a/include/wx/html/htmprint.h b/include/wx/html/htmprint.h
new file mode 100644
index 0000000000..c35df126ec
--- /dev/null
+++ b/include/wx/html/htmprint.h
@@ -0,0 +1,239 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        htmprint.h
+// Purpose:     html printing classes
+// Author:      Vaclav Slavik
+// Created:     25/09/99
+// RCS-ID:      $Id$
+// Copyright:   (c)
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_HTMPRINT_H_
+#define _WX_HTMPRINT_H_
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include <wx/defs.h>
+
+#if wxUSE_PRINTING_ARCHITECTURE
+
+#include "wx/html/htmlcell.h"
+#include "wx/html/winpars.h"
+
+#include "wx/print.h"
+#include "wx/printdlg.h"
+
+
+//--------------------------------------------------------------------------------
+// wxHtmlDCRenderer
+//                  This class is capable of rendering HTML into specified 
+//                  portion of DC
+//--------------------------------------------------------------------------------
+
+
+class wxHtmlDCRenderer : public wxObject
+{
+    public:
+        wxHtmlDCRenderer();
+        ~wxHtmlDCRenderer();
+        
+        // Following 3 methods *must* be called before any call to Render:
+        void SetDC(wxDC *dc, int maxwidth);
+                // asign DC to this render
+                // maxwidth is width of area (on this DC) that is equivalent to screen's width, in pixels
+                // (you should set it to page width minus margins)
+                // Also see SetSize
+        void SetSize(int width, int height);
+                // sets size of output rectangle, in pixels. Note that you *can't* change
+                // width of the rectangle between calls to Render! (You can freely change height.)
+                // If you set width = maxwidth then HTML is rendered as if it were displayed in fullscreen.
+                // If you set width = 1/2 maxwidth the it is rendered as if it covered half the screen
+                // and so on..
+        void SetHtmlText(const wxString& html, const wxString& basepath = wxEmptyString, bool isdir = TRUE);
+                // sets the text to be displayed
+                //
+                // basepath is base directory (html string would be stored there if it was in
+                // file). It is used to determine path for loading images, for example.
+                // isdir is FALSE if basepath is filename, TRUE if it is directory name
+                // (see wxFileSystem for detailed explanation)
+                                
+        int Render(int x, int y, int from = 0, int dont_render = FALSE);
+                // [x,y] is position of upper-left corner of printing rectangle (see SetSize)
+                // from is y-coordinate of the very first visible cell 
+                // Returned value is y coordinate of first cell than didn't fit onto page.
+                // Use this value as 'from' in next call to Render in order to print multiple pages
+                // document
+                // If dont_render is TRUE then nothing is rendered into DC and it only counts
+                // pixels and return y coord of the next page
+                //
+                // CAUTION! Render() changes DC's user scale and does NOT restore it! 
+                
+        int GetTotalHeight();
+                // returns total height of the html document
+                // (compare Render's return value with this)
+        
+    private:
+    
+        wxDC *m_DC;
+        wxHtmlWinParser *m_Parser;
+        wxFileSystem *m_FS;
+        wxHtmlContainerCell *m_Cells;
+        int m_MaxWidth, m_Width, m_Height;
+        double m_Scale;
+};
+
+
+
+
+
+enum {
+    wxPAGE_ODD,
+    wxPAGE_EVEN,
+    wxPAGE_ALL
+};
+
+
+
+//--------------------------------------------------------------------------------
+// wxHtmlPrintout
+//                  This class is derived from standard wxWindows printout class
+//                  and is used to print HTML documents.
+//--------------------------------------------------------------------------------
+
+
+class wxHtmlPrintout : public wxPrintout
+{
+    public:
+        wxHtmlPrintout(const wxString& title = "Printout");
+        ~wxHtmlPrintout();
+
+        void SetHtmlText(const wxString& html, const wxString &basepath = wxEmptyString, bool isdir = TRUE); 
+                // prepares the class for printing this html document.
+                // Must be called before using the class, in fact just after constructor
+                //
+                // basepath is base directory (html string would be stored there if it was in
+                // file). It is used to determine path for loading images, for example.
+                // isdir is FALSE if basepath is filename, TRUE if it is directory name
+                // (see wxFileSystem for detailed explanation)
+                
+        void SetHtmlFile(const wxString &htmlfile);
+                // same as SetHtmlText except that it takes regular file as the parameter
+                
+        void SetHeader(const wxString& header, int pg = wxPAGE_ALL);
+        void SetFooter(const wxString& footer, int pg = wxPAGE_ALL);
+                // sets header/footer for the document. The argument is interpreted as HTML document.
+                // You can use macros in it:
+                //   @PAGENUM@ is replaced by page number
+                //   @PAGESCNT@ is replaced by total number of pages
+                //
+                // pg is one of wxPAGE_ODD, wxPAGE_EVEN and wx_PAGE_ALL constants.
+                // You can set different header/footer for odd and even pages
+
+        void SetMargins(float top = 25.2, float bottom = 25.2, float left = 25.2, float right = 25.2, 
+                        float spaces = 5);
+                // sets margins in milimeters. Defaults to 1 inch for margins and 0.5cm for space
+                // between text and header and/or footer
+
+        // wxPrintout stuff:        
+        bool OnPrintPage(int page);
+        bool HasPage(int page);
+        void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
+        bool OnBeginDocument(int start, int end);
+        
+    private:
+
+        void RenderPage(wxDC *dc, int page);
+                // renders one page into dc
+        wxString TranslateHeader(const wxString& instr, int page);
+                // substitute @PAGENUM@ and @PAGESCNT@ by real values
+        void CountPages();
+                // counts pages and fills m_NumPages and m_PageBreaks
+        
+        
+    private:
+        int m_NumPages;
+        int m_PageBreaks[HTML_PRINT_MAX_PAGES];
+
+        wxString m_Document, m_BasePath;
+        bool m_BasePathIsDir;
+        wxString m_Headers[2], m_Footers[2];
+
+        int m_HeaderHeight, m_FooterHeight;
+        wxHtmlDCRenderer *m_Renderer, *m_RendererHdr;
+        float m_MarginTop, m_MarginBottom, m_MarginLeft, m_MarginRight, m_MarginSpace;
+};
+
+
+
+
+
+//--------------------------------------------------------------------------------
+// wxHtmlEasyPrinting
+//                  This class provides very simple interface to printing 
+//                  architecture. It allows you to print HTML documents only
+//                  with very few commands. 
+//
+//                  Note : do not create this class on stack only.
+//                         You should create an instance on app startup and 
+//                         use this instance for all printing. Why? The class
+//                         stores page&printer settings in it.
+//--------------------------------------------------------------------------------
+
+class wxHtmlEasyPrinting : public wxObject
+{
+    public:
+
+        wxHtmlEasyPrinting(const wxString& name = "Printing", wxFrame *parent_frame = NULL);
+        ~wxHtmlEasyPrinting();
+        
+        void PreviewFile(const wxString &htmlfile);
+        void PreviewText(const wxString &htmltext, const wxString& basepath = wxEmptyString);
+                // Preview file / html-text for printing
+                // (and offers printing)
+                // basepath is base directory for opening subsequent files (e.g. from <img> tag)
+                
+        void PrintFile(const wxString &htmlfile);
+        void PrintText(const wxString &htmltext, const wxString& basepath = wxEmptyString);
+                // Print file / html-text w/o preview
+                
+        void PrinterSetup();
+        void PageSetup();
+                // pop up printer or page setup dialog
+
+        void SetHeader(const wxString& header, int pg = wxPAGE_ALL);
+        void SetFooter(const wxString& footer, int pg = wxPAGE_ALL);
+                // sets header/footer for the document. The argument is interpreted as HTML document.
+                // You can use macros in it:
+                //   @PAGENUM@ is replaced by page number
+                //   @PAGESCNT@ is replaced by total number of pages
+                //
+                // pg is one of wxPAGE_ODD, wxPAGE_EVEN and wx_PAGE_ALL constants.
+                // You can set different header/footer for odd and even pages
+                
+        wxPrintData *GetPrintData() {return m_PrintData;}
+        wxPageSetupDialogData *GetPageSetupData() {return m_PageSetupData;}
+                // return page setting data objects. 
+                // (You can set their parameters.)
+                
+    private:
+    
+        wxHtmlPrintout *CreatePrintout();
+        void DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2);
+        void DoPrint(wxHtmlPrintout *printout);
+    
+        wxPrintData *m_PrintData;
+        wxPageSetupDialogData *m_PageSetupData;
+        wxString m_Name;
+        wxString m_Headers[2], m_Footers[2];
+        wxFrame *m_Frame;
+};
+
+
+
+
+#endif  // wxUSE_PRINTING_ARCHITECTURE
+
+#endif // _WX_HTMPRINT_H_
+
diff --git a/samples/html/printing/Makefile.in b/samples/html/printing/Makefile.in
index 5bd7d8beca..a430ce270c 100644
--- a/samples/html/printing/Makefile.in
+++ b/samples/html/printing/Makefile.in
@@ -13,7 +13,7 @@ top_srcdir = @top_srcdir@
 top_builddir = ../../..
 program_dir = samples/html/printing
 
-DATAFILES = test.htm pic.png
+DATAFILES = test.htm
 
 PROGRAM=printing
 
diff --git a/samples/html/printing/mondrian.xpm b/samples/html/printing/mondrian.xpm
deleted file mode 100644
index 409f27a843..0000000000
--- a/samples/html/printing/mondrian.xpm
+++ /dev/null
@@ -1,44 +0,0 @@
-/* XPM */
-static char *mondrian_xpm[] = {
-/* columns rows colors chars-per-pixel */
-"32 32 6 1",
-"  c Black",
-". c Blue",
-"X c #00bf00",
-"o c Red",
-"O c Yellow",
-"+ c Gray100",
-/* pixels */
-"                                ",
-" oooooo +++++++++++++++++++++++ ",
-" oooooo +++++++++++++++++++++++ ",
-" oooooo +++++++++++++++++++++++ ",
-" oooooo +++++++++++++++++++++++ ",
-" oooooo +++++++++++++++++++++++ ",
-" oooooo +++++++++++++++++++++++ ",
-" oooooo +++++++++++++++++++++++ ",
-"                                ",
-" ++++++ ++++++++++++++++++ .... ",
-" ++++++ ++++++++++++++++++ .... ",
-" ++++++ ++++++++++++++++++ .... ",
-" ++++++ ++++++++++++++++++ .... ",
-" ++++++ ++++++++++++++++++ .... ",
-" ++++++ ++++++++++++++++++      ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++ ++++++++++++++++++ ++++ ",
-" ++++++                    ++++ ",
-" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
-" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
-" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
-" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
-" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
-" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
-"                                "
-};
diff --git a/samples/html/printing/pic.png b/samples/html/printing/pic.png
deleted file mode 100644
index fcc18c1296d650b9ad75f9dc61b15d6cb0d09b03..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 31315
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

diff --git a/samples/html/printing/printing.cpp b/samples/html/printing/printing.cpp
index 2febc3bd6c..4b5b1d7b1e 100644
--- a/samples/html/printing/printing.cpp
+++ b/samples/html/printing/printing.cpp
@@ -1,312 +1,244 @@
-/*
- * File:	printing.cc
- * Purpose:	Printing demo for wxWindows class library
- * Author:	Julian Smart
- *          modified by Vaclav Slavik (wxHTML stuffs)
- * Created:	1995
- * Updated:	
- * Copyright:   (c) 1995, AIAI, University of Edinburgh
- */
-
-/* static const char sccsid[] = "%W% %G%"; */
-
-#ifdef __GNUG__
-#pragma implementation
-#endif
+/////////////////////////////////////////////////////////////////////////////
+// Name:        printimg.cpp
+// Purpose:     wxHtmlEasyPrinting testing example
+/////////////////////////////////////////////////////////////////////////////
+
 
 // For compilers that support precompilation, includes "wx/wx.h".
-#include "wx/wxprec.h"
+#include <wx/wxprec.h>
 
 #ifdef __BORLANDC__
 #pragma hdrstop
 #endif
 
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWindows headers
 #ifndef WX_PRECOMP
-#include "wx/wx.h"
+#include <wx/wx.h>
 #endif
 
-#if !wxUSE_PRINTING_ARCHITECTURE
-#error You must set wxUSE_PRINTING_ARCHITECTURE to 1 in setup.h to compile this demo.
-#endif
-
-// Set this to 1 if you want to test PostScript printing under MSW.
-// However, you'll also need to edit src/msw/makefile.nt.
-
-//!!! DON'T DO THAT! This is wxHTML sample now
-#define wxTEST_POSTSCRIPT_IN_MSW 0
+#include <wx/image.h>
+#include <wx/html/htmlwin.h>
 
-#include <ctype.h>
-#include "wx/metafile.h"
-#include "wx/print.h"
-#include "wx/printdlg.h"
+#include <wx/html/htmprint.h>
 
-#include "wx/accel.h"
 
-#if wxTEST_POSTSCRIPT_IN_MSW
-#include "wx/generic/printps.h"
-#include "wx/generic/prntdlgg.h"
-#endif
-
-#include <wx/wxhtml.h>
-#include <wx/wfstream.h>
-#include "printing.h"
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
 
-#ifndef __WXMSW__
-#include "mondrian.xpm"
-#endif
-
-// Global print data, to remember settings during the session
-wxPrintData *g_printData = (wxPrintData*) NULL ;
+// Define a new application type, each program should derive a class from wxApp
+class MyApp : public wxApp
+{
+    public:
+        // override base class virtuals
+        // ----------------------------
 
-// Global page setup data
-wxPageSetupData* g_pageSetupData = (wxPageSetupData*) NULL;
+        // this one is called on application startup and is a good place for the app
+        // initialization (doing it here and not in the ctor allows to have an error
+        // return: if OnInit() returns false, the application terminates)
 
+        virtual bool OnInit();
+};
 
-// Declare a frame
-MyFrame   *frame = (MyFrame *) NULL;
-wxHtmlWindow *html = NULL;
-int orientation = wxPORTRAIT;
+// Define a new frame type: this is going to be our main frame
+class MyFrame : public wxFrame
+{
+    public:
+        // ctor(s)
+
+        MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
+
+        // event handlers (these functions should _not_ be virtual)
+        void OnQuit(wxCommandEvent& event);
+        void OnAbout(wxCommandEvent& event);
+
+        void OnPrintSetup(wxCommandEvent& event);
+        void OnPageSetup(wxCommandEvent& event);
+        void OnPrint(wxCommandEvent& event);
+        void OnPreview(wxCommandEvent& event);
+        void OnOpen(wxCommandEvent& event);
+        
+
+    private:
+        wxHtmlWindow *m_Html;
+        wxHtmlEasyPrinting *m_Prn;
+        wxString m_Name;
+        // any class wishing to process wxWindows events must use this macro
+        DECLARE_EVENT_TABLE()
+};
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// IDs for the controls and the menu commands
+enum
+{
+    // menu items
+    Minimal_Quit = 1,
+    Minimal_About,
+    Minimal_Print,
+    Minimal_Preview,
+    Minimal_PageSetup,
+    Minimal_PrintSetup,
+    Minimal_Open
+
+};
+
+// ----------------------------------------------------------------------------
+// event tables and other macros for wxWindows
+// ----------------------------------------------------------------------------
+
+// the event tables connect the wxWindows events with the functions (event
+// handlers) which process them. It can be also done at run-time, but for the
+// simple menu events like this the static method is much simpler.
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+    EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
+    EVT_MENU(Minimal_About, MyFrame::OnAbout)
+    EVT_MENU(Minimal_Print, MyFrame::OnPrint)
+    EVT_MENU(Minimal_Preview, MyFrame::OnPreview)
+    EVT_MENU(Minimal_PageSetup, MyFrame::OnPageSetup)
+    EVT_MENU(Minimal_PrintSetup, MyFrame::OnPrintSetup)
+    EVT_MENU(Minimal_Open, MyFrame::OnOpen)
+END_EVENT_TABLE()
 
-// Main proc
+// Create a new application object: this macro will allow wxWindows to create
+// the application object during program execution (it's better than using a
+// static object for many reasons) and also declares the accessor function
+// wxGetApp() which will return the reference of the right type (i.e. MyApp and
+// not wxApp)
 IMPLEMENT_APP(MyApp)
 
+// ============================================================================
+// implementation
+// ============================================================================
 
-MyApp::MyApp()
+// ----------------------------------------------------------------------------
+// the application class
+// ----------------------------------------------------------------------------
+// `Main program' equivalent: the program execution "starts" here
+bool MyApp::OnInit()
 {
-}
+#if wxUSE_LIBPNG
+    wxImage::AddHandler(new wxPNGHandler);
+#endif
+#if wxUSE_LIBJPEG
+    wxImage::AddHandler(new wxJPEGHandler);
+#endif
+#if wxUSE_GIF
+    wxImage::AddHandler(new wxGIFHandler);
+#endif
 
-// The `main program' equivalent, creating the windows and returning the
-// main frame
-bool MyApp::OnInit(void)
-{
-    g_printData = new wxPrintData;
-    g_pageSetupData = new wxPageSetupDialogData;
+    MyFrame *frame = new MyFrame("Printing test",
+                                 wxPoint(150, 50), wxSize(640, 480));
 
-  // Create the main frame window
-  frame = new MyFrame((wxFrame *) NULL, (char *) "wxWindows Printing Demo", wxPoint(0, 0), wxSize(600, 400));
+    // Show it and tell the application that it's our main window
+    // @@@ what does it do exactly, in fact? is it necessary here?
+    frame->Show(TRUE);
+    SetTopWindow(frame);
 
-  // Give it a status line
-  frame->CreateStatusBar(2);
 
-  // Load icon and bitmap
-  frame->SetIcon( wxICON( mondrian) );
+    // success: wxApp::OnRun() will be called which will enter the main message
+    // loop and the application will run. If we returned FALSE here, the
+    // application would exit immediately.
+    return TRUE;
+}
 
-  // Make a menubar
-  wxMenu *file_menu = new wxMenu;
+// ----------------------------------------------------------------------------
+// main frame
+// ----------------------------------------------------------------------------
 
-  file_menu->Append(WXPRINT_PRINT, "&Print...",              "Print");
-  file_menu->Append(WXPRINT_PRINT_SETUP, "Print &Setup...",              "Setup printer properties");
-  file_menu->Append(WXPRINT_PAGE_SETUP, "Page Set&up...",              "Page setup");
-  file_menu->Append(WXPRINT_PREVIEW, "Print Pre&view",              "Preview");
 
-    // Accelerators
-    wxAcceleratorEntry entries[1];
-    entries[0].Set(wxACCEL_CTRL, (int) 'V', WXPRINT_PREVIEW);
-    wxAcceleratorTable accel(1, entries);
-    frame->SetAcceleratorTable(accel);
+// frame constructor
+MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
+        : wxFrame((wxFrame *)NULL, -1, title, pos, size)
+{
+    // create a menu bar
+    wxMenu *menuFile = new wxMenu;
+    wxMenu *menuNav = new wxMenu;
+
+    menuFile->Append(Minimal_Open, "Open...\tCtrl-O");
+    menuFile->AppendSeparator();
+    menuFile->Append(Minimal_PageSetup, "Page Setup");
+    menuFile->Append(Minimal_PrintSetup, "Printer Setup");
+    menuFile->Append(Minimal_Print, "Print...");
+    menuFile->Append(Minimal_Preview, "Preview...");
+    menuFile->AppendSeparator();
+    menuFile->Append(Minimal_About, "&About");
+    menuFile->AppendSeparator();
+    menuFile->Append(Minimal_Quit, "&Exit");
+
+    // now append the freshly created menu to the menu bar...
+    wxMenuBar *menuBar = new wxMenuBar;
+    menuBar->Append(menuFile, "&File");
+
+    // ... and attach this menu bar to the frame
+    SetMenuBar(menuBar);
+
+    CreateStatusBar(1);
+
+    m_Html = new wxHtmlWindow(this);
+    m_Html -> SetRelatedFrame(this, "HTML : %s");
+    m_Html -> SetRelatedStatusBar(0);
+    m_Name = "test.htm";
+    m_Html -> LoadPage(m_Name);
     
-  file_menu->AppendSeparator();
-  file_menu->Append(WXPRINT_QUIT, "E&xit",                "Exit program");
-
-  wxMenu *help_menu = new wxMenu;
-  help_menu->Append(WXPRINT_ABOUT, "&About",              "About this demo");
-
-  wxMenuBar *menu_bar = new wxMenuBar;
-
-  menu_bar->Append(file_menu, "&File");
-  menu_bar->Append(help_menu, "&Help");
-
-  // Associate the menu bar with the frame
-  frame->SetMenuBar(menu_bar);
-
-  frame->Centre(wxBOTH);
-  frame->Show(TRUE);
-
-  frame->SetStatusText("Printing demo");
-
-  SetTopWindow(frame);
-
-  return TRUE;
+    m_Prn = new wxHtmlEasyPrinting("Easy Printing Demo", this);
+    m_Prn -> SetHeader(m_Name + "(@PAGENUM@/@PAGESCNT@)<hr>", wxPAGE_ALL);
 }
 
-int MyApp::OnExit()
-{
-    delete g_printData;
-    delete g_pageSetupData;
-  return 1;
-}
 
-BEGIN_EVENT_TABLE(MyFrame, wxFrame)
-    EVT_MENU(WXPRINT_QUIT, MyFrame::OnExit)
-    EVT_MENU(WXPRINT_PRINT, MyFrame::OnPrint)
-    EVT_MENU(WXPRINT_PREVIEW, MyFrame::OnPrintPreview)
-    EVT_MENU(WXPRINT_PRINT_SETUP, MyFrame::OnPrintSetup)
-    EVT_MENU(WXPRINT_PAGE_SETUP, MyFrame::OnPageSetup)
-    EVT_MENU(WXPRINT_ABOUT, MyFrame::OnPrintAbout)
-END_EVENT_TABLE()
+// event handlers
 
-// Define my frame constructor
-MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size):
-  wxFrame(frame, -1, title, pos, size)
+void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 {
-  html = new wxHtmlWindow(this);
-  html -> LoadPage("test.htm");
+    delete m_Prn;    
+    // TRUE is to force the frame to close
+    Close(TRUE);
 }
 
-void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event))
-{
-      Close(TRUE);
-}
 
-void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event))
+void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 {
-      wxPrinter printer;
-      MyPrintout printout("My printout");
-      if (!printer.Print(this, &printout, TRUE))
-        wxMessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wxOK);
+    wxMessageBox("HTML printing sample\n\n(c) Vaclav Slavik, 1999");
 }
 
-void MyFrame::OnPrintPreview(wxCommandEvent& WXUNUSED(event))
-{
-      wxPrintData printData;
-      printData.SetOrientation(orientation);
-
-      // Pass two printout objects: for preview, and possible printing.
-      wxPrintPreview *preview = new wxPrintPreview(new MyPrintout, new MyPrintout, & printData);
-      if (!preview->Ok())
-      {
-        delete preview;
-        wxMessageBox("There was a problem previewing.\nPerhaps your current printer is not set correctly?", "Previewing", wxOK);
-        return;
-      }
-      
-      wxPreviewFrame *frame = new wxPreviewFrame(preview, this, "Demo Print Preview", wxPoint(100, 100), wxSize(600, 650));
-      frame->Centre(wxBOTH);
-      frame->Initialize();
-      frame->Show(TRUE);
-}
 
 void MyFrame::OnPrintSetup(wxCommandEvent& WXUNUSED(event))
 {
-    wxPrintDialogData printDialogData(* g_printData);
-    wxPrintDialog printerDialog(this, & printDialogData);
-    
-    printerDialog.GetPrintDialogData().SetSetupDialog(TRUE);
-    printerDialog.ShowModal();
-
-    (*g_printData) = printerDialog.GetPrintDialogData().GetPrintData();
-}
-
-void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event))
-{
-    (*g_pageSetupData) = * g_printData;
-
-    wxPageSetupDialog pageSetupDialog(this, g_pageSetupData);
-    pageSetupDialog.ShowModal();
-    
-    (*g_printData) = pageSetupDialog.GetPageSetupData().GetPrintData();
-    (*g_pageSetupData) = pageSetupDialog.GetPageSetupData();
+    m_Prn -> PrinterSetup();
 }
 
 
-
-void MyFrame::OnPrintAbout(wxCommandEvent& WXUNUSED(event))
+void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event))
 {
-      (void)wxMessageBox("wxWindows printing demo\nAuthor: Julian Smart julian.smart@ukonline.co.uk\n\nModified by Vaclav Slavik to show wxHtml features",
-            "About wxWindows printing demo", wxOK|wxCENTRE);
+    m_Prn -> PageSetup();
 }
 
 
-bool MyPrintout::OnPrintPage(int page)
-{
-  wxDC *dc = GetDC();
-  if (dc)
-  {
-    if (page == 1)
-      DrawPageOne(dc);
-
-    return TRUE;
-  }
-  else
-    return FALSE;
-}
-
-bool MyPrintout::OnBeginDocument(int startPage, int endPage)
+void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event))
 {
-  if (!wxPrintout::OnBeginDocument(startPage, endPage))
-    return FALSE;
-
-  return TRUE;
+    m_Prn -> PrintFile(m_Name);
 }
 
-void MyPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
-{
-  *minPage = 1;
-  *maxPage = 1;
-  *selPageFrom = 1;
-  *selPageTo = 1;
-}
 
-bool MyPrintout::HasPage(int pageNum)
+void MyFrame::OnPreview(wxCommandEvent& WXUNUSED(event))
 {
-  return (pageNum == 1);
+    m_Prn -> PreviewFile(m_Name);
 }
 
 
-void MyPrintout::DrawPageOne(wxDC *dc)
+void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
 {
-  int leftMargin = 20;
-  int topMargin = 40;
-
-/* You might use THIS code to set the printer DC to ROUGHLY reflect
- * the screen text size. This page also draws lines of actual length 5cm
- * on the page.
- */
-  // Get the logical pixels per inch of screen and printer
-  int ppiScreenX, ppiScreenY;
-  GetPPIScreen(&ppiScreenX, &ppiScreenY);
-  int ppiPrinterX, ppiPrinterY;
-  GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
-
-  // Here we obtain internal cell representation of HTML document:
-  wxHtmlContainerCell *cell = html -> GetInternalRepresentation();
-
-  // Now we have to check in case our real page size is reduced
-  // (e.g. because we're drawing to a print preview memory DC)
-  int pageWidth, pageHeight;
-  int w, h;
-  dc->GetSize(&w, &h);
-  GetPageSizePixels(&pageWidth, &pageHeight);
-
-  // Now we must scale it somehow. The best would be to suppose that html window
-  // width is equal to page width:
-
-  float scale = (float)((float)(pageWidth - 0 * leftMargin)/((float)cell -> GetMaxLineWidth() + 2 * leftMargin));
-
-  // If printer pageWidth == current DC width, then this doesn't
-  // change. But w might be the preview bitmap width, so scale down.
-  float overallScale = scale * (float)(w/(float)pageWidth);
-  dc->SetUserScale(overallScale, overallScale);
-
-  // Calculate conversion factor for converting millimetres into
-  // logical units.
-  // There are approx. 25.1 mm to the inch. There are ppi
-  // device units to the inch. Therefore 1 mm corresponds to
-  // ppi/25.1 device units. We also divide by the
-  // screen-to-printer scaling factor, because we need to
-  // unscale to pass logical units to DrawLine.
-
-  dc->SetBackgroundMode(wxTRANSPARENT);
-
-  // TESTING
-
-  int pageWidthMM, pageHeightMM;
-  GetPageSizeMM(&pageWidthMM, &pageHeightMM);
-
-
-  // This is all the printing :
-  cell -> Draw(*dc, leftMargin, topMargin, 0, cell -> GetHeight());
+    wxFileDialog dialog(this, "Open HTML page", "", "", "*.htm", 0);
+
+    if (dialog.ShowModal() == wxID_OK)
+    {
+        m_Name = dialog.GetPath();
+        m_Html -> LoadPage(m_Name);
+	m_Prn -> SetHeader(m_Name + "(@PAGENUM@/@PAGESCNT@)<hr>", wxPAGE_ALL);
+    } 
 }
 
 
-
diff --git a/samples/html/printing/printing.h b/samples/html/printing/printing.h
deleted file mode 100644
index ba50b4e216..0000000000
--- a/samples/html/printing/printing.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * File:	printing.h
- * Purpose:	Printing demo for wxWindows class library
- * Author:	Julian Smart
- * Created:	1995
- * Updated:	
- * Copyright:   (c) 1995, AIAI, University of Edinburgh
- */
-
-/* sccsid[] = "%W% %G%" */
-
-#ifdef __GNUG__
-#pragma interface
-#endif
-
-// Define a new application
-class MyApp: public wxApp
-{
-  public:
-    MyApp() ;
-    bool OnInit();
-    int OnExit();
-};
-
-DECLARE_APP(MyApp)
-
-class MyCanvas;
-
-// Define a new canvas and frame
-class MyFrame: public wxFrame
-{
-  public:
-    MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size);
-
-    void OnPrint(wxCommandEvent& event);
-    void OnPrintPreview(wxCommandEvent& event);
-    void OnPrintSetup(wxCommandEvent& event);
-    void OnPageSetup(wxCommandEvent& event);
-#if defined(__WXMSW__) && wxTEST_POSTSCRIPT_IN_MSW
-    void OnPrintPS(wxCommandEvent& event);
-    void OnPrintPreviewPS(wxCommandEvent& event);
-    void OnPrintSetupPS(wxCommandEvent& event);
-    void OnPageSetupPS(wxCommandEvent& event);
-#endif
-
-    void OnExit(wxCommandEvent& event);
-    void OnPrintAbout(wxCommandEvent& event);
-DECLARE_EVENT_TABLE()
-};
-
-
-class MyPrintout: public wxPrintout
-{
- public:
-  MyPrintout(char *title = "My printout"):wxPrintout(title) {}
-  bool OnPrintPage(int page);
-  bool HasPage(int page);
-  bool OnBeginDocument(int startPage, int endPage);
-  void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
-
-  void DrawPageOne(wxDC *dc);
-};
-
-#define WXPRINT_QUIT            100
-#define WXPRINT_PRINT           101
-#define WXPRINT_PRINT_SETUP     102
-#define WXPRINT_PAGE_SETUP      103
-#define WXPRINT_PREVIEW         104
-
-#define WXPRINT_PRINT_PS        105
-#define WXPRINT_PRINT_SETUP_PS  106
-#define WXPRINT_PAGE_SETUP_PS   107
-#define WXPRINT_PREVIEW_PS      108
-
-#define WXPRINT_ABOUT           109
-
diff --git a/samples/html/printing/test.htm b/samples/html/printing/test.htm
index ca2d7dfba1..9cbd004977 100644
--- a/samples/html/printing/test.htm
+++ b/samples/html/printing/test.htm
@@ -1,126 +1,186 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 <HTML>
 <HEAD>
-   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
-   <META NAME="GENERATOR" CONTENT="Mozilla/4.06 [en] (X11; I; Linux 2.0.35 i686) [Netscape]">
+  <TITLE>wxWindows Roadmap</TITLE>
 </HEAD>
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#000088">
-This is - - default text, now switching to
-<CENTER>
-<P>center, now still ctr, now exiting</CENTER>
-
-<P>exited!.<A HREF="#downtown">[link to down]</A>
-<P>Hello, this *is* default charset (helvetica, probably) and it is displayed
-with one&nbsp; <FONT COLOR="#FF0000">COLOR CHANGE</FONT>. Of course we
-can have as many color changes as we can, what about this <FONT COLOR="#FF0000">M</FONT><FONT COLOR="#FFFF00">A</FONT><FONT COLOR="#33FF33">D</FONT><B><FONT COLOR="#FFFFFF"><FONT SIZE=+1>N</FONT></FONT></B>E<FONT COLOR="#999999">S</FONT><FONT COLOR="#CC33CC">S?</FONT>
-<P><FONT COLOR="#000000">There was a space above.</FONT>
-<BR>
-<HR WIDTH="100%">This was a line. <TT>(BTW we are in <B>fixed</B> font
-/ <I><U>typewriter</U> font</I> right now :-)</TT>
-<BR>This is in <B>BOLD</B> face. This is <I>ITALIC.</I> This is <B><I><U>E
-V E R Y T H I N G</U></I></B>.
-<BR>&nbsp;
-<BR>&nbsp;
-<BR>
-<BR>
-<BR>
-<CENTER>
-<P>Right now, <FONT COLOR="#0000FF"><FONT SIZE=+4>centered REALLY Big Text</FONT></FONT>,
-how do you like (space) it?</CENTER>
-
-<DIV ALIGN=right>RIGHT: <FONT SIZE=-2>text-2, </FONT><FONT SIZE=-1>text-1,
-</FONT>text+0,
-<FONT SIZE=+1>text+1,
-</FONT><FONT COLOR="#FF0000"><FONT SIZE=+2>text+2,
-</FONT></FONT><FONT SIZE=+3>text+3,
-</FONT><FONT SIZE=+4>text+4</FONT>
-<BR><U><FONT SIZE=+1>we are right now</FONT></U></DIV>
-
-<CENTER><U><FONT SIZE=+1>we are center now</FONT></U></CENTER>
-<U><FONT SIZE=+1>we are left now.</FONT></U>
-<P><I><FONT COLOR="#3366FF">Blue italic text is displayed there....</FONT></I>
-<H1>
-
-<HR ALIGN=LEFT SIZE=10 WIDTH="50%">This is heading one.</H1>
-this is normal
-<CENTER>
-<H1>
-This is <FONT COLOR="#33FF33">CENTERED</FONT> heading one</H1></CENTER>
-<IMG SRC="pic.png" ALT="Testing image image" >and this is text......
-<BR>&nbsp;
-<UL>
-<LI>
-item 1</LI>
-
-<LI>
-item 2</LI>
-
-<UL>
-<LI>
-nested item</LI>
-
-<LI>
-nested item 2</LI>
-</UL>
-
-<LI>
-item 3</LI>
-</UL>
-
-<OL>
-<LI>
-item one</LI>
-
-<LI>
-item two</LI>
-
-<OL>
-<LI>
-nsted item</LI>
-</OL>
-
-<LI>
-last numbered item</LI>
-</OL>
-
-<H1>
-Heading 1</H1>
-<I>Italic text now...</I>
-<H2>
-<I>Heading 2</I></H2>
-<I>and now?</I>
-<H3>
-Heading 3</H3>
-
-<H4>
-Heading 4</H4>
-
-<H5>
-Heading 5</H5>
-
-<H6>
-Heading 6</H6>
-And this is normal text, once again :-)
-<P>And yes, we're in <FONT SIZE=+4>HTML DOCUMENT, </FONT><FONT SIZE=+1>so
-what about some nice <A HREF="fft.html">hypertext link</A>??</FONT>
-<P>hello?
+
+<BODY>
+
+<a name="top"></a>
+
+<font face="Arial, Lucida Sans, Helvetica">
+
+<table width=100% border=4 cellpadding=5 cellspacing=0>
+<tr>
+<td bgcolor="#660000">
+<font size=+1 face="Arial, Lucida Sans, Helvetica" color="#FFFFFF">
+wxWindows Roadmap
+</font>
+</td>
+</tr>
+</table>
+
+<P>
+
 <CENTER>
-<P>This is&nbsp;<A NAME="downtown"></A>centered paragraph</CENTER>
-
-<P>Now, you will see some PRE text:
-<PRE>// This is sample C++ code:
-
-void main(int argc, char *argv[])
-{
-&nbsp;&nbsp;&nbsp; printf("Go away, man!\n");
-&nbsp;&nbsp;&nbsp; i = 666;
-&nbsp;&nbsp;&nbsp; printf("\n\n\nCRASH\n&nbsp; DOWN NOW. . .&nbsp; \n");
-}</PRE>
-
-<H3>
-WWW</H3>
-<A HREF="http://www.kde.org">This is WWW link to KDE site!</A>
-<BR><A HREF="http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html">(one
-folder up)</A>
+<a href="#schedule">Schedule</a> | <a href="#todo">To-Do List</a>
+</CENTER>
+
+<P>
+
+This page represents current thinking about where wxWindows is going in the near, 
+medium and long-term. It also serves as a schedule for new releases so
+that both developers and users can know what to expect when, at least approximately.<P>
+
+Note (1): as the wxWindows effort is voluntary, these are not hard-and-fast deadlines:
+but we will endeavour to follow them as closely as possible.<P>
+
+Note (2): the releases described are for wxGTK, wxMSW and wxMotif ports. wxMac currently follows
+its own development path. Also, minor snapshot releases for specific platforms may be
+available at dates convenient to the developers.<P>
+
+<HR> <FONT SIZE=+2><I><B><a name="schedule">Schedule</a></B></I></FONT> <HR>
+<P>
+
+<H4>Release 2.1.10</H4>
+
+<ul>
+<li>Release date: October 3rd, 1999
+<li>This beta is intended to be the last stable snapshot before wxWindows
+is split into base and GUI libraries.
+<li>New wxGrid in beta.
+</ul>
+
+<P>
+
+<H2>Release 2.1.11 (final)</H2>
+
+<ul>
+<li>Release date: November 7th, 1999
+<li>Splits wxWindows into base and GUI libraries. Most, but not all makefiles
+are expected to support this: for the rest, the makefiles will build a valid
+combined base/GUI library for GUI applications only.
+<li>New wxGrid.
+<li>wxSocket working.
+<li>wxHTML printing (possibly).
+<li>Animation classes (possibly).
+<li>PCX writing capability (possibly).
+<li>wxImage handlers in separate .h and .cpp files.
+<li>Rewritten timer.cpp, possible wxChrono class.
+<li>Bug tracking system in place.
+</ul>
+
+<P>
+
+<H4>Release 2.1.12</H4>
+
+<ul>
+<li>Release date: January 9th, 2000
+<li>Miscellaneous fixes and small enhancements.
+</ul>
+
+<P>
+
+<H4>Release 2.1.13</H4>
+
+<ul>
+<li>Release date: March 5th, 2000
+<li>Miscellaneous fixes and small enhancements.
+<li>wxDateTime class in beta.
+</ul>
+
+<P>
+
+<H4>Release 2.2.0</H4>
+
+<ul>
+<li>Release date: May 7th, 2000
+<li>Unicode compilation starting to work in wxGTK and wxMSW.
+</ul>
+
+<P>
+
+<H2>Release 2.2.x (final)</H2>
+
+<ul>
+<li>Release date: c. July 2nd, 2000
+<li>Unicode compilation working in wxGTK and wxMSW.
+<li>wxDateTime class.
+</ul>
+
+<P>
+
+<H2>Release 2.3.x (final)</H2>
+
+<ul>
+<li>Release date: unknown
+<li>WinCE port available.
+</ul>
+
+<P>
+
+<HR> <FONT SIZE=+2><I><B><a name="todo">To-Do List</a></B></I></FONT> <HR>
+
+<P>
+
+Developers: please feel free to add to these, and delete them when they are done.
+
+<P>
+
+<B><I>General</I></B><P>
+
+<ul>
+<li>wxHTML printing. When finished, this will allow an application to generate
+printed reports with very little effort.
+<li>wxSocket.
+<li>Split library into several, for base (classes and functions usable by console and GUI
+applications), console (classes and functions usable by console application only)
+and GUI (classes and functions usable by GUI application only).
+<li>Extend and unify drag and drop handling (e.g. we need to specify multiple drop targets
+that can handle multiple formats).
+<li>Expand the number of controls that can be specified in a WXR file.
+<li>Rewrite Dialog Editor.
+<li>PCX writing code.
+<li>GIF animation code.
+<li>Tidying of timer code, addition of wxChrono class.
+<li>wxDateTime class.
+<li>MGL port (see Backroom/Future Ports page).
+<li>Rotated text support.
+<li>FreeType support.
+<li>Support for 'skins', perhaps using a set of alternative control and window classes
+written generically in wxWindows.
+<li>Book, tutorial.
+<li>More examples.
+</ul>
+
+<P>
+
+<B><I>wxMSW</I></B><P>
+
+<ul>
+<li>Windows CE port.
+<li>Cure bug whereby in a panel within another panel, all buttons become
+default buttons (heavy black border).
+<li>Write a RC->WXR converter.
+</ul>
+
+<P>
+
+<B><I>wxGTK</I></B><P>
+
+<ul>
+<li>GNOME/KDE integration libraries.
+</ul>
+
+<P>
+
+<B><I>wxMotif</I></B><P>
+
+<ul>
+<li>Allow wxSystemSettings to be configurable, perhaps via a control
+panel application.
+</ul>
+
+
 </BODY>
 </HTML>
+
diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp
new file mode 100644
index 0000000000..da2b0d5e15
--- /dev/null
+++ b/src/html/htmprint.cpp
@@ -0,0 +1,570 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        htmprint.cpp
+// Purpose:     html printing classes
+// Author:      Vaclav Slavik
+// Created:     25/09/99
+// RCS-ID:      $Id$
+// Copyright:   (c) Vaclav Slavik, 1999
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#if wxUSE_PRINTING_ARCHITECTURE
+
+#include "wx/print.h"
+#include "wx/printdlg.h"
+#include "wx/html/htmprint.h"
+#include "wx/wxhtml.h"
+#include "wx/wfstream.h"
+
+
+//--------------------------------------------------------------------------------
+// wxHtmlDCRenderer
+//--------------------------------------------------------------------------------
+
+
+wxHtmlDCRenderer::wxHtmlDCRenderer() : wxObject()
+{
+    m_DC = NULL;
+    m_Width = m_Height = 0;
+    m_Cells = NULL;
+    m_Parser = new wxHtmlWinParser(NULL);
+    m_FS = new wxFileSystem();
+    m_Parser -> SetFS(m_FS);
+    m_Scale = 1.0;
+}
+
+
+
+wxHtmlDCRenderer::~wxHtmlDCRenderer()
+{
+    if (m_Cells) delete m_Cells;
+    if (m_Parser) delete m_Parser;
+    if (m_FS) delete m_FS;
+}
+
+
+
+void wxHtmlDCRenderer::SetDC(wxDC *dc, int maxwidth)
+{
+    int dx, dy;
+
+    wxDisplaySize(&dx, &dy);
+    m_MaxWidth = maxwidth;
+#if 0
+    m_Scale = (float)dx * 2 / 3 / (float)maxwidth;
+            // let the width of A4 is approximately 2/3 the screen width
+#endif
+    m_Scale = (float)800 / (float)maxwidth;
+            // for now, assume screen width = 800 => good results
+
+    m_DC = dc;
+    m_Parser -> SetDC(dc);
+}
+
+
+
+void wxHtmlDCRenderer::SetSize(int width, int height)
+{
+    m_Width = (int)(width * m_Scale);
+    m_Height = (int)(height * m_Scale);
+}
+
+
+
+void wxHtmlDCRenderer::SetHtmlText(const wxString& html, const wxString& basepath, bool isdir)
+{
+    if (m_DC == NULL) return;
+
+    if (m_Cells != NULL) delete m_Cells;
+    
+    m_FS -> ChangePathTo(basepath, isdir);
+    m_DC -> SetUserScale(1.0, 1.0);
+    m_Cells = (wxHtmlContainerCell*) m_Parser -> Parse(html);
+    m_Cells -> SetIndent(0, HTML_INDENT_ALL, HTML_UNITS_PIXELS);
+    m_Cells -> Layout(m_Width);
+}
+
+
+
+int wxHtmlDCRenderer::Render(int x, int y, int from, int dont_render)
+{
+    int pbreak;
+    
+    if (m_Cells == NULL || m_DC == NULL) return 0;
+    
+    pbreak = (int)(from * m_Scale + m_Height);
+    while (m_Cells -> AdjustPagebreak(&pbreak)) {}
+    
+    if (!dont_render) {
+        int w, h;
+        m_DC -> GetSize(&w, &h);
+        float overallScale = (float)(w/(float)m_MaxWidth) / m_Scale;
+        m_DC -> SetUserScale(overallScale, overallScale);
+
+        m_DC -> SetBrush(*wxWHITE_BRUSH);
+        
+        m_DC -> SetClippingRegion(x * m_Scale, y * m_Scale, m_Width, m_Height);
+        m_Cells -> Draw(*m_DC, 
+                        x * m_Scale, (y - from) * m_Scale, 
+                        y * m_Scale, pbreak + (y - from) * m_Scale);
+        m_DC -> DestroyClippingRegion();
+    }
+    
+    if (pbreak < m_Cells -> GetHeight()) return (int)(pbreak / m_Scale);
+    else return GetTotalHeight();
+}
+
+
+
+int wxHtmlDCRenderer::GetTotalHeight()
+{
+    if (m_Cells) return (int)(m_Cells -> GetHeight() / m_Scale);
+    else return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//--------------------------------------------------------------------------------
+// wxHtmlPrintout
+//--------------------------------------------------------------------------------
+
+
+
+wxHtmlPrintout::wxHtmlPrintout(const wxString& title) : wxPrintout(title)
+{
+    m_Renderer = new wxHtmlDCRenderer;
+    m_RendererHdr = new wxHtmlDCRenderer;
+    m_NumPages = HTML_PRINT_MAX_PAGES;
+    m_Document = m_BasePath = wxEmptyString; m_BasePathIsDir = TRUE;
+    m_Headers[0] = m_Headers[1] = wxEmptyString;
+    m_Footers[0] = m_Footers[1] = wxEmptyString;
+    m_HeaderHeight = m_FooterHeight = 0;
+    SetMargins(); // to default values
+}
+
+
+
+wxHtmlPrintout::~wxHtmlPrintout()
+{
+    delete m_Renderer;
+    delete m_RendererHdr;
+}
+
+
+
+bool wxHtmlPrintout::OnBeginDocument(int start, int end)
+{
+    int pageWidth, pageHeight, mm_w, mm_h;
+    float ppmm_h, ppmm_v;
+    
+    if (!wxPrintout::OnBeginDocument(start, end)) return FALSE;
+
+    GetPageSizePixels(&pageWidth, &pageHeight);
+    GetPageSizeMM(&mm_w, &mm_h);
+    ppmm_h = (float)pageWidth / mm_w;
+    ppmm_v = (float)pageHeight / mm_h;
+
+    /* prepare headers/footers renderer: */
+    
+    m_RendererHdr -> SetDC(GetDC(), pageWidth);
+    m_RendererHdr -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop), 
+                          ppmm_v * (mm_h - m_MarginTop - m_MarginBottom));
+    if (m_Headers[0] != wxEmptyString) {
+        m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[0], 1));
+        m_HeaderHeight = m_RendererHdr -> GetTotalHeight();
+    }
+    else if (m_Headers[1] != wxEmptyString) {
+        m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[1], 1));
+        m_HeaderHeight = m_RendererHdr -> GetTotalHeight();
+    }
+    if (m_Footers[0] != wxEmptyString) {
+        m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[0], 1));
+        m_FooterHeight = m_RendererHdr -> GetTotalHeight();
+    }
+    else if (m_Footers[1] != wxEmptyString) {
+        m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[1], 1));
+        m_FooterHeight = m_RendererHdr -> GetTotalHeight();
+    }
+    
+    /* prepare main renderer: */
+    m_Renderer -> SetDC(GetDC(), pageWidth);
+    m_Renderer -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop), 
+                          ppmm_v * (mm_h - m_MarginTop - m_MarginBottom) - 
+                          m_FooterHeight - m_HeaderHeight -
+                          ((m_HeaderHeight == 0) ? 0 : m_MarginSpace * ppmm_v) -
+                          ((m_FooterHeight == 0) ? 0 : m_MarginSpace * ppmm_v)
+                          );
+    m_Renderer -> SetHtmlText(m_Document, m_BasePath, m_BasePathIsDir);
+    CountPages();
+    
+    return TRUE;
+}
+
+
+bool wxHtmlPrintout::OnPrintPage(int page)
+{
+    wxDC *dc = GetDC();
+    if (dc) {
+        if (HasPage(page))
+            RenderPage(dc, page);
+        return TRUE;
+    } else
+        return FALSE;
+}
+
+
+void wxHtmlPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
+{
+    *minPage = 1;
+    *maxPage = HTML_PRINT_MAX_PAGES;
+    *selPageFrom = 1;
+    *selPageTo = 1;
+}
+
+
+
+bool wxHtmlPrintout::HasPage(int pageNum)
+{
+    return (pageNum >= 1 && pageNum <= m_NumPages);
+}
+
+
+
+void wxHtmlPrintout::SetHtmlText(const wxString& html, const wxString &basepath, bool isdir)
+{
+    m_Document = html;
+    m_BasePath = basepath;
+    m_BasePathIsDir = isdir;
+}
+
+
+
+void wxHtmlPrintout::SetHtmlFile(const wxString& htmlfile)
+{
+    wxFileSystem fs;
+    wxFSFile *ff = fs.OpenFile(htmlfile);
+    wxInputStream *st = ff -> GetStream();
+    char *t = new char[st -> GetSize() + 1];
+    st -> Read(t, st -> GetSize());
+    t[st -> GetSize()] = 0;
+    
+    wxString doc = wxString(t);
+    delete t;
+    delete ff;
+    
+    SetHtmlText(doc, htmlfile, FALSE);
+}
+
+
+
+void wxHtmlPrintout::SetHeader(const wxString& header, int pg)
+{
+    if (pg == wxPAGE_ALL || pg == wxPAGE_EVEN) 
+        m_Headers[0] = header;
+    if (pg == wxPAGE_ALL || pg == wxPAGE_ODD) 
+        m_Headers[1] = header;
+}
+
+
+
+void wxHtmlPrintout::SetFooter(const wxString& footer, int pg)
+{
+    if (pg == wxPAGE_ALL || pg == wxPAGE_EVEN) 
+        m_Footers[0] = footer;
+    if (pg == wxPAGE_ALL || pg == wxPAGE_ODD) 
+        m_Footers[1] = footer;
+}
+
+
+
+void wxHtmlPrintout::CountPages()
+{
+    wxBusyCursor wait;
+    int pageWidth, pageHeight, mm_w, mm_h;
+    float ppmm_h, ppmm_v;
+
+    GetPageSizePixels(&pageWidth, &pageHeight);
+    GetPageSizeMM(&mm_w, &mm_h);
+    ppmm_h = (float)pageWidth / mm_w;
+    ppmm_v = (float)pageHeight / mm_h;
+
+    int pos = 0;
+
+    m_NumPages = 0;
+    
+    m_PageBreaks[0] = 0;
+    do {
+        pos = m_Renderer -> Render(ppmm_h * m_MarginLeft, 
+                                   ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight,
+                                   pos, TRUE);
+        m_PageBreaks[++m_NumPages] = pos;
+    } while (pos < m_Renderer -> GetTotalHeight());
+}
+
+
+
+void wxHtmlPrintout::RenderPage(wxDC *dc, int page)
+{
+    wxBusyCursor wait;
+
+    int pageWidth, pageHeight, mm_w, mm_h;
+    float ppmm_h, ppmm_v;
+
+    GetPageSizePixels(&pageWidth, &pageHeight);
+    GetPageSizeMM(&mm_w, &mm_h);
+    ppmm_h = (float)pageWidth / mm_w;
+    ppmm_v = (float)pageHeight / mm_h;
+    
+    m_Renderer -> SetDC(dc, pageWidth);
+
+    dc -> SetBackgroundMode(wxTRANSPARENT);
+
+    m_Renderer -> Render(ppmm_h * m_MarginLeft, 
+                         ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight,
+                         m_PageBreaks[page-1]);
+    
+    m_RendererHdr -> SetDC(dc, pageWidth);
+    if (m_Headers[page % 2] != wxEmptyString) {
+        m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[page % 2], page));
+        m_RendererHdr -> Render(ppmm_h * m_MarginLeft, ppmm_v * m_MarginTop);
+    }
+    if (m_Footers[page % 2] != wxEmptyString) {
+        m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[page % 2], page));
+        m_RendererHdr -> Render(ppmm_h * m_MarginLeft, pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight);
+    }
+}
+
+
+
+wxString wxHtmlPrintout::TranslateHeader(const wxString& instr, int page)
+{
+    wxString r = instr;
+    wxString num;
+    
+    num.Printf("%i", page);
+    r.Replace("@PAGENUM@", num);
+
+    num.Printf("%i", m_NumPages);
+    r.Replace("@PAGESCNT@", num);
+
+    return r;
+}
+
+
+
+void wxHtmlPrintout::SetMargins(float top, float bottom, float left, float right, float spaces)
+{
+    m_MarginTop = top;
+    m_MarginBottom = bottom;
+    m_MarginLeft = left;
+    m_MarginRight = right;
+    m_MarginSpace = spaces;
+}
+
+
+
+
+
+
+//--------------------------------------------------------------------------------
+// wxHtmlEasyPrinting
+//--------------------------------------------------------------------------------
+
+
+wxHtmlEasyPrinting::wxHtmlEasyPrinting(const wxString& name, wxFrame *parent_frame)
+{
+    m_Frame = parent_frame;
+    m_Name = name;
+    m_PrintData = new wxPrintData;
+    m_PageSetupData = new wxPageSetupDialogData;
+    m_Headers[0] = m_Headers[1] = m_Footers[0] = m_Footers[1] = wxEmptyString;
+    
+    m_PageSetupData -> EnableMargins(TRUE);
+    m_PageSetupData -> SetMarginTopLeft(wxPoint(25, 25));    
+    m_PageSetupData -> SetMarginBottomRight(wxPoint(25, 25));
+
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
+    m_PrintData -> SetPrinterCommand("lpr");
+#endif
+}
+
+
+
+wxHtmlEasyPrinting::~wxHtmlEasyPrinting()
+{
+    delete m_PrintData;
+    delete m_PageSetupData;
+}
+
+
+
+void wxHtmlEasyPrinting::PreviewFile(const wxString &htmlfile)
+{
+    wxHtmlPrintout *p1 = CreatePrintout();
+    p1 -> SetHtmlFile(htmlfile);
+    wxHtmlPrintout *p2 = CreatePrintout();
+    p2 -> SetHtmlFile(htmlfile);
+    DoPreview(p1, p2);
+}
+
+
+
+void wxHtmlEasyPrinting::PreviewText(const wxString &htmltext, const wxString &basepath)
+{
+    wxHtmlPrintout *p1 = CreatePrintout();
+    p1 -> SetHtmlText(htmltext, basepath, TRUE);
+    wxHtmlPrintout *p2 = CreatePrintout();
+    p2 -> SetHtmlText(htmltext, basepath, TRUE);
+    DoPreview(p1, p2);
+}
+
+
+
+void wxHtmlEasyPrinting::PrintFile(const wxString &htmlfile)
+{
+    wxHtmlPrintout *p = CreatePrintout();
+    p -> SetHtmlFile(htmlfile);
+    DoPrint(p);
+}
+
+
+
+void wxHtmlEasyPrinting::PrintText(const wxString &htmltext, const wxString &basepath)
+{
+    wxHtmlPrintout *p = CreatePrintout();
+    p -> SetHtmlText(htmltext, basepath, TRUE);
+    DoPrint(p);
+}
+
+
+
+void wxHtmlEasyPrinting::DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2)
+{
+    // Pass two printout objects: for preview, and possible printing.
+    wxPrintDialogData printDialogData(*m_PrintData);
+    wxPrintPreview *preview = new wxPrintPreview(printout1, printout2, &printDialogData);
+    if (!preview -> Ok()) {
+        delete preview;
+        wxMessageBox(_("There was a problem previewing.\nPerhaps your current printer is not set correctly?"), _("Previewing"), wxOK);
+    }
+    
+    else {
+        wxPreviewFrame *frame = new wxPreviewFrame(preview, m_Frame, 
+                                                   m_Name + _(" Preview"), 
+                                                   wxPoint(100, 100), wxSize(500, 500));
+        frame -> Centre(wxBOTH);
+        frame -> Initialize();
+        frame -> Show(TRUE);
+    }
+}
+
+
+
+void wxHtmlEasyPrinting::DoPrint(wxHtmlPrintout *printout)
+{
+    wxPrintDialogData printDialogData(*m_PrintData);
+    wxPrinter printer(&printDialogData);
+
+    if (!printer.Print(m_Frame, printout, TRUE))
+        wxMessageBox(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"), _("Printing"), wxOK);
+    else
+        (*m_PrintData) = printer.GetPrintDialogData().GetPrintData();
+}
+
+
+
+void wxHtmlEasyPrinting::PrinterSetup()
+{
+    wxPrintDialogData printDialogData(*m_PrintData);
+    wxPrintDialog printerDialog(m_Frame, &printDialogData);
+    
+    printerDialog.GetPrintDialogData().SetSetupDialog(TRUE);
+
+    if (printerDialog.ShowModal() == wxID_OK)
+        (*m_PrintData) = printerDialog.GetPrintDialogData().GetPrintData();
+}
+
+
+
+void wxHtmlEasyPrinting::PageSetup()
+{
+    m_PageSetupData -> SetPrintData(*m_PrintData);
+    wxPageSetupDialog pageSetupDialog(m_Frame, m_PageSetupData);
+
+    if (pageSetupDialog.ShowModal() == wxID_OK) {
+        (*m_PrintData) = pageSetupDialog.GetPageSetupData().GetPrintData();
+        (*m_PageSetupData) = pageSetupDialog.GetPageSetupData();
+    }
+}
+
+
+
+void wxHtmlEasyPrinting::SetHeader(const wxString& header, int pg)
+{
+    if (pg == wxPAGE_ALL || pg == wxPAGE_EVEN) 
+        m_Headers[0] = header;
+    if (pg == wxPAGE_ALL || pg == wxPAGE_ODD) 
+        m_Headers[1] = header;
+}
+
+
+
+void wxHtmlEasyPrinting::SetFooter(const wxString& footer, int pg)
+{
+    if (pg == wxPAGE_ALL || pg == wxPAGE_EVEN) 
+        m_Footers[0] = footer;
+    if (pg == wxPAGE_ALL || pg == wxPAGE_ODD) 
+        m_Footers[1] = footer;
+}
+
+
+
+wxHtmlPrintout *wxHtmlEasyPrinting::CreatePrintout()
+{
+    wxHtmlPrintout *p = new wxHtmlPrintout(m_Name);
+    
+    p -> SetHeader(m_Headers[0], wxPAGE_EVEN);
+    p -> SetHeader(m_Headers[1], wxPAGE_ODD);
+    p -> SetFooter(m_Footers[0], wxPAGE_EVEN);
+    p -> SetFooter(m_Footers[1], wxPAGE_ODD);
+
+    p -> SetMargins(m_PageSetupData -> GetMarginTopLeft().y,
+                    m_PageSetupData -> GetMarginBottomRight().y,
+                    m_PageSetupData -> GetMarginTopLeft().x,
+                    m_PageSetupData -> GetMarginBottomRight().x);
+    
+    return p;
+}
+
+
+
+#endif // wxUSE_PRINTING_ARCHITECTURE
diff --git a/src/msw/makefile.b32 b/src/msw/makefile.b32
index 4a13bde399..09cd8ae564 100644
--- a/src/msw/makefile.b32
+++ b/src/msw/makefile.b32
@@ -1,6 +1,6 @@
 
 
-# This file was automatically generated by tmake at 14:54, 1999/10/14
+# This file was automatically generated by tmake at 22:30, 1999/10/16
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE B32.T!
 
 #
diff --git a/src/msw/makefile.bcc b/src/msw/makefile.bcc
index b25de61c34..0c027309fe 100644
--- a/src/msw/makefile.bcc
+++ b/src/msw/makefile.bcc
@@ -1,6 +1,6 @@
 
 
-# This file was automatically generated by tmake at 14:54, 1999/10/14
+# This file was automatically generated by tmake at 22:30, 1999/10/16
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE BCC.T!
 
 #
diff --git a/src/msw/makefile.dos b/src/msw/makefile.dos
index c717c3c56e..54d2a93843 100644
--- a/src/msw/makefile.dos
+++ b/src/msw/makefile.dos
@@ -1,6 +1,6 @@
 
 
-# This file was automatically generated by tmake at 14:54, 1999/10/14
+# This file was automatically generated by tmake at 22:30, 1999/10/16
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE DOS.T!
 
 #
diff --git a/src/msw/makefile.g95 b/src/msw/makefile.g95
index 3f3fe7b866..f947d366c2 100644
--- a/src/msw/makefile.g95
+++ b/src/msw/makefile.g95
@@ -1,5 +1,5 @@
 
-# This file was automatically generated by tmake at 14:54, 1999/10/14
+# This file was automatically generated by tmake at 22:30, 1999/10/16
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE G95.T!
 
 #
@@ -156,6 +156,7 @@ HTMLOBJS = \
 		$(HTMLDIR)/htmlpars.$(OBJSUFF) \
 		$(HTMLDIR)/htmltag.$(OBJSUFF) \
 		$(HTMLDIR)/htmlwin.$(OBJSUFF) \
+		$(HTMLDIR)/htmprint.$(OBJSUFF) \
 		$(HTMLDIR)/m_fonts.$(OBJSUFF) \
 		$(HTMLDIR)/m_hline.$(OBJSUFF) \
 		$(HTMLDIR)/m_image.$(OBJSUFF) \
diff --git a/src/msw/makefile.sc b/src/msw/makefile.sc
index 342f65c38f..fb6d66d2f5 100644
--- a/src/msw/makefile.sc
+++ b/src/msw/makefile.sc
@@ -1,6 +1,6 @@
 
 
-# This file was automatically generated by tmake at 14:54, 1999/10/14
+# This file was automatically generated by tmake at 22:30, 1999/10/16
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE SC.T!
 
 # Symantec C++ makefile for the msw objects
diff --git a/src/msw/makefile.vc b/src/msw/makefile.vc
index 64c55f907d..9a5e4edf45 100644
--- a/src/msw/makefile.vc
+++ b/src/msw/makefile.vc
@@ -1,4 +1,4 @@
-# This file was automatically generated by tmake at 14:54, 1999/10/14
+# This file was automatically generated by tmake at 22:30, 1999/10/16
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE VC.T!
 
 # File:     makefile.vc
@@ -314,6 +314,7 @@ HTMLOBJS = ..\html\$D\helpctrl.obj \
 		..\html\$D\htmlpars.obj \
 		..\html\$D\htmltag.obj \
 		..\html\$D\htmlwin.obj \
+		..\html\$D\htmprint.obj \
 		..\html\$D\m_fonts.obj \
 		..\html\$D\m_hline.obj \
 		..\html\$D\m_image.obj \
diff --git a/src/msw/makefile.wat b/src/msw/makefile.wat
index c8e0ca2d00..7b72555a8e 100644
--- a/src/msw/makefile.wat
+++ b/src/msw/makefile.wat
@@ -1,6 +1,6 @@
 
 
-# This file was automatically generated by tmake at 14:54, 1999/10/14
+# This file was automatically generated by tmake at 22:30, 1999/10/16
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE WAT.T!
 
 #!/binb/wmake.exe
diff --git a/src/wxvc.dsp b/src/wxvc.dsp
index 8bd26d3c34..2641b3336f 100644
--- a/src/wxvc.dsp
+++ b/src/wxvc.dsp
@@ -563,6 +563,10 @@ SOURCE=.\html\htmlwin.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\html\htmprint.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\html\m_fonts.cpp
 # End Source File
 # Begin Source File
diff --git a/src/wxvc6.dsp b/src/wxvc6.dsp
index 043c132fc2..9ec20280e6 100644
--- a/src/wxvc6.dsp
+++ b/src/wxvc6.dsp
@@ -578,6 +578,10 @@ SOURCE=.\html\htmlwin.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\html\htmprint.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\html\m_fonts.cpp
 # End Source File
 # Begin Source File
diff --git a/src/wxvc_dll.dsp b/src/wxvc_dll.dsp
index e1ec62776f..bc5ee9cbdf 100644
--- a/src/wxvc_dll.dsp
+++ b/src/wxvc_dll.dsp
@@ -571,6 +571,10 @@ SOURCE=.\html\htmlwin.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\html\htmprint.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\html\winpars.cpp
 # End Source File
 # Begin Source File
-- 
2.45.2