From 3ce369e6876c49ad7a101ad222048bd5446b7125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= 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 | 432 +++++++++------------- samples/html/printing/printing.h | 76 ---- samples/html/printing/test.htm | 262 ++++++++----- 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, 1568 insertions(+), 538 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 + +#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 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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 #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 #endif -#if !wxUSE_PRINTING_ARCHITECTURE -#error You must set wxUSE_PRINTING_ARCHITECTURE to 1 in setup.h to compile this demo. -#endif +#include +#include -// 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 -#include "wx/metafile.h" -#include "wx/print.h" -#include "wx/printdlg.h" - -#include "wx/accel.h" - -#if wxTEST_POSTSCRIPT_IN_MSW -#include "wx/generic/printps.h" -#include "wx/generic/prntdlgg.h" -#endif - -#include -#include -#include "printing.h" - -#ifndef __WXMSW__ -#include "mondrian.xpm" -#endif - -// Global print data, to remember settings during the session -wxPrintData *g_printData = (wxPrintData*) NULL ; - -// Global page setup data -wxPageSetupData* g_pageSetupData = (wxPageSetupData*) NULL; +#include -// Declare a frame -MyFrame *frame = (MyFrame *) NULL; -wxHtmlWindow *html = NULL; -int orientation = wxPORTRAIT; +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- -// Main proc -IMPLEMENT_APP(MyApp) - - -MyApp::MyApp() +// Define a new application type, each program should derive a class from wxApp +class MyApp : public wxApp { -} + public: + // override base class virtuals + // ---------------------------- -// The `main program' equivalent, creating the windows and returning the -// main frame -bool MyApp::OnInit(void) + // 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(); +}; + +// Define a new frame type: this is going to be our main frame +class MyFrame : public wxFrame { - g_printData = new wxPrintData; - g_pageSetupData = new wxPageSetupDialogData; + public: + // ctor(s) - // Create the main frame window - frame = new MyFrame((wxFrame *) NULL, (char *) "wxWindows Printing Demo", wxPoint(0, 0), wxSize(600, 400)); + MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); - // Give it a status line - frame->CreateStatusBar(2); + // event handlers (these functions should _not_ be virtual) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); - // Load icon and bitmap - frame->SetIcon( wxICON( mondrian) ); + void OnPrintSetup(wxCommandEvent& event); + void OnPageSetup(wxCommandEvent& event); + void OnPrint(wxCommandEvent& event); + void OnPreview(wxCommandEvent& event); + void OnOpen(wxCommandEvent& event); + - // Make a menubar - wxMenu *file_menu = new wxMenu; + private: + wxHtmlWindow *m_Html; + wxHtmlEasyPrinting *m_Prn; + wxString m_Name; + // any class wishing to process wxWindows events must use this macro + DECLARE_EVENT_TABLE() +}; - 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"); +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- - // Accelerators - wxAcceleratorEntry entries[1]; - entries[0].Set(wxACCEL_CTRL, (int) 'V', WXPRINT_PREVIEW); - wxAcceleratorTable accel(1, entries); - frame->SetAcceleratorTable(accel); - - 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; -} - -int MyApp::OnExit() +// IDs for the controls and the menu commands +enum { - delete g_printData; - delete g_pageSetupData; - return 1; -} + // 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(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) + 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() -// Define my frame constructor -MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size): - wxFrame(frame, -1, title, pos, size) +// 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 +// ============================================================================ + +// ---------------------------------------------------------------------------- +// the application class +// ---------------------------------------------------------------------------- +// `Main program' equivalent: the program execution "starts" here +bool MyApp::OnInit() { - html = new wxHtmlWindow(this); - html -> LoadPage("test.htm"); +#if wxUSE_LIBPNG + wxImage::AddHandler(new wxPNGHandler); +#endif +#if wxUSE_LIBJPEG + wxImage::AddHandler(new wxJPEGHandler); +#endif +#if wxUSE_GIF + wxImage::AddHandler(new wxGIFHandler); +#endif + + MyFrame *frame = new MyFrame("Printing test", + wxPoint(150, 50), wxSize(640, 480)); + + // 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); + + + // 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; } -void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event)) +// ---------------------------------------------------------------------------- +// main frame +// ---------------------------------------------------------------------------- + + +// frame constructor +MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) + : wxFrame((wxFrame *)NULL, -1, title, pos, size) { - Close(TRUE); + // 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); + + m_Prn = new wxHtmlEasyPrinting("Easy Printing Demo", this); + m_Prn -> SetHeader(m_Name + "(@PAGENUM@/@PAGESCNT@)
", wxPAGE_ALL); } -void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event)) + +// event handlers + +void MyFrame::OnQuit(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); + delete m_Prn; + // TRUE is to force the frame to close + Close(TRUE); } -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::OnAbout(wxCommandEvent& WXUNUSED(event)) +{ + wxMessageBox("HTML printing sample\n\n(c) Vaclav Slavik, 1999"); } + 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(); + m_Prn -> PrinterSetup(); } + 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 -> PageSetup(); } - -void MyFrame::OnPrintAbout(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OnPrint(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 -> PrintFile(m_Name); } -bool MyPrintout::OnPrintPage(int page) +void MyFrame::OnPreview(wxCommandEvent& WXUNUSED(event)) { - wxDC *dc = GetDC(); - if (dc) - { - if (page == 1) - DrawPageOne(dc); - - return TRUE; - } - else - return FALSE; + m_Prn -> PreviewFile(m_Name); } -bool MyPrintout::OnBeginDocument(int startPage, int endPage) + +void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event)) { - if (!wxPrintout::OnBeginDocument(startPage, endPage)) - return FALSE; + wxFileDialog dialog(this, "Open HTML page", "", "", "*.htm", 0); - return TRUE; -} - -void MyPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) -{ - *minPage = 1; - *maxPage = 1; - *selPageFrom = 1; - *selPageTo = 1; -} - -bool MyPrintout::HasPage(int pageNum) -{ - return (pageNum == 1); + if (dialog.ShowModal() == wxID_OK) + { + m_Name = dialog.GetPath(); + m_Html -> LoadPage(m_Name); + m_Prn -> SetHeader(m_Name + "(@PAGENUM@/@PAGESCNT@)
", wxPAGE_ALL); + } } -void MyPrintout::DrawPageOne(wxDC *dc) -{ - 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()); -} - - - 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 @@ - - - + wxWindows Roadmap - -This is - - default text, now switching to + + + + + + + + + + + +
+ +wxWindows Roadmap + +
+ +

+

-

center, now still ctr, now exiting

+Schedule | To-Do List + -

exited!.[link to down] -

Hello, this *is* default charset (helvetica, probably) and it is displayed -with one  COLOR CHANGE. Of course we -can have as many color changes as we can, what about this MADNESS? -

There was a space above. -
-


This was a line. (BTW we are in fixed font -/ typewriter font right now :-) -
This is in BOLD face. This is ITALIC. This is E -V E R Y T H I N G. -
  -
  -
-
-
-
-

Right now, centered REALLY Big Text, -how do you like (space) it?

+

-

RIGHT: text-2, text-1, -text+0, -text+1, -text+2, -text+3, -text+4 -
we are right now
+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.

-

we are center now
-we are left now. -

Blue italic text is displayed there.... -

+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.

-


This is heading one.

-this is normal -
-

-This is CENTERED heading one

-Testing image imageand this is text...... -
  -
    -
  • -item 1
  • +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.

    -

  • -item 2
  • +
    Schedule
    +

    -

      -
    • -nested item
    • +

      Release 2.1.10

      -
    • -nested item 2
    • -
    +
      +
    • Release date: October 3rd, 1999 +
    • This beta is intended to be the last stable snapshot before wxWindows +is split into base and GUI libraries. +
    • New wxGrid in beta. +
    -
  • -item 3
  • -
+

-

    -
  1. -item one
  2. +

    Release 2.1.11 (final)

    -
  3. -item two
  4. +
      +
    • Release date: November 7th, 1999 +
    • 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. +
    • New wxGrid. +
    • wxSocket working. +
    • wxHTML printing (possibly). +
    • Animation classes (possibly). +
    • PCX writing capability (possibly). +
    • wxImage handlers in separate .h and .cpp files. +
    • Rewritten timer.cpp, possible wxChrono class. +
    • Bug tracking system in place. +
    -
      -
    1. -nsted item
    2. -
    +

    -

  5. -last numbered item
  6. -
+

Release 2.1.12

-

-Heading 1

-Italic text now... -

-Heading 2

-and now? -

-Heading 3

+
    +
  • Release date: January 9th, 2000 +
  • Miscellaneous fixes and small enhancements. +
-

-Heading 4

+

-

-Heading 5
+

Release 2.1.13

-
-Heading 6
-And this is normal text, once again :-) -

And yes, we're in HTML DOCUMENT, so -what about some nice hypertext link?? -

hello? -

-

This is centered paragraph

+
    +
  • Release date: March 5th, 2000 +
  • Miscellaneous fixes and small enhancements. +
  • wxDateTime class in beta. +
-

Now, you will see some PRE text: -

// This is sample C++ code:
+

+ +

Release 2.2.0

+ +
    +
  • Release date: May 7th, 2000 +
  • Unicode compilation starting to work in wxGTK and wxMSW. +
+ +

+ +

Release 2.2.x (final)

+ +
    +
  • Release date: c. July 2nd, 2000 +
  • Unicode compilation working in wxGTK and wxMSW. +
  • wxDateTime class. +
+ +

+ +

Release 2.3.x (final)

+ +
    +
  • Release date: unknown +
  • WinCE port available. +
+ +

+ +


To-Do List
+ +

+ +Developers: please feel free to add to these, and delete them when they are done. + +

+ +General

+ +

    +
  • wxHTML printing. When finished, this will allow an application to generate +printed reports with very little effort. +
  • wxSocket. +
  • 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). +
  • Extend and unify drag and drop handling (e.g. we need to specify multiple drop targets +that can handle multiple formats). +
  • Expand the number of controls that can be specified in a WXR file. +
  • Rewrite Dialog Editor. +
  • PCX writing code. +
  • GIF animation code. +
  • Tidying of timer code, addition of wxChrono class. +
  • wxDateTime class. +
  • MGL port (see Backroom/Future Ports page). +
  • Rotated text support. +
  • FreeType support. +
  • Support for 'skins', perhaps using a set of alternative control and window classes +written generically in wxWindows. +
  • Book, tutorial. +
  • More examples. +
+ +

+ +wxMSW

+ +

    +
  • Windows CE port. +
  • Cure bug whereby in a panel within another panel, all buttons become +default buttons (heavy black border). +
  • Write a RC->WXR converter. +
+ +

+ +wxGTK

+ +

    +
  • GNOME/KDE integration libraries. +
+ +

+ +wxMotif

+ +

    +
  • Allow wxSystemSettings to be configurable, perhaps via a control +panel application. +
-void main(int argc, char *argv[]) -{ -    printf("Go away, man!\n"); -    i = 666; -    printf("\n\n\nCRASH\n  DOWN NOW. . .  \n"); -}
-

-WWW

-This is WWW link to KDE site! -
(one -folder up) + 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