| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/html/htmprint.h
- // Purpose: html printing classes
- // Author: Vaclav Slavik
- // Created: 25/09/99
- // Copyright: (c) Vaclav Slavik
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_HTMPRINT_H_
- #define _WX_HTMPRINT_H_
- #include "wx/defs.h"
- #if wxUSE_HTML & wxUSE_PRINTING_ARCHITECTURE
- #include "wx/html/htmlcell.h"
- #include "wx/html/winpars.h"
- #include "wx/html/htmlfilt.h"
- #include "wx/print.h"
- #include "wx/printdlg.h"
- #include <limits.h> // INT_MAX
- //--------------------------------------------------------------------------------
- // wxHtmlDCRenderer
- // This class is capable of rendering HTML into specified
- // portion of DC
- //--------------------------------------------------------------------------------
- class WXDLLIMPEXP_HTML wxHtmlDCRenderer : public wxObject
- {
- public:
- wxHtmlDCRenderer();
- virtual ~wxHtmlDCRenderer();
- // Following 3 methods *must* be called before any call to Render:
- // Assign DC to this render
- void SetDC(wxDC *dc, double pixel_scale = 1.0)
- { SetDC(dc, pixel_scale, pixel_scale); }
- void SetDC(wxDC *dc, double pixel_scale, double font_scale);
- // 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.)
- void SetSize(int width, int height);
- // 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)
- void SetHtmlText(const wxString& html, const wxString& basepath = wxEmptyString, bool isdir = true);
- // Sets fonts to be used when displaying HTML page. (if size null then default sizes used).
- void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL);
- // Sets font sizes to be relative to the given size or the system
- // default size; use either specified or default font
- void SetStandardFonts(int size = -1,
- const wxString& normal_face = wxEmptyString,
- const wxString& fixed_face = wxEmptyString);
- // [x,y] is position of upper-left corner of printing rectangle (see SetSize)
- // from is y-coordinate of the very first visible cell
- // to is y-coordinate of the next following page break, if any
- // 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
- //
- // known_pagebreaks and number_of_pages are used only when counting pages;
- // otherwise, their default values should be used. Their purpose is to
- // support pagebreaks using a subset of CSS2's <DIV>. The <DIV> handler
- // needs to know what pagebreaks have already been set so that it doesn't
- // set the same pagebreak twice.
- //
- // CAUTION! Render() changes DC's user scale and does NOT restore it!
- int Render(int x, int y, wxArrayInt& known_pagebreaks, int from = 0,
- int dont_render = false, int to = INT_MAX);
- // returns total width of the html document
- int GetTotalWidth() const;
- // returns total height of the html document
- // (compare Render's return value with this)
- int GetTotalHeight() const;
- private:
- wxDC *m_DC;
- wxHtmlWinParser *m_Parser;
- wxFileSystem *m_FS;
- wxHtmlContainerCell *m_Cells;
- int m_MaxWidth, m_Width, m_Height;
- wxDECLARE_NO_COPY_CLASS(wxHtmlDCRenderer);
- };
- enum {
- wxPAGE_ODD,
- wxPAGE_EVEN,
- wxPAGE_ALL
- };
- //--------------------------------------------------------------------------------
- // wxHtmlPrintout
- // This class is derived from standard wxWidgets printout class
- // and is used to print HTML documents.
- //--------------------------------------------------------------------------------
- class WXDLLIMPEXP_HTML wxHtmlPrintout : public wxPrintout
- {
- public:
- wxHtmlPrintout(const wxString& title = wxT("Printout"));
- virtual ~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
- // Sets fonts to be used when displaying HTML page. (if size null then default sizes used).
- void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL);
- // Sets font sizes to be relative to the given size or the system
- // default size; use either specified or default font
- void SetStandardFonts(int size = -1,
- const wxString& normal_face = wxEmptyString,
- const wxString& fixed_face = wxEmptyString);
- void SetMargins(float top = 25.2f, float bottom = 25.2f, float left = 25.2f, float right = 25.2f,
- 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 startPage, int endPage);
- void OnPreparePrinting();
- // Adds input filter
- static void AddFilter(wxHtmlFilter *filter);
- // Cleanup
- static void CleanUpStatics();
- private:
- // this function is called by the base class OnPreparePrinting()
- // implementation and by default checks whether the document fits into
- // pageArea horizontally and warns the user if it does not and, if we're
- // going to print and not just to preview the document, giving him the
- // possibility to cancel printing
- //
- // you may override it to either suppress this check if truncation of the
- // HTML being printed is acceptable or, on the contrary, add more checks to
- // it, e.g. for the fit in the vertical direction if the document should
- // always appear on a single page
- //
- // return true if printing should go ahead or false to cancel it (the
- // return value is ignored when previewing)
- virtual bool CheckFit(const wxSize& pageArea, const wxSize& docArea) const;
- 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;
- wxArrayInt m_PageBreaks;
- 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;
- // list of HTML filters
- static wxList m_Filters;
- wxDECLARE_NO_COPY_CLASS(wxHtmlPrintout);
- };
- //--------------------------------------------------------------------------------
- // 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 WXDLLIMPEXP_HTML wxHtmlEasyPrinting : public wxObject
- {
- public:
- wxHtmlEasyPrinting(const wxString& name = wxT("Printing"), wxWindow *parentWindow = NULL);
- virtual ~wxHtmlEasyPrinting();
- bool PreviewFile(const wxString &htmlfile);
- bool 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)
- bool PrintFile(const wxString &htmlfile);
- bool PrintText(const wxString &htmltext, const wxString& basepath = wxEmptyString);
- // Print file / html-text w/o preview
- 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
- void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = 0);
- // Sets fonts to be used when displaying HTML page. (if size null then default sizes used)
- // Sets font sizes to be relative to the given size or the system
- // default size; use either specified or default font
- void SetStandardFonts(int size = -1,
- const wxString& normal_face = wxEmptyString,
- const wxString& fixed_face = wxEmptyString);
- wxPrintData *GetPrintData();
- wxPageSetupDialogData *GetPageSetupData() {return m_PageSetupData;}
- // return page setting data objects.
- // (You can set their parameters.)
- wxWindow* GetParentWindow() const { return m_ParentWindow; }
- // get the parent window
- void SetParentWindow(wxWindow* window) { m_ParentWindow = window; }
- // set the parent window
- const wxString& GetName() const { return m_Name; }
- // get the printout name
- void SetName(const wxString& name) { m_Name = name; }
- // set the printout name
- protected:
- virtual wxHtmlPrintout *CreatePrintout();
- virtual bool DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2);
- virtual bool DoPrint(wxHtmlPrintout *printout);
- private:
- wxPrintData *m_PrintData;
- wxPageSetupDialogData *m_PageSetupData;
- wxString m_Name;
- int m_FontsSizesArr[7];
- int *m_FontsSizes;
- wxString m_FontFaceFixed, m_FontFaceNormal;
- enum FontMode
- {
- FontMode_Explicit,
- FontMode_Standard
- };
- FontMode m_fontMode;
- wxString m_Headers[2], m_Footers[2];
- wxWindow *m_ParentWindow;
- wxDECLARE_NO_COPY_CLASS(wxHtmlEasyPrinting);
- };
- #endif // wxUSE_HTML & wxUSE_PRINTING_ARCHITECTURE
- #endif // _WX_HTMPRINT_H_
|