+
+bool wxMacCarbonPrintData::IsOk() const
+{
+ return (m_macPageFormat != kPMNoPageFormat) && (m_macPrintSettings != kPMNoPrintSettings) && (m_macPrintSession != kPMNoReference);
+}
+wxMacCarbonPrintData::wxMacCarbonPrintData()
+{
+ m_macPageFormat = kPMNoPageFormat;
+ m_macPrintSettings = kPMNoPrintSettings;
+ m_macPrintSession = kPMNoReference ;
+ ValidateOrCreate() ;
+}
+
+wxMacCarbonPrintData::~wxMacCarbonPrintData()
+{
+ if (m_macPageFormat != kPMNoPageFormat)
+ {
+ (void)PMRelease(m_macPageFormat);
+ m_macPageFormat = kPMNoPageFormat;
+ }
+
+ if (m_macPrintSettings != kPMNoPrintSettings)
+ {
+ (void)PMRelease(m_macPrintSettings);
+ m_macPrintSettings = kPMNoPrintSettings;
+ }
+
+ if ( m_macPrintSession != kPMNoReference )
+ {
+ (void)PMRelease(m_macPrintSession);
+ m_macPrintSession = kPMNoReference;
+ }
+}
+
+void wxMacCarbonPrintData::ValidateOrCreate()
+{
+ OSStatus err = noErr ;
+ if ( m_macPrintSession == kPMNoReference )
+ {
+ err = PMCreateSession( (PMPrintSession *) &m_macPrintSession ) ;
+ }
+ // Set up a valid PageFormat object.
+ if ( m_macPageFormat == kPMNoPageFormat)
+ {
+ err = PMCreatePageFormat((PMPageFormat *) &m_macPageFormat);
+
+ // 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))
+ {
+ err = PMSessionDefaultPageFormat((PMPrintSession) m_macPrintSession,
+ (PMPageFormat) m_macPageFormat);
+ }
+ }
+ else
+ {
+ err = PMSessionValidatePageFormat((PMPrintSession) m_macPrintSession,
+ (PMPageFormat) m_macPageFormat,
+ kPMDontWantBoolean);
+ }
+
+ // Set up a valid PrintSettings object.
+ if ( m_macPrintSettings == kPMNoPrintSettings)
+ {
+ err = PMCreatePrintSettings((PMPrintSettings *) &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))
+ {
+ err = PMSessionDefaultPrintSettings((PMPrintSession) m_macPrintSession,
+ (PMPrintSettings) m_macPrintSettings);
+ }
+ }
+ else
+ {
+ err = PMSessionValidatePrintSettings((PMPrintSession) m_macPrintSession,
+ (PMPrintSettings) m_macPrintSettings,
+ kPMDontWantBoolean);
+ }
+}
+
+bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data )
+{
+ ValidateOrCreate() ;
+ PMSetCopies( (PMPrintSettings) m_macPrintSettings , data.GetNoCopies() , false ) ;
+ if ( data.IsOrientationReversed() )
+ PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
+ kPMReverseLandscape : kPMReversePortrait , false ) ;
+ else
+ PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
+ kPMLandscape : kPMPortrait , false ) ;
+ // collate cannot be set
+#if 0 // not yet tested
+ if ( !m_printerName.empty() )
+ PMSessionSetCurrentPrinter( (PMPrintSession) m_macPrintSession , wxMacCFStringHolder( m_printerName , wxFont::GetDefaultEncoding() ) ) ;
+#endif
+#ifndef __LP64__
+ PMColorMode color ;
+ PMGetColorMode( (PMPrintSettings) m_macPrintSettings, &color ) ;
+ if ( data.GetColour() )
+ {
+ if ( color == kPMBlackAndWhite )
+ PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ;
+ }
+ else
+ PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ;
+#endif
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ if ( PMSetDuplex!=NULL )
+ {
+ PMDuplexMode mode = 0 ;
+ switch( data.GetDuplex() )
+ {
+ case wxDUPLEX_HORIZONTAL :
+ mode = kPMDuplexNoTumble ;
+ break ;
+ case wxDUPLEX_VERTICAL :
+ mode = kPMDuplexTumble ;
+ break ;
+ case wxDUPLEX_SIMPLEX :
+ default :
+ mode = kPMDuplexNone ;
+ break ;
+ }
+ PMSetDuplex( (PMPrintSettings) m_macPrintSettings, mode ) ;
+ }
+#endif
+ // PMQualityMode not yet accessible via API
+ // todo paperSize
+
+ PMResolution res;
+ PMPrinter printer;
+ PMSessionGetCurrentPrinter(m_macPrintSession, &printer);
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+ PMPrinterGetOutputResolution( printer,
+ (PMPrintSettings) m_macPrintSettings, &res) ;
+ // TODO transfer ? into page format ?
+#else
+ PMTag tag = kPMMaxSquareResolution;
+ PMPrinterGetPrinterResolution(printer, tag, &res);
+ PMSetResolution((PMPageFormat) m_macPageFormat, &res);
+#endif
+ // 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) ;
+
+ return true ;
+}
+
+bool wxMacCarbonPrintData::TransferTo( wxPrintData &data )
+{
+ OSStatus err = noErr ;
+
+ UInt32 copies ;
+ err = PMGetCopies( m_macPrintSettings , &copies ) ;
+ if ( err == noErr )
+ data.SetNoCopies( copies ) ;
+
+ PMOrientation orientation ;
+ err = PMGetOrientation( m_macPageFormat , &orientation ) ;
+ if ( err == noErr )
+ {
+ if ( orientation == kPMPortrait || orientation == kPMReversePortrait )
+ {
+ data.SetOrientation( wxPORTRAIT );
+ data.SetOrientationReversed( orientation == kPMReversePortrait );
+ }
+ else
+ {
+ data.SetOrientation( wxLANDSCAPE );
+ data.SetOrientationReversed( orientation == kPMReverseLandscape );
+ }
+ }
+
+ // collate cannot be set
+#if 0
+ {
+ wxMacCFStringHolder name ;
+ PMPrinter printer ;
+ PMSessionGetCurrentPrinter( m_macPrintSession ,
+ &printer ) ;
+ m_printerName = name.AsString() ;
+ }
+#endif
+
+#ifndef __LP64__
+ PMColorMode color ;
+ err = PMGetColorMode( m_macPrintSettings, &color ) ;
+ if ( err == noErr )
+ data.SetColour( !(color == kPMBlackAndWhite) ) ;
+#endif
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ if ( PMGetDuplex!=NULL )
+ {
+ PMDuplexMode mode = 0 ;
+ PMGetDuplex( (PMPrintSettings) m_macPrintSettings, &mode ) ;
+ switch( mode )
+ {
+ case kPMDuplexNoTumble :
+ data.SetDuplex(wxDUPLEX_HORIZONTAL);
+ break ;
+ case kPMDuplexTumble :
+ data.SetDuplex(wxDUPLEX_VERTICAL);
+ break ;
+ case kPMDuplexNone :
+ default :
+ data.SetDuplex(wxDUPLEX_SIMPLEX);
+ break ;
+ }
+ }