X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/746d7582973593a058ae72d24ac489bc2fc87832..62f864c32c53356b7228591c85b14abc491c46f0:/src/mac/carbon/printmac.cpp?ds=sidebyside diff --git a/src/mac/carbon/printmac.cpp b/src/mac/carbon/printmac.cpp index 426fa98c7a..bfccc761a5 100644 --- a/src/mac/carbon/printmac.cpp +++ b/src/mac/carbon/printmac.cpp @@ -9,19 +9,19 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #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,31 +29,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; @@ -135,20 +130,20 @@ 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 if ( m_printerName.Length() > 0 ) - PMSessionSetCurrentPrinter( (PMPrintSession) m_macPrintSession , wxMacCFStringHolder( m_printerName ) ) ; + PMSessionSetCurrentPrinter( (PMPrintSession) m_macPrintSession , wxMacCFStringHolder( m_printerName , wxFont::GetDefaultEncoding() ) ) ; #endif PMColorMode color ; PMGetColorMode( (PMPrintSettings) m_macPrintSettings, &color ) ; - if ( data->GetColour() ) + if ( data.GetColour() ) { if ( color == kPMBlackAndWhite ) PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ; @@ -159,25 +154,26 @@ void wxMacCarbonPrintData::TransferFrom( wxPrintData* data ) // PMDuplexMode not yet accessible via API // PMQualityMode not yet accessible via API // todo paperSize + 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 @@ -194,7 +190,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 @@ -203,10 +199,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 ) @@ -214,9 +211,6 @@ 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 ) @@ -234,8 +228,24 @@ void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data ) (int)(((double) rPage.top - rPaper.top ) * pt2mm) ) ) ; data->SetMinMarginBottomRight( wxPoint ( - ((double) rPaper.right - rPage.right ) * pt2mm , - ((double) rPaper.bottom - rPage.bottom ) * pt2mm ) ) ; + (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) ); + } } } @@ -261,258 +271,13 @@ void wxMacCarbonPrintData::TransferFrom( wxPrintDialogData* data ) PMSetPageRange( m_macPrintSettings , data->GetMinPage() , data->GetMaxPage() ) ; PMSetCopies( m_macPrintSettings , data->GetNoCopies() , false ) ; PMSetFirstPage( m_macPrintSettings , data->GetFromPage() , false ) ; - PMSetLastPage( m_macPrintSettings , data->GetToPage() , 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)) - { - 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 - } - else - { - } -} -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 ) ) ; + int toPage = data->GetToPage(); + if (toPage < 1) + toPage = data->GetFromPage(); + PMSetLastPage( m_macPrintSettings , toPage , false ) ; } -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 ) -{ - (**m_macPrintSettings).prJob.iFstPage = data->GetFromPage() ; - (**m_macPrintSettings).prJob.iLstPage = data->GetToPage() ; -} - -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() -{ - 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 ; -} - -int wxMacClassicPrintData::ShowPageSetupDialog() -{ - int result = wxID_CANCEL ; - OSErr err = noErr ; - wxString message ; - - err = ::UMAPrOpen() ; - if ( err == noErr ) - { - if ( ::PrStlDialog( m_macPrintSettings ) ) - { - result = wxID_OK ; - } - - } - else - { - message.Printf( wxT("Print Error %d"), err ) ; - wxMessageDialog dialog( NULL , message , wxEmptyString , wxICON_HAND | wxOK) ; - dialog.ShowModal(); - } - ::UMAPrClose() ; - return result ; -} - -#endif - /* * Printer */ @@ -535,38 +300,11 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) return FALSE; printout->SetIsPreview(FALSE); - 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) - return FALSE; - - m_printDialogData.SetMinPage(minPage); - m_printDialogData.SetMaxPage(maxPage); - if (fromPage != 0) - m_printDialogData.SetFromPage(fromPage); - if (toPage != 0) - m_printDialogData.SetToPage(toPage); - - if (minPage != 0) - { - m_printDialogData.EnablePageNumbers(TRUE); - if (m_printDialogData.GetFromPage() < m_printDialogData.GetMinPage()) - m_printDialogData.SetFromPage(m_printDialogData.GetMinPage()); - else if (m_printDialogData.GetFromPage() > m_printDialogData.GetMaxPage()) - m_printDialogData.SetFromPage(m_printDialogData.GetMaxPage()); - if (m_printDialogData.GetToPage() > m_printDialogData.GetMaxPage()) - m_printDialogData.SetToPage(m_printDialogData.GetMaxPage()); - else if (m_printDialogData.GetToPage() < m_printDialogData.GetMinPage()) - m_printDialogData.SetToPage(m_printDialogData.GetMinPage()); - } - else - m_printDialogData.EnablePageNumbers(FALSE); - + if (m_printDialogData.GetMinPage() < 1) + m_printDialogData.SetMinPage(1); + if (m_printDialogData.GetMaxPage() < 1) + m_printDialogData.SetMaxPage(9999); + // Create a suitable device context wxDC *dc = NULL; if (prompt) @@ -575,7 +313,7 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) if (dialog.ShowModal() == wxID_OK) { dc = dialog.GetPrintDC(); - m_printDialogData = dialog.GetPrintData(); + m_printDialogData = dialog.GetPrintDialogData(); } } else @@ -609,6 +347,24 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) // 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; + } + + // 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); @@ -650,12 +406,15 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) } else { -// #if !TARGET_CARBON - GrafPtr thePort ; - GetPort( &thePort ) ; - wxSafeYield(win,true); - SetPort( thePort ) ; -// #endif +#if TARGET_CARBON + if ( UMAGetSystemVersion() >= 0x1000 ) +#endif + { + GrafPtr thePort ; + GetPort( &thePort ) ; + wxSafeYield(win,true); + SetPort( thePort ) ; + } dc->StartPage(); keepGoing = printout->OnPrintPage(pn); dc->EndPage(); @@ -698,6 +457,7 @@ wxDC* wxMacPrinter::PrintDialog(wxWindow *parent) bool wxMacPrinter::Setup(wxWindow *parent) { +#if 0 wxPrintDialog dialog(parent, & m_printDialogData); dialog.GetPrintDialogData().SetSetupDialog(TRUE); @@ -709,6 +469,8 @@ bool wxMacPrinter::Setup(wxWindow *parent) } return (ret == wxID_OK); +#endif + return wxID_CANCEL; } /* @@ -778,3 +540,5 @@ void wxMacPrintPreview::DetermineScaling(void) m_previewScale = 1 ; } + +#endif