1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: wx/gtk/print.h 3 // Author: Anthony Bretaudeau 4 // Purpose: GTK printing support 5 // Created: 2007-08-25 6 // Copyright: (c) Anthony Bretaudeau 7 // Licence: wxWindows Licence 8 ///////////////////////////////////////////////////////////////////////////// 9 10 #ifndef _WX_GTK_PRINT_H_ 11 #define _WX_GTK_PRINT_H_ 12 13 #include "wx/defs.h" 14 15 #if wxUSE_GTKPRINT 16 17 #include "wx/print.h" 18 #include "wx/printdlg.h" 19 #include "wx/prntbase.h" 20 #include "wx/dc.h" 21 22 typedef struct _GtkPrintOperation GtkPrintOperation; 23 typedef struct _GtkPrintContext GtkPrintContext; 24 typedef struct _GtkPrintSettings GtkPrintSettings; 25 typedef struct _GtkPageSetup GtkPageSetup; 26 27 typedef struct _cairo cairo_t; 28 29 //---------------------------------------------------------------------------- 30 // wxGtkPrintFactory 31 //---------------------------------------------------------------------------- 32 33 class wxGtkPrintFactory: public wxPrintFactory 34 { 35 public: 36 virtual wxPrinterBase *CreatePrinter( wxPrintDialogData *data ); 37 38 virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, 39 wxPrintout *printout = NULL, 40 wxPrintDialogData *data = NULL ); 41 virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, 42 wxPrintout *printout, 43 wxPrintData *data ); 44 45 virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, 46 wxPrintDialogData *data = NULL ); 47 virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, 48 wxPrintData *data ); 49 50 virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, 51 wxPageSetupDialogData * data = NULL ); 52 53 virtual wxDCImpl* CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ); 54 55 virtual bool HasPrintSetupDialog(); 56 virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ); 57 virtual bool HasOwnPrintToFile(); 58 virtual bool HasPrinterLine(); 59 virtual wxString CreatePrinterLine(); 60 virtual bool HasStatusLine(); 61 virtual wxString CreateStatusLine(); 62 63 virtual wxPrintNativeDataBase *CreatePrintNativeData(); 64 }; 65 66 //---------------------------------------------------------------------------- 67 // wxGtkPrintDialog 68 //---------------------------------------------------------------------------- 69 70 class WXDLLIMPEXP_CORE wxGtkPrintDialog: public wxPrintDialogBase 71 { 72 public: 73 wxGtkPrintDialog( wxWindow *parent, 74 wxPrintDialogData* data = NULL ); 75 wxGtkPrintDialog( wxWindow *parent, wxPrintData* data); 76 virtual ~wxGtkPrintDialog(); 77 GetPrintData()78 wxPrintData& GetPrintData() 79 { return m_printDialogData.GetPrintData(); } GetPrintDialogData()80 wxPrintDialogData& GetPrintDialogData() 81 { return m_printDialogData; } 82 GetPrintDC()83 wxDC *GetPrintDC() { return m_dc; } SetPrintDC(wxDC * printDC)84 void SetPrintDC(wxDC * printDC) { m_dc = printDC; } 85 86 virtual int ShowModal(); 87 Validate()88 virtual bool Validate() { return true; } TransferDataToWindow()89 virtual bool TransferDataToWindow() { return true; } TransferDataFromWindow()90 virtual bool TransferDataFromWindow() { return true; } 91 SetShowDialog(bool show)92 void SetShowDialog(bool show) { m_showDialog = show; } GetShowDialog()93 bool GetShowDialog() { return m_showDialog; } 94 95 protected: 96 // Implement some base class methods to do nothing to avoid asserts and 97 // GTK warnings, since this is not a real wxDialog. WXUNUSED(x)98 virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y), 99 int WXUNUSED(width), int WXUNUSED(height), 100 int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {} DoMoveWindow(int WXUNUSED (x),int WXUNUSED (y),int WXUNUSED (width),int WXUNUSED (height))101 virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), 102 int WXUNUSED(width), int WXUNUSED(height)) {} 103 104 private: 105 wxPrintDialogData m_printDialogData; 106 wxWindow *m_parent; 107 bool m_showDialog; 108 wxDC *m_dc; 109 110 DECLARE_DYNAMIC_CLASS(wxGtkPrintDialog) 111 }; 112 113 //---------------------------------------------------------------------------- 114 // wxGtkPageSetupDialog 115 //---------------------------------------------------------------------------- 116 117 class WXDLLIMPEXP_CORE wxGtkPageSetupDialog: public wxPageSetupDialogBase 118 { 119 public: 120 wxGtkPageSetupDialog( wxWindow *parent, 121 wxPageSetupDialogData* data = NULL ); 122 virtual ~wxGtkPageSetupDialog(); 123 GetPageSetupDialogData()124 virtual wxPageSetupDialogData& GetPageSetupDialogData() { return m_pageDialogData; } 125 126 virtual int ShowModal(); 127 Validate()128 virtual bool Validate() { return true; } TransferDataToWindow()129 virtual bool TransferDataToWindow() { return true; } TransferDataFromWindow()130 virtual bool TransferDataFromWindow() { return true; } 131 132 protected: 133 // Implement some base class methods to do nothing to avoid asserts and 134 // GTK warnings, since this is not a real wxDialog. WXUNUSED(x)135 virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y), 136 int WXUNUSED(width), int WXUNUSED(height), 137 int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {} DoMoveWindow(int WXUNUSED (x),int WXUNUSED (y),int WXUNUSED (width),int WXUNUSED (height))138 virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), 139 int WXUNUSED(width), int WXUNUSED(height)) {} 140 141 private: 142 wxPageSetupDialogData m_pageDialogData; 143 wxWindow *m_parent; 144 145 DECLARE_DYNAMIC_CLASS(wxGtkPageSetupDialog) 146 }; 147 148 //---------------------------------------------------------------------------- 149 // wxGtkPrinter 150 //---------------------------------------------------------------------------- 151 152 class WXDLLIMPEXP_CORE wxGtkPrinter : public wxPrinterBase 153 { 154 public: 155 wxGtkPrinter(wxPrintDialogData *data = NULL); 156 virtual ~wxGtkPrinter(); 157 158 virtual bool Print(wxWindow *parent, 159 wxPrintout *printout, 160 bool prompt = true); 161 virtual wxDC* PrintDialog(wxWindow *parent); 162 virtual bool Setup(wxWindow *parent); 163 GetPrintContext()164 GtkPrintContext *GetPrintContext() { return m_gpc; } SetPrintContext(GtkPrintContext * context)165 void SetPrintContext(GtkPrintContext *context) {m_gpc = context;} 166 void BeginPrint(wxPrintout *printout, GtkPrintOperation *operation, GtkPrintContext *context); 167 void DrawPage(wxPrintout *printout, GtkPrintOperation *operation, GtkPrintContext *context, int page_nr); 168 169 private: 170 GtkPrintContext *m_gpc; 171 wxDC *m_dc; 172 173 DECLARE_DYNAMIC_CLASS(wxGtkPrinter) 174 wxDECLARE_NO_COPY_CLASS(wxGtkPrinter); 175 }; 176 177 //---------------------------------------------------------------------------- 178 // wxGtkPrintNativeData 179 //---------------------------------------------------------------------------- 180 181 class WXDLLIMPEXP_CORE wxGtkPrintNativeData : public wxPrintNativeDataBase 182 { 183 public: 184 wxGtkPrintNativeData(); 185 virtual ~wxGtkPrintNativeData(); 186 187 virtual bool TransferTo( wxPrintData &data ); 188 virtual bool TransferFrom( const wxPrintData &data ); 189 Ok()190 virtual bool Ok() const { return IsOk(); } IsOk()191 virtual bool IsOk() const { return true; } 192 GetPrintConfig()193 GtkPrintSettings* GetPrintConfig() { return m_config; } 194 void SetPrintConfig( GtkPrintSettings * config ); 195 GetPrintJob()196 GtkPrintOperation* GetPrintJob() { return m_job; } 197 void SetPrintJob(GtkPrintOperation *job); 198 GetPrintContext()199 GtkPrintContext *GetPrintContext() { return m_context; } SetPrintContext(GtkPrintContext * context)200 void SetPrintContext(GtkPrintContext *context) {m_context = context; } 201 202 203 GtkPageSetup* GetPageSetupFromSettings(GtkPrintSettings* settings); 204 void SetPageSetupToSettings(GtkPrintSettings* settings, GtkPageSetup* page_setup); 205 206 private: 207 // NB: m_config is created and owned by us, but the other objects are not 208 // and their accessors don't change their ref count. 209 GtkPrintSettings *m_config; 210 GtkPrintOperation *m_job; 211 GtkPrintContext *m_context; 212 213 DECLARE_DYNAMIC_CLASS(wxGtkPrintNativeData) 214 }; 215 216 //----------------------------------------------------------------------------- 217 // wxGtkPrinterDC 218 //----------------------------------------------------------------------------- 219 220 class WXDLLIMPEXP_CORE wxGtkPrinterDCImpl : public wxDCImpl 221 { 222 public: 223 wxGtkPrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ); 224 virtual ~wxGtkPrinterDCImpl(); 225 Ok()226 bool Ok() const { return IsOk(); } 227 bool IsOk() const; 228 229 virtual void* GetCairoContext() const; 230 virtual void* GetHandle() const; 231 CanDrawBitmap()232 bool CanDrawBitmap() const { return true; } 233 void Clear(); 234 void SetFont( const wxFont& font ); 235 void SetPen( const wxPen& pen ); 236 void SetBrush( const wxBrush& brush ); 237 void SetLogicalFunction( wxRasterOperationMode function ); 238 void SetBackground( const wxBrush& brush ); 239 void DestroyClippingRegion(); 240 bool StartDoc(const wxString& message); 241 void EndDoc(); 242 void StartPage(); 243 void EndPage(); 244 wxCoord GetCharHeight() const; 245 wxCoord GetCharWidth() const; CanGetTextExtent()246 bool CanGetTextExtent() const { return true; } 247 wxSize GetPPI() const; GetDepth()248 virtual int GetDepth() const { return 24; } 249 void SetBackgroundMode(int mode); SetPalette(const wxPalette & WXUNUSED (palette))250 void SetPalette(const wxPalette& WXUNUSED(palette)) { } 251 void SetResolution(int ppi); 252 253 // overridden for wxPrinterDC Impl 254 virtual int GetResolution() const; 255 virtual wxRect GetPaperRect() const; 256 257 protected: 258 bool DoFloodFill(wxCoord x1, wxCoord y1, const wxColour &col, 259 wxFloodFillStyle style=wxFLOOD_SURFACE ); 260 void DoGradientFillConcentric(const wxRect& rect, const wxColour& initialColour, const wxColour& destColour, const wxPoint& circleCenter); 261 void DoGradientFillLinear(const wxRect& rect, const wxColour& initialColour, const wxColour& destColour, wxDirection nDirection = wxEAST); 262 bool DoGetPixel(wxCoord x1, wxCoord y1, wxColour *col) const; 263 void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); 264 void DoCrossHair(wxCoord x, wxCoord y); 265 void DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc); 266 void DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea); 267 void DoDrawPoint(wxCoord x, wxCoord y); 268 void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); 269 void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); 270 void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); 271 void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); 272 void DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius = 20.0); 273 void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); 274 #if wxUSE_SPLINES 275 void DoDrawSpline(const wxPointList *points); 276 #endif 277 bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, 278 wxDC *source, wxCoord xsrc, wxCoord ysrc, 279 wxRasterOperationMode rop = wxCOPY, bool useMask = false, 280 wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); 281 void DoDrawIcon( const wxIcon& icon, wxCoord x, wxCoord y ); 282 void DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, bool useMask = false ); 283 void DoDrawText(const wxString& text, wxCoord x, wxCoord y ); 284 void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle); 285 void DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height); DoSetDeviceClippingRegion(const wxRegion & WXUNUSED (clip))286 void DoSetDeviceClippingRegion( const wxRegion &WXUNUSED(clip) ) 287 { 288 wxFAIL_MSG( "not implemented" ); 289 } 290 void DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, 291 wxCoord *descent = NULL, 292 wxCoord *externalLeading = NULL, 293 const wxFont *theFont = NULL ) const; 294 void DoGetSize(int* width, int* height) const; 295 void DoGetSizeMM(int *width, int *height) const; 296 GetPrintData()297 wxPrintData& GetPrintData() { return m_printData; } 298 void SetPrintData(const wxPrintData& data); 299 300 private: 301 wxPrintData m_printData; 302 PangoContext *m_context; 303 PangoLayout *m_layout; 304 PangoFontDescription *m_fontdesc; 305 cairo_t *m_cairo; 306 307 unsigned char m_currentRed; 308 unsigned char m_currentGreen; 309 unsigned char m_currentBlue; 310 unsigned char m_currentAlpha; 311 312 GtkPrintContext *m_gpc; 313 int m_resolution; 314 double m_PS2DEV; 315 double m_DEV2PS; 316 317 DECLARE_DYNAMIC_CLASS(wxGtkPrinterDCImpl) 318 wxDECLARE_NO_COPY_CLASS(wxGtkPrinterDCImpl); 319 }; 320 321 // ---------------------------------------------------------------------------- 322 // wxGtkPrintPreview: programmer creates an object of this class to preview a 323 // wxPrintout. 324 // ---------------------------------------------------------------------------- 325 326 class WXDLLIMPEXP_CORE wxGtkPrintPreview : public wxPrintPreviewBase 327 { 328 public: 329 wxGtkPrintPreview(wxPrintout *printout, 330 wxPrintout *printoutForPrinting = NULL, 331 wxPrintDialogData *data = NULL); 332 wxGtkPrintPreview(wxPrintout *printout, 333 wxPrintout *printoutForPrinting, 334 wxPrintData *data); 335 336 virtual ~wxGtkPrintPreview(); 337 338 virtual bool Print(bool interactive); 339 virtual void DetermineScaling(); 340 341 private: 342 void Init(wxPrintout *printout, 343 wxPrintout *printoutForPrinting, 344 wxPrintData *data); 345 346 // resolution to use in DPI 347 int m_resolution; 348 349 DECLARE_CLASS(wxGtkPrintPreview) 350 }; 351 352 #endif // wxUSE_GTKPRINT 353 354 #endif // _WX_GTK_PRINT_H_ 355