]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/generic/printps.cpp
wxCHECK/wxCHECK_RET changes
[wxWidgets.git] / src / generic / printps.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: printps.cpp
3// Purpose: Postscript print/preview framework
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart and Markus Holzem
9// Licence: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "printps.h"
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#include "wx/defs.h"
24
25#ifndef WX_PRECOMP
26#include "wx/utils.h"
27#include "wx/dc.h"
28#include "wx/app.h"
29#include "wx/msgdlg.h"
30#endif
31
32#include "wx/generic/printps.h"
33#include "wx/dcprint.h"
34#include "wx/printdlg.h"
35#include "wx/generic/prntdlgg.h"
36
37#include <stdlib.h>
38
39#if !USE_SHARED_LIBRARY
40IMPLEMENT_DYNAMIC_CLASS(wxPostScriptPrinter, wxPrinterBase)
41IMPLEMENT_CLASS(wxPostScriptPrintPreview, wxPrintPreviewBase)
42#endif
43
44/*
45 * Printer
46 */
47
48wxPostScriptPrinter::wxPostScriptPrinter(wxPrintData *data):
49 wxPrinterBase(data)
50{
51}
52
53wxPostScriptPrinter::~wxPostScriptPrinter(void)
54{
55}
56
57bool wxPostScriptPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
58{
59 abortIt = FALSE;
60 abortWindow = NULL;
61
62 if (!printout)
63 return FALSE;
64
65 printout->SetIsPreview(FALSE);
66 printout->OnPreparePrinting();
67
68 // Get some parameters from the printout, if defined
69 int fromPage, toPage;
70 int minPage, maxPage;
71 printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage);
72
73 if (maxPage == 0)
74 return FALSE;
75
76 printData.SetMinPage(minPage);
77 printData.SetMaxPage(maxPage);
78 if (fromPage != 0)
79 printData.SetFromPage(fromPage);
80 if (toPage != 0)
81 printData.SetToPage(toPage);
82
83 if (minPage != 0)
84 {
85 printData.EnablePageNumbers(TRUE);
86 if (printData.GetFromPage() < printData.GetMinPage())
87 printData.SetFromPage(printData.GetMinPage());
88 else if (printData.GetFromPage() > printData.GetMaxPage())
89 printData.SetFromPage(printData.GetMaxPage());
90 if (printData.GetToPage() > printData.GetMaxPage())
91 printData.SetToPage(printData.GetMaxPage());
92 else if (printData.GetToPage() < printData.GetMinPage())
93 printData.SetToPage(printData.GetMinPage());
94 }
95 else
96 printData.EnablePageNumbers(FALSE);
97
98 // Create a suitable device context
99 wxDC *dc = NULL;
100 if (prompt)
101 {
102 wxGenericPrintDialog dialog(parent, & printData);
103 if (dialog.ShowModal() == wxID_OK)
104 {
105 dc = dialog.GetPrintDC();
106 printData = dialog.GetPrintData();
107 }
108 }
109 else
110 {
111 dc = new wxPostScriptDC(wxThePrintSetupData->GetPrinterFile(), FALSE, NULL);
112 }
113
114 // May have pressed cancel.
115 if (!dc || !dc->Ok())
116 {
117 if (dc) delete dc;
118 return FALSE;
119 }
120
121 int logPPIScreenX = 0;
122 int logPPIScreenY = 0;
123 int logPPIPrinterX = 0;
124 int logPPIPrinterY = 0;
125
126 // Correct values for X/PostScript?
127 logPPIScreenX = 100;
128 logPPIScreenY = 100;
129 logPPIPrinterX = 100;
130 logPPIPrinterY = 100;
131
132 printout->SetPPIScreen(logPPIScreenX, logPPIScreenY);
133 printout->SetPPIPrinter(logPPIPrinterX, logPPIPrinterY);
134
135 // Set printout parameters
136 printout->SetDC(dc);
137
138 int w, h;
139 long ww, hh;
140 dc->GetSize(&w, &h);
141 printout->SetPageSizePixels((int)w, (int)h);
142 dc->GetSizeMM(&ww, &hh);
143 printout->SetPageSizeMM((int)ww, (int)hh);
144
145 // Create an abort window
146 wxBeginBusyCursor();
147
148 printout->OnBeginPrinting();
149
150 bool keepGoing = TRUE;
151
152 int copyCount;
153 for (copyCount = 1; copyCount <= printData.GetNoCopies(); copyCount ++)
154 {
155 if (!printout->OnBeginDocument(printData.GetFromPage(), printData.GetToPage()))
156 {
157 wxEndBusyCursor();
158 wxMessageBox("Could not start printing.", "Print Error", wxOK, parent);
159 break;
160 }
161 if (abortIt)
162 break;
163
164 int pn;
165 for (pn = printData.GetFromPage(); keepGoing && (pn <= printData.GetToPage()) && printout->HasPage(pn);
166 pn++)
167 {
168 if (abortIt)
169 {
170 keepGoing = FALSE;
171 break;
172 }
173 else
174 {
175 dc->StartPage();
176 printout->OnPrintPage(pn);
177 dc->EndPage();
178 }
179 }
180 printout->OnEndDocument();
181 }
182
183 printout->OnEndPrinting();
184
185 wxEndBusyCursor();
186
187 delete dc;
188
189 return TRUE;
190}
191
192bool wxPostScriptPrinter::PrintDialog(wxWindow *parent)
193{
194 wxGenericPrintDialog dialog(parent, & printData);
195 return (dialog.ShowModal() == wxID_OK);
196}
197
198bool wxPostScriptPrinter::Setup(wxWindow *parent)
199{
200 wxGenericPrintDialog dialog(parent, & printData);
201 dialog.GetPrintData().SetSetupDialog(TRUE);
202 return (dialog.ShowModal() == wxID_OK);
203}
204
205/*
206 * Print preview
207 */
208
209wxPostScriptPrintPreview::wxPostScriptPrintPreview(wxPrintout *printout, wxPrintout *printoutForPrinting, wxPrintData *data):
210 wxPrintPreviewBase(printout, printoutForPrinting, data)
211{
212 // Have to call it here since base constructor can't call it
213 DetermineScaling();
214}
215
216wxPostScriptPrintPreview::~wxPostScriptPrintPreview(void)
217{
218}
219
220bool wxPostScriptPrintPreview::Print(bool interactive)
221{
222 if (!printPrintout)
223 return FALSE;
224 wxPostScriptPrinter printer(&printData);
225 return printer.Print(previewFrame, printPrintout, interactive);
226}
227
228void wxPostScriptPrintPreview::DetermineScaling(void)
229{
230 char *paperType = wxThePrintSetupData->GetPaperName();
231 if (!paperType)
232 paperType = "A4 210 x 297 mm";
233
234 wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(paperType);
235 if (!paper)
236 paper = wxThePrintPaperDatabase->FindPaperType("A4 210 x 297 mm");
237 if (paper)
238 {
239 previewPrintout->SetPPIScreen(100, 100);
240 previewPrintout->SetPPIPrinter(100, 100);
241
242 // If in landscape mode, we need to swap the width and height.
243 if ( printData.GetOrientation() == wxLANDSCAPE )
244 {
245 pageWidth = paper->heightPixels;
246 pageHeight = paper->widthPixels;
247 previewPrintout->SetPageSizeMM(paper->heightMM, paper->widthMM);
248 previewPrintout->SetPageSizePixels(paper->heightPixels, paper->widthPixels);
249 }
250 else
251 {
252 pageWidth = paper->widthPixels;
253 pageHeight = paper->heightPixels;
254 previewPrintout->SetPageSizeMM(paper->widthMM, paper->heightMM);
255 previewPrintout->SetPageSizePixels(paper->widthPixels, paper->heightPixels);
256 }
257
258 // At 100%, the page should look about page-size on the screen.
259 previewScale = (float)0.8;
260// previewScale = (float)((float)screenWidth/(float)printerWidth);
261// previewScale = previewScale * (float)((float)screenXRes/(float)printerYRes);
262 }
263}
264