]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dcprint.cpp
Fixed overlapping buttons in wizard on MacOS X
[wxWidgets.git] / src / mac / carbon / dcprint.cpp
index 257c74206b6a7707bae2d3479b742e1376374e50..6c32de8ad07f773c2225d7efd676509f24a34f64 100644 (file)
 #endif
 
 #include "wx/dcprint.h"
-#include "math.h"
+#include "wx/msgdlg.h"
+#include <math.h>
 #include "wx/mac/uma.h"
+#ifndef __DARWIN__
+#include "Printing.h"
+#endif
 
+#if defined(TARGET_CARBON) && !defined(__DARWIN__)
+#  if PM_USE_SESSION_APIS
+#    include <PMCore.h>
+#  endif
+#  include <PMApplication.h>
+#endif
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_CLASS(wxPrinterDC, wxDC)
@@ -36,86 +46,166 @@ GrafPtr macPrintFormerPort = NULL ;
 
 wxPrinterDC::wxPrinterDC(const wxPrintData& printdata)
 {
-#if !TARGET_CARBON
-       OSErr err ;
+       OSStatus err ;
        wxString message ;
        
        m_printData = printdata ;
        m_printData.ConvertToNative() ;
-       
-       ::UMAPrOpen() ;
-       err = PrError() ;
-       if ( err )
+
+#if TARGET_CARBON && PM_USE_SESSION_APIS
+       err = UMAPrOpen(&m_macPrintSessionPort) ;
+       if ( err != noErr || m_macPrintSessionPort == kPMNoData )
+#else
+       err = UMAPrOpen(NULL) ;
+       if ( err != noErr )
+#endif
        {
-               message.Printf( "Print Error %d", err ) ;
+               message.Printf( "Print Error %ld", err ) ;
                wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
-               UMAPrClose() ;
+               dialog.ShowModal();
+#if TARGET_CARBON && PM_USE_SESSION_APIS
+               UMAPrClose(&m_macPrintSessionPort) ;
+#else
+               UMAPrClose(NULL) ;
+#endif
+               m_ok = FALSE;
+               return;
        }
        
-       if ( ::PrValidate( m_printData.m_macPrintInfo ) )
+#if !TARGET_CARBON
+       if ( ::PrValidate( (THPrint) m_printData.m_macPrintSettings ) )
        {
-               ::PrStlDialog( m_printData.m_macPrintInfo ) ;
+               ::PrStlDialog( (THPrint) m_printData.m_macPrintSettings ) ;
                // the driver has changed in the mean time, should we pop up a page setup dialog ?
        }
        err = PrError() ;
-       if ( err )
+       if ( err != noErr )
        {
-               message.Printf( "Print Error %d", err ) ;
+               message.Printf( "Print Error %ld", err ) ;
                wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
-               UMAPrClose() ;
+               dialog.ShowModal();
+               UMAPrClose(NULL) ;
+               m_ok = FALSE;
+               return;
        }
        ::GetPort( &macPrintFormerPort ) ;
-       m_macPrintPort = ::PrOpenDoc( m_printData.m_macPrintInfo , NULL , NULL ) ;
+       m_macPrintSessionPort = ::PrOpenDoc( (THPrint) m_printData.m_macPrintSettings , NULL , NULL ) ;
        err = PrError() ;
        if ( err )
        {
-               message.Printf( "Print Error %d", err ) ;
+               message.Printf( "Print Error %ld", err ) ;
                wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
-               UMAPrClose() ;
+               dialog.ShowModal();
+               UMAPrClose(NULL) ;
+               m_ok = FALSE;
+               return;
        }
        // sets current port
-       m_macPort = (GrafPtr ) m_macPrintPort ;
+       m_macPort = (GrafPtr ) m_macPrintSessionPort ;
+#else
+  #if PM_USE_SESSION_APIS
+    err = PMSessionBeginDocument((PMPrintSession)m_macPrintSessionPort,
+              (PMPrintSettings)m_printData.m_macPrintSettings, 
+             (PMPageFormat)m_printData.m_macPageFormat);
+    if ( err != noErr )
+  #else
+       m_macPrintSessionPort = kPMNoReference ;
+    err = PMBeginDocument(
+             m_printData.m_macPrintSettings, 
+             m_printData.m_macPageFormat, 
+             &m_macPrintSessionPort);
+    if ( err != noErr || m_macPrintSessionPort == kPMNoReference )
+  #endif
+    {
+               message.Printf( "Print Error %ld", err ) ;
+               wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
+               dialog.ShowModal();
+  #if TARGET_CARBON && PM_USE_SESSION_APIS
+               UMAPrClose(&m_macPrintSessionPort) ;
+  #else
+               UMAPrClose(NULL) ;
+  #endif
+               m_ok = FALSE;
+               return;
+    }
+       // sets current port
+       ::GetPort( (GrafPtr *)&m_macPort ) ;
+#endif
        m_ok = TRUE ;
        m_minY = m_minX = 0 ;
-       m_maxX = (**m_printData.m_macPrintInfo).rPaper.right - (**m_printData.m_macPrintInfo).rPaper.left ;
-       m_maxY = (**m_printData.m_macPrintInfo).rPaper.bottom - (**m_printData.m_macPrintInfo).rPaper.top ;
+#if TARGET_CARBON
+       PMRect rPaper;
+       
+       err = PMGetAdjustedPaperRect((PMPageFormat)m_printData.m_macPageFormat, &rPaper);
+    if ( err != noErr )
+    {
+               message.Printf( "Print Error %ld", err ) ;
+               wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
+               dialog.ShowModal();
+  #if TARGET_CARBON && PM_USE_SESSION_APIS
+               UMAPrClose(&m_macPrintSessionPort) ;
+  #else
+               UMAPrClose(NULL) ;
+  #endif
+               m_ok = FALSE;
+               return;
+    }
+       m_maxX = wxCoord(rPaper.right - rPaper.left) ;
+       m_maxY = wxCoord(rPaper.bottom - rPaper.top);
 #else
-#pragma warning "TODO:printing support for carbon"
+       m_maxX = (**(THPrint)m_printData.m_macPrintSettings).rPaper.right - (**(THPrint)m_printData.m_macPrintSettings).rPaper.left ;
+       m_maxY = (**(THPrint)m_printData.m_macPrintSettings).rPaper.bottom - (**(THPrint)m_printData.m_macPrintSettings).rPaper.top ;
 #endif
 }
 
 wxPrinterDC::~wxPrinterDC(void)
 {
+       OSStatus err ;
+       wxString message ;
 #if !TARGET_CARBON
        if ( m_ok )
        {
-               OSErr err ;
-               wxString message ;
-       
-               ::PrCloseDoc( m_macPrintPort  ) ;
+               ::PrCloseDoc( (TPPrPort) m_macPrintSessionPort  ) ;
                err = PrError() ;
                
-               if ( !err )
+               if ( err == noErr )
                {
-                       if ( (**m_printData.m_macPrintInfo).prJob.bJDocLoop == bSpoolLoop )
+                       if ( (**(THPrint)m_printData.m_macPrintSettings).prJob.bJDocLoop == bSpoolLoop )
                        {
                                TPrStatus status ;
-                               ::PrPicFile( m_printData.m_macPrintInfo , NULL , NULL , NULL , &status ) ;
+                               ::PrPicFile( (THPrint) m_printData.m_macPrintSettings , NULL , NULL , NULL , &status ) ;
                        }
                }
                else
                {
-                       message.Printf( "Print Error %d", err ) ;
+                       message.Printf( "Print Error %ld", err ) ;
                        wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
-                       UMAPrClose() ;
+                   dialog.ShowModal();
                }
-               ::UMAPrClose() ;
+               ::UMAPrClose(NULL) ;
 //       ::SetPort( macPrintFormerPort ) ;
                ::SetPort( LMGetWMgrPort() ) ;
-               m_macPortHelper.Clear() ;
        }
 #else
-#pragma warning "TODO:printing support for carbon"
+       if ( m_ok ) 
+       {
+  #if PM_USE_SESSION_APIS
+           err = PMSessionEndDocument((PMPrintSession)m_macPrintSessionPort);
+  #else
+           err = PMEndDocument(m_macPrintSessionPort);
+  #endif
+       if ( err != noErr )
+       {
+                       message.Printf( "Print Error %ld", err ) ;
+                       wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
+                   dialog.ShowModal();
+       }
+  #if TARGET_CARBON && PM_USE_SESSION_APIS
+           UMAPrClose(&m_macPrintSessionPort) ;
+  #else
+           UMAPrClose(NULL) ;
+  #endif
+       }
 #endif
 }
 
@@ -130,7 +220,6 @@ void wxPrinterDC::EndDoc(void)
 
 void wxPrinterDC::StartPage(void) 
 {
-#if !TARGET_CARBON
        if ( !m_ok )
                return ;
 
@@ -150,51 +239,98 @@ void wxPrinterDC::StartPage(void)
        m_macPenInstalled = false ;
 
                
-       OSErr err ;
+       OSStatus err ;
        wxString message ;
 
-       PrOpenPage( m_macPrintPort , NULL ) ;
-       SetOrigin(  - (**m_printData.m_macPrintInfo).rPaper.left , - (**m_printData.m_macPrintInfo).rPaper.top ) ;
+#if !TARGET_CARBON
+       PrOpenPage( (TPPrPort) m_macPrintSessionPort , NULL ) ;
+       m_macLocalOrigin.x =  (**(THPrint)m_printData.m_macPrintSettings).rPaper.left ;
+       m_macLocalOrigin.y =  (**(THPrint)m_printData.m_macPrintSettings).rPaper.top ;
+       
        Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
        ::ClipRect( &clip ) ;
        err = PrError() ;
-       if ( err )
+       if ( err != noErr )
        {
-               message.Printf( "Print Error %d", err ) ;
+               message.Printf( "Print Error %ld", err ) ;
                wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
-               ::PrClosePage(  m_macPrintPort) ;
-               ::PrCloseDoc( m_macPrintPort  ) ;
-               ::UMAPrClose() ;
+               dialog.ShowModal();
+               ::PrClosePage( (TPPrPort) m_macPrintSessionPort ) ;
+               ::PrCloseDoc( (TPPrPort) m_macPrintSessionPort ) ;
+               ::UMAPrClose(NULL) ;
                ::SetPort( macPrintFormerPort ) ;
                m_ok = FALSE ;
        }
 #else
-#pragma warning "TODO:printing support for carbon"
+  #if PM_USE_SESSION_APIS
+       err = PMSessionBeginPage((PMPrintSession)m_macPrintSessionPort,
+                                (PMPageFormat)m_printData.m_macPageFormat,
+                                nil);
+  #else
+       err = PMBeginPage(m_macPrintSessionPort, nil);
+  #endif
+       if ( err != noErr )
+       {
+               message.Printf( "Print Error %ld", err ) ;
+               wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
+               dialog.ShowModal();
+  #if PM_USE_SESSION_APIS
+               PMSessionEndPage((PMPrintSession)m_macPrintSessionPort);
+               PMSessionEndDocument((PMPrintSession)m_macPrintSessionPort);
+               UMAPrClose(&m_macPrintSessionPort) ;
+  #else
+               PMEndPage(m_macPrintSessionPort);
+               PMEndDocument(m_macPrintSessionPort);
+               UMAPrClose(NULL) ;
+  #endif
+               ::SetPort( macPrintFormerPort ) ;
+               m_ok = FALSE ;
+       }
 #endif
 }
 
 void wxPrinterDC::EndPage(void) 
 {
-#if !TARGET_CARBON
        if ( !m_ok )
                return ;
 
-       OSErr err ;
+       OSStatus err ;
        wxString message ;
 
-       PrClosePage(  (TPrPort*) m_macPort ) ;
+#if !TARGET_CARBON
+       PrClosePage(  (TPPrPort) m_macPort ) ;
        err = PrError() ;
-       if ( err )
+       if ( err != noErr )
        {
-               message.Printf( "Print Error %d", err ) ;
+               message.Printf( "Print Error %ld", err ) ;
                wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
-               ::PrCloseDoc( m_macPrintPort  ) ;
-               ::UMAPrClose() ;
+               dialog.ShowModal();
+               ::PrCloseDoc( (TPPrPort) m_macPrintSessionPort  ) ;
+               ::UMAPrClose(NULL) ;
                ::SetPort( macPrintFormerPort ) ;
                m_ok = FALSE ;
        }
 #else
-#pragma warning "TODO:printing support for carbon"
+  #if PM_USE_SESSION_APIS
+       err = PMSessionEndPage((PMPrintSession)m_macPrintSessionPort);
+  #else
+       err = PMEndPage(m_macPrintSessionPort);
+  #endif
+       if ( err != noErr )
+       {
+               message.Printf( "Print Error %ld", err ) ;
+               wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
+               dialog.ShowModal();
+  #if PM_USE_SESSION_APIS
+               PMSessionEndDocument((PMPrintSession)m_macPrintSessionPort);
+               UMAPrClose(&m_macPrintSessionPort) ;
+  #else
+               PMEndDocument(m_macPrintSessionPort);
+               UMAPrClose(NULL) ;
+  #endif
+               ::SetPort( macPrintFormerPort ) ;
+               m_ok = FALSE ;
+       }
 #endif
 
 }