1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/richtext/richtextprint.h
3 // Purpose:     Rich text printing classes
4 // Author:      Julian Smart
5 // Created:     2006-10-23
6 // RCS-ID:      $Id: richtextprint.h 55146 2008-08-21 16:07:54Z JS $
7 // Copyright:   (c) Julian Smart
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef _WX_RICHTEXTPRINT_H_
12 #define _WX_RICHTEXTPRINT_H_
13 
14 #include "wx/defs.h"
15 
16 #if wxUSE_RICHTEXT & wxUSE_PRINTING_ARCHITECTURE
17 
18 #include "wx/richtext/richtextbuffer.h"
19 
20 #include "wx/print.h"
21 #include "wx/printdlg.h"
22 
23 #define wxRICHTEXT_PRINT_MAX_PAGES 99999
24 
25 // Header/footer page identifiers
26 enum wxRichTextOddEvenPage {
27     wxRICHTEXT_PAGE_ODD,
28     wxRICHTEXT_PAGE_EVEN,
29     wxRICHTEXT_PAGE_ALL
30 };
31 
32 // Header/footer text locations
33 enum wxRichTextPageLocation {
34     wxRICHTEXT_PAGE_LEFT,
35     wxRICHTEXT_PAGE_CENTRE,
36     wxRICHTEXT_PAGE_RIGHT
37 };
38 
39 /*!
40  * Header/footer data
41  */
42 
43 class WXDLLIMPEXP_RICHTEXT wxRichTextHeaderFooterData: public wxObject
44 {
45 public:
wxRichTextHeaderFooterData()46     wxRichTextHeaderFooterData() { Init(); }
wxRichTextHeaderFooterData(const wxRichTextHeaderFooterData & data)47     wxRichTextHeaderFooterData(const wxRichTextHeaderFooterData& data): wxObject() { Copy(data); }
48 
49     /// Initialise
Init()50     void Init() { m_headerMargin = 20; m_footerMargin = 20; m_showOnFirstPage = true; }
51 
52     /// Copy
53     void Copy(const wxRichTextHeaderFooterData& data);
54 
55     /// Assignment
56     void operator= (const wxRichTextHeaderFooterData& data) { Copy(data); }
57 
58     /// Set/get header text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT
59     void SetHeaderText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE);
60     wxString GetHeaderText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const;
61 
62     /// Set/get footer text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT
63     void SetFooterText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE);
64     wxString GetFooterText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const;
65 
66     /// Set/get text
67     void SetText(const wxString& text, int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location);
68     wxString GetText(int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location) const;
69 
70     /// Set/get margins between text and header or footer, in tenths of a millimeter
SetMargins(int headerMargin,int footerMargin)71     void SetMargins(int headerMargin, int footerMargin) { m_headerMargin = headerMargin; m_footerMargin = footerMargin; }
GetHeaderMargin()72     int GetHeaderMargin() const { return m_headerMargin; }
GetFooterMargin()73     int GetFooterMargin() const { return m_footerMargin; }
74 
75     /// Set/get whether to show header or footer on first page
SetShowOnFirstPage(bool showOnFirstPage)76     void SetShowOnFirstPage(bool showOnFirstPage) { m_showOnFirstPage = showOnFirstPage; }
GetShowOnFirstPage()77     bool GetShowOnFirstPage() const { return m_showOnFirstPage; }
78 
79     /// Clear all text
80     void Clear();
81 
82     /// Set/get font
SetFont(const wxFont & font)83     void SetFont(const wxFont& font) { m_font = font; }
GetFont()84     const wxFont& GetFont() const { return m_font; }
85 
86     /// Set/get colour
SetTextColour(const wxColour & col)87     void SetTextColour(const wxColour& col) { m_colour = col; }
GetTextColour()88     const wxColour& GetTextColour() const { return m_colour; }
89 
90     DECLARE_CLASS(wxRichTextHeaderFooterData)
91 
92 private:
93 
94     // Strings for left, centre, right, top, bottom, odd, even
95     wxString    m_text[12];
96     wxFont      m_font;
97     wxColour    m_colour;
98     int         m_headerMargin;
99     int         m_footerMargin;
100     bool        m_showOnFirstPage;
101 };
102 
103 /*!
104  * wxRichTextPrintout
105  */
106 
107 class WXDLLIMPEXP_RICHTEXT wxRichTextPrintout : public wxPrintout
108 {
109 public:
110     wxRichTextPrintout(const wxString& title = wxT("Printout"));
111     virtual ~wxRichTextPrintout();
112 
113     /// The buffer to print
SetRichTextBuffer(wxRichTextBuffer * buffer)114     void SetRichTextBuffer(wxRichTextBuffer* buffer) { m_richTextBuffer = buffer; }
GetRichTextBuffer()115     wxRichTextBuffer* GetRichTextBuffer() const { return m_richTextBuffer; }
116 
117     /// Set/get header/footer data
SetHeaderFooterData(const wxRichTextHeaderFooterData & data)118     void SetHeaderFooterData(const wxRichTextHeaderFooterData& data) { m_headerFooterData = data; }
GetHeaderFooterData()119     const wxRichTextHeaderFooterData& GetHeaderFooterData() const { return m_headerFooterData; }
120 
121     /// Sets margins in 10ths of millimetre. Defaults to 1 inch for margins.
122     void SetMargins(int top = 254, int bottom = 254, int left = 254, int right = 254);
123 
124     /// Calculate scaling and rectangles, setting the device context scaling
125     void CalculateScaling(wxDC* dc, wxRect& textRect, wxRect& headerRect, wxRect& footerRect);
126 
127     // wxPrintout virtual functions
128     virtual bool OnPrintPage(int page);
129     virtual bool HasPage(int page);
130     virtual void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
131     virtual bool OnBeginDocument(int startPage, int endPage);
132     virtual void OnPreparePrinting();
133 
134 private:
135 
136     /// Renders one page into dc
137     void RenderPage(wxDC *dc, int page);
138 
139     /// Substitute keywords
140     static bool SubstituteKeywords(wxString& str, const wxString& title, int pageNum, int pageCount);
141 
142 private:
143 
144     wxRichTextBuffer*           m_richTextBuffer;
145     int                         m_numPages;
146     wxArrayInt                  m_pageBreaksStart;
147     wxArrayInt                  m_pageBreaksEnd;
148     int                         m_marginLeft, m_marginTop, m_marginRight, m_marginBottom;
149 
150     wxRichTextHeaderFooterData  m_headerFooterData;
151 
152     DECLARE_NO_COPY_CLASS(wxRichTextPrintout)
153 };
154 
155 /*
156  *! wxRichTextPrinting
157  * A simple interface to perform wxRichTextBuffer printing.
158  */
159 
160 class WXDLLIMPEXP_RICHTEXT wxRichTextPrinting : public wxObject
161 {
162 public:
163     wxRichTextPrinting(const wxString& name = wxT("Printing"), wxWindow *parentWindow = NULL);
164     virtual ~wxRichTextPrinting();
165 
166     /// Preview the file or buffer
167     bool PreviewFile(const wxString& richTextFile);
168     bool PreviewBuffer(const wxRichTextBuffer& buffer);
169 
170     /// Print the file or buffer
171     bool PrintFile(const wxString& richTextFile);
172     bool PrintBuffer(const wxRichTextBuffer& buffer);
173 
174     /// Shows page setup dialog
175     void PageSetup();
176 
177     /// Set/get header/footer data
SetHeaderFooterData(const wxRichTextHeaderFooterData & data)178     void SetHeaderFooterData(const wxRichTextHeaderFooterData& data) { m_headerFooterData = data; }
GetHeaderFooterData()179     const wxRichTextHeaderFooterData& GetHeaderFooterData() const { return m_headerFooterData; }
180 
181     /// Set/get header text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT
182     void SetHeaderText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE);
183     wxString GetHeaderText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const;
184 
185     /// Set/get footer text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT
186     void SetFooterText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE);
187     wxString GetFooterText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const;
188 
189     /// Show header/footer on first page, or not
SetShowOnFirstPage(bool show)190     void SetShowOnFirstPage(bool show) { m_headerFooterData.SetShowOnFirstPage(show); }
191 
192     /// Set the font
SetHeaderFooterFont(const wxFont & font)193     void SetHeaderFooterFont(const wxFont& font) { m_headerFooterData.SetFont(font); }
194 
195     /// Set the colour
SetHeaderFooterTextColour(const wxColour & font)196     void SetHeaderFooterTextColour(const wxColour& font) { m_headerFooterData.SetTextColour(font); }
197 
198     /// Get print and page setup data
199     wxPrintData *GetPrintData();
GetPageSetupData()200     wxPageSetupDialogData *GetPageSetupData() { return m_pageSetupData; }
201 
202     /// Set print and page setup data
203     void SetPrintData(const wxPrintData& printData);
204     void SetPageSetupData(const wxPageSetupData& pageSetupData);
205 
206     /// Set the rich text buffer pointer, deleting the existing object if present
207     void SetRichTextBufferPreview(wxRichTextBuffer* buf);
GetRichTextBufferPreview()208     wxRichTextBuffer* GetRichTextBufferPreview() const { return m_richTextBufferPreview; }
209 
210     void SetRichTextBufferPrinting(wxRichTextBuffer* buf);
GetRichTextBufferPrinting()211     wxRichTextBuffer* GetRichTextBufferPrinting() const { return m_richTextBufferPrinting; }
212 
213     /// Set/get the parent window
SetParentWindow(wxWindow * parent)214     void SetParentWindow(wxWindow* parent) { m_parentWindow = parent; }
GetParentWindow()215     wxWindow* GetParentWindow() const { return m_parentWindow; }
216 
217     /// Set/get the title
SetTitle(const wxString & title)218     void SetTitle(const wxString& title) { m_title = title; }
GetTitle()219     const wxString& GetTitle() const { return m_title; }
220 
221     /// Set/get the preview rect
SetPreviewRect(const wxRect & rect)222     void SetPreviewRect(const wxRect& rect) { m_previewRect = rect; }
GetPreviewRect()223     const wxRect& GetPreviewRect() const { return m_previewRect; }
224 
225 protected:
226     virtual wxRichTextPrintout *CreatePrintout();
227     virtual bool DoPreview(wxRichTextPrintout *printout1, wxRichTextPrintout *printout2);
228     virtual bool DoPrint(wxRichTextPrintout *printout);
229 
230 private:
231     wxPrintData*                m_printData;
232     wxPageSetupDialogData*      m_pageSetupData;
233 
234     wxRichTextHeaderFooterData  m_headerFooterData;
235     wxString                    m_title;
236     wxWindow*                   m_parentWindow;
237     wxRichTextBuffer*           m_richTextBufferPreview;
238     wxRichTextBuffer*           m_richTextBufferPrinting;
239     wxRect                      m_previewRect;
240 
241     DECLARE_NO_COPY_CLASS(wxRichTextPrinting)
242 };
243 
244 #endif  // wxUSE_RICHTEXT & wxUSE_PRINTING_ARCHITECTURE
245 
246 #endif // _WX_RICHTEXTPRINT_H_
247 
248