From 147bf2639f28010ad095298941e9eb206328d2c1 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Tue, 24 Oct 2006 15:41:39 +0000 Subject: [PATCH] Added creation of printer DC to printer factory. Added wxPrintData ctor to wxGnomePrintDC. Added wxGnomePrintPreview. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42345 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/gnome/gprint.h | 33 +++++++++ include/wx/prntbase.h | 4 ++ src/common/prntbase.cpp | 13 ++++ src/gtk/gnome/gprint.cpp | 125 +++++++++++++++++++++++++++++++++- 4 files changed, 173 insertions(+), 2 deletions(-) diff --git a/include/wx/gtk/gnome/gprint.h b/include/wx/gtk/gnome/gprint.h index 280380270b..2148bfbe5f 100644 --- a/include/wx/gtk/gnome/gprint.h +++ b/include/wx/gtk/gnome/gprint.h @@ -78,6 +78,8 @@ public: virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, wxPageSetupDialogData * data = NULL ); + virtual wxDC* CreatePrinterDC( const wxPrintData& data ); + virtual bool HasPrintSetupDialog(); virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ); virtual bool HasOwnPrintToFile(); @@ -199,6 +201,7 @@ class wxGnomePrintDC: public wxDC { public: wxGnomePrintDC( wxGnomePrinter *printer ); + wxGnomePrintDC( const wxPrintData& data ); virtual ~wxGnomePrintDC(); bool Ok() const { return IsOk(); } @@ -275,6 +278,7 @@ private: static float ms_PSScaleFactor; private: + wxPrintData m_printData; PangoContext *m_context; PangoLayout *m_layout; PangoFontDescription *m_fontdesc; @@ -286,6 +290,7 @@ private: wxGnomePrinter *m_printer; GnomePrintContext *m_gpc; + GnomePrintJob* m_job; // only used and destroyed when created with wxPrintData void makeEllipticalPath(wxCoord x, wxCoord y, wxCoord width, wxCoord height); @@ -355,6 +360,34 @@ private: DECLARE_NO_COPY_CLASS(wxGnomePrintDC) }; +// ---------------------------------------------------------------------------- +// wxGnomePrintPreview: programmer creates an object of this class to preview a +// wxPrintout. +// ---------------------------------------------------------------------------- + +class wxGnomePreview : public wxPrintPreviewBase +{ +public: + wxGnomePrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting = (wxPrintout *) NULL, + wxPrintDialogData *data = (wxPrintDialogData *) NULL); + wxGnomePrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + + virtual ~wxGnomePrintPreview(); + + virtual bool Print(bool interactive); + virtual void DetermineScaling(); + +private: + void Init(wxPrintout *printout, wxPrintout *printoutForPrinting); + +private: + DECLARE_CLASS(wxGnomePrintPreview) +}; + + #endif // wxUSE_LIBGNOMEPRINT diff --git a/include/wx/prntbase.h b/include/wx/prntbase.h index eba4f57fa4..43376b04e7 100644 --- a/include/wx/prntbase.h +++ b/include/wx/prntbase.h @@ -77,6 +77,8 @@ public: virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, wxPageSetupDialogData * data = NULL ) = 0; + virtual wxDC* CreatePrinterDC( const wxPrintData& data ) = 0; + // What to do and what to show in the wxPrintDialog // a) Use the generic print setup dialog or a native one? virtual bool HasPrintSetupDialog() = 0; @@ -119,6 +121,8 @@ public: virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, wxPageSetupDialogData * data = NULL ); + virtual wxDC* CreatePrinterDC( const wxPrintData& data ); + virtual bool HasPrintSetupDialog(); virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ); virtual bool HasOwnPrintToFile(); diff --git a/src/common/prntbase.cpp b/src/common/prntbase.cpp index 9bb2f18a2f..67a73dd40e 100644 --- a/src/common/prntbase.cpp +++ b/src/common/prntbase.cpp @@ -43,6 +43,7 @@ #include "wx/prntbase.h" #include "wx/printdlg.h" #include "wx/print.h" +#include "wx/dcprint.h" #include #include @@ -54,6 +55,7 @@ #include "wx/mac/private/print.h" #else #include "wx/generic/prntdlgg.h" +#include "wx/dcps.h" #endif #ifdef __WXMSW__ @@ -201,6 +203,17 @@ wxDialog *wxNativePrintFactory::CreatePrintSetupDialog( wxWindow *parent, #endif } +wxDC* wxNativePrintFactory::CreatePrinterDC( const wxPrintData& data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxPrinterDC(data); +#elif defined(__WXMAC__) + return new wxPrinterDC(data); +#else + return new wxPrinterDC(data); +#endif +} + bool wxNativePrintFactory::HasOwnPrintToFile() { // Only relevant for PostScript and here the diff --git a/src/gtk/gnome/gprint.cpp b/src/gtk/gnome/gprint.cpp index a3520e69f5..29b2890fbf 100644 --- a/src/gtk/gnome/gprint.cpp +++ b/src/gtk/gnome/gprint.cpp @@ -309,14 +309,14 @@ wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview wxPrintout *printout, wxPrintDialogData *data ) { - return new wxPostScriptPrintPreview( preview, printout, data ); + return new wxGnomePrintPreview( preview, printout, data ); } wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview, wxPrintout *printout, wxPrintData *data ) { - return new wxPostScriptPrintPreview( preview, printout, data ); + return new wxGnomePrintPreview( preview, printout, data ); } wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent, @@ -354,6 +354,11 @@ wxDialog *wxGnomePrintFactory::CreatePrintSetupDialog( wxWindow *parent, wxPrint return NULL; } +wxDC* wxGnomePrintFactory::CreatePrinterDC( const wxPrintData& data ) +{ + return new wxGnomePrintDC(data); +} + bool wxGnomePrintFactory::HasOwnPrintToFile() { return true; @@ -835,6 +840,7 @@ wxGnomePrintDC::wxGnomePrintDC( wxGnomePrinter *printer ) m_printer = printer; m_gpc = printer->GetPrintContext(); + m_job = NULL; // only used and destroyed when created with wxPrintData m_layout = gs_lgp->gnome_print_pango_create_layout( m_gpc ); m_fontdesc = pango_font_description_from_string( "Sans 12" ); @@ -847,8 +853,33 @@ wxGnomePrintDC::wxGnomePrintDC( wxGnomePrinter *printer ) m_signY = -1; // default y-axis bottom up -> top down } +wxGnomePrintDC::wxGnomePrintDC( const wxPrintData& data ) +{ + m_printer = NULL; + m_printData = data; + + wxGnomePrintNativeData *native = + (wxGnomePrintNativeData*) m_printData.GetNativeData(); + + GnomePrintJob *job = gs_lgp->gnome_print_job_new( native->GetPrintConfig() ); + m_gpc = gs_lgp->gnome_print_job_get_context (job); + m_job = job; // only used and destroyed when created with wxPrintData + + m_layout = gs_lgp->gnome_print_pango_create_layout( m_gpc ); + m_fontdesc = pango_font_description_from_string( "Sans 12" ); + + m_currentRed = 0; + m_currentBlue = 0; + m_currentGreen = 0; + + m_signX = 1; // default x-axis left to right + m_signY = -1; // default y-axis bottom up -> top down +} + wxGnomePrintDC::~wxGnomePrintDC() { + if (m_job) + g_object_unref (job); } bool wxGnomePrintDC::IsOk() const @@ -1839,5 +1870,95 @@ void wxGnomePrintModule::OnExit() IMPLEMENT_DYNAMIC_CLASS(wxGnomePrintModule, wxModule) +// ---------------------------------------------------------------------------- +// Print preview +// ---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxGnomePrintPreview, wxPrintPreviewBase) + +void wxGnomePrintPreview::Init(wxPrintout * WXUNUSED(printout), + wxPrintout * WXUNUSED(printoutForPrinting)) +{ + DetermineScaling(); +} + +wxGnomePrintPreview::wxGnomePrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintDialogData *data) + : wxPrintPreviewBase(printout, printoutForPrinting, data) +{ + Init(printout, printoutForPrinting); +} + +wxGnomePrintPreview::wxGnomePrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data) + : wxPrintPreviewBase(printout, printoutForPrinting, data) +{ + Init(printout, printoutForPrinting); +} + +wxGnomePrintPreview::~wxGnomePrintPreview() +{ +} + +bool wxGnomePrintPreview::Print(bool interactive) +{ + if (!m_printPrintout) + return false; + + wxPrinter printer(& m_printDialogData); + return printer.Print(m_previewFrame, m_printPrintout, interactive); +} + +void wxGnomePrintPreview::DetermineScaling() +{ + wxPaperSize paperType = m_printDialogData.GetPrintData().GetPaperId(); + if (paperType == wxPAPER_NONE) + paperType = wxPAPER_NONE; + + wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(paperType); + if (!paper) + paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4); + + if (paper) + { + wxSize ScreenPixels = wxGetDisplaySize(); + wxSize ScreenMM = wxGetDisplaySizeMM(); + + m_previewPrintout->SetPPIScreen( (int) ((ScreenPixels.GetWidth() * 25.4) / ScreenMM.GetWidth()), + (int) ((ScreenPixels.GetHeight() * 25.4) / ScreenMM.GetHeight()) ); + m_previewPrintout->SetPPIPrinter(wxGnomePrintDC::GetResolution(), wxGnomePrintDC::GetResolution()); + + wxSize sizeDevUnits(paper->GetSizeDeviceUnits()); + + // TODO: get better resolution information from wxGnomePrintDC, if possible. + + sizeDevUnits.x = (wxCoord)((float)sizeDevUnits.x * wxGnomePrintDC::GetResolution() / 72.0); + sizeDevUnits.y = (wxCoord)((float)sizeDevUnits.y * wxGnomePrintDC::GetResolution() / 72.0); + wxSize sizeTenthsMM(paper->GetSize()); + wxSize sizeMM(sizeTenthsMM.x / 10, sizeTenthsMM.y / 10); + + // If in landscape mode, we need to swap the width and height. + if ( m_printDialogData.GetPrintData().GetOrientation() == wxLANDSCAPE ) + { + m_pageWidth = sizeDevUnits.y; + m_pageHeight = sizeDevUnits.x; + m_previewPrintout->SetPageSizeMM(sizeMM.y, sizeMM.x); + m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight); + } + else + { + m_pageWidth = sizeDevUnits.x; + m_pageHeight = sizeDevUnits.y; + m_previewPrintout->SetPageSizeMM(sizeMM.x, sizeMM.y); + m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight); + } + + // At 100%, the page should look about page-size on the screen. + m_previewScale = (float)0.8 * 72.0 / (float)wxGnomePrintDC::GetResolution(); + } +} + #endif // wxUSE_LIBGNOMEPRINT -- 2.45.2