]> git.saurik.com Git - wxWidgets.git/blame - src/richtext/richtextprint.cpp
Add wxGrid::RefreshAttr() method to force attribute refresh.
[wxWidgets.git] / src / richtext / richtextprint.cpp
CommitLineData
44219ff0
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/richtext/richtextprint.cpp
3// Purpose: Rich text printing classes
4// Author: Julian Smart
5// Created: 2006-10-24
6// RCS-ID: $Id$
7// Copyright: (c) Julian Smart
8// Licence: wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11// For compilers that support precompilation, includes "wx/wx.h".
12#include "wx/wxprec.h"
13
14#ifdef __BORLANDC__
15 #pragma hdrstop
16#endif
17
18#if wxUSE_RICHTEXT && wxUSE_PRINTING_ARCHITECTURE && wxUSE_STREAMS
19
20#ifndef WX_PRECOMP
21 #include "wx/log.h"
22 #include "wx/intl.h"
23 #include "wx/dc.h"
24 #include "wx/settings.h"
25 #include "wx/msgdlg.h"
26#endif
27
28#include "wx/datetime.h"
29#include "wx/print.h"
30#include "wx/printdlg.h"
31#include "wx/richtext/richtextprint.h"
32#include "wx/wfstream.h"
33
34/*!
35 * wxRichTextPrintout
36 */
37
38wxRichTextPrintout::wxRichTextPrintout(const wxString& title) : wxPrintout(title)
39{
40 m_numPages = wxRICHTEXT_PRINT_MAX_PAGES;
41
42 SetMargins(); // to default values
43}
44
45wxRichTextPrintout::~wxRichTextPrintout()
46{
47}
48
49void wxRichTextPrintout::OnPreparePrinting()
50{
51 wxBusyCursor wait;
52
f1b18eba 53 m_numPages = 1;
44219ff0
JS
54
55 m_pageBreaksStart.Clear();
56 m_pageBreaksEnd.Clear();
03647350 57
44219ff0 58 int lastStartPos = 0;
03647350 59
44219ff0
JS
60 wxRect rect, headerRect, footerRect;
61
62 /// Sets the DC scaling and returns important page rectangles
63 CalculateScaling(GetDC(), rect, headerRect, footerRect);
64
65 if (GetRichTextBuffer())
66 {
67 GetRichTextBuffer()->Invalidate(wxRICHTEXT_ALL);
68
69 GetRichTextBuffer()->Layout(*GetDC(), rect, wxRICHTEXT_FIXED_WIDTH|wxRICHTEXT_VARIABLE_HEIGHT);
03647350 70
44219ff0 71 // Now calculate the page breaks
03647350 72
44219ff0 73 int yOffset = 0;
03647350 74
44219ff0 75 wxRichTextLine* lastLine = NULL;
03647350 76
44219ff0
JS
77 wxRichTextObjectList::compatibility_iterator node = GetRichTextBuffer()->GetChildren().GetFirst();
78 while (node)
79 {
80 // child is a paragraph
81 wxRichTextParagraph* child = wxDynamicCast(node->GetData(), wxRichTextParagraph);
82 wxASSERT (child != NULL);
03647350 83
44219ff0
JS
84 wxRichTextLineList::compatibility_iterator node2 = child->GetLines().GetFirst();
85 while (node2)
86 {
87 wxRichTextLine* line = node2->GetData();
ea160b2e 88
44219ff0
JS
89 // Set the line to the page-adjusted position
90 line->SetPosition(wxPoint(line->GetPosition().x, line->GetPosition().y - yOffset));
91
92 int lineY = child->GetPosition().y + line->GetPosition().y;
03647350 93
ea160b2e
JS
94 // Break the page if either we're going off the bottom, or this paragraph specifies
95 // an explicit page break
03647350 96
ea160b2e
JS
97 if (((lineY + line->GetSize().y) > rect.GetBottom()) ||
98 ((node2 == child->GetLines().GetFirst()) && child->GetAttributes().HasPageBreak()))
44219ff0
JS
99 {
100 // New page starting at this line
101 int newY = rect.y;
03647350 102
44219ff0 103 // We increase the offset by the difference between new and old positions
03647350 104
44219ff0
JS
105 int increaseOffsetBy = lineY - newY;
106 yOffset += increaseOffsetBy;
03647350 107
44219ff0
JS
108 line->SetPosition(wxPoint(line->GetPosition().x, newY - child->GetPosition().y));
109
110 if (!lastLine)
111 lastLine = line;
03647350 112
44219ff0
JS
113 m_pageBreaksStart.Add(lastStartPos);
114 m_pageBreaksEnd.Add(lastLine->GetAbsoluteRange().GetEnd());
03647350 115
44219ff0 116 lastStartPos = line->GetAbsoluteRange().GetStart();
03647350 117
44219ff0
JS
118 m_numPages ++;
119 }
03647350 120
44219ff0
JS
121 lastLine = line;
122
123 node2 = node2->GetNext();
124 }
125
126 node = node->GetNext();
127 }
128
129 // Closing page break
f1b18eba 130 if (m_pageBreaksStart.GetCount() == 0 || (m_pageBreaksEnd[m_pageBreaksEnd.GetCount()-1] < (GetRichTextBuffer()->GetRange().GetEnd()-1)))
44219ff0
JS
131 {
132 m_pageBreaksStart.Add(lastStartPos);
133 m_pageBreaksEnd.Add(GetRichTextBuffer()->GetRange().GetEnd());
44219ff0
JS
134 }
135 }
136}
137
138bool wxRichTextPrintout::OnBeginDocument(int startPage, int endPage)
139{
140 if (!wxPrintout::OnBeginDocument(startPage, endPage)) return false;
141
142 return true;
143}
144
145bool wxRichTextPrintout::OnPrintPage(int page)
146{
147 wxDC *dc = GetDC();
148 if (dc)
149 {
150 if (HasPage(page))
151 RenderPage(dc, page);
152 return true;
153 }
154 else return false;
155}
156
157void wxRichTextPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
158{
159 *minPage = 1;
160 *maxPage = m_numPages;
161 *selPageFrom = 1;
162 *selPageTo = m_numPages;
163}
164
165bool wxRichTextPrintout::HasPage(int pageNum)
166{
167 return pageNum > 0 && pageNum <= m_numPages;
168}
169
170void wxRichTextPrintout::RenderPage(wxDC *dc, int page)
171{
172 if (!GetRichTextBuffer())
173 return;
174
175 wxBusyCursor wait;
03647350 176
44219ff0
JS
177 wxRect textRect, headerRect, footerRect;
178
179 /// Sets the DC scaling and returns important page rectangles
180 CalculateScaling(dc, textRect, headerRect, footerRect);
181
182 if (page > 1 || m_headerFooterData.GetShowOnFirstPage())
183 {
184 if (m_headerFooterData.GetFont().Ok())
185 dc->SetFont(m_headerFooterData.GetFont());
186 else
187 dc->SetFont(*wxNORMAL_FONT);
188 if (m_headerFooterData.GetTextColour().Ok())
189 dc->SetTextForeground(m_headerFooterData.GetTextColour());
190 else
191 dc->SetTextForeground(*wxBLACK);
04ee05f9 192 dc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
44219ff0 193
03647350 194 // Draw header, if any
44219ff0
JS
195 wxRichTextOddEvenPage oddEven = ((page % 2) == 1) ? wxRICHTEXT_PAGE_ODD : wxRICHTEXT_PAGE_EVEN;
196
197 wxString headerTextCentre = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_CENTRE);
198 wxString headerTextLeft = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_LEFT);
199 wxString headerTextRight = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_RIGHT);
200
201 if (!headerTextLeft.IsEmpty())
202 {
203 SubstituteKeywords(headerTextLeft, GetTitle(), page, m_numPages);
204
205 //int tx, ty;
206 //dc->GetTextExtent(headerTextLeft, & tx, & ty);
03647350 207
44219ff0
JS
208 int x = headerRect.GetLeft();
209 int y = headerRect.GetX();
210 dc->DrawText(headerTextLeft, x, y);
211 }
212 if (!headerTextCentre.IsEmpty())
213 {
214 SubstituteKeywords(headerTextCentre, GetTitle(), page, m_numPages);
215
216 int tx, ty;
217 dc->GetTextExtent(headerTextCentre, & tx, & ty);
218
219 int x = headerRect.GetWidth()/2 - tx/2 + headerRect.GetLeft();
220 int y = headerRect.GetY();
221 dc->DrawText(headerTextCentre, x, y);
222 }
223 if (!headerTextRight.IsEmpty())
224 {
225 SubstituteKeywords(headerTextRight, GetTitle(), page, m_numPages);
226
227 int tx, ty;
228 dc->GetTextExtent(headerTextRight, & tx, & ty);
229
230 int x = headerRect.GetRight() - tx;
231 int y = headerRect.GetY();
232 dc->DrawText(headerTextRight, x, y);
233 }
234
03647350 235 // Draw footer, if any
44219ff0
JS
236 wxString footerTextCentre = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_CENTRE);
237 wxString footerTextLeft = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_LEFT);
238 wxString footerTextRight = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_RIGHT);
239
240 if (!footerTextLeft.IsEmpty())
241 {
242 SubstituteKeywords(footerTextLeft, GetTitle(), page, m_numPages);
243
244 int tx, ty;
245 dc->GetTextExtent(footerTextLeft, & tx, & ty);
246
247 int x = footerRect.GetLeft();
248 int y = footerRect.GetBottom() - ty;
249 dc->DrawText(footerTextLeft, x, y);
250 }
251 if (!footerTextCentre.IsEmpty())
252 {
253 SubstituteKeywords(footerTextCentre, GetTitle(), page, m_numPages);
254
255 int tx, ty;
256 dc->GetTextExtent(footerTextCentre, & tx, & ty);
257
258 int x = footerRect.GetWidth()/2 - tx/2 + footerRect.GetLeft();
259 int y = footerRect.GetBottom() - ty;
260 dc->DrawText(footerTextCentre, x, y);
261 }
262 if (!footerTextRight.IsEmpty())
263 {
264 SubstituteKeywords(footerTextRight, GetTitle(), page, m_numPages);
265
266 int tx, ty;
267 dc->GetTextExtent(footerTextRight, & tx, & ty);
268
269 int x = footerRect.GetRight() - tx;
270 int y = footerRect.GetBottom() - ty;
271 dc->DrawText(footerTextRight, x, y);
272 }
03647350 273 }
44219ff0
JS
274
275 wxRichTextRange rangeToDraw(m_pageBreaksStart[page-1], m_pageBreaksEnd[page-1]);
276
277 GetRichTextBuffer()->Draw(*dc, rangeToDraw, wxRichTextRange(-1,-1), textRect, 0 /* descent */, wxRICHTEXT_DRAW_IGNORE_CACHE /* flags */);
278}
279
280void wxRichTextPrintout::SetMargins(int top, int bottom, int left, int right)
281{
282 m_marginTop = top;
283 m_marginBottom = bottom;
284 m_marginLeft = left;
285 m_marginRight = right;
286}
287
288/// Calculate scaling and rectangles, setting the device context scaling
289void wxRichTextPrintout::CalculateScaling(wxDC* dc, wxRect& textRect, wxRect& headerRect, wxRect& footerRect)
290{
291 // Get the logical pixels per inch of screen and printer
292 int ppiScreenX, ppiScreenY;
293 GetPPIScreen(&ppiScreenX, &ppiScreenY);
294 int ppiPrinterX, ppiPrinterY;
295 GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
296
297 // This scales the DC so that the printout roughly represents the
298 // the screen scaling.
299 float scale = (float)((float)ppiPrinterX/(float)ppiScreenX);
300
301 // Now we have to check in case our real page size is reduced
302 // (e.g. because we're drawing to a print preview memory DC)
303 int pageWidth, pageHeight;
304 int w, h;
305 dc->GetSize(&w, &h);
306 GetPageSizePixels(&pageWidth, &pageHeight);
03647350 307
44219ff0
JS
308 // If printer pageWidth == current DC width, then this doesn't
309 // change. But w might be the preview bitmap width, so scale down.
310 float previewScale = (float)(w/(float)pageWidth);
311 float overallScale = scale * previewScale;
312
313 // The dimensions used for indentation etc. have to be unscaled
314 // during printing to be correct when scaling is applied.
315 if (!IsPreview())
316 m_richTextBuffer->SetScale(scale);
03647350 317
44219ff0
JS
318 // Calculate margins
319 int marginLeft = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_marginLeft);
320 int marginTop = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_marginTop);
321 int marginRight = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_marginRight);
322 int marginBottom = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_marginBottom);
03647350 323
44219ff0
JS
324 // Header and footer margins
325 int headerMargin = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_headerFooterData.GetHeaderMargin());
326 int footerMargin = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_headerFooterData.GetFooterMargin());
03647350 327
44219ff0
JS
328 dc->SetUserScale(overallScale, overallScale);
329
2786b623
JS
330 wxRect rect((int) (marginLeft/scale), (int) (marginTop/scale),
331 (int) ((pageWidth - marginLeft - marginRight)/scale), (int)((pageHeight - marginTop - marginBottom)/scale));
03647350 332
44219ff0
JS
333 headerRect = wxRect(0, 0, 0, 0);
334
335 if (!m_headerFooterData.GetHeaderText(wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT).IsEmpty() ||
336 !m_headerFooterData.GetHeaderText(wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_CENTRE).IsEmpty() ||
337 !m_headerFooterData.GetHeaderText(wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_RIGHT).IsEmpty() ||
338
339 !m_headerFooterData.GetHeaderText(wxRICHTEXT_PAGE_EVEN, wxRICHTEXT_PAGE_LEFT).IsEmpty() ||
340 !m_headerFooterData.GetHeaderText(wxRICHTEXT_PAGE_EVEN, wxRICHTEXT_PAGE_CENTRE).IsEmpty() ||
341 !m_headerFooterData.GetHeaderText(wxRICHTEXT_PAGE_EVEN, wxRICHTEXT_PAGE_RIGHT).IsEmpty())
342 {
343 if (m_headerFooterData.GetFont().Ok())
344 dc->SetFont(m_headerFooterData.GetFont());
345 else
346 dc->SetFont(*wxNORMAL_FONT);
03647350 347
44219ff0 348 int charHeight = dc->GetCharHeight();
03647350 349
2786b623 350 int headerHeight = (int) (charHeight + headerMargin/scale);
44219ff0
JS
351
352 headerRect = wxRect(rect.x, rect.y, rect.width, headerHeight);
353
354 rect.y += headerHeight;
03647350 355 rect.height -= headerHeight;
44219ff0
JS
356 }
357
358 footerRect = wxRect(0, 0, 0, 0);
359
360 if (!m_headerFooterData.GetFooterText(wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT).IsEmpty() ||
361 !m_headerFooterData.GetFooterText(wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_CENTRE).IsEmpty() ||
362 !m_headerFooterData.GetFooterText(wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_RIGHT).IsEmpty() ||
363
364 !m_headerFooterData.GetFooterText(wxRICHTEXT_PAGE_EVEN, wxRICHTEXT_PAGE_LEFT).IsEmpty() ||
365 !m_headerFooterData.GetFooterText(wxRICHTEXT_PAGE_EVEN, wxRICHTEXT_PAGE_CENTRE).IsEmpty() ||
366 !m_headerFooterData.GetFooterText(wxRICHTEXT_PAGE_EVEN, wxRICHTEXT_PAGE_RIGHT).IsEmpty())
367 {
368 if (m_headerFooterData.GetFont().Ok())
369 dc->SetFont(m_headerFooterData.GetFont());
370 else
371 dc->SetFont(*wxNORMAL_FONT);
03647350 372
44219ff0 373 int charHeight = dc->GetCharHeight();
03647350 374
2786b623 375 int footerHeight = (int) (charHeight + footerMargin/scale);
44219ff0
JS
376
377 footerRect = wxRect(rect.x, rect.y + rect.height, rect.width, footerHeight);
378
03647350 379 rect.height -= footerHeight;
44219ff0
JS
380 }
381
382 textRect = rect;
383}
384
385bool wxRichTextPrintout::SubstituteKeywords(wxString& str, const wxString& title, int pageNum, int pageCount)
386{
387 wxString num;
388
389 num.Printf(wxT("%i"), pageNum);
390 str.Replace(wxT("@PAGENUM@"), num);
391
392 num.Printf(wxT("%lu"), (unsigned long) pageCount);
393 str.Replace(wxT("@PAGESCNT@"), num);
394
395 wxDateTime now = wxDateTime::Now();
396
397 str.Replace(wxT("@DATE@"), now.FormatDate());
398 str.Replace(wxT("@TIME@"), now.FormatTime());
399
400 str.Replace(wxT("@TITLE@"), title);
401
402 return true;
403}
404
405/*!
406 * wxRichTextPrinting
407 */
408
409wxRichTextPrinting::wxRichTextPrinting(const wxString& name, wxWindow *parentWindow)
410{
411 m_richTextBufferPrinting = NULL;
412 m_richTextBufferPreview = NULL;
413
414 m_parentWindow = parentWindow;
415 m_title = name;
416 m_printData = NULL;
03647350 417
44219ff0
JS
418 m_previewRect = wxRect(wxPoint(100, 100), wxSize(800, 800));
419
420 m_pageSetupData = new wxPageSetupDialogData;
421 m_pageSetupData->EnableMargins(true);
422 m_pageSetupData->SetMarginTopLeft(wxPoint(25, 25));
423 m_pageSetupData->SetMarginBottomRight(wxPoint(25, 25));
424}
425
426wxRichTextPrinting::~wxRichTextPrinting()
427{
428 delete m_printData;
429 delete m_pageSetupData;
430 delete m_richTextBufferPrinting;
431 delete m_richTextBufferPreview;
432}
433
434wxPrintData *wxRichTextPrinting::GetPrintData()
435{
436 if (m_printData == NULL)
437 m_printData = new wxPrintData();
438 return m_printData;
439}
440
5c0a71a2
JS
441/// Set print and page setup data
442void wxRichTextPrinting::SetPrintData(const wxPrintData& printData)
443{
444 (*GetPrintData()) = printData;
445}
446
447void wxRichTextPrinting::SetPageSetupData(const wxPageSetupData& pageSetupData)
448{
449 (*GetPageSetupData()) = pageSetupData;
450}
451
44219ff0
JS
452/// Set the rich text buffer pointer, deleting the existing object if present
453void wxRichTextPrinting::SetRichTextBufferPrinting(wxRichTextBuffer* buf)
454{
455 if (m_richTextBufferPrinting)
456 {
457 delete m_richTextBufferPrinting;
458 m_richTextBufferPrinting = NULL;
459 }
460 m_richTextBufferPrinting = buf;
461}
462
463void wxRichTextPrinting::SetRichTextBufferPreview(wxRichTextBuffer* buf)
464{
465 if (m_richTextBufferPreview)
466 {
467 delete m_richTextBufferPreview;
468 m_richTextBufferPreview = NULL;
469 }
470 m_richTextBufferPreview = buf;
471}
472
473bool wxRichTextPrinting::PreviewFile(const wxString& richTextFile)
474{
475 SetRichTextBufferPreview(new wxRichTextBuffer);
476
477 if (!m_richTextBufferPreview->LoadFile(richTextFile))
478 {
479 SetRichTextBufferPreview(NULL);
480 return false;
481 }
482 else
483 SetRichTextBufferPrinting(new wxRichTextBuffer(*m_richTextBufferPreview));
03647350 484
44219ff0
JS
485 wxRichTextPrintout *p1 = CreatePrintout();
486 p1->SetRichTextBuffer(m_richTextBufferPreview);
487
488 wxRichTextPrintout *p2 = CreatePrintout();
489 p2->SetRichTextBuffer(m_richTextBufferPrinting);
490 return DoPreview(p1, p2);
491}
492
493bool wxRichTextPrinting::PreviewBuffer(const wxRichTextBuffer& buffer)
494{
495 SetRichTextBufferPreview(new wxRichTextBuffer(buffer));
496 SetRichTextBufferPrinting(new wxRichTextBuffer(buffer));
497
498 wxRichTextPrintout *p1 = CreatePrintout();
499 p1->SetRichTextBuffer(m_richTextBufferPreview);
03647350 500
44219ff0
JS
501 wxRichTextPrintout *p2 = CreatePrintout();
502 p2->SetRichTextBuffer(m_richTextBufferPrinting);
503
504 return DoPreview(p1, p2);
505}
506
507bool wxRichTextPrinting::PrintFile(const wxString& richTextFile)
508{
509 SetRichTextBufferPrinting(new wxRichTextBuffer);
510
511 if (!m_richTextBufferPrinting->LoadFile(richTextFile))
512 {
513 SetRichTextBufferPrinting(NULL);
514 return false;
515 }
516
517 wxRichTextPrintout *p = CreatePrintout();
518 p->SetRichTextBuffer(m_richTextBufferPrinting);
519
520 bool ret = DoPrint(p);
521 delete p;
522 return ret;
523}
524
525bool wxRichTextPrinting::PrintBuffer(const wxRichTextBuffer& buffer)
526{
527 SetRichTextBufferPrinting(new wxRichTextBuffer(buffer));
528
529 wxRichTextPrintout *p = CreatePrintout();
530 p->SetRichTextBuffer(m_richTextBufferPrinting);
531
532 bool ret = DoPrint(p);
533 delete p;
534 return ret;
535}
536
537bool wxRichTextPrinting::DoPreview(wxRichTextPrintout *printout1, wxRichTextPrintout *printout2)
538{
539 // Pass two printout objects: for preview, and possible printing.
540 wxPrintDialogData printDialogData(*GetPrintData());
541 wxPrintPreview *preview = new wxPrintPreview(printout1, printout2, &printDialogData);
542 if (!preview->Ok())
543 {
544 delete preview;
545 return false;
546 }
547
548 wxPreviewFrame *frame = new wxPreviewFrame(preview, m_parentWindow,
549 m_title + _(" Preview"),
550 m_previewRect.GetPosition(), m_previewRect.GetSize());
551 frame->Centre(wxBOTH);
552 frame->Initialize();
553 frame->Show(true);
554 return true;
555}
556
557bool wxRichTextPrinting::DoPrint(wxRichTextPrintout *printout)
558{
559 wxPrintDialogData printDialogData(*GetPrintData());
560 wxPrinter printer(&printDialogData);
561
562 if (!printer.Print(m_parentWindow, printout, true))
563 {
564 return false;
565 }
566
567 (*GetPrintData()) = printer.GetPrintDialogData().GetPrintData();
568 return true;
569}
570
571void wxRichTextPrinting::PageSetup()
572{
573 if (!GetPrintData()->Ok())
574 {
575 wxLogError(_("There was a problem during page setup: you may need to set a default printer."));
576 return;
577 }
578
579 m_pageSetupData->SetPrintData(*GetPrintData());
580 wxPageSetupDialog pageSetupDialog(m_parentWindow, m_pageSetupData);
581
582 if (pageSetupDialog.ShowModal() == wxID_OK)
583 {
584 (*GetPrintData()) = pageSetupDialog.GetPageSetupData().GetPrintData();
585 (*m_pageSetupData) = pageSetupDialog.GetPageSetupData();
586 }
587}
588
589wxRichTextPrintout *wxRichTextPrinting::CreatePrintout()
590{
591 wxRichTextPrintout *p = new wxRichTextPrintout(m_title);
592
593 p->SetHeaderFooterData(GetHeaderFooterData());
594 p->SetMargins(10*m_pageSetupData->GetMarginTopLeft().y,
595 10*m_pageSetupData->GetMarginBottomRight().y,
596 10*m_pageSetupData->GetMarginTopLeft().x,
597 10*m_pageSetupData->GetMarginBottomRight().x);
598
599 return p;
600}
601
602/// Set/get header text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT
603void wxRichTextPrinting::SetHeaderText(const wxString& text, wxRichTextOddEvenPage page, wxRichTextPageLocation location)
604{
605 m_headerFooterData.SetHeaderText(text, page, location);
606}
607
608wxString wxRichTextPrinting::GetHeaderText(wxRichTextOddEvenPage page, wxRichTextPageLocation location) const
609{
610 return m_headerFooterData.GetHeaderText(page, location);
611}
612
613/// Set/get footer text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT
614void wxRichTextPrinting::SetFooterText(const wxString& text, wxRichTextOddEvenPage page, wxRichTextPageLocation location)
615{
616 m_headerFooterData.SetFooterText(text, page, location);
617}
618
619wxString wxRichTextPrinting::GetFooterText(wxRichTextOddEvenPage page, wxRichTextPageLocation location) const
620{
621 return m_headerFooterData.GetFooterText(page, location);
622}
623
624/*!
625 * Header/footer data
626 */
627
628IMPLEMENT_CLASS(wxRichTextHeaderFooterData, wxObject)
629
630/// Copy
631void wxRichTextHeaderFooterData::Copy(const wxRichTextHeaderFooterData& data)
632{
633 int i;
634 for (i = 0; i < 12; i++)
635 m_text[i] = data.m_text[i];
636 m_font = data.m_font;
637 m_colour = data.m_colour;
638 m_headerMargin = data.m_headerMargin;
639 m_footerMargin = data.m_footerMargin;
640 m_showOnFirstPage = data.m_showOnFirstPage;
641}
642
643/// Set/get text
644void wxRichTextHeaderFooterData::SetText(const wxString& text, int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location)
645{
646 int idx = headerFooter + (2 * (int) page) + (4 * (int) location);
647 wxASSERT( idx >= 0 && idx < 12 );
648
649 if (idx >= 0 && idx < 12)
650 m_text[idx] = text;
651}
652
653wxString wxRichTextHeaderFooterData::GetText(int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location) const
654{
655 int idx = headerFooter + (2 * (int) page) + (4 * (int) location);
656 wxASSERT( idx >= 0 && idx < 12 );
657
658 if (idx >= 0 && idx < 12)
659 return m_text[idx];
660 else
661 return wxEmptyString;
662}
663
664/// Set/get header text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT
665void wxRichTextHeaderFooterData::SetHeaderText(const wxString& text, wxRichTextOddEvenPage page, wxRichTextPageLocation location)
666{
667 if (page == wxRICHTEXT_PAGE_ALL)
668 {
669 SetText(text, 0, wxRICHTEXT_PAGE_ODD, location);
670 SetText(text, 0, wxRICHTEXT_PAGE_EVEN, location);
671 }
672 else
673 SetText(text, 0, page, location);
674}
675
676wxString wxRichTextHeaderFooterData::GetHeaderText(wxRichTextOddEvenPage page, wxRichTextPageLocation location) const
677{
678 return GetText(0, page, location);
679}
680
681/// Set/get footer text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT
682void wxRichTextHeaderFooterData::SetFooterText(const wxString& text, wxRichTextOddEvenPage page, wxRichTextPageLocation location)
683{
684 if (page == wxRICHTEXT_PAGE_ALL)
685 {
686 SetText(text, 1, wxRICHTEXT_PAGE_ODD, location);
687 SetText(text, 1, wxRICHTEXT_PAGE_EVEN, location);
688 }
689 else
690 SetText(text, 1, page, location);
691}
692
693wxString wxRichTextHeaderFooterData::GetFooterText(wxRichTextOddEvenPage page, wxRichTextPageLocation location) const
694{
695 return GetText(1, page, location);
696}
697
698/// Clear all text
699void wxRichTextHeaderFooterData::Clear()
700{
701 int i;
702 for (i = 0; i < 12; i++)
703 m_text[i] = wxEmptyString;
704}
705
706#endif // wxUSE_RICHTEXT & wxUSE_PRINTING_ARCHITECTURE
707