use Print Manager session APIs if PM_USE_SESSION_APIS is true
[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 !USE_SHARED_LIBRARY
32 IMPLEMENT_CLASS(wxPrinterDC, wxDC)
33 #endif
34
35 GrafPtr macPrintFormerPort = NULL ;
36
37 wxPrinterDC::wxPrinterDC(const wxPrintData& printdata)
38 {
39 OSStatus err ;
40 wxString message ;
41
42 m_printData = printdata ;
43 m_printData.ConvertToNative() ;
44
45 #if !TARGET_CARBON
46 err = UMAPrOpen() ;
47 #else
48 err = UMAPrOpen(&m_macPrintPort) ;
49 #endif
50 if ( err )
51 {
52 message.Printf( "Print Error %d", err ) ;
53 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
54 #if !TARGET_CARBON
55 UMAPrClose() ;
56 #else
57 UMAPrClose(&m_macPrintPort) ;
58 #endif
59 }
60
61 #if !TARGET_CARBON
62 if ( ::PrValidate( m_printData.m_macPrintInfo ) )
63 {
64 ::PrStlDialog( m_printData.m_macPrintInfo ) ;
65 // the driver has changed in the mean time, should we pop up a page setup dialog ?
66 }
67 err = PrError() ;
68 if ( err )
69 {
70 message.Printf( "Print Error %d", err ) ;
71 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
72 UMAPrClose() ;
73 }
74 ::GetPort( &macPrintFormerPort ) ;
75 m_macPrintPort = ::PrOpenDoc( m_printData.m_macPrintInfo , NULL , NULL ) ;
76 err = PrError() ;
77 if ( err )
78 {
79 message.Printf( "Print Error %d", err ) ;
80 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
81 UMAPrClose() ;
82 }
83 // sets current port
84 m_macPort = (GrafPtr ) m_macPrintPort ;
85 #else
86 m_macPrintPort = kPMNoReference ;
87 #if PM_USE_SESSION_APIS
88 err = PMSessionBeginDocument(
89 m_macPrintPort,
90 m_printData.m_macPrintSettings,
91 m_printData.m_macPageFormat);
92 #else
93 err = PMBeginDocument(
94 m_printData.m_macPrintSettings,
95 m_printData.m_macPageFormat,
96 &m_macPrintPort);
97 #endif
98 if ( err != noErr || m_macPrintPort == kPMNoReference )
99 {
100 message.Printf( "Print Error %d", err ) ;
101 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
102 UMAPrClose(&m_macPrintPort) ;
103 }
104 // sets current port
105 ::GetPort( &m_macPort ) ;
106 #endif
107 m_ok = TRUE ;
108 m_minY = m_minX = 0 ;
109 #if TARGET_CARBON
110 #else
111 m_maxX = (**m_printData.m_macPrintInfo).rPaper.right - (**m_printData.m_macPrintInfo).rPaper.left ;
112 m_maxY = (**m_printData.m_macPrintInfo).rPaper.bottom - (**m_printData.m_macPrintInfo).rPaper.top ;
113 #endif
114 }
115
116 wxPrinterDC::~wxPrinterDC(void)
117 {
118 OSStatus err ;
119 wxString message ;
120 #if !TARGET_CARBON
121 if ( m_ok )
122 {
123 ::PrCloseDoc( m_macPrintPort ) ;
124 err = PrError() ;
125
126 if ( !err )
127 {
128 if ( (**m_printData.m_macPrintInfo).prJob.bJDocLoop == bSpoolLoop )
129 {
130 TPrStatus status ;
131 ::PrPicFile( m_printData.m_macPrintInfo , NULL , NULL , NULL , &status ) ;
132 }
133 }
134 else
135 {
136 message.Printf( "Print Error %d", err ) ;
137 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
138 UMAPrClose() ;
139 }
140 ::UMAPrClose() ;
141 // ::SetPort( macPrintFormerPort ) ;
142 ::SetPort( LMGetWMgrPort() ) ;
143 }
144 #else
145 if ( m_ok )
146 {
147 #if PM_USE_SESSION_APIS
148 err = PMSessionEndDocument(m_macPrintPort);
149 #else
150 err = PMEndDocument(m_macPrintPort);
151 #endif
152 if ( !err )
153 {
154 message.Printf( "Print Error %d", err ) ;
155 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
156 #if !TARGET_CARBON
157 UMAPrClose() ;
158 #else
159 UMAPrClose(&m_macPrintPort) ;
160 #endif
161 }
162 #if !TARGET_CARBON
163 UMAPrClose() ;
164 #else
165 UMAPrClose(&m_macPrintPort) ;
166 #endif
167 }
168 #endif
169 }
170
171 bool wxPrinterDC::StartDoc( const wxString& WXUNUSED(message) )
172 {
173 return m_ok ;
174 }
175
176 void wxPrinterDC::EndDoc(void)
177 {
178 }
179
180 void wxPrinterDC::StartPage(void)
181 {
182 if ( !m_ok )
183 return ;
184
185 m_logicalFunction = wxCOPY;
186 // m_textAlignment = wxALIGN_TOP_LEFT;
187 m_backgroundMode = wxTRANSPARENT;
188
189 m_textForegroundColour = *wxBLACK;
190 m_textBackgroundColour = *wxWHITE;
191 m_pen = *wxBLACK_PEN;
192 m_font = *wxNORMAL_FONT;
193 m_brush = *wxTRANSPARENT_BRUSH;
194 m_backgroundBrush = *wxWHITE_BRUSH;
195
196 m_macFontInstalled = false ;
197 m_macBrushInstalled = false ;
198 m_macPenInstalled = false ;
199
200
201 OSStatus err ;
202 wxString message ;
203
204 #if !TARGET_CARBON
205 PrOpenPage( m_macPrintPort , NULL ) ;
206 m_macLocalOrigin.h = (**m_printData.m_macPrintInfo).rPaper.left ;
207 m_macLocalOrigin.v = (**m_printData.m_macPrintInfo).rPaper.top ;
208
209 SetOrigin( - m_macLocalOrigin.h , - m_macLocalOrigin.v ) ;
210 Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
211 ::ClipRect( &clip ) ;
212 err = PrError() ;
213 if ( err )
214 {
215 message.Printf( "Print Error %d", err ) ;
216 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
217 ::PrClosePage( m_macPrintPort) ;
218 ::PrCloseDoc( m_macPrintPort ) ;
219 ::UMAPrClose() ;
220 ::SetPort( macPrintFormerPort ) ;
221 m_ok = FALSE ;
222 }
223 #else
224 #if PM_USE_SESSION_APIS
225 err = PMSessionBeginPage(m_macPrintPort,
226 m_printData.m_macPageFormat,
227 nil);
228 #else
229 err = PMBeginPage(m_macPrintPort, nil);
230 #endif
231 if ( err )
232 {
233 message.Printf( "Print Error %d", err ) ;
234 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
235 #if PM_USE_SESSION_APIS
236 PMSessionEndPage(m_macPrintPort);
237 PMSessionEndDocument(m_macPrintPort);
238 #else
239 PMEndPage(m_macPrintPort);
240 PMEndDocument(m_macPrintPort);
241 #endif
242 UMAPrClose(&m_macPrintPort) ;
243 ::SetPort( macPrintFormerPort ) ;
244 m_ok = FALSE ;
245 }
246 #endif
247 }
248
249 void wxPrinterDC::EndPage(void)
250 {
251 if ( !m_ok )
252 return ;
253
254 OSStatus err ;
255 wxString message ;
256
257 #if !TARGET_CARBON
258 PrClosePage( (TPrPort*) m_macPort ) ;
259 err = PrError() ;
260 if ( err )
261 {
262 message.Printf( "Print Error %d", err ) ;
263 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
264 ::PrCloseDoc( m_macPrintPort ) ;
265 ::UMAPrClose() ;
266 ::SetPort( macPrintFormerPort ) ;
267 m_ok = FALSE ;
268 }
269 #else
270 #if PM_USE_SESSION_APIS
271 err = PMSessionEndPage(m_macPrintPort);
272 #else
273 err = PMEndPage(m_macPrintPort);
274 #endif
275 if ( err )
276 {
277 message.Printf( "Print Error %d", err ) ;
278 wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
279 #if PM_USE_SESSION_APIS
280 PMSessionEndDocument(m_macPrintPort);
281 #else
282 PMEndDocument(m_macPrintPort);
283 #endif
284 UMAPrClose(&m_macPrintPort) ;
285 ::SetPort( macPrintFormerPort ) ;
286 m_ok = FALSE ;
287 }
288 #endif
289
290 }