1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Base classes for printing framework
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_PRNTBASEH__
13 #define _WX_PRNTBASEH__
15 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
16 #pragma interface "prntbase.h"
21 #if wxUSE_PRINTING_ARCHITECTURE
24 #include "wx/cmndata.h"
26 #include "wx/scrolwin.h"
27 #include "wx/dialog.h"
30 class WXDLLEXPORT wxDC
;
31 class WXDLLEXPORT wxButton
;
32 class WXDLLEXPORT wxChoice
;
33 class WXDLLEXPORT wxPrintout
;
34 class WXDLLEXPORT wxPrinterBase
;
35 class WXDLLEXPORT wxPrintDialogBase
;
36 class WXDLLEXPORT wxPrintDialog
;
37 class WXDLLEXPORT wxPageSetupDialogBase
;
38 class WXDLLEXPORT wxPageSetupDialog
;
39 class WXDLLEXPORT wxPrintPreviewBase
;
40 class WXDLLEXPORT wxPreviewCanvas
;
41 class WXDLLEXPORT wxPreviewControlBar
;
42 class WXDLLEXPORT wxPreviewFrame
;
43 class WXDLLEXPORT wxPrintFactory
;
44 class WXDLLEXPORT wxPrintNativeDataBase
;
46 //----------------------------------------------------------------------------
48 //----------------------------------------------------------------------------
52 wxPRINTER_NO_ERROR
= 0,
57 //----------------------------------------------------------------------------
59 //----------------------------------------------------------------------------
61 class WXDLLEXPORT wxPrintFactory
65 virtual ~wxPrintFactory() {}
67 virtual wxPrinterBase
*CreatePrinter( wxPrintDialogData
* data
) = 0;
69 virtual wxPrintPreviewBase
*CreatePrintPreview( wxPrintout
*preview
,
70 wxPrintout
*printout
= NULL
,
71 wxPrintDialogData
*data
= NULL
) = 0;
72 virtual wxPrintPreviewBase
*CreatePrintPreview( wxPrintout
*preview
,
74 wxPrintData
*data
) = 0;
76 virtual wxPrintDialogBase
*CreatePrintDialog( wxWindow
*parent
,
77 wxPrintDialogData
*data
= NULL
) = 0;
78 virtual wxPrintDialogBase
*CreatePrintDialog( wxWindow
*parent
,
79 wxPrintData
*data
) = 0;
81 virtual wxPageSetupDialogBase
*CreatePageSetupDialog( wxWindow
*parent
,
82 wxPageSetupDialogData
* data
= NULL
) = 0;
84 // What to do and what to show in the wxPrintDialog
85 // a) Use the generic print setup dialog or a native one?
86 virtual bool HasPrintSetupDialog() = 0;
87 virtual wxDialog
*CreatePrintSetupDialog( wxWindow
*parent
, wxPrintData
*data
) = 0;
88 // b) Provide the "print to file" option ourselves or via print setup?
89 virtual bool HasOwnPrintToFile() = 0;
90 // c) Show current printer
91 virtual bool HasPrinterLine() = 0;
92 virtual wxString
CreatePrinterLine() = 0;
93 // d) Show Status line for current printer?
94 virtual bool HasStatusLine() = 0;
95 virtual wxString
CreateStatusLine() = 0;
98 virtual wxPrintNativeDataBase
*CreatePrintNativeData() = 0;
100 static void SetPrintFactory( wxPrintFactory
*factory
);
101 static wxPrintFactory
*GetFactory();
102 static wxPrintFactory
*m_factory
;
105 class WXDLLEXPORT wxNativePrintFactory
: public wxPrintFactory
108 virtual wxPrinterBase
*CreatePrinter( wxPrintDialogData
*data
);
110 virtual wxPrintPreviewBase
*CreatePrintPreview( wxPrintout
*preview
,
111 wxPrintout
*printout
= NULL
,
112 wxPrintDialogData
*data
= NULL
);
113 virtual wxPrintPreviewBase
*CreatePrintPreview( wxPrintout
*preview
,
114 wxPrintout
*printout
,
117 virtual wxPrintDialogBase
*CreatePrintDialog( wxWindow
*parent
,
118 wxPrintDialogData
*data
= NULL
);
119 virtual wxPrintDialogBase
*CreatePrintDialog( wxWindow
*parent
,
122 virtual wxPageSetupDialogBase
*CreatePageSetupDialog( wxWindow
*parent
,
123 wxPageSetupDialogData
* data
= NULL
);
125 virtual bool HasPrintSetupDialog();
126 virtual wxDialog
*CreatePrintSetupDialog( wxWindow
*parent
, wxPrintData
*data
);
127 virtual bool HasOwnPrintToFile();
128 virtual bool HasPrinterLine();
129 virtual wxString
CreatePrinterLine();
130 virtual bool HasStatusLine();
131 virtual wxString
CreateStatusLine();
133 virtual wxPrintNativeDataBase
*CreatePrintNativeData();
136 //----------------------------------------------------------------------------
137 // wxPrintNativeDataBase
138 //----------------------------------------------------------------------------
140 class WXDLLEXPORT wxPrintNativeDataBase
: public wxObject
143 wxPrintNativeDataBase();
144 virtual ~wxPrintNativeDataBase() {}
146 virtual bool TransferTo( wxPrintData
&data
) = 0;
147 virtual bool TransferFrom( const wxPrintData
&data
) = 0;
149 virtual bool Ok() const = 0;
154 DECLARE_CLASS(wxPrintNativeDataBase
)
155 DECLARE_NO_COPY_CLASS(wxPrintNativeDataBase
)
158 //----------------------------------------------------------------------------
160 //----------------------------------------------------------------------------
163 * Represents the printer: manages printing a wxPrintout object
166 class WXDLLEXPORT wxPrinterBase
: public wxObject
169 wxPrinterBase(wxPrintDialogData
*data
= (wxPrintDialogData
*) NULL
);
170 virtual ~wxPrinterBase();
172 virtual wxWindow
*CreateAbortWindow(wxWindow
*parent
, wxPrintout
*printout
);
173 virtual void ReportError(wxWindow
*parent
, wxPrintout
*printout
, const wxString
& message
);
175 virtual wxPrintDialogData
& GetPrintDialogData() const;
176 bool GetAbort() const { return sm_abortIt
; }
178 static wxPrinterError
GetLastError() { return sm_lastError
; }
180 ///////////////////////////////////////////////////////////////////////////
183 virtual bool Setup(wxWindow
*parent
) = 0;
184 virtual bool Print(wxWindow
*parent
, wxPrintout
*printout
, bool prompt
= true) = 0;
185 virtual wxDC
* PrintDialog(wxWindow
*parent
) = 0;
188 wxPrintDialogData m_printDialogData
;
189 wxPrintout
* m_currentPrintout
;
191 static wxPrinterError sm_lastError
;
194 static wxWindow
* sm_abortWindow
;
195 static bool sm_abortIt
;
198 DECLARE_CLASS(wxPrinterBase
)
199 DECLARE_NO_COPY_CLASS(wxPrinterBase
)
202 //----------------------------------------------------------------------------
204 //----------------------------------------------------------------------------
206 class WXDLLEXPORT wxPrinter
: public wxPrinterBase
209 wxPrinter(wxPrintDialogData
*data
= (wxPrintDialogData
*) NULL
);
210 virtual ~wxPrinter();
212 virtual wxWindow
*CreateAbortWindow(wxWindow
*parent
, wxPrintout
*printout
);
213 virtual void ReportError(wxWindow
*parent
, wxPrintout
*printout
, const wxString
& message
);
215 virtual bool Setup(wxWindow
*parent
);
216 virtual bool Print(wxWindow
*parent
, wxPrintout
*printout
, bool prompt
= true);
217 virtual wxDC
* PrintDialog(wxWindow
*parent
);
219 virtual wxPrintDialogData
& GetPrintDialogData() const;
222 wxPrinterBase
*m_pimpl
;
225 DECLARE_CLASS(wxPrinter
)
226 DECLARE_NO_COPY_CLASS(wxPrinter
)
229 //----------------------------------------------------------------------------
231 //----------------------------------------------------------------------------
234 * Represents an object via which a document may be printed.
235 * The programmer derives from this, overrides (at least) OnPrintPage,
236 * and passes it to a wxPrinter object for printing, or a wxPrintPreview
237 * object for previewing.
240 class WXDLLEXPORT wxPrintout
: public wxObject
243 wxPrintout(const wxString
& title
= wxT("Printout"));
244 virtual ~wxPrintout();
246 virtual bool OnBeginDocument(int startPage
, int endPage
);
247 virtual void OnEndDocument();
248 virtual void OnBeginPrinting();
249 virtual void OnEndPrinting();
251 // Guaranteed to be before any other functions are called
252 virtual void OnPreparePrinting() { }
254 virtual bool HasPage(int page
);
255 virtual bool OnPrintPage(int page
) = 0;
256 virtual void GetPageInfo(int *minPage
, int *maxPage
, int *pageFrom
, int *pageTo
);
258 virtual wxString
GetTitle() const { return m_printoutTitle
; }
260 wxDC
*GetDC() const { return m_printoutDC
; }
261 void SetDC(wxDC
*dc
) { m_printoutDC
= dc
; }
262 void SetPageSizePixels(int w
, int h
) { m_pageWidthPixels
= w
; m_pageHeightPixels
= h
; }
263 void GetPageSizePixels(int *w
, int *h
) const { *w
= m_pageWidthPixels
; *h
= m_pageHeightPixels
; }
264 void SetPageSizeMM(int w
, int h
) { m_pageWidthMM
= w
; m_pageHeightMM
= h
; }
265 void GetPageSizeMM(int *w
, int *h
) const { *w
= m_pageWidthMM
; *h
= m_pageHeightMM
; }
267 void SetPPIScreen(int x
, int y
) { m_PPIScreenX
= x
; m_PPIScreenY
= y
; }
268 void GetPPIScreen(int *x
, int *y
) const { *x
= m_PPIScreenX
; *y
= m_PPIScreenY
; }
269 void SetPPIPrinter(int x
, int y
) { m_PPIPrinterX
= x
; m_PPIPrinterY
= y
; }
270 void GetPPIPrinter(int *x
, int *y
) const { *x
= m_PPIPrinterX
; *y
= m_PPIPrinterY
; }
272 virtual bool IsPreview() const { return m_isPreview
; }
274 virtual void SetIsPreview(bool p
) { m_isPreview
= p
; }
277 wxString m_printoutTitle
;
280 int m_pageWidthPixels
;
281 int m_pageHeightPixels
;
294 DECLARE_ABSTRACT_CLASS(wxPrintout
)
295 DECLARE_NO_COPY_CLASS(wxPrintout
)
300 * Canvas upon which a preview is drawn.
303 class WXDLLEXPORT wxPreviewCanvas
: public wxScrolledWindow
306 wxPreviewCanvas(wxPrintPreviewBase
*preview
,
308 const wxPoint
& pos
= wxDefaultPosition
,
309 const wxSize
& size
= wxDefaultSize
,
311 const wxString
& name
= wxT("canvas"));
314 void OnPaint(wxPaintEvent
& event
);
315 void OnChar(wxKeyEvent
&event
);
316 // Responds to colour changes
317 void OnSysColourChanged(wxSysColourChangedEvent
& event
);
321 void OnMouseWheel(wxMouseEvent
& event
);
322 #endif // wxUSE_MOUSEWHEEL
324 wxPrintPreviewBase
* m_printPreview
;
326 DECLARE_CLASS(wxPreviewCanvas
)
327 DECLARE_EVENT_TABLE()
328 DECLARE_NO_COPY_CLASS(wxPreviewCanvas
)
333 * Default frame for showing preview.
336 class WXDLLEXPORT wxPreviewFrame
: public wxFrame
339 wxPreviewFrame(wxPrintPreviewBase
*preview
,
341 const wxString
& title
= wxT("Print Preview"),
342 const wxPoint
& pos
= wxDefaultPosition
,
343 const wxSize
& size
= wxDefaultSize
,
344 long style
= wxDEFAULT_FRAME_STYLE
,
345 const wxString
& name
= wxT("frame"));
348 void OnCloseWindow(wxCloseEvent
& event
);
349 virtual void Initialize();
350 virtual void CreateCanvas();
351 virtual void CreateControlBar();
353 inline wxPreviewControlBar
* GetControlBar() const { return m_controlBar
; }
356 wxPreviewCanvas
* m_previewCanvas
;
357 wxPreviewControlBar
* m_controlBar
;
358 wxPrintPreviewBase
* m_printPreview
;
359 wxWindowDisabler
* m_windowDisabler
;
362 DECLARE_CLASS(wxPreviewFrame
)
363 DECLARE_EVENT_TABLE()
364 DECLARE_NO_COPY_CLASS(wxPreviewFrame
)
368 * wxPreviewControlBar
369 * A panel with buttons for controlling a print preview.
370 * The programmer may wish to use other means for controlling
374 #define wxPREVIEW_PRINT 1
375 #define wxPREVIEW_PREVIOUS 2
376 #define wxPREVIEW_NEXT 4
377 #define wxPREVIEW_ZOOM 8
378 #define wxPREVIEW_FIRST 16
379 #define wxPREVIEW_LAST 32
380 #define wxPREVIEW_GOTO 64
382 #define wxPREVIEW_DEFAULT (wxPREVIEW_PREVIOUS|wxPREVIEW_NEXT|wxPREVIEW_ZOOM\
383 |wxPREVIEW_FIRST|wxPREVIEW_GOTO|wxPREVIEW_LAST)
386 #define wxID_PREVIEW_CLOSE 1
387 #define wxID_PREVIEW_NEXT 2
388 #define wxID_PREVIEW_PREVIOUS 3
389 #define wxID_PREVIEW_PRINT 4
390 #define wxID_PREVIEW_ZOOM 5
391 #define wxID_PREVIEW_FIRST 6
392 #define wxID_PREVIEW_LAST 7
393 #define wxID_PREVIEW_GOTO 8
395 class WXDLLEXPORT wxPreviewControlBar
: public wxPanel
397 DECLARE_CLASS(wxPreviewControlBar
)
400 wxPreviewControlBar(wxPrintPreviewBase
*preview
,
403 const wxPoint
& pos
= wxDefaultPosition
,
404 const wxSize
& size
= wxDefaultSize
,
405 long style
= wxTAB_TRAVERSAL
,
406 const wxString
& name
= wxT("panel"));
407 ~wxPreviewControlBar();
409 virtual void CreateButtons();
410 virtual void SetZoomControl(int zoom
);
411 virtual int GetZoomControl();
412 virtual wxPrintPreviewBase
*GetPrintPreview() const
413 { return m_printPreview
; }
415 void OnWindowClose(wxCommandEvent
& event
);
422 void OnPrintButton(wxCommandEvent
& WXUNUSED(event
)) { OnPrint(); }
423 void OnNextButton(wxCommandEvent
& WXUNUSED(event
)) { OnNext(); }
424 void OnPreviousButton(wxCommandEvent
& WXUNUSED(event
)) { OnPrevious(); }
425 void OnFirstButton(wxCommandEvent
& WXUNUSED(event
)) { OnFirst(); }
426 void OnLastButton(wxCommandEvent
& WXUNUSED(event
)) { OnLast(); }
427 void OnGotoButton(wxCommandEvent
& WXUNUSED(event
)) { OnGoto(); }
428 void OnZoom(wxCommandEvent
& event
);
429 void OnPaint(wxPaintEvent
& event
);
432 wxPrintPreviewBase
* m_printPreview
;
433 wxButton
* m_closeButton
;
434 wxButton
* m_nextPageButton
;
435 wxButton
* m_previousPageButton
;
436 wxButton
* m_printButton
;
437 wxChoice
* m_zoomControl
;
438 wxButton
* m_firstPageButton
;
439 wxButton
* m_lastPageButton
;
440 wxButton
* m_gotoPageButton
;
444 DECLARE_EVENT_TABLE()
445 DECLARE_NO_COPY_CLASS(wxPreviewControlBar
)
448 //----------------------------------------------------------------------------
449 // wxPrintPreviewBase
450 //----------------------------------------------------------------------------
453 * Programmer creates an object of this class to preview a wxPrintout.
456 class WXDLLEXPORT wxPrintPreviewBase
: public wxObject
459 wxPrintPreviewBase(wxPrintout
*printout
,
460 wxPrintout
*printoutForPrinting
= (wxPrintout
*) NULL
,
461 wxPrintDialogData
*data
= (wxPrintDialogData
*) NULL
);
462 wxPrintPreviewBase(wxPrintout
*printout
,
463 wxPrintout
*printoutForPrinting
,
465 virtual ~wxPrintPreviewBase();
467 virtual bool SetCurrentPage(int pageNum
);
468 virtual int GetCurrentPage() const;
470 virtual void SetPrintout(wxPrintout
*printout
);
471 virtual wxPrintout
*GetPrintout() const;
472 virtual wxPrintout
*GetPrintoutForPrinting() const;
474 virtual void SetFrame(wxFrame
*frame
);
475 virtual void SetCanvas(wxPreviewCanvas
*canvas
);
477 virtual wxFrame
*GetFrame() const;
478 virtual wxPreviewCanvas
*GetCanvas() const;
480 // The preview canvas should call this from OnPaint
481 virtual bool PaintPage(wxPreviewCanvas
*canvas
, wxDC
& dc
);
483 // This draws a blank page onto the preview canvas
484 virtual bool DrawBlankPage(wxPreviewCanvas
*canvas
, wxDC
& dc
);
486 // Adjusts the scrollbars for the current scale
487 virtual void AdjustScrollbars(wxPreviewCanvas
*canvas
);
489 // This is called by wxPrintPreview to render a page into a wxMemoryDC.
490 virtual bool RenderPage(int pageNum
);
493 virtual void SetZoom(int percent
);
494 virtual int GetZoom() const;
496 virtual wxPrintDialogData
& GetPrintDialogData();
498 virtual int GetMaxPage() const;
499 virtual int GetMinPage() const;
501 virtual bool Ok() const;
502 virtual void SetOk(bool ok
);
504 ///////////////////////////////////////////////////////////////////////////
507 // If we own a wxPrintout that can be used for printing, this
508 // will invoke the actual printing procedure. Called
509 // by the wxPreviewControlBar.
510 virtual bool Print(bool interactive
) = 0;
512 // Calculate scaling that needs to be done to get roughly
513 // the right scaling for the screen pretending to be
514 // the currently selected printer.
515 virtual void DetermineScaling() = 0;
518 wxPrintDialogData m_printDialogData
;
519 wxPreviewCanvas
* m_previewCanvas
;
520 wxFrame
* m_previewFrame
;
521 wxBitmap
* m_previewBitmap
;
522 wxPrintout
* m_previewPrintout
;
523 wxPrintout
* m_printPrintout
;
526 float m_previewScale
;
535 bool m_printingPrepared
; // Called OnPreparePrinting?
538 void Init(wxPrintout
*printout
, wxPrintout
*printoutForPrinting
);
540 DECLARE_NO_COPY_CLASS(wxPrintPreviewBase
)
541 DECLARE_CLASS(wxPrintPreviewBase
)
544 //----------------------------------------------------------------------------
546 //----------------------------------------------------------------------------
548 class WXDLLEXPORT wxPrintPreview
: public wxPrintPreviewBase
551 wxPrintPreview(wxPrintout
*printout
,
552 wxPrintout
*printoutForPrinting
= (wxPrintout
*) NULL
,
553 wxPrintDialogData
*data
= (wxPrintDialogData
*) NULL
);
554 wxPrintPreview(wxPrintout
*printout
,
555 wxPrintout
*printoutForPrinting
,
557 virtual ~wxPrintPreview();
559 virtual bool SetCurrentPage(int pageNum
);
560 virtual int GetCurrentPage() const;
561 virtual void SetPrintout(wxPrintout
*printout
);
562 virtual wxPrintout
*GetPrintout() const;
563 virtual wxPrintout
*GetPrintoutForPrinting() const;
564 virtual void SetFrame(wxFrame
*frame
);
565 virtual void SetCanvas(wxPreviewCanvas
*canvas
);
567 virtual wxFrame
*GetFrame() const;
568 virtual wxPreviewCanvas
*GetCanvas() const;
569 virtual bool PaintPage(wxPreviewCanvas
*canvas
, wxDC
& dc
);
570 virtual bool DrawBlankPage(wxPreviewCanvas
*canvas
, wxDC
& dc
);
571 virtual void AdjustScrollbars(wxPreviewCanvas
*canvas
);
572 virtual bool RenderPage(int pageNum
);
573 virtual void SetZoom(int percent
);
575 virtual bool Print(bool interactive
);
576 virtual void DetermineScaling();
578 virtual wxPrintDialogData
& GetPrintDialogData();
580 virtual int GetMaxPage() const;
581 virtual int GetMinPage() const;
583 virtual bool Ok() const;
584 virtual void SetOk(bool ok
);
587 wxPrintPreviewBase
*m_pimpl
;
590 DECLARE_CLASS(wxPrintPreview
)
591 DECLARE_NO_COPY_CLASS(wxPrintPreview
)
594 //----------------------------------------------------------------------------
595 // wxPrintAbortDialog
596 //----------------------------------------------------------------------------
598 class WXDLLEXPORT wxPrintAbortDialog
: public wxDialog
601 wxPrintAbortDialog(wxWindow
*parent
,
602 const wxString
& title
,
603 const wxPoint
& pos
= wxDefaultPosition
,
604 const wxSize
& size
= wxDefaultSize
,
606 const wxString
& name
= wxT("dialog"))
607 : wxDialog(parent
, wxID_ANY
, title
, pos
, size
, style
, name
)
611 void OnCancel(wxCommandEvent
& event
);
614 DECLARE_EVENT_TABLE()
615 DECLARE_NO_COPY_CLASS(wxPrintAbortDialog
)
618 #endif // wxUSE_PRINTING_ARCHITECTURE