X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/08680429a25d66e284c75f69f14fe8ca6ab15f72..ea8ca011a351c6aaa4009bedbf0cec19a7c57d98:/src/mac/carbon/printmac.cpp diff --git a/src/mac/carbon/printmac.cpp b/src/mac/carbon/printmac.cpp index bb1901b3eb..0415a33953 100644 --- a/src/mac/carbon/printmac.cpp +++ b/src/mac/carbon/printmac.cpp @@ -9,19 +9,15 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "printwin.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if wxUSE_PRINTING_ARCHITECTURE + #ifdef __BORLANDC__ #pragma hdrstop #endif -#include "wx/defs.h" - #ifndef WX_PRECOMP #include "wx/utils.h" #include "wx/dc.h" @@ -29,32 +25,26 @@ #include "wx/msgdlg.h" #endif +#include "wx/math.h" #include "wx/mac/uma.h" #include "wx/mac/printmac.h" #include "wx/mac/private/print.h" -#define mm2pt 2.83464566929 -#define pt2mm 0.352777777778 - #include "wx/dcprint.h" #include "wx/printdlg.h" #include "wx/mac/printdlg.h" #include -#if !USE_SHARED_LIBRARY +IMPLEMENT_DYNAMIC_CLASS(wxMacCarbonPrintData, wxPrintNativeDataBase) IMPLEMENT_DYNAMIC_CLASS(wxMacPrinter, wxPrinterBase) IMPLEMENT_CLASS(wxMacPrintPreview, wxPrintPreviewBase) -#endif -#if TARGET_CARBON - -wxNativePrintData* wxNativePrintData::Create() +bool wxMacCarbonPrintData::Ok() const { - return new wxMacCarbonPrintData() ; + return (m_macPageFormat != kPMNoPageFormat) && (m_macPrintSettings != kPMNoPrintSettings) && (m_macPrintSession != kPMNoReference); } - wxMacCarbonPrintData::wxMacCarbonPrintData() { m_macPageFormat = kPMNoPageFormat; @@ -136,11 +126,11 @@ void wxMacCarbonPrintData::ValidateOrCreate() } } -void wxMacCarbonPrintData::TransferFrom( wxPrintData* data ) +bool wxMacCarbonPrintData::TransferFrom( const wxPrintData &data ) { ValidateOrCreate() ; - PMSetCopies( (PMPrintSettings) m_macPrintSettings , data->GetNoCopies() , false ) ; - PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data->GetOrientation() == wxLANDSCAPE ) ? + PMSetCopies( (PMPrintSettings) m_macPrintSettings , data.GetNoCopies() , false ) ; + PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ? kPMLandscape : kPMPortrait , false ) ; // collate cannot be set #if 0 // not yet tested @@ -149,7 +139,7 @@ void wxMacCarbonPrintData::TransferFrom( wxPrintData* data ) #endif PMColorMode color ; PMGetColorMode( (PMPrintSettings) m_macPrintSettings, &color ) ; - if ( data->GetColour() ) + if ( data.GetColour() ) { if ( color == kPMBlackAndWhite ) PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ; @@ -160,25 +150,33 @@ void wxMacCarbonPrintData::TransferFrom( wxPrintData* data ) // PMDuplexMode not yet accessible via API // PMQualityMode not yet accessible via API // todo paperSize + PMResolution res; + PMPrinter printer; + PMTag tag = kPMMaxSquareResolution; + PMSessionGetCurrentPrinter(m_macPrintSession, &printer); + PMPrinterGetPrinterResolution(printer, tag, &res); + PMSetResolution((PMPageFormat) m_macPageFormat, &res); + + return true ; } -void wxMacCarbonPrintData::TransferTo( wxPrintData* data ) +bool wxMacCarbonPrintData::TransferTo( wxPrintData &data ) { OSStatus err = noErr ; UInt32 copies ; err = PMGetCopies( m_macPrintSettings , &copies ) ; if ( err == noErr ) - data->SetNoCopies( copies ) ; + data.SetNoCopies( copies ) ; PMOrientation orientation ; err = PMGetOrientation( m_macPageFormat , &orientation ) ; if ( err == noErr ) { if ( orientation == kPMPortrait || orientation == kPMReversePortrait ) - data->SetOrientation( wxPORTRAIT ); + data.SetOrientation( wxPORTRAIT ); else - data->SetOrientation( wxLANDSCAPE ); + data.SetOrientation( wxLANDSCAPE ); } // collate cannot be set @@ -195,7 +193,7 @@ void wxMacCarbonPrintData::TransferTo( wxPrintData* data ) PMColorMode color ; err = PMGetColorMode( m_macPrintSettings, &color ) ; if ( err == noErr ) - data->SetColour( !(color == kPMBlackAndWhite) ) ; + data.SetColour( !(color == kPMBlackAndWhite) ) ; // PMDuplexMode not yet accessible via API // PMQualityMode not yet accessible via API @@ -204,10 +202,11 @@ void wxMacCarbonPrintData::TransferTo( wxPrintData* data ) err = PMGetUnadjustedPaperRect( m_macPageFormat, &rPaper); if ( err == noErr ) { - data->SetPaperSize( wxSize ( + data.SetPaperSize( wxSize ( (int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) , (int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ) ) ); } + return true ; } void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *data ) @@ -215,14 +214,11 @@ void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *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 -#if TARGET_CARBON -#else -#endif } void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data ) { - PMRect rPaper; + PMRect rPaper; OSStatus err = PMGetUnadjustedPaperRect(m_macPageFormat, &rPaper); if ( err == noErr ) { @@ -234,9 +230,24 @@ void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data ) (int)(((double) rPage.left - rPaper.left ) * pt2mm) , (int)(((double) rPage.top - rPaper.top ) * pt2mm) ) ) ; - data->SetMinMarginBottomRight( wxPoint ( + data->SetMinMarginBottomRight( wxPoint ( (wxCoord)(((double) rPaper.right - rPage.right ) * pt2mm), (wxCoord)(((double) rPaper.bottom - rPage.bottom ) * pt2mm)) ) ; + + if ( data->GetMarginTopLeft().x < data->GetMinMarginTopLeft().x ) + data->SetMarginTopLeft( wxPoint( data->GetMinMarginTopLeft().x , + data->GetMarginTopLeft().y ) ) ; + + if ( data->GetMarginBottomRight().x < data->GetMinMarginBottomRight().x ) + data->SetMarginBottomRight( wxPoint( data->GetMinMarginBottomRight().x , + data->GetMarginBottomRight().y ) ); + + if ( data->GetMarginTopLeft().y < data->GetMinMarginTopLeft().y ) + data->SetMarginTopLeft( wxPoint( data->GetMarginTopLeft().x , data->GetMinMarginTopLeft().y ) ); + + if ( data->GetMarginBottomRight().y < data->GetMinMarginBottomRight().y ) + data->SetMarginBottomRight( wxPoint( data->GetMarginBottomRight().x , + data->GetMinMarginBottomRight().y) ); } } } @@ -253,274 +264,33 @@ void wxMacCarbonPrintData::TransferTo( wxPrintDialogData* data ) UInt32 from , to ; PMGetFirstPage( m_macPrintSettings , &from ) ; PMGetLastPage( m_macPrintSettings , &to ) ; - data->SetFromPage( from ) ; - data->SetToPage( to ) ; -} - -void wxMacCarbonPrintData::TransferFrom( wxPrintDialogData* data ) -{ - PMSetPageRange( m_macPrintSettings , data->GetMinPage() , data->GetMaxPage() ) ; - PMSetCopies( m_macPrintSettings , data->GetNoCopies() , false ) ; - PMSetFirstPage( m_macPrintSettings , data->GetFromPage() , false ) ; - - int toPage = data->GetToPage(); - if (toPage < 1) - toPage = data->GetFromPage(); - PMSetLastPage( m_macPrintSettings , toPage , false ) ; -} - -void wxMacCarbonPrintData::CopyFrom( wxNativePrintData* d ) -{ - wxMacCarbonPrintData *data = (wxMacCarbonPrintData*) d ; - if ( data->m_macPrintSession != kPMNoReference ) - PMRetain( data->m_macPrintSession ) ; - if ( m_macPrintSession != kPMNoReference ) - { - PMRelease( m_macPrintSession ) ; - m_macPrintSession = kPMNoReference ; - } - if ( data->m_macPrintSession != kPMNoReference ) - m_macPrintSession = data->m_macPrintSession ; - - if ( data->m_macPrintSettings != kPMNoPrintSettings ) - PMRetain( data->m_macPrintSettings ) ; - if ( m_macPrintSettings != kPMNoPrintSettings ) - { - PMRelease( m_macPrintSettings ) ; - m_macPrintSettings = kPMNoPrintSettings ; - } - if ( data->m_macPrintSettings != kPMNoPrintSettings ) - m_macPrintSettings = data->m_macPrintSettings ; - - if ( data->m_macPageFormat != kPMNoPageFormat ) - PMRetain( data->m_macPageFormat ) ; - if ( m_macPageFormat != kPMNoPageFormat ) - { - PMRelease( m_macPageFormat ) ; - m_macPageFormat = kPMNoPageFormat ; - } - if ( data->m_macPageFormat != kPMNoPageFormat ) - m_macPageFormat = data->m_macPageFormat ; -} - -int wxMacCarbonPrintData::ShowPrintDialog() -{ - int result = wxID_CANCEL ; - OSErr err = noErr ; - wxString message ; - - Boolean accepted; - - { - // Display the Print dialog. - if (err == noErr) - { - err = PMSessionPrintDialog( m_macPrintSession, - m_macPrintSettings, - m_macPageFormat, - &accepted); - if ((err == noErr) && !accepted) - { - err = kPMCancel; // user clicked Cancel button - } - } - if ( err == noErr ) - { - result = wxID_OK ; - } - } - if ((err != noErr) && (err != kPMCancel)) + if ( to >= 0x7FFFFFFF ) // due to an OS Bug we don't get back kPMPrintAllPages { - message.Printf( wxT("Print Error %d"), err ) ; - wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ; - dialog.ShowModal(); - } - - return result ; -} - -int wxMacCarbonPrintData::ShowPageSetupDialog() -{ - int result = wxID_CANCEL ; - OSErr err = noErr ; - wxString message ; - - Boolean accepted; - { - // Display the Page Setup dialog. - if (err == noErr) - { - err = PMSessionPageSetupDialog( m_macPrintSession, - m_macPageFormat, - &accepted); - if ((err == noErr) && !accepted) - { - err = kPMCancel; // user clicked Cancel button - } - } - - // If the user did not cancel, flatten and save the PageFormat object - // with our document. - if (err == noErr) { - result = wxID_OK ; - } - } - if ((err != noErr) && (err != kPMCancel)) - { - message.Printf( wxT("Print Error %d"), err ) ; - wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ; - dialog.ShowModal(); - } - - return result ; -} - -#else - -wxNativePrintData* wxNativePrintData::Create() -{ - return new wxMacClassicPrintData() ; -} - -wxMacClassicPrintData::wxMacClassicPrintData() -{ - m_macPrintSettings = NULL ; - ValidateOrCreate() ; -} - -wxMacClassicPrintData::~wxMacClassicPrintData() -{ - wxASSERT( m_macPrintSettings ); - DisposeHandle( (Handle) m_macPrintSettings ) ; -} - -void wxMacClassicPrintData::ValidateOrCreate() -{ - if ( m_macPrintSettings == NULL ) - { - m_macPrintSettings = (THPrint) NewHandleClear( sizeof( TPrint ) ); - (**m_macPrintSettings).iPrVersion = 0; // something invalid - - (**m_macPrintSettings).prInfo.iHRes = 72; - (**m_macPrintSettings).prInfo.iVRes = 72; - Rect r1 = { 0, 0, 8*72 - 2 * 18, 11*72 - 2 * 36 }; - (**m_macPrintSettings).prInfo.rPage = r1;// must have its top left & (0,0) - - Rect r2 = { -18, -36, 8*72 - 18, 11*72 - 36 }; - (**m_macPrintSettings).rPaper = r2; - (**m_macPrintSettings).prStl.iPageV = 11 * 120 ; // 11 inches in 120th of an inch - (**m_macPrintSettings).prStl.iPageH = 8 * 120 ; // 8 inches in 120th of an inch + data->SetAllPages( true ) ; + // This means all pages, more or less + data->SetFromPage(1); + data->SetToPage(32000); } else { + data->SetFromPage( from ) ; + data->SetToPage( to ) ; + data->SetAllPages( false ); } } -void wxMacClassicPrintData::TransferFrom( wxPrintData* data ) -{ - ValidateOrCreate() ; - (**m_macPrintSettings).prJob.iCopies = data->GetNoCopies() ; - // on mac the paper rect has a negative top left corner, because the page rect (printable area) is at 0,0 - // if all printing data is consolidated in on structure we will be able to set additional infos about pages -} - -void wxMacClassicPrintData::TransferTo( wxPrintData* data ) -{ - data->SetNoCopies( (**m_macPrintSettings).prJob.iCopies ); - data->SetPaperSize( wxSize( - ((double) (**m_macPrintSettings).rPaper.right - (**m_macPrintSettings).rPaper.left ) * pt2mm , - ((double) (**m_macPrintSettings).rPaper.bottom - (**m_macPrintSettings).rPaper.top ) * pt2mm ) ) ; -} - -void wxMacClassicPrintData::TransferFrom( wxPageSetupData *data ) -{ -} - -void wxMacClassicPrintData::TransferTo( wxPageSetupData* data ) -{ - data->SetMinMarginTopLeft( wxPoint( - ((double) (**m_macPrintSettings).prInfo.rPage.left -(**m_macPrintSettings).rPaper.left ) * pt2mm , - ((double) (**m_macPrintSettings).prInfo.rPage.top -(**m_macPrintSettings).rPaper.top ) * pt2mm ) ) ; - data->SetMinMarginBottomRight( wxPoint( - ((double) (**m_macPrintSettings).rPaper.right - (**m_macPrintSettings).prInfo.rPage.right ) * pt2mm , - ((double)(**m_macPrintSettings).rPaper.bottom - (**m_macPrintSettings).prInfo.rPage.bottom ) * pt2mm ) ) ; -} - -void wxMacClassicPrintData::TransferFrom( wxPrintDialogData* data ) -{ - int toPage = data->GetToPage(); - if (toPage < 1) - toPage = data->GetFromPage(); - (**m_macPrintSettings).prJob.iFstPage = data->GetFromPage() ; - (**m_macPrintSettings).prJob.iLstPage = toPage; -} - -void wxMacClassicPrintData::TransferTo( wxPrintDialogData* data ) -{ - data->SetFromPage( (**m_macPrintSettings).prJob.iFstPage ) ; - data->SetToPage( (**m_macPrintSettings).prJob.iLstPage ) ; -} - -void wxMacClassicPrintData::CopyFrom( wxNativePrintData* data ) -{ - DisposeHandle( (Handle) m_macPrintSettings ) ; - m_macPrintSettings = ((wxMacClassicPrintData*)data)->m_macPrintSettings; - HandToHand( (Handle*) &m_macPrintSettings ); -} - -int wxMacClassicPrintData::ShowPrintDialog() +void wxMacCarbonPrintData::TransferFrom( wxPrintDialogData* data ) { - int result = wxID_CANCEL ; - OSErr err = noErr ; - wxString message ; - - err = ::UMAPrOpen() ; - if ( err == noErr ) - { - if ( ::PrJobDialog( m_macPrintSettings ) ) - { - result = wxID_OK ; - } - - } - else - { - message.Printf( wxT("Print Error %d"), err ) ; - wxMessageDialog dialog( NULL , message , wxT(""), wxICON_HAND | wxOK) ; - dialog.ShowModal(); - } - ::UMAPrClose() ; - - return result ; -} + PMSetPageRange( m_macPrintSettings , data->GetMinPage() , data->GetMaxPage() ) ; + PMSetCopies( m_macPrintSettings , data->GetNoCopies() , false ) ; + PMSetFirstPage( m_macPrintSettings , data->GetFromPage() , false ) ; -int wxMacClassicPrintData::ShowPageSetupDialog() -{ - int result = wxID_CANCEL ; - OSErr err = noErr ; - wxString message ; - - err = ::UMAPrOpen() ; - if ( err == noErr ) - { - if ( ::PrStlDialog( m_macPrintSettings ) ) - { - result = wxID_OK ; - } - - } + if (data->GetAllPages() || data->GetFromPage() == 0) + PMSetLastPage( m_macPrintSettings , (UInt32) kPMPrintAllPages, true ) ; else - { - message.Printf( wxT("Print Error %d"), err ) ; - wxMessageDialog dialog( NULL , message , wxEmptyString , wxICON_HAND | wxOK) ; - dialog.ShowModal(); - } - ::UMAPrClose() ; - return result ; + PMSetLastPage( m_macPrintSettings , (UInt32) data->GetToPage() , false ) ; } -#endif - /* * Printer */ @@ -536,13 +306,13 @@ wxMacPrinter::~wxMacPrinter(void) bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) { - sm_abortIt = FALSE; + sm_abortIt = false; sm_abortWindow = NULL; - + if (!printout) - return FALSE; - - printout->SetIsPreview(FALSE); + return false; + + printout->SetIsPreview(false); if (m_printDialogData.GetMinPage() < 1) m_printDialogData.SetMinPage(1); if (m_printDialogData.GetMaxPage() < 1) @@ -563,69 +333,74 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) { dc = new wxPrinterDC( m_printDialogData.GetPrintData() ) ; } - - + // May have pressed cancel. if (!dc || !dc->Ok()) { - if (dc) delete dc; - return FALSE; + if (dc) + delete dc; + return false; } - + // on the mac we have always pixels as addressing mode with 72 dpi - printout->SetPPIScreen(72, 72); - printout->SetPPIPrinter(72, 72); - - // Set printout parameters + PMResolution res; + wxMacCarbonPrintData* nativeData = (wxMacCarbonPrintData*) + (m_printDialogData.GetPrintData().GetNativeData()); + PMGetResolution((PMPageFormat) (nativeData->m_macPageFormat), &res); + printout->SetPPIPrinter(int(res.hRes), int(res.vRes)); + + // Set printout parameters 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); - + // Create an abort window wxBeginBusyCursor(); - + 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) { wxEndBusyCursor(); - return FALSE; + return false; } - + // Only set min and max, because from and to have been // set by the user m_printDialogData.SetMinPage(minPage); m_printDialogData.SetMaxPage(maxPage); - + wxWindow *win = CreateAbortWindow(parent, printout); wxSafeYield(win,true); - + if (!win) { wxEndBusyCursor(); wxMessageBox(wxT("Sorry, could not create an abort dialog."), wxT("Print Error"), wxOK, parent); delete dc; - return FALSE; + + return false; } + sm_abortWindow = win; - sm_abortWindow->Show(TRUE); + sm_abortWindow->Show(true); wxSafeYield(win,true); - + printout->OnBeginPrinting(); - - bool keepGoing = TRUE; - + + bool keepGoing = true; + int copyCount; for (copyCount = 1; copyCount <= m_printDialogData.GetNoCopies(); copyCount ++) { @@ -637,14 +412,15 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) } if (sm_abortIt) break; - + int pn; - for (pn = m_printDialogData.GetFromPage(); keepGoing && (pn <= m_printDialogData.GetToPage()) && printout->HasPage(pn); + for (pn = m_printDialogData.GetFromPage(); + keepGoing && (pn <= m_printDialogData.GetToPage()) && printout->HasPage(pn); pn++) { if (sm_abortIt) { - keepGoing = FALSE; + keepGoing = false; break; } else @@ -670,7 +446,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) if (sm_abortWindow) { - sm_abortWindow->Show(FALSE); + sm_abortWindow->Show(false); delete sm_abortWindow; sm_abortWindow = NULL; } @@ -679,7 +455,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) delete dc; - return TRUE; + return true; } wxDC* wxMacPrinter::PrintDialog(wxWindow *parent) @@ -702,17 +478,16 @@ bool wxMacPrinter::Setup(wxWindow *parent) { #if 0 wxPrintDialog dialog(parent, & m_printDialogData); - dialog.GetPrintDialogData().SetSetupDialog(TRUE); + dialog.GetPrintDialogData().SetSetupDialog(true); int ret = dialog.ShowModal(); if (ret == wxID_OK) - { m_printDialogData = dialog.GetPrintDialogData(); - } return (ret == wxID_OK); #endif + return wxID_CANCEL; } @@ -741,7 +516,8 @@ wxMacPrintPreview::~wxMacPrintPreview(void) bool wxMacPrintPreview::Print(bool interactive) { if (!m_printPrintout) - return FALSE; + return false; + wxMacPrinter printer(&m_printDialogData); return printer.Print(m_previewFrame, m_printPrintout, interactive); } @@ -777,9 +553,12 @@ void wxMacPrintPreview::DetermineScaling(void) { m_isOk = false ; } + // At 100%, the page should look about page-size on the screen. // m_previewScale = (float)((float)screenWidth/(float)printerWidth); // m_previewScale = m_previewScale * (float)((float)screenXRes/(float)printerXRes); - - m_previewScale = 1 ; + + m_previewScale = 1 ; } + +#endif