]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/core/printmac.cpp
Fix selection corner cases in wxOSX wxComboBox.
[wxWidgets.git] / src / osx / core / printmac.cpp
index 3ed74451c3a1e440393ee30d663ab841c3c91a22..4cf4f0cad6526f38650ba801c49c46d9afc659a0 100644 (file)
@@ -46,9 +46,9 @@ static int ResolutionSorter(const void *e1, const void *e2)
 {
     const PMResolution *res1 = (const PMResolution *)e1;
     const PMResolution *res2 = (const PMResolution *)e2;
 {
     const PMResolution *res1 = (const PMResolution *)e1;
     const PMResolution *res2 = (const PMResolution *)e2;
-    int area1 = res1->hRes * res1->vRes;
-    int area2 = res2->hRes * res2->vRes;
-    
+    const double area1 = res1->hRes * res1->vRes;
+    const double area2 = res2->hRes * res2->vRes;
+
     if (area1 < area2)
         return -1;
     else if (area1 > area2)
     if (area1 < area2)
         return -1;
     else if (area1 > area2)
@@ -91,7 +91,7 @@ static PMResolution *GetSupportedResolutions(PMPrinter printer, UInt32 *count)
                 resolutions[realCount++] = res;
         }
         qsort(resolutions, realCount, sizeof(PMResolution), ResolutionSorter);
                 resolutions[realCount++] = res;
         }
         qsort(resolutions, realCount, sizeof(PMResolution), ResolutionSorter);
-        
+
         *count = realCount;
     }
     if ((*count == 0) && (resolutions))
         *count = realCount;
     }
     if ((*count == 0) && (resolutions))
@@ -131,12 +131,12 @@ void wxOSXPrintData::UpdateToPMState()
 {
 }
 
 {
 }
 
-bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
+void wxOSXPrintData::TransferPrinterNameFrom( const wxPrintData &data )
 {
     CFArrayRef printerList;
     CFIndex index, count;
     CFStringRef name;
 {
     CFArrayRef printerList;
     CFIndex index, count;
     CFStringRef name;
-    
+
     if (PMServerCreatePrinterList(kPMServerLocal, &printerList) == noErr)
     {
         PMPrinter printer = NULL;
     if (PMServerCreatePrinterList(kPMServerLocal, &printerList) == noErr)
     {
         PMPrinter printer = NULL;
@@ -158,10 +158,13 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
             PMSessionSetCurrentPMPrinter(m_macPrintSession, printer);
         CFRelease(printerList);
     }
             PMSessionSetCurrentPMPrinter(m_macPrintSession, printer);
         CFRelease(printerList);
     }
-    
+}
+
+void wxOSXPrintData::TransferPaperInfoFrom( const wxPrintData &data )
+{
     PMPrinter printer;
     PMSessionGetCurrentPrinter(m_macPrintSession, &printer);
     PMPrinter printer;
     PMSessionGetCurrentPrinter(m_macPrintSession, &printer);
-
+    
     wxSize papersize = wxDefaultSize;
     const wxPaperSize paperId = data.GetPaperId();
     if ( paperId != wxPAPER_NONE && wxThePrintPaperDatabase )
     wxSize papersize = wxDefaultSize;
     const wxPaperSize paperId = data.GetPaperId();
     if ( paperId != wxPAPER_NONE && wxThePrintPaperDatabase )
@@ -177,16 +180,16 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
     {
         papersize = data.GetPaperSize();
     }
     {
         papersize = data.GetPaperSize();
     }
-
+    
     if ( papersize != wxDefaultSize )
     {
         papersize.x = (wxInt32) (papersize.x * mm2pt);
         papersize.y = (wxInt32) (papersize.y * mm2pt);
     if ( papersize != wxDefaultSize )
     {
         papersize.x = (wxInt32) (papersize.x * mm2pt);
         papersize.y = (wxInt32) (papersize.y * mm2pt);
-
+        
         double height, width;
         PMPaperGetHeight(m_macPaper, &height);
         PMPaperGetWidth(m_macPaper, &width);
         double height, width;
         PMPaperGetHeight(m_macPaper, &height);
         PMPaperGetWidth(m_macPaper, &width);
-
+        
         if ( fabs( width - papersize.x ) >= 5 ||
             fabs( height - papersize.y ) >= 5 )
         {
         if ( fabs( width - papersize.x ) >= 5 ||
             fabs( height - papersize.y ) >= 5 )
         {
@@ -215,19 +218,19 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
                     const PMPaperMargins margins = { 0.0, 0.0, 0.0, 0.0 };
                     wxString id, name(wxT("Custom paper"));
                     id.Printf(wxT("wxPaperCustom%dx%d"), papersize.x, papersize.y);
                     const PMPaperMargins margins = { 0.0, 0.0, 0.0, 0.0 };
                     wxString id, name(wxT("Custom paper"));
                     id.Printf(wxT("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() ),
 #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);
+                                            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() ),
                     }
 #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);
+                                      papersize.x, papersize.y, &margins, &paper);
                     }
 #endif
                 }
                     }
 #endif
                 }
@@ -243,16 +246,16 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
             }
         }
     }
             }
         }
     }
-
+    
     PMSetCopies( m_macPrintSettings , data.GetNoCopies() , false ) ;
     PMSetCollate(m_macPrintSettings, data.GetCollate());
     if ( data.IsOrientationReversed() )
         PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
     PMSetCopies( m_macPrintSettings , data.GetNoCopies() , false ) ;
     PMSetCollate(m_macPrintSettings, data.GetCollate());
     if ( data.IsOrientationReversed() )
         PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
-            kPMReverseLandscape : kPMReversePortrait , false ) ;
+                         kPMReverseLandscape : kPMReversePortrait , false ) ;
     else
         PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
     else
         PMSetOrientation( m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
-            kPMLandscape : kPMPortrait , false ) ;
-
+                         kPMLandscape : kPMPortrait , false ) ;
+    
     PMDuplexMode mode = 0 ;
     switch( data.GetDuplex() )
     {
     PMDuplexMode mode = 0 ;
     switch( data.GetDuplex() )
     {
@@ -268,14 +271,20 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
             break ;
     }
     PMSetDuplex(  m_macPrintSettings, mode ) ;
             break ;
     }
     PMSetDuplex(  m_macPrintSettings, mode ) ;
-
-
+    
+    
     if ( data.IsOrientationReversed() )
         PMSetOrientation(  m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
     if ( data.IsOrientationReversed() )
         PMSetOrientation(  m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
-            kPMReverseLandscape : kPMReversePortrait , false ) ;
+                         kPMReverseLandscape : kPMReversePortrait , false ) ;
     else
         PMSetOrientation(  m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
     else
         PMSetOrientation(  m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
-            kPMLandscape : kPMPortrait , false ) ;
+                         kPMLandscape : kPMPortrait , false ) ;
+}
+
+void wxOSXPrintData::TransferResolutionFrom( const wxPrintData &data )
+{
+    PMPrinter printer;
+    PMSessionGetCurrentPrinter(m_macPrintSession, &printer);
 
     UInt32 resCount;
     PMResolution *resolutions = GetSupportedResolutions(printer, &resCount);
 
     UInt32 resCount;
     PMResolution *resolutions = GetSupportedResolutions(printer, &resCount);
@@ -284,7 +293,7 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
         wxPrintQuality quality = data.GetQuality();
         if (quality >= 0)
             quality = wxPRINT_QUALITY_HIGH;
         wxPrintQuality quality = data.GetQuality();
         if (quality >= 0)
             quality = wxPRINT_QUALITY_HIGH;
-        
+
         PMResolution res = resolutions[((quality - wxPRINT_QUALITY_DRAFT) * (resCount - 1)) / 3];
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
         if ( PMPrinterSetOutputResolution != NULL )
         PMResolution res = resolutions[((quality - wxPRINT_QUALITY_DRAFT) * (resCount - 1)) / 3];
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
         if ( PMPrinterSetOutputResolution != NULL )
@@ -296,16 +305,25 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
             PMSetResolution( m_macPageFormat, &res);
 #endif
         }
             PMSetResolution( m_macPageFormat, &res);
 #endif
         }
-
+        
         free(resolutions);
     }
         free(resolutions);
     }
+}
+
+bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
+{
+    TransferPrinterNameFrom(data);
+    TransferPaperInfoFrom(data);
+    TransferResolutionFrom(data);
+    
     // after setting the new resolution the format has to be updated, otherwise the page rect remains
     // at the 'old' scaling
     // after setting the new resolution the format has to be updated, otherwise the page rect remains
     // at the 'old' scaling
-
+    
     PMSessionValidatePageFormat(m_macPrintSession,
     PMSessionValidatePageFormat(m_macPrintSession,
-        m_macPageFormat, kPMDontWantBoolean);
+                                m_macPageFormat, kPMDontWantBoolean);
     PMSessionValidatePrintSettings(m_macPrintSession,
     PMSessionValidatePrintSettings(m_macPrintSession,
-        m_macPrintSettings, kPMDontWantBoolean);
+                                   m_macPrintSettings, kPMDontWantBoolean);
+
 #if wxOSX_USE_COCOA
     UpdateFromPMState();
 #endif
 #if wxOSX_USE_COCOA
     UpdateFromPMState();
 #endif
@@ -313,17 +331,31 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
     return true ;
 }
 
     return true ;
 }
 
-bool wxOSXPrintData::TransferTo( wxPrintData &data )
+void wxOSXPrintData::TransferPrinterNameTo( wxPrintData &data )
 {
 {
+    CFStringRef name;
+    PMPrinter printer ;
+    PMSessionGetCurrentPrinter( m_macPrintSession, &printer );
+    if (PMPrinterIsDefault(printer))
+        data.SetPrinterName(wxEmptyString);
+    else
+    {
+        name = PMPrinterGetName(printer);
+        CFRetain(name);
+        data.SetPrinterName(wxCFStringRef(name).AsString());
+    }
+}
+
+void wxOSXPrintData::TransferPaperInfoTo( wxPrintData &data )
+{
+    PMPrinter printer ;
+    PMSessionGetCurrentPrinter( m_macPrintSession, &printer );
     OSStatus err = noErr ;
     OSStatus err = noErr ;
-#if wxOSX_USE_COCOA
-    UpdateToPMState();
-#endif
     UInt32 copies ;
     err = PMGetCopies( m_macPrintSettings , &copies ) ;
     if ( err == noErr )
         data.SetNoCopies( copies ) ;
     UInt32 copies ;
     err = PMGetCopies( m_macPrintSettings , &copies ) ;
     if ( err == noErr )
         data.SetNoCopies( copies ) ;
-
+    
     PMOrientation orientation ;
     err = PMGetOrientation(  m_macPageFormat , &orientation ) ;
     if ( err == noErr )
     PMOrientation orientation ;
     err = PMGetOrientation(  m_macPageFormat , &orientation ) ;
     if ( err == noErr )
@@ -339,23 +371,12 @@ bool wxOSXPrintData::TransferTo( wxPrintData &data )
             data.SetOrientationReversed( orientation == kPMReverseLandscape );
         }
     }
             data.SetOrientationReversed( orientation == kPMReverseLandscape );
         }
     }
-
+    
     Boolean collate;
     if (PMGetCollate(m_macPrintSettings, &collate) == noErr)
         data.SetCollate(collate);
     Boolean collate;
     if (PMGetCollate(m_macPrintSettings, &collate) == noErr)
         data.SetCollate(collate);
-
-    CFStringRef name;
-    PMPrinter printer ;
-    PMSessionGetCurrentPrinter( m_macPrintSession, &printer );
-    if (PMPrinterIsDefault(printer))
-        data.SetPrinterName(wxEmptyString);
-    else
-    {
-        name = PMPrinterGetName(printer);
-        CFRetain(name);
-        data.SetPrinterName(wxCFStringRef(name).AsString());
-    }
-
+    
+    
     PMDuplexMode mode = 0 ;
     PMGetDuplex(  m_macPrintSettings, &mode ) ;
     switch( mode )
     PMDuplexMode mode = 0 ;
     PMGetDuplex(  m_macPrintSettings, &mode ) ;
     switch( mode )
@@ -371,10 +392,29 @@ bool wxOSXPrintData::TransferTo( wxPrintData &data )
             data.SetDuplex(wxDUPLEX_SIMPLEX);
             break ;
     }
             data.SetDuplex(wxDUPLEX_SIMPLEX);
             break ;
     }
+    
+    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)
+    {
+        data.SetPaperId(id);
+    }
+}
+
+void wxOSXPrintData::TransferResolutionTo( wxPrintData &data )
+{
+    PMPrinter printer ;
+    PMSessionGetCurrentPrinter( m_macPrintSession, &printer );
 
     /* assume high quality, will change below if we are able to */
     data.SetQuality(wxPRINT_QUALITY_HIGH);
 
     /* assume high quality, will change below if we are able to */
     data.SetQuality(wxPRINT_QUALITY_HIGH);
-    
+
     PMResolution *resolutions;
     UInt32 resCount;
     resolutions = GetSupportedResolutions(printer, &resCount);
     PMResolution *resolutions;
     UInt32 resCount;
     resolutions = GetSupportedResolutions(printer, &resCount);
@@ -406,19 +446,17 @@ bool wxOSXPrintData::TransferTo( wxPrintData &data )
         }
         free(resolutions);
     }    
         }
         free(resolutions);
     }    
-    
-    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)
-    {
-        data.SetPaperId(id);
-    }
+bool wxOSXPrintData::TransferTo( wxPrintData &data )
+{
+#if wxOSX_USE_COCOA
+    UpdateToPMState();
+#endif
+
+    TransferPrinterNameTo(data);
+    TransferPaperInfoTo(data);
+    TransferResolutionTo(data);
     return true ;
 }
 
     return true ;
 }
 
@@ -473,7 +511,7 @@ void wxOSXPrintData::TransferTo( wxPageSetupData* data )
 }
 
 void wxOSXPrintData::TransferTo( wxPrintDialogData* data )
 }
 
 void wxOSXPrintData::TransferTo( wxPrintDialogData* data )
-{ 
+{
 #if wxOSX_USE_COCOA
     UpdateToPMState();
 #endif
 #if wxOSX_USE_COCOA
     UpdateToPMState();
 #endif
@@ -525,11 +563,11 @@ wxPrintNativeDataBase* wxOSXCreatePrintData()
 {
 #if wxOSX_USE_COCOA
     return new wxOSXCocoaPrintData();
 {
 #if wxOSX_USE_COCOA
     return new wxOSXCocoaPrintData();
-#endif
-#if wxOSX_USE_CARBON
+#elif wxOSX_USE_CARBON
     return new wxOSXCarbonPrintData();
     return new wxOSXCarbonPrintData();
-#endif
+#else
     return NULL;
     return NULL;
+#endif
 }
 
 /*
 }
 
 /*
@@ -553,21 +591,10 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
     sm_abortWindow = NULL;
 
     if (!printout)
     sm_abortWindow = NULL;
 
     if (!printout)
+    {
+        sm_lastError = wxPRINTER_ERROR;
         return false;
         return false;
-
-    printout->SetIsPreview(false);
-
-    // Get some parameters from the printout, if defined
-    int fromPage, toPage;
-    int minPage, maxPage;
-    printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage);
-
-    if (maxPage == 0) return false;
-
-    // Only set min and max, because from and to will be
-    // set by the user
-    m_printDialogData.SetMinPage(minPage);
-    m_printDialogData.SetMaxPage(maxPage);
+    }
 
     if (m_printDialogData.GetMinPage() < 1)
         m_printDialogData.SetMinPage(1);
 
     if (m_printDialogData.GetMinPage() < 1)
         m_printDialogData.SetMinPage(1);
@@ -608,7 +635,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
 
     if (PMSessionGetCurrentPrinter(nativeData->GetPrintSession(), &printer) == noErr)
     {
 
     if (PMSessionGetCurrentPrinter(nativeData->GetPrintSession(), &printer) == noErr)
     {
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
         if ( PMPrinterGetOutputResolution != NULL )
         {
             if (PMPrinterGetOutputResolution( printer, nativeData->GetPrintSettings(), &res) == -9589 /* kPMKeyNotFound */ )
         if ( PMPrinterGetOutputResolution != NULL )
         {
             if (PMPrinterGetOutputResolution( printer, nativeData->GetPrintSettings(), &res) == -9589 /* kPMKeyNotFound */ )
@@ -619,7 +646,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
         else
 #endif
         {
         else
 #endif
         {
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
             PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res);
 #endif
         }
             PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res);
 #endif
         }
@@ -642,6 +669,22 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
 
     printout->OnPreparePrinting();
 
 
     printout->OnPreparePrinting();
 
+    // Get some parameters from the printout, if defined
+    int fromPage, toPage;
+    int minPage, maxPage;
+    printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage);
+
+    if (maxPage == 0)
+    {
+        sm_lastError = wxPRINTER_ERROR;
+        return false;
+    }
+
+    // Only set min and max, because from and to will be
+    // set by the user
+    m_printDialogData.SetMinPage(minPage);
+    m_printDialogData.SetMaxPage(maxPage);
+
     printout->OnBeginPrinting();
 
     bool keepGoing = true;
     printout->OnBeginPrinting();
 
     bool keepGoing = true;
@@ -659,7 +702,6 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
     {
         if (sm_abortIt)
         {
     {
         if (sm_abortIt)
         {
-                keepGoing = false;
                 break;
         }
         else
                 break;
         }
         else
@@ -676,8 +718,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
     if (sm_abortWindow)
     {
         sm_abortWindow->Show(false);
     if (sm_abortWindow)
     {
         sm_abortWindow->Show(false);
-        delete sm_abortWindow;
-        sm_abortWindow = NULL;
+        wxDELETE(sm_abortWindow);
     }
 
     wxEndBusyCursor();
     }
 
     wxEndBusyCursor();
@@ -717,7 +758,7 @@ bool wxMacPrinter::Setup(wxWindow *WXUNUSED(parent))
     return (ret == wxID_OK);
 #endif
 
     return (ret == wxID_OK);
 #endif
 
-    return wxID_CANCEL;
+    return false;
 }
 
 /*
 }
 
 /*