]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/printmac.cpp
weak link test is not optimal, as CoreText is already having some symbols defined...
[wxWidgets.git] / src / mac / carbon / printmac.cpp
index 9d695cd4d242d937405edc54d23c8054e636f0fa..7d35f7a8e58ca21c75d1165b755687b5d34cd484 100644 (file)
@@ -33,6 +33,7 @@
 #include "wx/mac/private/print.h"
 
 #include "wx/printdlg.h"
+#include "wx/paper.h"
 #include "wx/mac/printdlg.h"
 
 #include <stdlib.h>
@@ -130,8 +131,12 @@ bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data )
 {
     ValidateOrCreate() ;
     PMSetCopies( (PMPrintSettings) m_macPrintSettings , data.GetNoCopies() , false ) ;
-    PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
-        kPMLandscape : kPMPortrait , 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() )
@@ -149,7 +154,22 @@ bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data )
         PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ;
 #endif
 
-    // PMDuplexMode not yet accessible via API
+    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 ) ;
+
     // PMQualityMode not yet accessible via API
     // todo paperSize
 
@@ -188,9 +208,15 @@ bool wxMacCarbonPrintData::TransferTo( wxPrintData &data )
     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
@@ -210,21 +236,43 @@ bool wxMacCarbonPrintData::TransferTo( wxPrintData &data )
     if ( err == noErr )
         data.SetColour( !(color == kPMBlackAndWhite) ) ;
 #endif
-    // PMDuplexMode not yet accessible via API
+    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 ;
+    }
     // PMQualityMode not yet accessible via API
-    // todo paperSize
+    
+    PMPaper paper ;
+    PMGetPageFormatPaper( m_macPageFormat, &paper );
+    
     PMRect rPaper;
     err = PMGetUnadjustedPaperRect( m_macPageFormat, &rPaper);
     if ( err == noErr )
     {
-        data.SetPaperSize( wxSize (
-            (int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) ,
-             (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ) ) );
+        wxSize sz((int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) ,
+             (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ));
+        data.SetPaperSize(sz);
+        wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10));
+        if (id != wxPAPER_NONE)
+        {
+            data.SetPaperId(id);
+        }
     }
     return true ;
 }
 
-void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *data )
+void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *WXUNUSED(data) )
 {
     // should we setup the page rect here ?
     // since MacOS sometimes has two same paper rects with different
@@ -237,6 +285,10 @@ void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data )
     OSStatus err = PMGetUnadjustedPaperRect(m_macPageFormat, &rPaper);
     if ( err == noErr )
     {
+        wxSize sz((int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) ,
+             (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ));
+        data->SetPaperSize(sz);
+
         PMRect rPage ;
         err = PMGetUnadjustedPageRect(m_macPageFormat , &rPage ) ;
         if ( err == noErr )
@@ -334,13 +386,14 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
         m_printDialogData.SetMaxPage(9999);
 
     // Create a suitable device context
-    wxDC *dc = NULL;
+    wxPrinterDC *dc = NULL;
     if (prompt)
     {
-        wxPrintDialog dialog(parent, & m_printDialogData);
+        wxMacPrintDialog dialog(parent, & m_printDialogData);
         if (dialog.ShowModal() == wxID_OK)
         {
-            dc = dialog.GetPrintDC();
+            dc = wxDynamicCast(dialog.GetPrintDC(), wxPrinterDC);
+            wxASSERT(dc);
             m_printDialogData = dialog.GetPrintDialogData();
         }
     }
@@ -375,11 +428,12 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
     printout->SetDC(dc);
 
     int w, h;
-    wxCoord ww, hh;
     dc->GetSize(&w, &h);
     printout->SetPageSizePixels((int)w, (int)h);
-    dc->GetSizeMM(&ww, &hh);
-    printout->SetPageSizeMM((int)ww, (int)hh);
+    printout->SetPaperRectPixels(dc->GetPaperRect());
+    wxCoord mw, mh;
+    dc->GetSizeMM(&mw, &mh);
+    printout->SetPageSizeMM((int)mw, (int)mh);
 
     // Create an abort window
     wxBeginBusyCursor();
@@ -446,19 +500,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
             }
             else
             {
-#if TARGET_CARBON
-                if ( UMAGetSystemVersion() >= 0x1000 )
-#endif
-                {
-#if !wxMAC_USE_CORE_GRAPHICS
-                    GrafPtr thePort ;
-                    GetPort( &thePort ) ;
-#endif
-                    wxSafeYield(win,true);
-#if !wxMAC_USE_CORE_GRAPHICS
-                    SetPort( thePort ) ;
-#endif
-                }
+                wxSafeYield(win,true);
                 dc->StartPage();
                 keepGoing = printout->OnPrintPage(pn);
                 dc->EndPage();
@@ -499,7 +541,7 @@ wxDC* wxMacPrinter::PrintDialog(wxWindow *parent)
     return dc;
 }
 
-bool wxMacPrinter::Setup(wxWindow *parent)
+bool wxMacPrinter::Setup(wxWindow *WXUNUSED(parent))
 {
 #if 0
     wxPrintDialog dialog(parent, & m_printDialogData);
@@ -555,36 +597,43 @@ void wxMacPrintPreview::DetermineScaling(void)
     wxSize ppiScreen( 72 , 72 ) ;
     wxSize ppiPrinter( 72 , 72 ) ;
     
+    // Note that with Leopard, screen dpi=72 is no longer a given
     m_previewPrintout->SetPPIScreen( ppiScreen.x , ppiScreen.y ) ;
     
-    int x , y ;
+    wxCoord w , h ;
     wxCoord ww, hh;
+    wxRect paperRect;
 
     // Get a device context for the currently selected printer
     wxPrinterDC printerDC(m_printDialogData.GetPrintData());
     if (printerDC.Ok())
     {
         printerDC.GetSizeMM(&ww, &hh);
-        printerDC.GetSize( &x , &y ) ;
+        printerDC.GetSize( &w , &h ) ;
         ppiPrinter = printerDC.GetPPI() ;
+        paperRect = printerDC.GetPaperRect();
         m_isOk = true ;
     }
     else
     {
         // use some defaults
-        x = 8 * 72 ;
-        y = 11 * 72 ;
-        ww = (int) (x * 25.4 / ppiPrinter.x) ;
-        hh = (int) (y * 25.4 / ppiPrinter.y) ;
+        w = 8 * 72 ;
+        h = 11 * 72 ;
+        ww = (wxCoord) (w * 25.4 / ppiPrinter.x) ;
+        hh = (wxCoord) (h * 25.4 / ppiPrinter.y) ;
+        paperRect = wxRect(0, 0, w, h);
         m_isOk = false ;
     }
-    m_previewPrintout->SetPageSizeMM((int)ww, (int)hh);
-    m_previewPrintout->SetPageSizePixels( x , y) ;
-    m_pageWidth = x ;
-    m_pageHeight = y ;
+    m_pageWidth = w;
+    m_pageHeight = h;
+    
+    m_previewPrintout->SetPageSizePixels(w , h) ;
+    m_previewPrintout->SetPageSizeMM(ww, hh);
+    m_previewPrintout->SetPaperRectPixels(paperRect);
     m_previewPrintout->SetPPIPrinter( ppiPrinter.x , ppiPrinter.y ) ;
 
-    m_previewScale = (float)((float)ppiScreen.x/(float)ppiPrinter.y);
+    m_previewScaleX = float(ppiScreen.x) / ppiPrinter.x;
+    m_previewScaleY = float(ppiScreen.y) / ppiPrinter.y;
 }
 
 #endif