]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/mac/carbon/dcprint.cpp
obsolete ref to checklistbox
[wxWidgets.git] / src / mac / carbon / dcprint.cpp
... / ...
CommitLineData
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
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
15#if wxUSE_PRINTING_ARCHITECTURE
16
17#ifdef __BORLANDC__
18#pragma hdrstop
19#endif
20
21#ifndef WX_PRECOMP
22#endif
23
24#include "wx/dcprint.h"
25#include "wx/msgdlg.h"
26#include "wx/math.h"
27#include "wx/mac/uma.h"
28#include "wx/mac/private/print.h"
29
30IMPLEMENT_CLASS(wxPrinterDC, wxDC)
31
32class wxNativePrinterDC
33{
34public :
35 wxNativePrinterDC() {}
36 virtual ~wxNativePrinterDC() {}
37 virtual bool StartDoc( wxPrinterDC* dc , const wxString& message ) = 0;
38 virtual void EndDoc( wxPrinterDC* dc ) = 0;
39 virtual void StartPage( wxPrinterDC* dc ) = 0;
40 virtual void EndPage( wxPrinterDC* dc ) = 0;
41 virtual wxCoord GetMaxX() const = 0 ;
42 virtual wxCoord GetMaxY() const = 0 ;
43 // returns 0 in case of no Error, otherwise platform specific error codes
44 virtual wxUint32 GetStatus() const = 0 ;
45 bool Ok() { return GetStatus() == 0 ; }
46
47 static wxNativePrinterDC* Create(wxPrintData* data) ;
48} ;
49
50class wxMacCarbonPrinterDC : public wxNativePrinterDC
51{
52public :
53 wxMacCarbonPrinterDC( wxPrintData* data ) ;
54 ~wxMacCarbonPrinterDC() ;
55 virtual bool StartDoc( wxPrinterDC* dc , const wxString& message ) ;
56 virtual void EndDoc( wxPrinterDC* dc ) ;
57 virtual void StartPage( wxPrinterDC* dc ) ;
58 virtual void EndPage( wxPrinterDC* dc ) ;
59 virtual wxCoord GetMaxX() const { return m_maxX ; }
60 virtual wxCoord GetMaxY() const { return m_maxY ; }
61 virtual wxUint32 GetStatus() const { return m_err ; }
62private :
63 GrafPtr m_macPrintFormerPort ;
64 wxCoord m_maxX ;
65 wxCoord m_maxY ;
66 OSStatus m_err ;
67} ;
68
69wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data )
70{
71 ::GetPort( & m_macPrintFormerPort ) ;
72
73 m_err = noErr ;
74 wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) data->GetNativeData() ;
75
76 PMRect rPage;
77 m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
78 if ( m_err != noErr )
79 return;
80
81 m_maxX = wxCoord(rPage.right - rPage.left) ;
82 m_maxY = wxCoord(rPage.bottom - rPage.top);
83}
84
85wxMacCarbonPrinterDC::~wxMacCarbonPrinterDC()
86{
87 // nothing to release from print data, as wxPrinterDC has all data in its wxPrintData member
88 ::SetPort( m_macPrintFormerPort ) ;
89}
90
91wxNativePrinterDC* wxNativePrinterDC::Create(wxPrintData* data)
92{
93 return new wxMacCarbonPrinterDC(data) ;
94}
95
96bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& WXUNUSED(message) )
97{
98 if ( m_err )
99 return false ;
100
101 wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().GetNativeData() ;
102
103#if wxMAC_USE_CORE_GRAPHICS
104 {
105 CFStringRef s[1] = { kPMGraphicsContextCoreGraphics };
106 CFArrayRef graphicsContextsArray = CFArrayCreate(NULL, (const void**)s, 1, &kCFTypeArrayCallBacks);
107 PMSessionSetDocumentFormatGeneration(native->m_macPrintSession, kPMDocumentFormatPDF, graphicsContextsArray, NULL);
108 CFRelease(graphicsContextsArray);
109 }
110#endif
111
112 m_err = PMSessionBeginDocument(native->m_macPrintSession,
113 native->m_macPrintSettings,
114 native->m_macPageFormat);
115 if ( m_err != noErr )
116 return false;
117
118 PMRect rPage;
119 m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
120 if ( m_err != noErr )
121 return false;
122
123 m_maxX = (wxCoord)(rPage.right - rPage.left);
124 m_maxY = (wxCoord)(rPage.bottom - rPage.top);
125 return true ;
126}
127
128void wxMacCarbonPrinterDC::EndDoc( wxPrinterDC* dc )
129{
130 if ( m_err )
131 return ;
132
133 wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().GetNativeData() ;
134
135 m_err = PMSessionEndDocument(native->m_macPrintSession);
136}
137
138void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc )
139{
140 if ( m_err )
141 return ;
142
143 wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().GetNativeData() ;
144
145 m_err = PMSessionBeginPage(native->m_macPrintSession,
146 native->m_macPageFormat,
147 nil);
148
149#if wxMAC_USE_CORE_GRAPHICS
150 CGContextRef pageContext;
151#endif
152 if ( m_err == noErr )
153 {
154#if wxMAC_USE_CORE_GRAPHICS
155 m_err = PMSessionGetGraphicsContext(native->m_macPrintSession,
156 kPMGraphicsContextCoreGraphics,
157 (void**) &pageContext );
158 dc->MacSetCGContext(pageContext) ;
159#else
160 m_err = PMSessionGetGraphicsContext(native->m_macPrintSession,
161 kPMGraphicsContextQuickdraw,
162 (void**) &dc->m_macPort );
163#endif
164 }
165
166 if ( m_err != noErr )
167 {
168 PMSessionEndPage(native->m_macPrintSession);
169 PMSessionEndDocument(native->m_macPrintSession);
170 }
171 else
172 {
173 PMRect rPage;
174
175 m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
176 if ( !m_err )
177 {
178#if wxMAC_USE_CORE_GRAPHICS
179 PMRect paperRect ;
180 PMGetAdjustedPaperRect( native->m_macPageFormat , &paperRect ) ;
181 CGContextTranslateCTM( pageContext , -paperRect.left , -paperRect.top + ( rPage.bottom - rPage.top ) ) ;
182 CGContextScaleCTM( pageContext , 1 , -1 ) ;
183 CGContextSaveGState( pageContext ) ;
184#else
185 dc->m_macLocalOrigin.x = (int) rPage.left;
186 dc->m_macLocalOrigin.y = (int) rPage.top;
187#endif
188 }
189 // since this is a non-critical error, we set the flag back
190 m_err = noErr ;
191 }
192}
193
194void wxMacCarbonPrinterDC::EndPage( wxPrinterDC* dc )
195{
196 if ( m_err )
197 return ;
198
199 wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().GetNativeData() ;
200
201 m_err = PMSessionEndPage(native->m_macPrintSession);
202 if ( m_err != noErr )
203 {
204 PMSessionEndDocument(native->m_macPrintSession);
205 }
206}
207
208wxPrinterDC::wxPrinterDC(const wxPrintData& printdata)
209{
210 m_ok = FALSE ;
211 m_printData = printdata ;
212 m_printData.ConvertToNative() ;
213 m_nativePrinterDC = wxNativePrinterDC::Create( &m_printData ) ;
214 if ( m_nativePrinterDC )
215 {
216 m_ok = m_nativePrinterDC->Ok() ;
217 if ( !m_ok )
218 {
219 wxString message ;
220 message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
221 wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
222 dialog.ShowModal();
223 }
224#if wxMAC_USE_CORE_GRAPHICS
225 // the cgContext will only be handed over page by page
226 m_graphicContext = new wxMacCGContext() ;
227#endif
228 }
229}
230
231wxPrinterDC::~wxPrinterDC(void)
232{
233#if wxMAC_USE_CORE_GRAPHICS
234 // this context was borrowed
235 ((wxMacCGContext*)(m_graphicContext))->SetNativeContext( NULL ) ;
236#endif
237 delete m_nativePrinterDC ;
238}
239
240#if wxMAC_USE_CORE_GRAPHICS
241void wxPrinterDC::MacSetCGContext( void * cg )
242{
243 ((wxMacCGContext*)(m_graphicContext))->SetNativeContext( (CGContextRef) cg ) ;
244 m_graphicContext->SetPen( m_pen ) ;
245 m_graphicContext->SetBrush( m_brush ) ;
246}
247#endif
248bool wxPrinterDC::StartDoc( const wxString& message )
249{
250 wxASSERT_MSG( Ok() , wxT("Called wxPrinterDC::StartDoc from an invalid object") ) ;
251
252 if ( !m_ok )
253 return false ;
254
255 if ( m_nativePrinterDC->StartDoc(this, message ) )
256 {
257 // in case we have to do additional things when successful
258 }
259 m_ok = m_nativePrinterDC->Ok() ;
260 if ( !m_ok )
261 {
262 wxString message ;
263 message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
264 wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
265 dialog.ShowModal();
266 }
267
268 return m_ok ;
269}
270
271void wxPrinterDC::EndDoc(void)
272{
273 if ( !m_ok )
274 return ;
275
276 m_nativePrinterDC->EndDoc( this ) ;
277 m_ok = m_nativePrinterDC->Ok() ;
278
279 if ( !m_ok )
280 {
281 wxString message ;
282 message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
283 wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
284 dialog.ShowModal();
285 }
286}
287
288void wxPrinterDC::StartPage(void)
289{
290 if ( !m_ok )
291 return ;
292
293 m_logicalFunction = wxCOPY;
294 // m_textAlignment = wxALIGN_TOP_LEFT;
295 m_backgroundMode = wxTRANSPARENT;
296
297 m_textForegroundColour = *wxBLACK;
298 m_textBackgroundColour = *wxWHITE;
299 m_pen = *wxBLACK_PEN;
300 m_font = *wxNORMAL_FONT;
301 m_brush = *wxTRANSPARENT_BRUSH;
302 m_backgroundBrush = *wxWHITE_BRUSH;
303#if !wxMAC_USE_CORE_GRAPHICS
304 m_macFontInstalled = false ;
305 m_macBrushInstalled = false ;
306 m_macPenInstalled = false ;
307#endif
308
309 m_nativePrinterDC->StartPage(this) ;
310 m_ok = m_nativePrinterDC->Ok() ;
311
312}
313
314void wxPrinterDC::EndPage(void)
315{
316 if ( !m_ok )
317 return ;
318
319 m_nativePrinterDC->EndPage(this) ;
320 m_ok = m_nativePrinterDC->Ok() ;
321}
322
323void wxPrinterDC::DoGetSize(int *width, int *height) const
324{
325 wxCHECK_RET( m_ok , _T("GetSize() doesn't work without a valid wxPrinterDC") );
326
327 if ( width )
328 * width = m_nativePrinterDC->GetMaxX() ;
329 if ( height )
330 * height = m_nativePrinterDC->GetMaxY() ;
331}
332
333#endif