unified UMAPrOpen/UMAPrClose prototypes for session and non-session printing
[wxWidgets.git] / src / mac / carbon / dcprint.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: dcprint.cpp
3 // Purpose: wxPrinterDC class
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 01/02/97
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "dcprint.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 #ifndef WX_PRECOMP
24 #endif
25
26 #include "wx/dcprint.h"
27 #include "wx/msgdlg.h"
28 #include <math.h>
29 #include "wx/mac/uma.h"
30
31 #if defined(TARGET_CARBON) && !defined(__DARWIN__)
32 # if PM_USE_SESSION_APIS
33 # include <PMCore.h>
34 # endif
35 # include <PMApplication.h>
36 #endif
37
38 #if !USE_SHARED_LIBRARY
39 IMPLEMENT_CLASS(wxPrinterDC, wxDC)
40 #endif
41
42 GrafPtr macPrintFormerPort = NULL ;
43
44 wxPrinterDC::wxPrinterDC(const wxPrintData& printdata)
45 {
46 OSStatus err ;
47 wxString message ;
48
49 m_printData = printdata ;
50 m_printData.ConvertToNative() ;
51
52 #if TARGET_CARBON && PM_USE_SESSION_APIS
53 err = UMAPrOpen(&m_macPrintSessionPort) ;
54 if ( err != noErr || m_macPrintSessionPort == kPMNoData )
55 #else
56 err = UMAPrOpen(NULL) ;
57 if ( err != noErr )
58 #endif
59 {
60 message.Printf( "Print Error %d", err ) ;
61 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
62 dialog.ShowModal();
63 #if TARGET_CARBON && PM_USE_SESSION_APIS
64 UMAPrClose(&m_macPrintSessionPort) ;
65 #else
66 UMAPrClose(NULL) ;
67 #endif
68 m_ok = FALSE;
69 return;
70 }
71
72 #if !TARGET_CARBON
73 if ( ::PrValidate( (THPrint) m_printData.m_macPrintSettings ) )
74 {
75 ::PrStlDialog( (THPrint) m_printData.m_macPrintSettings ) ;
76 // the driver has changed in the mean time, should we pop up a page setup dialog ?
77 }
78 err = PrError() ;
79 if ( err != noErr )
80 {
81 message.Printf( "Print Error %d", err ) ;
82 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
83 dialog.ShowModal();
84 UMAPrClose(NULL) ;
85 m_ok = FALSE;
86 return;
87 }
88 ::GetPort( &macPrintFormerPort ) ;
89 m_macPrintSessionPort = ::PrOpenDoc( (THPrint) m_printData.m_macPrintSettings , NULL , NULL ) ;
90 err = PrError() ;
91 if ( err )
92 {
93 message.Printf( "Print Error %d", err ) ;
94 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
95 dialog.ShowModal();
96 UMAPrClose(NULL) ;
97 m_ok = FALSE;
98 return;
99 }
100 // sets current port
101 m_macPort = (GrafPtr ) m_macPrintSessionPort ;
102 #else
103 #if PM_USE_SESSION_APIS
104 err = PMSessionBeginDocument((PMPrintSession)m_macPrintSessionPort,
105 (PMPrintSettings)m_printData.m_macPrintSettings,
106 (PMPageFormat)m_printData.m_macPageFormat);
107 if ( err != noErr )
108 #else
109 m_macPrintSessionPort = kPMNoReference ;
110 err = PMBeginDocument(
111 m_printData.m_macPrintSettings,
112 m_printData.m_macPageFormat,
113 &m_macPrintSessionPort);
114 if ( err != noErr || m_macPrintSessionPort == kPMNoReference )
115 #endif
116 {
117 message.Printf( "Print Error %d", err ) ;
118 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
119 dialog.ShowModal();
120 #if TARGET_CARBON && PM_USE_SESSION_APIS
121 UMAPrClose(&m_macPrintSessionPort) ;
122 #else
123 UMAPrClose(NULL) ;
124 #endif
125 m_ok = FALSE;
126 return;
127 }
128 // sets current port
129 ::GetPort( (GrafPtr *)&m_macPort ) ;
130 #endif
131 m_ok = TRUE ;
132 m_minY = m_minX = 0 ;
133 #if TARGET_CARBON
134 PMRect rPaper;
135
136 err = PMGetAdjustedPaperRect((PMPageFormat)m_printData.m_macPageFormat, &rPaper);
137 if ( err != noErr )
138 {
139 message.Printf( "Print Error %d", err ) ;
140 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
141 dialog.ShowModal();
142 #if TARGET_CARBON && PM_USE_SESSION_APIS
143 UMAPrClose(&m_macPrintSessionPort) ;
144 #else
145 UMAPrClose(NULL) ;
146 #endif
147 m_ok = FALSE;
148 return;
149 }
150 m_maxX = rPaper.right - rPaper.left ;
151 m_maxY = rPaper.bottom - rPaper.top ;
152 #else
153 m_maxX = (**(THPrint)m_printData.m_macPrintSettings).rPaper.right - (**(THPrint)m_printData.m_macPrintSettings).rPaper.left ;
154 m_maxY = (**(THPrint)m_printData.m_macPrintSettings).rPaper.bottom - (**(THPrint)m_printData.m_macPrintSettings).rPaper.top ;
155 #endif
156 }
157
158 wxPrinterDC::~wxPrinterDC(void)
159 {
160 OSStatus err ;
161 wxString message ;
162 #if !TARGET_CARBON
163 if ( m_ok )
164 {
165 ::PrCloseDoc( (TPPrPort) m_macPrintSessionPort ) ;
166 err = PrError() ;
167
168 if ( err == noErr )
169 {
170 if ( (**(THPrint)m_printData.m_macPrintSettings).prJob.bJDocLoop == bSpoolLoop )
171 {
172 TPrStatus status ;
173 ::PrPicFile( (THPrint) m_printData.m_macPrintSettings , NULL , NULL , NULL , &status ) ;
174 }
175 }
176 else
177 {
178 message.Printf( "Print Error %d", err ) ;
179 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
180 dialog.ShowModal();
181 }
182 ::UMAPrClose(NULL) ;
183 // ::SetPort( macPrintFormerPort ) ;
184 ::SetPort( LMGetWMgrPort() ) ;
185 }
186 #else
187 if ( m_ok )
188 {
189 #if PM_USE_SESSION_APIS
190 err = PMSessionEndDocument((PMPrintSession)m_macPrintSessionPort);
191 #else
192 err = PMEndDocument(m_macPrintSessionPort);
193 #endif
194 if ( err != noErr )
195 {
196 message.Printf( "Print Error %d", err ) ;
197 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
198 dialog.ShowModal();
199 }
200 #if TARGET_CARBON && PM_USE_SESSION_APIS
201 UMAPrClose(&m_macPrintSessionPort) ;
202 #else
203 UMAPrClose(NULL) ;
204 #endif
205 }
206 #endif
207 }
208
209 bool wxPrinterDC::StartDoc( const wxString& WXUNUSED(message) )
210 {
211 return m_ok ;
212 }
213
214 void wxPrinterDC::EndDoc(void)
215 {
216 }
217
218 void wxPrinterDC::StartPage(void)
219 {
220 if ( !m_ok )
221 return ;
222
223 m_logicalFunction = wxCOPY;
224 // m_textAlignment = wxALIGN_TOP_LEFT;
225 m_backgroundMode = wxTRANSPARENT;
226
227 m_textForegroundColour = *wxBLACK;
228 m_textBackgroundColour = *wxWHITE;
229 m_pen = *wxBLACK_PEN;
230 m_font = *wxNORMAL_FONT;
231 m_brush = *wxTRANSPARENT_BRUSH;
232 m_backgroundBrush = *wxWHITE_BRUSH;
233
234 m_macFontInstalled = false ;
235 m_macBrushInstalled = false ;
236 m_macPenInstalled = false ;
237
238
239 OSStatus err ;
240 wxString message ;
241
242 #if !TARGET_CARBON
243 PrOpenPage( (TPPrPort) m_macPrintSessionPort , NULL ) ;
244 m_macLocalOrigin.x = (**(THPrint)m_printData.m_macPrintSettings).rPaper.left ;
245 m_macLocalOrigin.y = (**(THPrint)m_printData.m_macPrintSettings).rPaper.top ;
246
247 Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
248 ::ClipRect( &clip ) ;
249 err = PrError() ;
250 if ( err != noErr )
251 {
252 message.Printf( "Print Error %d", err ) ;
253 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
254 dialog.ShowModal();
255 ::PrClosePage( (TPPrPort) m_macPrintSessionPort ) ;
256 ::PrCloseDoc( (TPPrPort) m_macPrintSessionPort ) ;
257 ::UMAPrClose(NULL) ;
258 ::SetPort( macPrintFormerPort ) ;
259 m_ok = FALSE ;
260 }
261 #else
262 #if PM_USE_SESSION_APIS
263 err = PMSessionBeginPage((PMPrintSession)m_macPrintSessionPort,
264 (PMPageFormat)m_printData.m_macPageFormat,
265 nil);
266 #else
267 err = PMBeginPage(m_macPrintSessionPort, nil);
268 #endif
269 if ( err != noErr )
270 {
271 message.Printf( "Print Error %d", err ) ;
272 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
273 dialog.ShowModal();
274 #if PM_USE_SESSION_APIS
275 PMSessionEndPage((PMPrintSession)m_macPrintSessionPort);
276 PMSessionEndDocument((PMPrintSession)m_macPrintSessionPort);
277 UMAPrClose(&m_macPrintSessionPort) ;
278 #else
279 PMEndPage(m_macPrintSessionPort);
280 PMEndDocument(m_macPrintSessionPort);
281 UMAPrClose(NULL) ;
282 #endif
283 ::SetPort( macPrintFormerPort ) ;
284 m_ok = FALSE ;
285 }
286 #endif
287 }
288
289 void wxPrinterDC::EndPage(void)
290 {
291 if ( !m_ok )
292 return ;
293
294 OSStatus err ;
295 wxString message ;
296
297 #if !TARGET_CARBON
298 PrClosePage( (TPPrPort) m_macPort ) ;
299 err = PrError() ;
300 if ( err != noErr )
301 {
302 message.Printf( "Print Error %d", err ) ;
303 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
304 dialog.ShowModal();
305 ::PrCloseDoc( (TPPrPort) m_macPrintSessionPort ) ;
306 ::UMAPrClose(NULL) ;
307 ::SetPort( macPrintFormerPort ) ;
308 m_ok = FALSE ;
309 }
310 #else
311 #if PM_USE_SESSION_APIS
312 err = PMSessionEndPage((PMPrintSession)m_macPrintSessionPort);
313 #else
314 err = PMEndPage(m_macPrintSessionPort);
315 #endif
316 if ( err != noErr )
317 {
318 message.Printf( "Print Error %d", err ) ;
319 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
320 dialog.ShowModal();
321 #if PM_USE_SESSION_APIS
322 PMSessionEndDocument((PMPrintSession)m_macPrintSessionPort);
323 UMAPrClose(&m_macPrintSessionPort) ;
324 #else
325 PMEndDocument(m_macPrintSessionPort);
326 UMAPrClose(NULL) ;
327 #endif
328 ::SetPort( macPrintFormerPort ) ;
329 m_ok = FALSE ;
330 }
331 #endif
332
333 }