1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxPrinterDC class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "dcprint.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
26 #include "wx/dcprint.h"
27 #include "wx/msgdlg.h"
29 #include "wx/mac/uma.h"
30 #include "wx/mac/private/print.h"
32 IMPLEMENT_CLASS(wxPrinterDC
, wxDC
)
34 class wxNativePrinterDC
37 wxNativePrinterDC() {}
38 virtual ~wxNativePrinterDC() {}
39 virtual bool StartDoc( wxPrinterDC
* dc
, const wxString
& message
) = 0;
40 virtual void EndDoc( wxPrinterDC
* dc
) = 0;
41 virtual void StartPage( wxPrinterDC
* dc
) = 0;
42 virtual void EndPage( wxPrinterDC
* dc
) = 0;
43 virtual wxCoord
GetMaxX() const = 0 ;
44 virtual wxCoord
GetMaxY() const = 0 ;
45 // returns 0 in case of no Error, otherwise platform specific error codes
46 virtual wxUint32
GetStatus() const = 0 ;
47 bool Ok() { return GetStatus() == 0 ; }
49 static wxNativePrinterDC
* Create(wxPrintData
* data
) ;
54 class wxMacCarbonPrinterDC
: public wxNativePrinterDC
57 wxMacCarbonPrinterDC( wxPrintData
* data
) ;
58 ~wxMacCarbonPrinterDC() ;
59 virtual bool StartDoc( wxPrinterDC
* dc
, const wxString
& message
) ;
60 virtual void EndDoc( wxPrinterDC
* dc
) ;
61 virtual void StartPage( wxPrinterDC
* dc
) ;
62 virtual void EndPage( wxPrinterDC
* dc
) ;
63 virtual wxCoord
GetMaxX() const { return m_maxX
; }
64 virtual wxCoord
GetMaxY() const { return m_maxY
; }
65 virtual wxUint32
GetStatus() const { return m_err
; }
67 GrafPtr m_macPrintFormerPort
;
73 wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData
* data
)
75 ::GetPort( & m_macPrintFormerPort
) ;
78 wxMacCarbonPrintData
*native
= (wxMacCarbonPrintData
*) data
->m_nativePrintData
;
81 m_err
= PMGetAdjustedPageRect(native
->m_macPageFormat
, &rPage
);
85 m_maxX
= wxCoord(rPage
.right
- rPage
.left
) ;
86 m_maxY
= wxCoord(rPage
.bottom
- rPage
.top
);
89 wxMacCarbonPrinterDC::~wxMacCarbonPrinterDC()
91 // nothing to release from print data, as wxPrinterDC has all data in its wxPrintData member
92 ::SetPort( m_macPrintFormerPort
) ;
95 wxNativePrinterDC
* wxNativePrinterDC::Create(wxPrintData
* data
)
97 return new wxMacCarbonPrinterDC(data
) ;
100 bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC
* dc
, const wxString
& WXUNUSED(message
) )
105 wxMacCarbonPrintData
*native
= (wxMacCarbonPrintData
*) dc
->GetPrintData().m_nativePrintData
;
107 m_err
= PMSessionBeginDocument(native
->m_macPrintSession
,
108 native
->m_macPrintSettings
,
109 native
->m_macPageFormat
);
110 if ( m_err
!= noErr
)
114 m_err
= PMGetAdjustedPageRect(native
->m_macPageFormat
, &rPage
);
115 if ( m_err
!= noErr
)
118 m_maxX
= (wxCoord
)(rPage
.right
- rPage
.left
);
119 m_maxY
= (wxCoord
)(rPage
.bottom
- rPage
.top
);
123 void wxMacCarbonPrinterDC::EndDoc( wxPrinterDC
* dc
)
128 wxMacCarbonPrintData
*native
= (wxMacCarbonPrintData
*) dc
->GetPrintData().m_nativePrintData
;
130 m_err
= PMSessionEndDocument(native
->m_macPrintSession
);
133 void wxMacCarbonPrinterDC::StartPage( wxPrinterDC
* dc
)
138 wxMacCarbonPrintData
*native
= (wxMacCarbonPrintData
*) dc
->GetPrintData().m_nativePrintData
;
140 m_err
= PMSessionBeginPage(native
->m_macPrintSession
,
141 native
->m_macPageFormat
,
144 if ( m_err
== noErr
)
146 m_err
= PMSessionGetGraphicsContext(native
->m_macPrintSession
,
148 (void**) &dc
->m_macPort
);
151 if ( m_err
!= noErr
)
153 PMSessionEndPage(native
->m_macPrintSession
);
154 PMSessionEndDocument(native
->m_macPrintSession
);
160 m_err
= PMGetAdjustedPageRect(native
->m_macPageFormat
, &rPage
);
163 dc
->m_macLocalOrigin
.x
= (int) rPage
.left
;
164 dc
->m_macLocalOrigin
.y
= (int) rPage
.top
;
166 // since this is a non-critical error, we set the flag back
171 void wxMacCarbonPrinterDC::EndPage( wxPrinterDC
* dc
)
176 wxMacCarbonPrintData
*native
= (wxMacCarbonPrintData
*) dc
->GetPrintData().m_nativePrintData
;
178 m_err
= PMSessionEndPage(native
->m_macPrintSession
);
179 if ( m_err
!= noErr
)
181 PMSessionEndDocument(native
->m_macPrintSession
);
187 class wxMacClassicPrinterDC
: public wxNativePrinterDC
190 wxMacClassicPrinterDC( wxPrintData
* data
) ;
191 ~wxMacClassicPrinterDC() ;
192 virtual bool StartDoc( wxPrinterDC
* dc
, const wxString
& message
) ;
193 virtual void EndDoc( wxPrinterDC
* dc
) ;
194 virtual void StartPage( wxPrinterDC
* dc
) ;
195 virtual void EndPage( wxPrinterDC
* dc
) ;
196 virtual wxCoord
GetMaxX() const { return m_maxX
; }
197 virtual wxCoord
GetMaxY() const { return m_maxY
; }
198 virtual wxUint32
GetStatus() const { return m_err
; }
200 GrafPtr m_macPrintFormerPort
;
201 TPPrPort m_macPrintingPort
;
207 wxNativePrinterDC
* wxNativePrinterDC::Create(wxPrintData
* data
)
209 return new wxMacClassicPrinterDC(data
) ;
212 wxMacClassicPrinterDC::wxMacClassicPrinterDC(wxPrintData
* data
)
214 ::GetPort( &m_macPrintFormerPort
) ;
218 if ( m_err
!= noErr
)
221 wxMacClassicPrintData
*native
= (wxMacClassicPrintData
*) data
->m_nativePrintData
;
223 if ( ::PrValidate( native
->m_macPrintSettings
) )
225 // the driver has changed in the mean time, should we pop up a page setup dialog ?
226 if ( !::PrStlDialog( native
->m_macPrintSettings
) )
234 if ( m_err
== noErr
)
236 m_maxX
= (**native
->m_macPrintSettings
).prInfo
.rPage
.right
- (**native
->m_macPrintSettings
).prInfo
.rPage
.left
;
237 m_maxY
= (**native
->m_macPrintSettings
).prInfo
.rPage
.bottom
- (**native
->m_macPrintSettings
).prInfo
.rPage
.top
;
241 wxMacClassicPrinterDC::~wxMacClassicPrinterDC()
244 ::SetPort( LMGetWMgrPort() ) ;
247 bool wxMacClassicPrinterDC::StartDoc( wxPrinterDC
* dc
, const wxString
& WXUNUSED(message
) )
252 wxMacClassicPrintData
*native
= (wxMacClassicPrintData
*) dc
->GetPrintData().m_nativePrintData
;
253 m_macPrintingPort
= ::PrOpenDoc( native
->m_macPrintSettings
, NULL
, NULL
) ;
259 dc
->m_macPort
= (GrafPtr
) m_macPrintingPort
;
260 m_maxX
= (**native
->m_macPrintSettings
).prInfo
.rPage
.right
- (**native
->m_macPrintSettings
).prInfo
.rPage
.left
;
261 m_maxY
= (**native
->m_macPrintSettings
).prInfo
.rPage
.bottom
- (**native
->m_macPrintSettings
).prInfo
.rPage
.top
;
265 void wxMacClassicPrinterDC::EndDoc( wxPrinterDC
* dc
)
270 PrCloseDoc( m_macPrintingPort
) ;
274 void wxMacClassicPrinterDC::StartPage( wxPrinterDC
* dc
)
279 wxMacClassicPrintData
*native
= (wxMacClassicPrintData
*) dc
->GetPrintData().m_nativePrintData
;
281 PrOpenPage( m_macPrintingPort
, NULL
) ;
282 dc
->m_macLocalOrigin
.x
= (**native
->m_macPrintSettings
).rPaper
.left
;
283 dc
->m_macLocalOrigin
.y
= (**native
->m_macPrintSettings
).rPaper
.top
;
284 // m_macPrintingPort is now the current port
285 Rect clip
= { -32000 , -32000 , 32000 , 32000 } ;
286 ::ClipRect( &clip
) ;
288 if ( m_err
!= noErr
)
289 ::PrCloseDoc( m_macPrintingPort
) ;
292 void wxMacClassicPrinterDC::EndPage( wxPrinterDC
* dc
)
297 PrClosePage( m_macPrintingPort
) ;
299 if ( m_err
!= noErr
)
300 ::PrCloseDoc( m_macPrintingPort
) ;
305 wxPrinterDC::wxPrinterDC(const wxPrintData
& printdata
)
308 m_printData
= printdata
;
309 m_printData
.ConvertToNative() ;
310 m_nativePrinterDC
= wxNativePrinterDC::Create( &m_printData
) ;
311 if ( m_nativePrinterDC
)
313 m_ok
= m_nativePrinterDC
->Ok() ;
318 message
.Printf( wxT("Print Error %u"), m_nativePrinterDC
->GetStatus() ) ;
319 wxMessageDialog
dialog( NULL
, message
, wxEmptyString
, wxICON_HAND
| wxOK
) ;
325 wxPrinterDC::~wxPrinterDC(void)
327 delete m_nativePrinterDC
;
330 bool wxPrinterDC::StartDoc( const wxString
& message
)
332 wxASSERT_MSG( Ok() , wxT("Called wxPrinterDC::StartDoc from an invalid object") ) ;
337 if ( m_nativePrinterDC
->StartDoc(this, message
) )
339 // in case we have to do additional things when successful
341 m_ok
= m_nativePrinterDC
->Ok() ;
345 message
.Printf( wxT("Print Error %u"), m_nativePrinterDC
->GetStatus() ) ;
346 wxMessageDialog
dialog( NULL
, message
, wxEmptyString
, wxICON_HAND
| wxOK
) ;
353 void wxPrinterDC::EndDoc(void)
358 m_nativePrinterDC
->EndDoc( this ) ;
359 m_ok
= m_nativePrinterDC
->Ok() ;
364 message
.Printf( wxT("Print Error %u"), m_nativePrinterDC
->GetStatus() ) ;
365 wxMessageDialog
dialog( NULL
, message
, wxEmptyString
, wxICON_HAND
| wxOK
) ;
370 void wxPrinterDC::StartPage(void)
375 m_logicalFunction
= wxCOPY
;
376 // m_textAlignment = wxALIGN_TOP_LEFT;
377 m_backgroundMode
= wxTRANSPARENT
;
379 m_textForegroundColour
= *wxBLACK
;
380 m_textBackgroundColour
= *wxWHITE
;
381 m_pen
= *wxBLACK_PEN
;
382 m_font
= *wxNORMAL_FONT
;
383 m_brush
= *wxTRANSPARENT_BRUSH
;
384 m_backgroundBrush
= *wxWHITE_BRUSH
;
386 m_macFontInstalled
= false ;
387 m_macBrushInstalled
= false ;
388 m_macPenInstalled
= false ;
390 m_nativePrinterDC
->StartPage(this) ;
391 m_ok
= m_nativePrinterDC
->Ok() ;
395 void wxPrinterDC::EndPage(void)
400 m_nativePrinterDC
->EndPage(this) ;
401 m_ok
= m_nativePrinterDC
->Ok() ;
404 void wxPrinterDC::DoGetSize(int *width
, int *height
) const
406 wxCHECK_RET( m_ok
, _T("GetSize() doesn't work without a valid wxPrinterDC") );
409 * width
= m_nativePrinterDC
->GetMaxX() ;
411 * height
= m_nativePrinterDC
->GetMaxY() ;