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