From c347101b66e941922bf6f266bf155be4db0be793 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 17 Jan 2009 08:46:00 +0000 Subject: [PATCH] streamlining printing support, adding printing support on osx-cocoa git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58164 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/osx/carbon/private/print.h | 67 ++++- src/common/prntbase.cpp | 2 +- src/osx/carbon/dcprint.cpp | 58 ++-- src/osx/carbon/printdlg.cpp | 34 +-- src/osx/core/printmac.cpp | 377 +++++++++++++------------- 5 files changed, 289 insertions(+), 249 deletions(-) diff --git a/include/wx/osx/carbon/private/print.h b/include/wx/osx/carbon/private/print.h index d4d8c2582e..a53482fd17 100644 --- a/include/wx/osx/carbon/private/print.h +++ b/include/wx/osx/carbon/private/print.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: wx/mac/carbon/private/print.h -// Purpose: private implementation for printing on MacOS +// Name: wx/osx/carbon/private/print.h +// Purpose: private implementation for printing on OS X // Author: Stefan Csomor // Modified by: // Created: 03/02/99 @@ -14,32 +14,71 @@ #include "wx/cmndata.h" #include "wx/print.h" + +// for PrintingManager #include "ApplicationServices/ApplicationServices.h" -class WXDLLIMPEXP_CORE wxMacCarbonPrintData : public wxPrintNativeDataBase +class WXDLLIMPEXP_CORE wxOSXPrintData : public wxPrintNativeDataBase { -public : - wxMacCarbonPrintData() ; - virtual ~wxMacCarbonPrintData() ; +public: + wxOSXPrintData(); + virtual ~wxOSXPrintData(); virtual bool TransferTo( wxPrintData &data ); virtual bool TransferFrom( const wxPrintData &data ); virtual bool IsOk() const ; - virtual void TransferFrom( wxPageSetupDialogData * ) ; - virtual void TransferTo( wxPageSetupDialogData * ) ; + virtual void TransferFrom( wxPageSetupDialogData * ); + virtual void TransferTo( wxPageSetupDialogData * ); + + virtual void TransferFrom( wxPrintDialogData * ); + virtual void TransferTo( wxPrintDialogData * ); + + PMPrintSession GetPrintSession() { return m_macPrintSession; } + PMPageFormat GetPageFormat() { return m_macPageFormat; } + PMPrintSettings GetPrintSettings() { return m_macPrintSettings; } +protected : + virtual void UpdateFromPMState(); + virtual void UpdateToPMState(); - virtual void TransferFrom( wxPrintDialogData * ) ; - virtual void TransferTo( wxPrintDialogData * ) ; -private : - virtual void ValidateOrCreate() ; -public : PMPrintSession m_macPrintSession ; PMPageFormat m_macPageFormat ; PMPrintSettings m_macPrintSettings ; + PMPaper m_macPaper; +private: + DECLARE_DYNAMIC_CLASS(wxOSXPrintData) +} ; + +WXDLLIMPEXP_CORE wxPrintNativeDataBase* wxOSXCreatePrintData(); + +#if wxOSX_USE_CARBON +class WXDLLIMPEXP_CORE wxOSXCarbonPrintData : public wxOSXPrintData +{ +public: + wxOSXCarbonPrintData(); + virtual ~wxOSXCarbonPrintData(); +private: + DECLARE_DYNAMIC_CLASS(wxOSXCarbonPrintData) +} ; +#endif + +#if wxOSX_USE_COCOA +class WXDLLIMPEXP_CORE wxOSXCocoaPrintData : public wxOSXPrintData +{ +public: + wxOSXCocoaPrintData(); + virtual ~wxOSXCocoaPrintData(); + + WX_NSPrintInfo GetNSPrintInfo() { return m_macPrintInfo; } +protected: + virtual void UpdateFromPMState(); + virtual void UpdateToPMState(); + + WX_NSPrintInfo m_macPrintInfo; private: - DECLARE_DYNAMIC_CLASS(wxMacCarbonPrintData) + DECLARE_DYNAMIC_CLASS(wxOSXCocoaPrintData) } ; +#endif #endif // _WX_MAC_PRIVATE_PRINT_H_ diff --git a/src/common/prntbase.cpp b/src/common/prntbase.cpp index 4da0d2fa96..27c8491cc3 100644 --- a/src/common/prntbase.cpp +++ b/src/common/prntbase.cpp @@ -261,7 +261,7 @@ wxPrintNativeDataBase *wxNativePrintFactory::CreatePrintNativeData() #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) return new wxWindowsPrintNativeData; #elif defined(__WXMAC__) - return new wxMacCarbonPrintData; + return wxOSXCreatePrintData(); #else return new wxPostScriptPrintNativeData; #endif diff --git a/src/osx/carbon/dcprint.cpp b/src/osx/carbon/dcprint.cpp index f9353bc42c..c5bf0962f4 100644 --- a/src/osx/carbon/dcprint.cpp +++ b/src/osx/carbon/dcprint.cpp @@ -73,10 +73,10 @@ private : wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data ) { m_err = noErr ; - wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) data->GetNativeData() ; + wxOSXPrintData *native = (wxOSXPrintData*) data->GetNativeData() ; PMRect rPage; - m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage); + m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &rPage); if ( m_err != noErr ) return; @@ -89,10 +89,10 @@ wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data ) if ( PMPrinterGetOutputResolution != NULL ) { PMPrinter printer; - m_err = PMSessionGetCurrentPrinter(native->m_macPrintSession, &printer); + m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer); if ( m_err == noErr ) { - m_err = PMPrinterGetOutputResolution( printer, native->m_macPrintSettings, &res) ; + m_err = PMPrinterGetOutputResolution( printer, native->GetPrintSettings(), &res) ; if ( m_err == -9589 /* kPMKeyNotFound */ ) { m_err = noErr ; @@ -104,7 +104,7 @@ wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data ) #endif { #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - m_err = PMGetResolution((PMPageFormat) (native->m_macPageFormat), &res); + m_err = PMGetResolution((PMPageFormat) (native->GetPageFormat()), &res); #endif } @@ -126,21 +126,21 @@ bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& message return false ; wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl(); - wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) impl->GetPrintData().GetNativeData() ; + wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 if ( PMPrintSettingsSetJobName != NULL ) - PMPrintSettingsSetJobName(native->m_macPrintSettings, wxCFStringRef(message)); + PMPrintSettingsSetJobName(native->GetPrintSettings(), wxCFStringRef(message)); #endif - m_err = PMSessionBeginCGDocumentNoDialog(native->m_macPrintSession, - native->m_macPrintSettings, - native->m_macPageFormat); + m_err = PMSessionBeginCGDocumentNoDialog(native->GetPrintSession(), + native->GetPrintSettings(), + native->GetPageFormat()); if ( m_err != noErr ) return false; PMRect rPage; - m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage); + m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &rPage); if ( m_err != noErr ) return false ; @@ -152,10 +152,10 @@ bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& message if ( PMPrinterGetOutputResolution != NULL ) { PMPrinter printer; - m_err = PMSessionGetCurrentPrinter(native->m_macPrintSession, &printer); + m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer); if ( m_err == noErr ) { - m_err = PMPrinterGetOutputResolution( printer, native->m_macPrintSettings, &res) ; + m_err = PMPrinterGetOutputResolution( printer, native->GetPrintSettings(), &res) ; if ( m_err == -9589 /* kPMKeyNotFound */ ) { m_err = noErr ; @@ -167,7 +167,7 @@ bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& message #endif { #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - m_err = PMGetResolution((PMPageFormat) (native->m_macPageFormat), &res); + m_err = PMGetResolution((PMPageFormat) (native->GetPageFormat()), &res); #endif } @@ -181,9 +181,9 @@ void wxMacCarbonPrinterDC::EndDoc( wxPrinterDC* dc ) return ; wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl(); - wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) impl->GetPrintData().GetNativeData() ; + wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ; - m_err = PMSessionEndDocumentNoDialog(native->m_macPrintSession); + m_err = PMSessionEndDocumentNoDialog(native->GetPrintSession()); } void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc ) @@ -192,34 +192,34 @@ void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc ) return ; wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl(); - wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) impl->GetPrintData().GetNativeData() ; + wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ; - m_err = PMSessionBeginPageNoDialog(native->m_macPrintSession, - native->m_macPageFormat, + m_err = PMSessionBeginPageNoDialog(native->GetPrintSession(), + native->GetPageFormat(), nil); CGContextRef pageContext; if ( m_err == noErr ) { - m_err = PMSessionGetCGGraphicsContext(native->m_macPrintSession, + m_err = PMSessionGetCGGraphicsContext(native->GetPrintSession(), &pageContext ); } if ( m_err != noErr ) { - PMSessionEndPageNoDialog(native->m_macPrintSession); - PMSessionEndDocumentNoDialog(native->m_macPrintSession); + PMSessionEndPageNoDialog(native->GetPrintSession()); + PMSessionEndDocumentNoDialog(native->GetPrintSession()); } else { PMRect rPage; - m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage); + m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &rPage); if ( !m_err ) { PMRect paperRect ; - PMGetAdjustedPaperRect( native->m_macPageFormat , &paperRect ) ; + PMGetAdjustedPaperRect( native->GetPageFormat() , &paperRect ) ; // make sure (0,0) is at the upper left of the printable area (wx conventions) // Core Graphics initially has the lower left of the paper as 0,0 CGContextTranslateCTM( pageContext , (CGFloat) -paperRect.left , (CGFloat) paperRect.bottom ) ; @@ -237,12 +237,12 @@ void wxMacCarbonPrinterDC::EndPage( wxPrinterDC* dc ) return ; wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl(); - wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) impl->GetPrintData().GetNativeData() ; + wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ; - m_err = PMSessionEndPageNoDialog(native->m_macPrintSession); + m_err = PMSessionEndPageNoDialog(native->GetPrintSession()); if ( m_err != noErr ) { - PMSessionEndDocumentNoDialog(native->m_macPrintSession); + PMSessionEndDocumentNoDialog(native->GetPrintSession()); } // the cg context we got when starting the page isn't valid anymore, so replace it impl->SetGraphicsContext( wxGraphicsContext::Create() ); @@ -349,10 +349,10 @@ wxRect wxPrinterDCImpl::GetPaperRect() const wxCoord w, h; GetOwner()->GetSize(&w, &h); wxRect pageRect(0, 0, w, h); - wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) m_printData.GetNativeData() ; + wxOSXPrintData *native = (wxOSXPrintData*) m_printData.GetNativeData() ; OSStatus err = noErr ; PMRect rPaper; - err = PMGetAdjustedPaperRect(native->m_macPageFormat, &rPaper); + err = PMGetAdjustedPaperRect(native->GetPageFormat(), &rPaper); if ( err != noErr ) return pageRect; return wxRect(wxCoord(rPaper.left), wxCoord(rPaper.top), diff --git a/src/osx/carbon/printdlg.cpp b/src/osx/carbon/printdlg.cpp index 28a6e24338..a36ecd0367 100644 --- a/src/osx/carbon/printdlg.cpp +++ b/src/osx/carbon/printdlg.cpp @@ -77,21 +77,19 @@ wxMacPrintDialog::~wxMacPrintDialog() } } +#if wxOSX_USE_CARBON int wxMacPrintDialog::ShowModal() { m_printDialogData.GetPrintData().ConvertToNative(); - ((wxMacCarbonPrintData*)m_printDialogData.GetPrintData().GetNativeData())->TransferFrom( &m_printDialogData ); + ((wxOSXPrintData*)m_printDialogData.GetPrintData().GetNativeData())->TransferFrom( &m_printDialogData ); int result = wxID_CANCEL; -#if wxOSX_USE_CARBON OSErr err = noErr; Boolean accepted; - err = PMSessionPrintDialog( - ((wxMacCarbonPrintData*)m_printDialogData.GetPrintData().GetNativeData())->m_macPrintSession, - ((wxMacCarbonPrintData*)m_printDialogData.GetPrintData().GetNativeData())->m_macPrintSettings, - ((wxMacCarbonPrintData*)m_printDialogData.GetPrintData().GetNativeData())->m_macPageFormat, - &accepted ); + wxOSXPrintData* nativeData = (wxOSXPrintData*)m_printDialogData.GetPrintData().GetNativeData(); + err = PMSessionPrintDialog(nativeData->GetPrintSession(), nativeData->GetPrintSettings(), + nativeData->GetPageFormat(), &accepted ); if ((err == noErr) && !accepted) { @@ -116,13 +114,11 @@ int wxMacPrintDialog::ShowModal() if (result == wxID_OK) { m_printDialogData.GetPrintData().ConvertFromNative(); - ((wxMacCarbonPrintData*)m_printDialogData.GetPrintData().GetNativeData())->TransferTo( &m_printDialogData ); + ((wxOSXPrintData*)m_printDialogData.GetPrintData().GetNativeData())->TransferTo( &m_printDialogData ); } -#else - // TODO use NSPrintPanel -#endif return result; } +#endif wxDC *wxMacPrintDialog::GetPrintDC() { @@ -156,19 +152,18 @@ wxPageSetupData& wxMacPageSetupDialog::GetPageSetupDialogData() return m_pageSetupData; } +#if wxOSX_USE_CARBON int wxMacPageSetupDialog::ShowModal() { m_pageSetupData.GetPrintData().ConvertToNative(); - ((wxMacCarbonPrintData*)m_pageSetupData.GetPrintData().GetNativeData())->TransferFrom( &m_pageSetupData ); + wxOSXPrintData* nativeData = (wxOSXPrintData*)m_pageSetupData.GetPrintData().GetNativeData(); + nativeData->TransferFrom( &m_pageSetupData ); int result = wxID_CANCEL; -#if wxOSX_USE_CARBON OSErr err = noErr; Boolean accepted; - err = PMSessionPageSetupDialog( - ((wxMacCarbonPrintData*)m_pageSetupData.GetPrintData().GetNativeData())->m_macPrintSession, - ((wxMacCarbonPrintData*)m_pageSetupData.GetPrintData().GetNativeData())->m_macPageFormat, + err = PMSessionPageSetupDialog( nativeData->GetPrintSession(), nativeData->GetPageFormat(), &accepted ); if ((err == noErr) && !accepted) @@ -197,14 +192,11 @@ int wxMacPageSetupDialog::ShowModal() { m_pageSetupData.GetPrintData().ConvertFromNative(); m_pageSetupData.SetPaperSize( m_pageSetupData.GetPrintData().GetPaperSize() ); - ((wxMacCarbonPrintData*)m_pageSetupData.GetPrintData().GetNativeData())->TransferTo( &m_pageSetupData ); + nativeData->TransferTo( &m_pageSetupData ); } -#else - // TODO -#endif return result; } - +#endif IMPLEMENT_CLASS(wxMacPageMarginsDialog, wxDialog) diff --git a/src/osx/core/printmac.cpp b/src/osx/core/printmac.cpp index 5256be6b13..c64891c3ff 100644 --- a/src/osx/core/printmac.cpp +++ b/src/osx/core/printmac.cpp @@ -38,104 +38,128 @@ #include -IMPLEMENT_DYNAMIC_CLASS(wxMacCarbonPrintData, wxPrintNativeDataBase) -IMPLEMENT_DYNAMIC_CLASS(wxMacPrinter, wxPrinterBase) -IMPLEMENT_CLASS(wxMacPrintPreview, wxPrintPreviewBase) +// +// move to print_osx.cpp +// -bool wxMacCarbonPrintData::IsOk() const +IMPLEMENT_DYNAMIC_CLASS(wxOSXPrintData, wxPrintNativeDataBase) + +bool wxOSXPrintData::IsOk() const { return (m_macPageFormat != kPMNoPageFormat) && (m_macPrintSettings != kPMNoPrintSettings) && (m_macPrintSession != kPMNoReference); } -wxMacCarbonPrintData::wxMacCarbonPrintData() + +wxOSXPrintData::wxOSXPrintData() { m_macPageFormat = kPMNoPageFormat; m_macPrintSettings = kPMNoPrintSettings; m_macPrintSession = kPMNoReference ; - ValidateOrCreate() ; + m_macPaper = kPMNoData; } -wxMacCarbonPrintData::~wxMacCarbonPrintData() +wxOSXPrintData::~wxOSXPrintData() { - if (m_macPageFormat != kPMNoPageFormat) - { - (void)PMRelease(m_macPageFormat); - m_macPageFormat = kPMNoPageFormat; - } +} - if (m_macPrintSettings != kPMNoPrintSettings) - { - (void)PMRelease(m_macPrintSettings); - m_macPrintSettings = kPMNoPrintSettings; - } +void wxOSXPrintData::UpdateFromPMState() +{ +} - if ( m_macPrintSession != kPMNoReference ) - { - (void)PMRelease(m_macPrintSession); - m_macPrintSession = kPMNoReference; - } +void wxOSXPrintData::UpdateToPMState() +{ } -void wxMacCarbonPrintData::ValidateOrCreate() +bool wxOSXPrintData::TransferFrom( const wxPrintData &data ) { - OSStatus err = noErr ; - if ( m_macPrintSession == kPMNoReference ) - { - err = PMCreateSession( &m_macPrintSession ) ; - } - // Set up a valid PageFormat object. - if ( m_macPageFormat == kPMNoPageFormat) - { - err = PMCreatePageFormat(&m_macPageFormat); + PMPrinter printer; + PMSessionGetCurrentPrinter(m_macPrintSession, &printer); - // Note that PMPageFormat is not session-specific, but calling - // PMSessionDefaultPageFormat assigns values specific to the printer - // associated with the current printing session. - if ((err == noErr) && - ( m_macPageFormat != kPMNoPageFormat)) + wxSize papersize = wxDefaultSize; + const wxPaperSize paperId = data.GetPaperId(); + if ( paperId != wxPAPER_NONE && wxThePrintPaperDatabase ) + { + papersize = wxThePrintPaperDatabase->GetSize(paperId); + if ( papersize != wxDefaultSize ) { - err = PMSessionDefaultPageFormat(m_macPrintSession, - m_macPageFormat); + papersize.x /= 10; + papersize.y /= 10; } } else { - err = PMSessionValidatePageFormat(m_macPrintSession, - m_macPageFormat, - kPMDontWantBoolean); + papersize = data.GetPaperSize(); } - - // Set up a valid PrintSettings object. - if ( m_macPrintSettings == kPMNoPrintSettings) + + if ( papersize != wxDefaultSize ) { - err = PMCreatePrintSettings( &m_macPrintSettings); - - // Note that PMPrintSettings is not session-specific, but calling - // PMSessionDefaultPrintSettings assigns values specific to the printer - // associated with the current printing session. - if ((err == noErr) && - ( m_macPrintSettings != kPMNoPrintSettings)) + papersize.x = (wxInt32) (papersize.x * mm2pt); + papersize.y = (wxInt32) (papersize.y * mm2pt); + + double height, width; + PMPaperGetHeight(m_macPaper, &height); + PMPaperGetWidth(m_macPaper, &width); + + if ( fabs( width - papersize.x ) >= 5 || + fabs( height - papersize.y ) >= 5 ) { - err = PMSessionDefaultPrintSettings(m_macPrintSession, - m_macPrintSettings); + // we have to change the current paper + CFArrayRef paperlist = 0 ; + if ( PMPrinterGetPaperList( printer, &paperlist ) == noErr ) + { + PMPaper bestPaper = kPMNoData ; + CFIndex top = CFArrayGetCount(paperlist); + for ( CFIndex i = 0 ; i < top ; ++ i ) + { + PMPaper paper = (PMPaper) CFArrayGetValueAtIndex( paperlist, i ); + PMPaperGetHeight(paper, &height); + PMPaperGetWidth(paper, &width); + if ( fabs( width - papersize.x ) < 5 && + fabs( height - papersize.y ) < 5 ) + { + // TODO test for duplicate hits and use additional + // criteria for best match + bestPaper = paper; + } + } + PMPaper paper = kPMNoData; + if ( bestPaper == kPMNoData ) + { + const PMPaperMargins margins = { 0.0, 0.0, 0.0, 0.0 }; + wxString id, name(_T("Custom paper")); + id.Printf(_T("wxPaperCustom%dx%d"), papersize.x, papersize.y); + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + if ( PMPaperCreateCustom != NULL) + { + PMPaperCreateCustom(printer, wxCFStringRef( id, wxFont::GetDefaultEncoding() ), wxCFStringRef( name, wxFont::GetDefaultEncoding() ), + papersize.x, papersize.y, &margins, &paper); + } +#endif +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + if ( paper == kPMNoData ) + { + PMPaperCreate(printer, wxCFStringRef( id, wxFont::GetDefaultEncoding() ), wxCFStringRef( name, wxFont::GetDefaultEncoding() ), + papersize.x, papersize.y, &margins, &paper); + } +#endif + } + if ( bestPaper != kPMNoData ) + { + PMPageFormat pageFormat; + PMCreatePageFormatWithPMPaper(&pageFormat, bestPaper); + PMCopyPageFormat( pageFormat, m_macPageFormat ); + PMRelease(pageFormat); + PMGetPageFormatPaper(m_macPageFormat, &m_macPaper); + } + PMRelease(paper); + } } } - else - { - err = PMSessionValidatePrintSettings( m_macPrintSession, - m_macPrintSettings, - kPMDontWantBoolean); - } -} -bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ) -{ CFArrayRef printerList; CFIndex index, count; - PMPrinter printer; CFStringRef name; - ValidateOrCreate() ; - if (PMServerCreatePrinterList(kPMServerLocal, &printerList) == noErr) { count = CFArrayGetCount(printerList); @@ -153,25 +177,19 @@ bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ) } } if (index < count) - PMSessionSetCurrentPMPrinter((PMPrintSession)m_macPrintSession, printer); + PMSessionSetCurrentPMPrinter(m_macPrintSession, printer); CFRelease(printerList); } PMSetCopies( m_macPrintSettings , data.GetNoCopies() , false ) ; PMSetCollate(m_macPrintSettings, data.GetCollate()); - -#if wxOSX_USE_CARBON - PMColorMode color ; - PMGetColorMode( (PMPrintSettings) m_macPrintSettings, &color ) ; - if ( data.GetColour() ) - { - if ( color == kPMBlackAndWhite ) - PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ; - } + if ( data.IsOrientationReversed() ) + PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? + kPMReverseLandscape : kPMReversePortrait , false ) ; else - PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ; -#endif - + PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? + kPMLandscape : kPMPortrait , false ) ; + PMDuplexMode mode = 0 ; switch( data.GetDuplex() ) { @@ -186,100 +204,45 @@ bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ) mode = kPMDuplexNone ; break ; } - PMSetDuplex( (PMPrintSettings) m_macPrintSettings, mode ) ; + PMSetDuplex( m_macPrintSettings, mode ) ; // PMQualityMode not yet accessible via API - PMResolution res; - PMSessionGetCurrentPrinter(m_macPrintSession, &printer); - - bool found = false; - CFArrayRef formatList; - PMSessionCreatePageFormatList(m_macPrintSession, printer, &formatList); - if (formatList) - { - count = CFArrayGetCount(formatList); - for (index = 0; index < count; index++) - { - PMPageFormat temp = (PMPageFormat)CFArrayGetValueAtIndex(formatList, index); - PMRect rPaper; - PMGetUnadjustedPaperRect(temp, &rPaper); - wxSize sz((int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) , - (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 )); - wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10)); - if (((data.GetPaperId() != wxPAPER_NONE) && (id == data.GetPaperId())) || - ((data.GetPaperId() == wxPAPER_NONE) && (sz == data.GetPaperSize()))) - { - PMCopyPageFormat(temp, m_macPageFormat); - found = true; - break; - } - } - CFRelease(formatList); - } - if (!found) - { - PMPaper paper; - const PMPaperMargins margins = { 0.0, 0.0, 0.0, 0.0 }; - wxString id, name(_T("Custom paper")); - wxSize sz; - double width, height; - - id.Printf(_T("wxPaperCustom%dx%d"), sz.x, sz.y); - if (data.GetPaperId() == wxPAPER_NONE) - sz = data.GetPaperSize(); - else - sz = wxThePrintPaperDatabase->GetSize(data.GetPaperId()); - width = ((double)sz.x / 10.0) * mm2pt; - height = ((double)sz.y / 10.0) * mm2pt; - -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - PMPaperCreate(printer, wxCFStringRef( id, wxFont::GetDefaultEncoding() ), wxCFStringRef( name, wxFont::GetDefaultEncoding() ), width, height, &margins, &paper); -#else - if (PMPaperCreateCustom(printer, wxCFStringRef( id, wxFont::GetDefaultEncoding() ), wxCFStringRef( name, wxFont::GetDefaultEncoding() ), width, height, &margins, &paper) != noErr) - paper = NULL; -#endif - if (paper) - { - PMPageFormat temp; - if (PMCreatePageFormatWithPMPaper(&temp, paper) == noErr) { - PMCopyPageFormat(temp, m_macPageFormat); - PMRelease(temp); - } - PMRelease(paper); - } - } if ( data.IsOrientationReversed() ) - PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? + PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMReverseLandscape : kPMReversePortrait , false ) ; else - PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? + PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMLandscape : kPMPortrait , false ) ; -#if 1 // wxOSX_USE_CARBON + // PMQualityMode not accessible via API + // TODO: use our quality property to determine optimal resolution + PMResolution res; PMTag tag = kPMMaxSquareResolution; PMPrinterGetPrinterResolution(printer, tag, &res); - PMSetResolution((PMPageFormat) m_macPageFormat, &res); -#else - PMPrinterGetOutputResolution( printer, - (PMPrintSettings) m_macPrintSettings, &res) ; - // TODO transfer ? into page format ? - // may fail ! -#endif + PMSetResolution( m_macPageFormat, &res); + // after setting the new resolution the format has to be updated, otherwise the page rect remains // at the 'old' scaling - PMSessionValidatePageFormat((PMPrintSession) m_macPrintSession, - (PMPageFormat) m_macPageFormat, - kPMDontWantBoolean) ; + + PMSessionValidatePageFormat(m_macPrintSession, + m_macPageFormat, kPMDontWantBoolean); + PMSessionValidatePrintSettings(m_macPrintSession, + m_macPrintSettings, kPMDontWantBoolean); +#if wxOSX_USE_COCOA + UpdateFromPMState(); +#endif return true ; } -bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ) +bool wxOSXPrintData::TransferTo( wxPrintData &data ) { OSStatus err = noErr ; - +#if wxOSX_USE_COCOA + UpdateToPMState(); +#endif UInt32 copies ; err = PMGetCopies( m_macPrintSettings , &copies ) ; if ( err == noErr ) @@ -317,14 +280,8 @@ bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ) data.SetPrinterName(wxCFStringRef(name).AsString()); } -#ifndef __LP64__ - PMColorMode color ; - err = PMGetColorMode( m_macPrintSettings, &color ) ; - if ( err == noErr ) - data.SetColour( !(color == kPMBlackAndWhite) ) ; -#endif PMDuplexMode mode = 0 ; - PMGetDuplex( (PMPrintSettings) m_macPrintSettings, &mode ) ; + PMGetDuplex( m_macPrintSettings, &mode ) ; switch( mode ) { case kPMDuplexNoTumble : @@ -340,31 +297,33 @@ bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ) } // PMQualityMode not yet accessible via API - PMPaper paper ; - PMGetPageFormatPaper( m_macPageFormat, &paper ); - - PMRect rPaper; - err = PMGetUnadjustedPaperRect( m_macPageFormat, &rPaper); - if ( err == noErr ) + double height, width; + PMPaperGetHeight(m_macPaper, &height); + PMPaperGetWidth(m_macPaper, &width); + + wxSize sz((int)(width * pt2mm + 0.5 ) , + (int)(height * pt2mm + 0.5 )); + data.SetPaperSize(sz); + wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10)); + if (id != wxPAPER_NONE) { - wxSize sz((int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) * 10, - (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ) * 10); - data.SetPaperSize(sz); - wxPaperSize id = wxThePrintPaperDatabase->GetSize(sz); data.SetPaperId(id); } return true ; } -void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *WXUNUSED(data) ) +void wxOSXPrintData::TransferFrom( wxPageSetupData *WXUNUSED(data) ) { // should we setup the page rect here ? // since MacOS sometimes has two same paper rects with different // page rects we could make it roundtrip safe perhaps } -void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data ) +void wxOSXPrintData::TransferTo( wxPageSetupData* data ) { +#if wxOSX_USE_COCOA + UpdateToPMState(); +#endif PMRect rPaper; OSStatus err = PMGetUnadjustedPaperRect(m_macPageFormat, &rPaper); if ( err == noErr ) @@ -403,8 +362,11 @@ void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data ) } } -void wxMacCarbonPrintData::TransferTo( wxPrintDialogData* data ) +void wxOSXPrintData::TransferTo( wxPrintDialogData* data ) { +#if wxOSX_USE_COCOA + UpdateToPMState(); +#endif UInt32 minPage , maxPage ; PMGetPageRange( m_macPrintSettings , &minPage , &maxPage ) ; data->SetMinPage( minPage ) ; @@ -420,7 +382,7 @@ void wxMacCarbonPrintData::TransferTo( wxPrintDialogData* data ) data->SetAllPages( true ) ; // This means all pages, more or less data->SetFromPage(1); - data->SetToPage(32000); + data->SetToPage(9999); } else { @@ -430,7 +392,7 @@ void wxMacCarbonPrintData::TransferTo( wxPrintDialogData* data ) } } -void wxMacCarbonPrintData::TransferFrom( wxPrintDialogData* data ) +void wxOSXPrintData::TransferFrom( wxPrintDialogData* data ) { // Respect the value of m_printAllPages if ( data->GetAllPages() ) @@ -444,12 +406,28 @@ void wxMacCarbonPrintData::TransferFrom( wxPrintDialogData* data ) PMSetLastPage( m_macPrintSettings , (UInt32) kPMPrintAllPages, true ) ; else PMSetLastPage( m_macPrintSettings , (UInt32) data->GetToPage() , false ) ; +#if wxOSX_USE_COCOA + UpdateFromPMState(); +#endif +} + +wxPrintNativeDataBase* wxOSXCreatePrintData() +{ +#if wxOSX_USE_COCOA + return new wxOSXCocoaPrintData(); +#endif +#if wxOSX_USE_CARBON + return new wxOSXCarbonPrintData(); +#endif + return NULL; } /* * Printer */ +IMPLEMENT_DYNAMIC_CLASS(wxMacPrinter, wxPrinterBase) + wxMacPrinter::wxMacPrinter(wxPrintDialogData *data): wxPrinterBase(data) { @@ -500,15 +478,9 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) // on the mac we have always pixels as addressing mode with 72 dpi printout->SetPPIScreen(72, 72); PMResolution res; - wxMacCarbonPrintData* nativeData = (wxMacCarbonPrintData*) + wxOSXPrintData* nativeData = (wxOSXPrintData*) (m_printDialogData.GetPrintData().GetNativeData()); -#if 1 // wxOSX_USE_CARBON - PMGetResolution((PMPageFormat) (nativeData->m_macPageFormat), &res); -#else - PMPrinter printer; - PMSessionGetCurrentPrinter(nativeData->m_macPrintSession, &printer); - PMPrinterGetOutputResolution( printer, nativeData->m_macPrintSettings, &res) ; -#endif + PMGetResolution( (nativeData->GetPageFormat()), &res); printout->SetPPIPrinter(int(res.hRes), int(res.vRes)); // Set printout parameters @@ -625,6 +597,8 @@ bool wxMacPrinter::Setup(wxWindow *WXUNUSED(parent)) * Print preview */ +IMPLEMENT_CLASS(wxMacPrintPreview, wxPrintPreviewBase) + wxMacPrintPreview::wxMacPrintPreview(wxPrintout *printout, wxPrintout *printoutForPrinting, wxPrintDialogData *data) @@ -699,4 +673,39 @@ void wxMacPrintPreview::DetermineScaling(void) m_previewScaleY = float(ppiScreen.y) / ppiPrinter.y; } +// +// end of print_osx.cpp +// + +#if wxOSX_USE_CARBON + +IMPLEMENT_DYNAMIC_CLASS(wxOSXCarbonPrintData, wxOSXPrintData) + +wxOSXCarbonPrintData::wxOSXCarbonPrintData() +{ + if ( PMCreateSession( &m_macPrintSession ) == noErr ) + { + if ( PMCreatePageFormat(&m_macPageFormat) == noErr ) + { + PMSessionDefaultPageFormat(m_macPrintSession, + m_macPageFormat); + PMGetPageFormatPaper(m_macPageFormat, &m_macPaper); + } + + if ( PMCreatePrintSettings(&m_macPrintSettings) == noErr ) + { + PMSessionDefaultPrintSettings(m_macPrintSession, + m_macPrintSettings); + } + } +} + +wxOSXCarbonPrintData::~wxOSXCarbonPrintData() +{ + (void)PMRelease(m_macPageFormat); + (void)PMRelease(m_macPrintSettings); + (void)PMRelease(m_macPrintSession); +} +#endif + #endif -- 2.47.2