1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        print.h
3 // Purpose:     interface of wxPreviewControlBar
4 // Author:      wxWidgets team
5 // Licence:     wxWindows licence
6 /////////////////////////////////////////////////////////////////////////////
7 
8 enum wxPrinterError
9 {
10     wxPRINTER_NO_ERROR = 0,
11     wxPRINTER_CANCELLED,
12     wxPRINTER_ERROR
13 };
14 
15 #define wxPREVIEW_PRINT        1
16 #define wxPREVIEW_PREVIOUS     2
17 #define wxPREVIEW_NEXT         4
18 #define wxPREVIEW_ZOOM         8
19 #define wxPREVIEW_FIRST       16
20 #define wxPREVIEW_LAST        32
21 #define wxPREVIEW_GOTO        64
22 
23 #define wxPREVIEW_DEFAULT  (wxPREVIEW_PREVIOUS|wxPREVIEW_NEXT|wxPREVIEW_ZOOM\
24                             |wxPREVIEW_FIRST|wxPREVIEW_GOTO|wxPREVIEW_LAST)
25 
26 // Ids for controls
27 #define wxID_PREVIEW_CLOSE      1
28 #define wxID_PREVIEW_NEXT       2
29 #define wxID_PREVIEW_PREVIOUS   3
30 #define wxID_PREVIEW_PRINT      4
31 #define wxID_PREVIEW_ZOOM       5
32 #define wxID_PREVIEW_FIRST      6
33 #define wxID_PREVIEW_LAST       7
34 #define wxID_PREVIEW_GOTO       8
35 #define wxID_PREVIEW_ZOOM_IN    9
36 #define wxID_PREVIEW_ZOOM_OUT   10
37 
38 
39 /**
40     @class wxPreviewControlBar
41 
42     This is the default implementation of the preview control bar, a panel
43     with buttons and a zoom control.
44 
45     You can derive a new class from this and override some or all member functions
46     to change the behaviour and appearance; or you can leave it as it is.
47 
48     @library{wxcore}
49     @category{printing}
50 
51     @see wxPreviewFrame, wxPreviewCanvas, wxPrintPreview
52 */
53 class wxPreviewControlBar : public wxPanel
54 {
55 public:
56 
57     /**
58         Constructor.
59 
60         The @a buttons parameter may be a combination of the following, using the bitwise
61         'or' operator:
62 
63         @beginFlagTable
64         @flag{wxPREVIEW_PRINT}
65             Create a print button.
66         @flag{wxPREVIEW_NEXT}
67             Create a next page button.
68         @flag{wxPREVIEW_PREVIOUS}
69             Create a previous page button.
70         @flag{wxPREVIEW_ZOOM}
71             Create a zoom control.
72         @flag{wxPREVIEW_DEFAULT}
73             Equivalent to a combination of @c wxPREVIEW_PREVIOUS, @c wxPREVIEW_NEXT
74             and @c wxPREVIEW_ZOOM.
75         @endFlagTable
76     */
77     wxPreviewControlBar(wxPrintPreview* preview,
78                         long buttons,
79                         wxWindow* parent,
80                         const wxPoint& pos = wxDefaultPosition,
81                         const wxSize& size = wxDefaultSize,
82                         long style = 0,
83                         const wxString& name = "panel");
84 
85     /**
86         Destructor.
87     */
88     virtual ~wxPreviewControlBar();
89 
90     /**
91         Creates buttons, according to value of the button style flags.
92 
93         @todo which flags??
94     */
95     virtual void CreateButtons();
96 
97     /**
98         Gets the print preview object associated with the control bar.
99     */
100     virtual wxPrintPreviewBase* GetPrintPreview() const;
101 
102     /**
103         Gets the current zoom setting in percent.
104     */
105     virtual int GetZoomControl();
106 
107     /**
108         Sets the zoom control.
109     */
110     virtual void SetZoomControl(int percent);
111 
112 };
113 
114 
115 
116 /**
117     @class wxPreviewCanvas
118 
119     A preview canvas is the default canvas used by the print preview
120     system to display the preview.
121 
122     @library{wxcore}
123     @category{printing}
124 
125     @see wxPreviewFrame, wxPreviewControlBar, wxPrintPreview
126 */
127 class wxPreviewCanvas : public wxScrolledWindow
128 {
129 public:
130     /**
131         Constructor.
132     */
133     wxPreviewCanvas(wxPrintPreview* preview, wxWindow* parent,
134                     const wxPoint& pos = wxDefaultPosition,
135                     const wxSize& size = wxDefaultSize,
136                     long style = 0,
137                     const wxString& name = "canvas");
138 
139     /**
140         Destructor.
141     */
142     virtual ~wxPreviewCanvas();
143 
144     /**
145         Calls wxPrintPreview::PaintPage() to refresh the canvas.
146     */
147     void OnPaint(wxPaintEvent& event);
148 };
149 
150 /**
151     Preview frame modality kind.
152 
153     The elements of this enum can be used with wxPreviewFrame::Initialize() to
154     indicate how should the preview frame be shown.
155 
156     @since 2.9.2
157 */
158 enum wxPreviewFrameModalityKind
159 {
160     /**
161         Disable all the other top level windows while the preview frame is shown.
162 
163         This is the default behaviour.
164      */
165     wxPreviewFrame_AppModal,
166 
167     /**
168         Disable only the parent window while the preview frame is shown.
169      */
170     wxPreviewFrame_WindowModal,
171 
172     /**
173         Show the preview frame non-modally and don't disable any other windows.
174      */
175     wxPreviewFrame_NonModal
176 };
177 
178 /**
179     @class wxPreviewFrame
180 
181     This class provides the default method of managing the print preview interface.
182     Member functions may be overridden to replace functionality, or the
183     class may be used without derivation.
184 
185     @library{wxcore}
186     @category{printing}
187 
188     @see wxPreviewCanvas, wxPreviewControlBar, wxPrintPreview
189 */
190 class wxPreviewFrame : public wxFrame
191 {
192 public:
193     /**
194         Constructor.
195 
196         Pass a print preview object plus other normal frame arguments.
197         The print preview object will be destroyed by the frame when it closes.
198     */
199     wxPreviewFrame(wxPrintPreviewBase* preview, wxWindow* parent,
200                    const wxString& title = "Print Preview",
201                    const wxPoint& pos = wxDefaultPosition,
202                    const wxSize& size = wxDefaultSize,
203                    long style = wxDEFAULT_FRAME_STYLE,
204                    const wxString& name = wxFrameNameStr);
205 
206     /**
207         Destructor.
208     */
209     virtual ~wxPreviewFrame();
210 
211     /**
212         Creates a wxPreviewCanvas.
213 
214         Override this function to allow a user-defined preview canvas object
215         to be created.
216     */
217     virtual void CreateCanvas();
218 
219     /**
220         Creates a wxPreviewControlBar.
221 
222         Override this function to allow a user-defined preview control bar object
223         to be created.
224     */
225     virtual void CreateControlBar();
226 
227     /**
228         Initializes the frame elements and prepares for showing it.
229 
230         Calling this method is equivalent to calling InitializeWithModality()
231         with wxPreviewFrame_AppModal argument, please see its documentation for
232         more details.
233 
234         Please notice that this function is virtual mostly for backwards
235         compatibility only, there is no real need to override it as it's never
236         called by wxWidgets itself.
237      */
238     virtual void Initialize();
239 
240     /**
241         Initializes the frame elements and prepares for showing it with the
242         given modality kind.
243 
244         This method creates the frame elements by calling CreateCanvas() and
245         CreateControlBar() methods (which may be overridden to customize them)
246         and prepares to show the frame according to the value of @a kind
247         parameter:
248             - If it is wxPreviewFrame_AppModal, all the other application
249             windows will be disabled when this frame is shown. This is the same
250             behaviour as that of simple Initialize().
251             - If it is wxPreviewFrame_WindowModal, only the parent window of
252             the preview frame will be disabled when it is shown.
253             - And if it is wxPreviewFrame_NonModal, no windows at all will be
254             disabled while the preview is shown.
255 
256         Notice that this function (or Initialize()) must be called by the
257         application prior to showing the frame but you still must call @c
258         Show(true) to actually show it afterwards.
259 
260         @param kind
261             The modality kind of preview frame.
262 
263         @since 2.9.2
264     */
265     void InitializeWithModality(wxPreviewFrameModalityKind kind);
266 
267     /**
268         Enables any disabled frames in the application, and deletes the print preview
269         object, implicitly deleting any printout objects associated with the print
270         preview object.
271     */
272     void OnCloseWindow(wxCloseEvent& event);
273 };
274 
275 
276 
277 /**
278     @class wxPrintPreview
279 
280     Objects of this class manage the print preview process. The object is passed
281     a wxPrintout object, and the wxPrintPreview object itself is passed to
282     a wxPreviewFrame object. Previewing is started by initializing and showing
283     the preview frame. Unlike wxPrinter::Print(), flow of control returns to the
284     application immediately after the frame is shown.
285 
286     @note
287     The preview shown is only exact on Windows. On other platforms, the wxDC
288     used for preview is different from what is used for printing and the
289     results may be significantly different, depending on how is the output
290     created. In particular, printing code relying on wxDC::GetTextExtent()
291     heavily (for example, wxHtmlEasyPrinting and other wxHTML classes do) is
292     affected. It is recommended to use native preview functionality on
293     platforms that offer it (macOS, GTK+).
294 
295     @library{wxcore}
296     @category{printing}
297 
298     @see @ref overview_printing, wxPrinterDC, wxPrintDialog, wxPrintout, wxPrinter,
299          wxPreviewCanvas, wxPreviewControlBar, wxPreviewFrame
300 */
301 class wxPrintPreview : public wxObject
302 {
303 public:
304     /**
305         Constructor.
306 
307         Pass a printout object, an optional printout object to be used for actual
308         printing, and the address of an optional block of printer data, which will
309         be copied to the print preview object's print data.
310 
311         If @a printoutForPrinting is non-@NULL, a @b "Print..." button will be placed on
312         the preview frame so that the user can print directly from the preview interface.
313 
314         @remarks
315         Do not explicitly delete the printout objects once this constructor has been
316         called, since they will be deleted in the wxPrintPreview destructor.
317         The same does not apply to the @a data argument.
318 
319         Use IsOk() to check whether the wxPrintPreview object was created correctly.
320     */
321     wxPrintPreview(wxPrintout* printout,
322                    wxPrintout* printoutForPrinting = NULL,
323                    wxPrintDialogData* data = NULL);
324     wxPrintPreview(wxPrintout* printout,
325                    wxPrintout* printoutForPrinting,
326                    wxPrintData* data);
327 
328     /**
329         Destructor.
330 
331         Deletes both print preview objects, so do not destroy these objects
332         in your application.
333     */
334     ~wxPrintPreview();
335 
336     /**
337         Gets the preview window used for displaying the print preview image.
338     */
339     virtual wxPreviewCanvas* GetCanvas() const;
340 
341     /**
342         Gets the page currently being previewed.
343     */
344     virtual int GetCurrentPage() const;
345 
346     /**
347         Gets the frame used for displaying the print preview canvas
348         and control bar.
349     */
350     virtual wxFrame* GetFrame() const;
351 
352     /**
353         Returns the maximum page number.
354     */
355     virtual int GetMaxPage() const;
356 
357     /**
358         Returns the minimum page number.
359     */
360     virtual int GetMinPage() const;
361 
362     /**
363         Gets the preview printout object associated with the wxPrintPreview object.
364     */
365     virtual wxPrintout* GetPrintout() const;
366 
367     /**
368         Gets the printout object to be used for printing from within the preview
369         interface,
370         or @NULL if none exists.
371     */
372     virtual wxPrintout* GetPrintoutForPrinting() const;
373 
374     /**
375         Returns @true if the wxPrintPreview is valid, @false otherwise.
376 
377         It could return @false if there was a problem initializing the printer
378         device context (current printer not set, for example).
379     */
380     virtual bool IsOk() const;
381 
382     /**
383         This refreshes the preview window with the preview image.
384         It must be called from the preview window's OnPaint member.
385 
386         The implementation simply blits the preview bitmap onto
387         the canvas, creating a new preview bitmap if none exists.
388     */
389     virtual bool PaintPage(wxPreviewCanvas* canvas, wxDC& dc);
390 
391     /**
392         Invokes the print process using the second wxPrintout object
393         supplied in the wxPrintPreview constructor.
394         Will normally be called by the @b Print... panel item on the
395         preview frame's control bar.
396 
397         Returns @false in case of error -- call wxPrinter::GetLastError()
398         to get detailed information about the kind of the error.
399     */
400     virtual bool Print(bool prompt);
401 
402     /**
403         Renders a page into a wxMemoryDC. Used internally by wxPrintPreview.
404     */
405     virtual bool RenderPage(int pageNum);
406 
407     /**
408         Sets the window to be used for displaying the print preview image.
409     */
410     virtual void SetCanvas(wxPreviewCanvas* window);
411 
412     /**
413         Sets the current page to be previewed.
414     */
415     virtual bool SetCurrentPage(int pageNum);
416 
417     /**
418         Sets the frame to be used for displaying the print preview canvas
419         and control bar.
420     */
421     virtual void SetFrame(wxFrame* frame);
422 
423     /**
424         Associates a printout object with the wxPrintPreview object.
425     */
426     virtual void SetPrintout(wxPrintout* printout);
427 
428     /**
429         Sets the percentage preview zoom, and refreshes the preview canvas accordingly.
430     */
431     virtual void SetZoom(int percent);
432 };
433 
434 
435 
436 /**
437     @class wxPrinter
438 
439     This class represents the Windows or PostScript printer, and is the vehicle
440     through which printing may be launched by an application.
441 
442     Printing can also be achieved through using of lower functions and classes,
443     but this and associated classes provide a more convenient and general method
444     of printing.
445 
446     @library{wxcore}
447     @category{printing}
448 
449     @see @ref overview_printing, wxPrinterDC, wxPrintDialog, wxPrintout, wxPrintPreview
450 */
451 class wxPrinter : public wxObject
452 {
453 public:
454     /**
455         Constructor.
456 
457         Pass an optional pointer to a block of print dialog data, which will be
458         copied to the printer object's local data.
459 
460         @see wxPrintDialogData, wxPrintData
461     */
462     wxPrinter(wxPrintDialogData* data = NULL);
463 
464     /**
465         Creates the default printing abort window, with a cancel button.
466     */
467     virtual wxPrintAbortDialog* CreateAbortWindow(wxWindow* parent, wxPrintout* printout);
468 
469     /**
470         Returns @true if the user has aborted the print job.
471     */
472     bool GetAbort() const;
473 
474     /**
475         Return last error. Valid after calling Print(), PrintDialog() or
476         wxPrintPreview::Print().
477 
478         These functions set last error to @c wxPRINTER_NO_ERROR if no error happened.
479 
480         Returned value is one of the following:
481 
482         @beginTable
483         @row2col{wxPRINTER_NO_ERROR, No error happened.}
484         @row2col{wxPRINTER_CANCELLED, The user cancelled printing.}
485         @row2col{wxPRINTER_ERROR, There was an error during printing.}
486         @endTable
487     */
488     static wxPrinterError GetLastError();
489 
490     /**
491         Returns the @ref overview_printing_printdata "print data" associated with
492         the printer object.
493     */
494     virtual wxPrintDialogData& GetPrintDialogData() const;
495 
496     /**
497         Starts the printing process. Provide a parent window, a user-defined wxPrintout
498         object which controls the printing of a document, and whether the print dialog
499         should be invoked first.
500 
501         Print() could return @false if there was a problem initializing the printer device
502         context (current printer not set, for example) or the user cancelled printing.
503         Call GetLastError() to get detailed information about the kind of the error.
504     */
505     virtual bool Print(wxWindow* parent, wxPrintout* printout,
506                        bool prompt = true);
507 
508     /**
509         Invokes the print dialog.
510 
511         If successful (the user did not press Cancel and no error occurred),
512         a suitable device context will be returned; otherwise @NULL is returned;
513         call GetLastError() to get detailed information about the kind of the error.
514 
515         @remarks
516         The application must delete this device context to avoid a memory leak.
517     */
518     virtual wxDC* PrintDialog(wxWindow* parent);
519 
520     /**
521         Default error-reporting function.
522     */
523     virtual void ReportError(wxWindow* parent, wxPrintout* printout,
524                              const wxString& message);
525 
526     /**
527         Invokes the print setup dialog.
528 
529         @deprecated
530         The setup dialog is obsolete, though retained
531         for backward compatibility.
532     */
533     virtual bool Setup(wxWindow* parent);
534 };
535 
536 
537 
538 /**
539     @class wxPrintout
540 
541     This class encapsulates the functionality of printing out an application document.
542 
543     A new class must be derived and members overridden to respond to calls such as
544     OnPrintPage() and HasPage() and to render the print image onto an associated wxDC.
545     Instances of this class are passed to wxPrinter::Print() or
546     to a wxPrintPreview object to initiate printing or previewing.
547 
548     Your derived wxPrintout is responsible for drawing both the preview image and
549     the printed page. If your windows' drawing routines accept an arbitrary DC as an
550     argument, you can re-use those routines within your wxPrintout subclass to draw
551     the printout image. You may also add additional drawing elements within your
552     wxPrintout subclass, like headers, footers, and/or page numbers. However, the
553     image on the printed page will often differ from the image drawn on the screen,
554     as will the print preview image -- not just in the presence of headers and
555     footers, but typically in scale. A high-resolution printer presents a much
556     larger drawing surface (i.e., a higher-resolution DC); a zoomed-out preview
557     image presents a much smaller drawing surface (lower-resolution DC). By using
558     the routines FitThisSizeToXXX() and/or MapScreenSizeToXXX() within your
559     wxPrintout subclass to set the user scale and origin of the associated DC, you
560     can easily use a single drawing routine to draw on your application's windows,
561     to create the print preview image, and to create the printed paper image, and
562     achieve a common appearance to the preview image and the printed page.
563 
564     @library{wxcore}
565     @category{printing}
566 
567     @see @ref overview_printing, wxPrinterDC, wxPrintDialog, wxPageSetupDialog,
568          wxPrinter, wxPrintPreview
569 */
570 class wxPrintout : public wxObject
571 {
572 public:
573     /**
574         Constructor.
575 
576         Pass an optional title argument - the current filename would be a
577         good idea. This will appear in the printing list (at least in MSW)
578     */
579     wxPrintout(const wxString& title = "Printout");
580 
581     /**
582         Destructor.
583     */
584     virtual ~wxPrintout();
585 
586     /**
587         Set the user scale and device origin of the wxDC associated with this wxPrintout
588         so that the given image size fits entirely within the page rectangle and the
589         origin is at the top left corner of the page rectangle.
590 
591         On MSW and Mac, the page rectangle is the printable area of the page.
592         On other platforms and PostScript printing, the page rectangle is the entire paper.
593 
594         Use this if you want your printed image as large as possible, but with the caveat
595         that on some platforms, portions of the image might be cut off at the edges.
596     */
597     void FitThisSizeToPage(const wxSize& imageSize);
598 
599     /**
600         Set the user scale and device origin of the wxDC associated with this wxPrintout
601         so that the given image size fits entirely within the page margins set in the
602         given wxPageSetupDialogData object.
603 
604         This function provides the greatest consistency across all platforms because it
605         does not depend on having access to the printable area of the paper.
606 
607         @remarks
608         On Mac, the native wxPageSetupDialog does not let you set the page margins;
609         you'll have to provide your own mechanism, or you can use the Mac-only class
610         wxMacPageMarginsDialog.
611     */
612     void FitThisSizeToPageMargins(const wxSize& imageSize,
613                                   const wxPageSetupDialogData& pageSetupData);
614 
615     /**
616         Set the user scale and device origin of the wxDC associated with this wxPrintout
617         so that the given image size fits entirely within the paper and the origin is at
618         the top left corner of the paper.
619 
620         Use this if you're managing your own page margins.
621 
622         @note
623         With most printers, the region around the edges of the paper are not
624         printable so that the edges of the image could be cut off.
625 
626     */
627     void FitThisSizeToPaper(const wxSize& imageSize);
628 
629     /**
630         Returns the device context associated with the printout (given to the printout
631         at start of printing or previewing).
632 
633         The application can use GetDC() to obtain a device context to draw on.
634 
635         This will be a wxPrinterDC if printing under Windows or Mac, a wxPostScriptDC
636         if printing on other platforms, and a wxMemoryDC if previewing.
637     */
638     wxDC* GetDC() const;
639 
640     /**
641         Return the rectangle corresponding to the page margins specified by the given
642         wxPageSetupDialogData object in the associated wxDC's logical coordinates for
643         the current user scale and device origin.
644 
645         The page margins are specified with respect to the edges of the paper on all
646         platforms.
647     */
648     wxRect GetLogicalPageMarginsRect(const wxPageSetupDialogData& pageSetupData) const;
649 
650     /**
651         Return the rectangle corresponding to the page in the associated wxDC 's
652         logical coordinates for the current user scale and device origin.
653 
654         On MSW and Mac, this will be the printable area of the paper.
655         On other platforms and PostScript printing, this will be the full paper
656         rectangle.
657     */
658     wxRect GetLogicalPageRect() const;
659 
660     /**
661         Return the rectangle corresponding to the paper in the associated wxDC 's
662         logical coordinates for the current user scale and device origin.
663     */
664     wxRect GetLogicalPaperRect() const;
665 
666     /**
667         Returns the number of pixels per logical inch of the printer device context.
668 
669         Dividing the printer PPI by the screen PPI can give a suitable scaling factor
670         for drawing text onto the printer.
671 
672         Remember to multiply this by a scaling factor to take the preview DC size into
673         account.
674         Or you can just use the FitThisSizeToXXX() and MapScreenSizeToXXX routines below,
675         which do most of the scaling calculations for you.
676 
677         @beginWxPerlOnly
678         In wxPerl this method takes no arguments and returns a
679         2-element list (w, h).
680         @endWxPerlOnly
681     */
682     void GetPPIPrinter(int* w, int* h) const;
683 
684     /**
685         Returns the number of pixels per logical inch of the screen device context.
686 
687         Dividing the printer PPI by the screen PPI can give a suitable scaling factor
688         for drawing text onto the printer.
689 
690         If you are doing your own scaling, remember to multiply this by a scaling
691         factor to take the preview DC size into account.
692 
693         @beginWxPerlOnly
694         In wxPerl this method takes no arguments and returns a
695         2-element list (w, h).
696         @endWxPerlOnly
697     */
698     void GetPPIScreen(int* w, int* h) const;
699 
700     /**
701         Called by the framework to obtain information from the application about minimum
702         and maximum page values that the user can select, and the required page range to
703         be printed.
704 
705         By default this returns (1, 32000) for the page minimum and maximum values, and
706         (1, 1) for the required page range.
707 
708         @a minPage must be greater than zero and @a maxPage must be greater
709         than @a minPage.
710     */
711     virtual void GetPageInfo(int* minPage, int* maxPage, int* pageFrom,
712                              int* pageTo);
713 
714     /**
715         Returns the size of the printer page in millimetres.
716 
717         @beginWxPerlOnly
718         In wxPerl this method takes no arguments and returns a
719         2-element list (w, h).
720         @endWxPerlOnly
721     */
722     void GetPageSizeMM(int* w, int* h) const;
723 
724     /**
725         Returns the size of the printer page in pixels, called the page rectangle.
726 
727         The page rectangle has a top left corner at (0,0) and a bottom right corner at
728         (w,h). These values may not be the same as the values returned from
729         wxDC::GetSize(); if the printout is being used for
730         previewing, a memory device context is used, which uses a bitmap size reflecting
731         the current preview zoom. The application must take this discrepancy into
732         account if previewing is to be supported.
733     */
734     void GetPageSizePixels(int* w, int* h) const;
735 
736     /**
737         Returns the rectangle that corresponds to the entire paper in pixels, called the
738         paper rectangle.
739 
740         This distinction between paper rectangle and page rectangle reflects the fact that
741         most printers cannot print all the way to the edge of the paper.
742         The page rectangle is a rectangle whose top left corner is at (0,0) and whose width
743         and height are given by wxDC::GetPageSizePixels().
744 
745         On MSW and Mac, the page rectangle gives the printable area of the paper, while the
746         paper rectangle represents the entire paper, including non-printable borders.
747         Thus, the rectangle returned by wxDC::GetPaperRectPixels() will have a top left corner
748         whose coordinates are small negative numbers and the bottom right corner will have
749         values somewhat larger than the width and height given by wxDC::GetPageSizePixels().
750 
751         On other platforms and for PostScript printing, the paper is treated as if its entire
752         area were printable, so this function will return the same rectangle as the page
753         rectangle.
754     */
755     wxRect GetPaperRectPixels() const;
756 
757     /**
758         Returns the title of the printout.
759 
760         @todo the python note here was wrong
761     */
762     virtual wxString GetTitle() const;
763 
764     /**
765         Should be overridden to return @true if the document has this page, or @false
766         if not.
767 
768         Returning @false signifies the end of the document. By default,
769         HasPage behaves as if the document has only one page.
770     */
771     virtual bool HasPage(int pageNum);
772 
773     /**
774         Returns @true if the printout is currently being used for previewing.
775 
776         @see GetPreview()
777     */
778     virtual bool IsPreview() const;
779 
780     /**
781         Returns the associated preview object if any.
782 
783         If this printout object is used for previewing, returns the associated
784         wxPrintPreview. Otherwise returns @NULL.
785 
786         The returned pointer is not owned by the printout and must not be
787         deleted.
788 
789         @see IsPreview()
790 
791         @since 2.9.1.
792      */
793     wxPrintPreview *GetPreview() const;
794 
795     /**
796         Set the user scale and device origin of the wxDC associated with this wxPrintout
797         so that one screen pixel maps to one device pixel on the DC.
798         That is, the user scale is set to (1,1) and the device origin is set to (0,0).
799 
800         Use this if you want to do your own scaling prior to calling wxDC drawing calls,
801         for example, if your underlying model is floating-point and you want to achieve
802         maximum drawing precision on high-resolution printers.
803 
804         You can use the GetLogicalXXXRect() routines below to obtain the paper rectangle,
805         page rectangle, or page margins rectangle to perform your own scaling.
806 
807         @note
808         While the underlying drawing model of macOS is floating-point,
809         wxWidgets's drawing model scales from integer coordinates.
810     */
811     void MapScreenSizeToDevice();
812 
813     /**
814         This sets the user scale of the wxDC associated with this wxPrintout to the same
815         scale as MapScreenSizeToPaper() but sets the logical origin to the top left corner
816         of the page rectangle.
817     */
818     void MapScreenSizeToPage();
819 
820     /**
821         This sets the user scale of the wxDC associated with this wxPrintout to the same
822         scale as MapScreenSizeToPageMargins() but sets the logical origin to the top left
823         corner of the page margins specified by the given wxPageSetupDialogData object.
824     */
825     void MapScreenSizeToPageMargins(const wxPageSetupDialogData& pageSetupData);
826 
827     /**
828         Set the user scale and device origin of the wxDC associated with this wxPrintout
829         so that the printed page matches the screen size as closely as possible
830         and the logical origin is in the top left corner of the paper rectangle.
831 
832         That is, a 100-pixel object on screen should appear at the same size on the
833         printed page.
834         (It will, of course, be larger or smaller in the preview image, depending on the
835         zoom factor.)
836 
837         Use this if you want WYSIWYG behaviour, e.g., in a text editor.
838     */
839     void MapScreenSizeToPaper();
840 
841     /**
842         Shift the device origin by an amount specified in logical coordinates.
843     */
844     void OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff);
845 
846     /**
847         Called by the framework at the start of document printing. Return @false from
848         this function cancels the print job.
849 
850         OnBeginDocument() is called once for every copy printed.
851 
852         @remarks
853         The base OnBeginDocument() must be called (and the return value
854         checked) from within the overridden function, since it calls wxDC::StartDoc().
855     */
856     virtual bool OnBeginDocument(int startPage, int endPage);
857 
858     /**
859         Called by the framework at the start of printing.
860 
861         OnBeginPrinting() is called once for every print job
862         (regardless of how many copies are being printed).
863     */
864     virtual void OnBeginPrinting();
865 
866     /**
867         Called by the framework at the end of document printing.
868 
869         OnEndDocument() is called once for every copy printed.
870 
871         @remarks
872         The base OnEndDocument() must be called from within the overridden function,
873         since it calls wxDC::EndDoc().
874     */
875     virtual void OnEndDocument();
876 
877     /**
878         Called by the framework at the end of printing.
879 
880         OnEndPrinting is called once for every print job
881         (regardless of how many copies are being printed).
882     */
883     virtual void OnEndPrinting();
884 
885     /**
886         Called once by the framework before any other demands are made of the
887         wxPrintout object.
888 
889         This gives the object an opportunity to calculate the number of pages
890         in the document, for example.
891     */
892     virtual void OnPreparePrinting();
893 
894     /**
895         Called by the framework when a page should be printed. Returning @false cancels
896         the print job.
897     */
898     virtual bool OnPrintPage(int pageNum) = 0;
899 
900     /**
901         Set the device origin of the associated wxDC so that the current logical point
902         becomes the new logical origin.
903     */
904     void SetLogicalOrigin(wxCoord x, wxCoord y);
905 };
906 
907 
908 /**
909    @class wxPrintAbortDialog
910 
911    The dialog created by default by the print framework that enables aborting
912    the printing process.
913  */
914 class wxPrintAbortDialog: public wxDialog
915 {
916 public:
917     wxPrintAbortDialog(wxWindow *parent,
918                        const wxString& documentTitle,
919                        const wxPoint& pos = wxDefaultPosition,
920                        const wxSize& size = wxDefaultSize,
921                        long style = wxDEFAULT_DIALOG_STYLE,
922                        const wxString& name = "dialog");
923 
924     void SetProgress(int currentPage, int totalPages,
925                      int currentCopy, int totalCopies);
926 };
927