]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/printps.cpp
56f95f30678d649e2d853cc3eadbad747ecdf66e
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Postscript print/preview framework 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart and Markus Holzem 
   9 // Licence:     wxWindows license 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  21     #pragma implementation "printps.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  37     #include "wx/msgdlg.h" 
  39     #include "wx/progdlg.h" 
  42 #include "wx/generic/printps.h" 
  43 #include "wx/dcprint.h" 
  44 #include "wx/printdlg.h" 
  45 #include "wx/generic/prntdlgg.h" 
  50 // ---------------------------------------------------------------------------- 
  52 // ---------------------------------------------------------------------------- 
  54 #if !USE_SHARED_LIBRARY 
  55     IMPLEMENT_DYNAMIC_CLASS(wxPostScriptPrinter
, wxPrinterBase
) 
  56     IMPLEMENT_CLASS(wxPostScriptPrintPreview
, wxPrintPreviewBase
) 
  59 // ============================================================================ 
  61 // ============================================================================ 
  63 // ---------------------------------------------------------------------------- 
  65 // ---------------------------------------------------------------------------- 
  67 wxPostScriptPrinter::wxPostScriptPrinter(wxPrintDialogData 
*data
) 
  72 wxPostScriptPrinter::~wxPostScriptPrinter() 
  76 bool wxPostScriptPrinter::Print(wxWindow 
*parent
, wxPrintout 
*printout
, bool prompt
) 
  79     sm_abortWindow 
= (wxWindow 
*) NULL
; 
  84     printout
->SetIsPreview(FALSE
); 
  85     printout
->OnPreparePrinting(); 
  87     // Get some parameters from the printout, if defined 
  90     printout
->GetPageInfo(&minPage
, &maxPage
, &fromPage
, &toPage
); 
  95     m_printDialogData
.SetMinPage(minPage
); 
  96     m_printDialogData
.SetMaxPage(maxPage
); 
  98         m_printDialogData
.SetFromPage(fromPage
); 
 100         m_printDialogData
.SetToPage(toPage
); 
 104         m_printDialogData
.EnablePageNumbers(TRUE
); 
 105         if (m_printDialogData
.GetFromPage() < m_printDialogData
.GetMinPage()) 
 106             m_printDialogData
.SetFromPage(m_printDialogData
.GetMinPage()); 
 107         else if (m_printDialogData
.GetFromPage() > m_printDialogData
.GetMaxPage()) 
 108             m_printDialogData
.SetFromPage(m_printDialogData
.GetMaxPage()); 
 109         if (m_printDialogData
.GetToPage() > m_printDialogData
.GetMaxPage()) 
 110             m_printDialogData
.SetToPage(m_printDialogData
.GetMaxPage()); 
 111         else if (m_printDialogData
.GetToPage() < m_printDialogData
.GetMinPage()) 
 112             m_printDialogData
.SetToPage(m_printDialogData
.GetMinPage()); 
 115         m_printDialogData
.EnablePageNumbers(FALSE
); 
 118     // Create a suitable device context 
 119     wxDC 
*dc 
= (wxDC 
*) NULL
; 
 122         dc 
= PrintDialog(parent
); 
 128         dc 
= new wxPostScriptDC(wxThePrintSetupData
->GetPrinterFile(), FALSE
, (wxWindow 
*) NULL
); 
 131     // May have pressed cancel. 
 132     if (!dc 
|| !dc
->Ok()) 
 138     int logPPIScreenX 
= 0; 
 139     int logPPIScreenY 
= 0; 
 140     int logPPIPrinterX 
= 0; 
 141     int logPPIPrinterY 
= 0; 
 147     // Correct values for X/PostScript? 
 148     logPPIPrinterX = 100; 
 149     logPPIPrinterY = 100; 
 155     printout
->SetPPIScreen(logPPIScreenX
, logPPIScreenY
); 
 156     printout
->SetPPIPrinter(logPPIPrinterX
, logPPIPrinterY
); 
 158     // Set printout parameters 
 163     printout
->SetPageSizePixels((int)w
, (int)h
); 
 164     dc
->GetSizeMM(&w
, &h
); 
 165     printout
->SetPageSizeMM((int)w
, (int)h
); 
 167     // Create an abort window 
 171        pagesPerCopy 
= m_printDialogData
.GetToPage()-m_printDialogData
.GetFromPage()+1, 
 172        totalPages 
= pagesPerCopy 
* m_printDialogData
.GetNoCopies(), 
 174     // Open the progress bar dialog 
 175     wxProgressDialog 
*progressDialog 
= new wxProgressDialog ( 
 176        printout
->GetTitle(), 
 180        /* disable parent only */ true, 
 181        /* show abort button */ true); 
 183     printout
->OnBeginPrinting(); 
 185     bool keepGoing 
= TRUE
; 
 188     for (copyCount 
= 1; copyCount 
<= m_printDialogData
.GetNoCopies(); copyCount 
++) 
 190         if (!printout
->OnBeginDocument(m_printDialogData
.GetFromPage(), m_printDialogData
.GetToPage())) 
 193             wxMessageBox(_("Could not start printing."), _("Print Error"), wxOK
, parent
); 
 200         for (pn 
= m_printDialogData
.GetFromPage(); keepGoing 
&& (pn 
<= m_printDialogData
.GetToPage()) && printout
->HasPage(pn
); 
 211                msg
.Printf(_("Printing page %d..."), printedPages
+1); 
 212                if(progressDialog
->Update(printedPages
++, msg
)) 
 215                   printout
->OnPrintPage(pn
); 
 225         printout
->OnEndDocument(); 
 228     printout
->OnEndPrinting(); 
 229     delete progressDialog
; 
 238 wxDC
* wxPostScriptPrinter::PrintDialog(wxWindow 
*parent
) 
 240     wxDC
* dc 
= (wxDC
*) NULL
; 
 241     wxGenericPrintDialog
* dialog 
= new wxGenericPrintDialog(parent
, & m_printDialogData
); 
 242     int ret 
= dialog
->ShowModal() ; 
 245         dc 
= dialog
->GetPrintDC(); 
 246         m_printDialogData 
= dialog
->GetPrintDialogData(); 
 253 bool wxPostScriptPrinter::Setup(wxWindow 
*parent
) 
 255     wxGenericPrintDialog
* dialog 
= new wxGenericPrintDialog(parent
, & m_printDialogData
); 
 256     dialog
->GetPrintDialogData().SetSetupDialog(TRUE
); 
 258     int ret 
= dialog
->ShowModal(); 
 262         m_printDialogData 
= dialog
->GetPrintDialogData(); 
 267     return (ret 
== wxID_OK
); 
 270 // ---------------------------------------------------------------------------- 
 272 // ---------------------------------------------------------------------------- 
 274 void wxPostScriptPrintPreview::Init(wxPrintout 
* WXUNUSED(printout
), 
 275                                     wxPrintout 
* WXUNUSED(printoutForPrinting
)) 
 277     // Have to call it here since base constructor can't call it 
 281 wxPostScriptPrintPreview::wxPostScriptPrintPreview(wxPrintout 
*printout
, 
 282                                                    wxPrintout 
*printoutForPrinting
, 
 283                                                    wxPrintDialogData 
*data
) 
 284                         : wxPrintPreviewBase(printout
, printoutForPrinting
, data
) 
 286     Init(printout
, printoutForPrinting
); 
 289 wxPostScriptPrintPreview::wxPostScriptPrintPreview(wxPrintout 
*printout
, 
 290                                                    wxPrintout 
*printoutForPrinting
, 
 292                         : wxPrintPreviewBase(printout
, printoutForPrinting
, data
) 
 294     Init(printout
, printoutForPrinting
); 
 297 wxPostScriptPrintPreview::~wxPostScriptPrintPreview() 
 301 bool wxPostScriptPrintPreview::Print(bool interactive
) 
 303     if (!m_printPrintout
) 
 305     wxPostScriptPrinter 
printer(& m_printDialogData
); 
 306     return printer
.Print(m_previewFrame
, m_printPrintout
, interactive
); 
 309 void wxPostScriptPrintPreview::DetermineScaling() 
 311     wxPaperSize paperType 
= m_printDialogData
.GetPrintData().GetPaperId(); 
 312     if (paperType 
== wxPAPER_NONE
) 
 313         paperType 
= wxPAPER_NONE
; 
 315     wxPrintPaperType 
*paper 
= wxThePrintPaperDatabase
->FindPaperType(paperType
); 
 317         paper 
= wxThePrintPaperDatabase
->FindPaperType(wxPAPER_A4
); 
 321         m_previewPrintout
->SetPPIScreen(100, 100); 
 322         //      m_previewPrintout->SetPPIPrinter(100, 100); 
 323         m_previewPrintout
->SetPPIPrinter(72, 72); 
 325         wxSize 
sizeDevUnits(paper
->GetSizeDeviceUnits()); 
 326         wxSize 
sizeTenthsMM(paper
->GetSize()); 
 327         wxSize 
sizeMM(sizeTenthsMM
.x 
/ 10, sizeTenthsMM
.y 
/ 10); 
 329         // If in landscape mode, we need to swap the width and height. 
 330         if ( m_printDialogData
.GetPrintData().GetOrientation() == wxLANDSCAPE 
) 
 332             m_pageWidth 
= sizeDevUnits
.y
; 
 333             m_pageHeight 
= sizeDevUnits
.x
; 
 334             m_previewPrintout
->SetPageSizeMM(sizeMM
.y
, sizeMM
.x
); 
 335             m_previewPrintout
->SetPageSizePixels(m_pageWidth
, m_pageHeight
); 
 339             m_pageWidth 
= sizeDevUnits
.x
; 
 340             m_pageHeight 
= sizeDevUnits
.y
; 
 341             m_previewPrintout
->SetPageSizeMM(sizeMM
.x
, sizeMM
.y
); 
 342             m_previewPrintout
->SetPageSizePixels(m_pageWidth
, m_pageHeight
); 
 345         // At 100%, the page should look about page-size on the screen. 
 346         m_previewScale 
= (float)0.8;