1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Printing Framework classes
9 // Copyright: (c) 1998 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
18 #include <wx/printdlg.h>
24 //----------------------------------------------------------------------
27 // Put some wx default wxChar* values into wxStrings.
28 static const wxChar* wxPrintoutTitleStr = wxT("Printout");
29 DECLARE_DEF_STRING(PrintoutTitleStr);
30 static const wxChar* wxPreviewCanvasNameStr = wxT("previewcanvas");
31 DECLARE_DEF_STRING(PreviewCanvasNameStr);
33 DECLARE_DEF_STRING(FrameNameStr);
34 DECLARE_DEF_STRING(PanelNameStr);
35 DECLARE_DEF_STRING(DialogNameStr);
39 //----------------------------------------------------------------------
42 %include my_typemaps.i
44 // Import some definitions of other classes, etc.
53 %pragma(python) code = "import wx"
56 //----------------------------------------------------------------------
60 wxPRINT_MODE_NONE = 0,
61 wxPRINT_MODE_PREVIEW = 1, // Preview in external application
62 wxPRINT_MODE_FILE = 2, // Print to file
63 wxPRINT_MODE_PRINTER = 3 // Send to printer
68 class wxPrintData : public wxObject {
79 const wxString& GetPrinterName();
81 wxDuplexMode GetDuplex();
82 wxPaperSize GetPaperId();
83 const wxSize& GetPaperSize();
85 wxPrintQuality GetQuality();
87 void SetNoCopies(int v);
88 void SetCollate(bool flag);
89 void SetOrientation(int orient);
91 void SetPrinterName(const wxString& name);
92 void SetColour(bool colour);
93 void SetDuplex(wxDuplexMode duplex);
94 void SetPaperId(wxPaperSize sizeId);
95 void SetPaperSize(const wxSize& sz);
96 void SetQuality(wxPrintQuality quality);
98 // PostScript-specific data
99 const wxString& GetPrinterCommand();
100 const wxString& GetPrinterOptions();
101 const wxString& GetPreviewCommand();
102 const wxString& GetFilename();
103 const wxString& GetFontMetricPath();
104 double GetPrinterScaleX();
105 double GetPrinterScaleY();
106 long GetPrinterTranslateX();
107 long GetPrinterTranslateY();
108 wxPrintMode GetPrintMode();
110 void SetPrinterCommand(const wxString& command);
111 void SetPrinterOptions(const wxString& options);
112 void SetPreviewCommand(const wxString& command);
113 void SetFilename(const wxString& filename);
114 void SetFontMetricPath(const wxString& path);
115 void SetPrinterScaleX(double x);
116 void SetPrinterScaleY(double y);
117 void SetPrinterScaling(double x, double y);
118 void SetPrinterTranslateX(long x);
119 void SetPrinterTranslateY(long y);
120 void SetPrinterTranslation(long x, long y);
121 void SetPrintMode(wxPrintMode printMode);
123 %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()"
126 //----------------------------------------------------------------------
129 class wxPrinterDC : public wxDC {
131 wxPrinterDC(const wxPrintData& printData);
132 %name(wxPrinterDC2) wxPrinterDC(const wxString& driver,
133 const wxString& device,
134 const wxString& output,
135 bool interactive = TRUE,
136 int orientation = wxPORTRAIT);
140 //---------------------------------------------------------------------------
142 class wxPostScriptDC : public wxDC {
144 wxPostScriptDC(const wxPrintData& printData);
145 // %name(wxPostScriptDC2)wxPostScriptDC(const wxString& output,
146 // bool interactive = TRUE,
147 // wxWindow* parent = NULL);
149 wxPrintData& GetPrintData();
150 void SetPrintData(const wxPrintData& data);
152 static void SetResolution(int ppi);
153 static int GetResolution();
156 //---------------------------------------------------------------------------
158 class wxPageSetupDialogData : public wxObject {
160 wxPageSetupDialogData();
161 ~wxPageSetupDialogData();
163 void EnableHelp(bool flag);
164 void EnableMargins(bool flag);
165 void EnableOrientation(bool flag);
166 void EnablePaper(bool flag);
167 void EnablePrinter(bool flag);
168 bool GetDefaultMinMargins();
169 bool GetEnableMargins();
170 bool GetEnableOrientation();
171 bool GetEnablePaper();
172 bool GetEnablePrinter();
173 bool GetEnableHelp();
174 bool GetDefaultInfo();
175 wxPoint GetMarginTopLeft();
176 wxPoint GetMarginBottomRight();
177 wxPoint GetMinMarginTopLeft();
178 wxPoint GetMinMarginBottomRight();
179 wxPaperSize GetPaperId();
180 wxSize GetPaperSize();
182 %new wxPrintData* GetPrintData() {
183 return new wxPrintData(self->GetPrintData()); // force a copy
189 void SetDefaultInfo(bool flag);
190 void SetDefaultMinMargins(bool flag);
191 void SetMarginTopLeft(const wxPoint& pt);
192 void SetMarginBottomRight(const wxPoint& pt);
193 void SetMinMarginTopLeft(const wxPoint& pt);
194 void SetMinMarginBottomRight(const wxPoint& pt);
195 void SetPaperId(wxPaperSize id);
196 void SetPaperSize(const wxSize& size);
197 void SetPrintData(const wxPrintData& printData);
199 %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()"
203 class wxPageSetupDialog : public wxDialog {
205 wxPageSetupDialog(wxWindow* parent, wxPageSetupDialogData* data = NULL);
207 %pragma(python) addtomethod = "__init__:#wx._StdDialogCallbacks(self)"
209 wxPageSetupDialogData& GetPageSetupData();
213 //----------------------------------------------------------------------
216 class wxPrintDialogData : public wxObject {
219 ~wxPrintDialogData();
221 int GetFromPage() const;
222 int GetToPage() const;
223 int GetMinPage() const;
224 int GetMaxPage() const;
225 int GetNoCopies() const;
226 bool GetAllPages() const;
227 bool GetSelection() const;
228 bool GetCollate() const;
229 bool GetPrintToFile() const;
230 bool GetSetupDialog() const;
232 void SetFromPage(int v);
233 void SetToPage(int v);
234 void SetMinPage(int v);
235 void SetMaxPage(int v);
236 void SetNoCopies(int v);
237 void SetAllPages(bool flag);
238 void SetSelection(bool flag);
239 void SetCollate(bool flag);
240 void SetPrintToFile(bool flag);
241 void SetSetupDialog(bool flag);
243 void EnablePrintToFile(bool flag);
244 void EnableSelection(bool flag);
245 void EnablePageNumbers(bool flag);
246 void EnableHelp(bool flag);
248 bool GetEnablePrintToFile() const;
249 bool GetEnableSelection() const;
250 bool GetEnablePageNumbers() const;
251 bool GetEnableHelp() const;
253 // Is this data OK for showing the print dialog?
257 %new wxPrintData* GetPrintData() {
258 return new wxPrintData(self->GetPrintData()); // force a copy
261 void SetPrintData(const wxPrintData& printData);
263 %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()"
267 class wxPrintDialog : public wxDialog {
269 wxPrintDialog(wxWindow* parent, wxPrintDialogData* data = NULL);
271 %pragma(python) addtomethod = "__init__:#wx._StdDialogCallbacks(self)"
273 wxPrintDialogData& GetPrintDialogData();
274 %new wxDC* GetPrintDC();
278 //----------------------------------------------------------------------
279 //----------------------------------------------------------------------
280 // Custom wxPrintout class that knows how to call python
284 // Since this one would be tough and ugly to do with the Macros...
285 void wxPyPrintout::GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo) {
289 wxPyBeginBlockThreads();
290 if ((found = m_myInst.findCallback("GetPageInfo"))) {
291 PyObject* result = m_myInst.callCallbackObj(Py_BuildValue("()"));
292 if (result && PyTuple_Check(result) && PyTuple_Size(result) == 4) {
295 val = PyTuple_GetItem(result, 0);
296 if (PyInt_Check(val)) *minPage = PyInt_AsLong(val);
299 val = PyTuple_GetItem(result, 1);
300 if (PyInt_Check(val)) *maxPage = PyInt_AsLong(val);
303 val = PyTuple_GetItem(result, 2);
304 if (PyInt_Check(val)) *pageFrom = PyInt_AsLong(val);
307 val = PyTuple_GetItem(result, 3);
308 if (PyInt_Check(val)) *pageTo = PyInt_AsLong(val);
315 PyErr_SetString(PyExc_TypeError, "GetPageInfo should return a tuple of 4 integers.");
320 wxPyEndBlockThreads();
322 wxPrintout::GetPageInfo(minPage, maxPage, pageFrom, pageTo);
325 void wxPyPrintout::base_GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo) {
326 wxPrintout::GetPageInfo(minPage, maxPage, pageFrom, pageTo);
330 IMP_PYCALLBACK_BOOL_INTINT(wxPyPrintout, wxPrintout, OnBeginDocument);
331 IMP_PYCALLBACK__(wxPyPrintout, wxPrintout, OnEndDocument);
332 IMP_PYCALLBACK__(wxPyPrintout, wxPrintout, OnBeginPrinting);
333 IMP_PYCALLBACK__(wxPyPrintout, wxPrintout, OnEndPrinting);
334 IMP_PYCALLBACK__(wxPyPrintout, wxPrintout, OnPreparePrinting);
335 IMP_PYCALLBACK_BOOL_INT_pure(wxPyPrintout, wxPrintout, OnPrintPage);
336 IMP_PYCALLBACK_BOOL_INT(wxPyPrintout, wxPrintout, HasPage);
342 // Now define the custom class for SWIGging
343 %name(wxPrintout) class wxPyPrintout : public wxObject {
345 wxPyPrintout(const wxString& title = wxPyPrintoutTitleStr);
347 void _setCallbackInfo(PyObject* self, PyObject* _class);
348 %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPrintout)"
351 void Destroy() { delete self; }
355 void GetPageSizeMM(int *OUTPUT, int *OUTPUT);
356 void GetPageSizePixels(int *OUTPUT, int *OUTPUT);
357 void GetPPIPrinter(int *OUTPUT, int *OUTPUT);
358 void GetPPIScreen(int *OUTPUT, int *OUTPUT);
361 bool base_OnBeginDocument(int startPage, int endPage);
362 void base_OnEndDocument();
363 void base_OnBeginPrinting();
364 void base_OnEndPrinting();
365 void base_OnPreparePrinting();
366 void base_GetPageInfo(int *OUTPUT, int *OUTPUT, int *OUTPUT, int *OUTPUT);
367 bool base_HasPage(int page);
370 //----------------------------------------------------------------------
374 wxPRINTER_NO_ERROR = 0,
380 class wxPrinter : public wxObject {
382 wxPrinter(wxPrintDialogData* data = NULL);
385 void CreateAbortWindow(wxWindow* parent, wxPyPrintout* printout);
386 wxPrintDialogData& GetPrintDialogData();
387 bool Print(wxWindow *parent, wxPyPrintout *printout, int prompt=TRUE);
388 wxDC* PrintDialog(wxWindow *parent);
389 void ReportError(wxWindow *parent, wxPyPrintout *printout, const wxString& message);
390 bool Setup(wxWindow *parent);
393 static wxPrinterError GetLastError();
396 //----------------------------------------------------------------------
398 class wxPrintAbortDialog: public wxDialog
401 wxPrintAbortDialog(wxWindow *parent,
402 const wxString& title,
403 const wxPoint& pos = wxDefaultPosition,
404 const wxSize& size = wxDefaultSize,
406 const wxString& name = wxPyDialogNameStr);
410 //----------------------------------------------------------------------
412 class wxPrintPreview : public wxObject {
414 wxPrintPreview(wxPyPrintout* printout,
415 wxPyPrintout* printoutForPrinting,
416 wxPrintData* data=NULL);
418 virtual bool SetCurrentPage(int pageNum);
419 int GetCurrentPage();
421 void SetPrintout(wxPyPrintout *printout);
422 wxPyPrintout *GetPrintout();
423 wxPyPrintout *GetPrintoutForPrinting();
425 void SetFrame(wxFrame *frame);
426 void SetCanvas(wxWindow *canvas);
428 virtual wxFrame *GetFrame();
429 virtual wxWindow *GetCanvas();
431 // The preview canvas should call this from OnPaint
432 virtual bool PaintPage(wxWindow *canvas, wxDC& dc);
434 // This draws a blank page onto the preview canvas
435 virtual bool DrawBlankPage(wxWindow *canvas, wxDC& dc);
437 // This is called by wxPrintPreview to render a page into a wxMemoryDC.
438 virtual bool RenderPage(int pageNum);
440 wxPrintDialogData& GetPrintDialogData();
442 virtual void SetZoom(int percent);
451 virtual bool Print(bool interactive);
452 virtual void DetermineScaling();
454 %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()"
458 class wxPreviewFrame : public wxFrame {
460 wxPreviewFrame(wxPrintPreview* preview, wxFrame* parent, const wxString& title,
461 const wxPoint& pos = wxDefaultPosition,
462 const wxSize& size = wxDefaultSize,
463 long style = wxDEFAULT_FRAME_STYLE,
464 const wxString& name = wxPyFrameNameStr);
466 %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
469 void CreateControlBar();
474 class wxPreviewCanvas: public wxScrolledWindow
477 wxPreviewCanvas(wxPrintPreview *preview,
479 const wxPoint& pos = wxDefaultPosition,
480 const wxSize& size = wxDefaultSize,
482 const wxString& name = wxPyPreviewCanvasNameStr);
483 %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
500 wxID_PREVIEW_PREVIOUS,
508 class wxPreviewControlBar: public wxPanel
511 wxPreviewControlBar(wxPrintPreview *preview,
514 const wxPoint& pos = wxDefaultPosition,
515 const wxSize& size = wxDefaultSize,
517 const wxString& name = wxPyPanelNameStr);
518 %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
520 int GetZoomControl();
521 void SetZoomControl(int zoom);
522 wxPrintPreview* GetPrintPreview();
532 //----------------------------------------------------------------------
533 // Python-derivable versions of the above preview classes
536 class wxPyPrintPreview : public wxPrintPreview
538 DECLARE_CLASS(wxPyPrintPreview)
540 wxPyPrintPreview(wxPyPrintout* printout,
541 wxPyPrintout* printoutForPrinting,
542 wxPrintData* data=NULL)
543 : wxPrintPreview(printout, printoutForPrinting, data)
546 DEC_PYCALLBACK_BOOL_INT(SetCurrentPage);
547 DEC_PYCALLBACK_BOOL_WXWINDC(PaintPage);
548 DEC_PYCALLBACK_BOOL_WXWINDC(DrawBlankPage);
549 DEC_PYCALLBACK_BOOL_INT(RenderPage);
550 DEC_PYCALLBACK_VOID_INT(SetZoom);
551 DEC_PYCALLBACK_BOOL_BOOL(Print);
552 DEC_PYCALLBACK_VOID_(DetermineScaling);
557 // Stupid renamed classes... Fix this in 2.5...
558 #if defined(__WXMSW__)
559 IMPLEMENT_CLASS( wxPyPrintPreview, wxWindowsPrintPreview );
560 #elif defined(__WXMAC__)
561 IMPLEMENT_CLASS( wxPyPrintPreview, wxMacPrintPreview );
563 IMPLEMENT_CLASS( wxPyPrintPreview, wxPostScriptPrintPreview );
566 IMP_PYCALLBACK_BOOL_INT (wxPyPrintPreview, wxPrintPreview, SetCurrentPage);
567 IMP_PYCALLBACK_BOOL_WXWINDC(wxPyPrintPreview, wxPrintPreview, PaintPage);
568 IMP_PYCALLBACK_BOOL_WXWINDC(wxPyPrintPreview, wxPrintPreview, DrawBlankPage);
569 IMP_PYCALLBACK_BOOL_INT (wxPyPrintPreview, wxPrintPreview, RenderPage);
570 IMP_PYCALLBACK_VOID_INT (wxPyPrintPreview, wxPrintPreview, SetZoom);
571 IMP_PYCALLBACK_BOOL_BOOL (wxPyPrintPreview, wxPrintPreview, Print);
572 IMP_PYCALLBACK_VOID_ (wxPyPrintPreview, wxPrintPreview, DetermineScaling);
576 class wxPyPrintPreview : public wxPrintPreview
579 wxPyPrintPreview(wxPyPrintout* printout,
580 wxPyPrintout* printoutForPrinting,
581 wxPrintData* data=NULL);
583 void _setCallbackInfo(PyObject* self, PyObject* _class);
584 %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPyPrintPreview)"
586 bool base_SetCurrentPage(int pageNum);
587 bool base_PaintPage(wxWindow *canvas, wxDC& dc);
588 bool base_DrawBlankPage(wxWindow *canvas, wxDC& dc);
589 bool base_RenderPage(int pageNum);
590 void base_SetZoom(int percent);
591 bool base_Print(bool interactive);
592 void base_DetermineScaling();
599 class wxPyPreviewFrame : public wxPreviewFrame
601 DECLARE_CLASS(wxPyPreviewFrame);
603 wxPyPreviewFrame(wxPrintPreview* preview, wxFrame* parent,
604 const wxString& title,
605 const wxPoint& pos = wxDefaultPosition,
606 const wxSize& size = wxDefaultSize,
607 long style = wxDEFAULT_FRAME_STYLE,
608 const wxString& name = wxPyFrameNameStr)
609 : wxPreviewFrame(preview, parent, title, pos, size, style, name)
612 void SetPreviewCanvas(wxWindow* canvas) { m_previewCanvas = canvas; }
613 void SetControlBar(wxPreviewControlBar* bar) { m_controlBar = bar; }
615 DEC_PYCALLBACK_VOID_(Initialize);
616 DEC_PYCALLBACK_VOID_(CreateCanvas);
617 DEC_PYCALLBACK_VOID_(CreateControlBar);
622 IMPLEMENT_CLASS(wxPyPreviewFrame, wxPreviewFrame);
624 IMP_PYCALLBACK_VOID_(wxPyPreviewFrame, wxPreviewFrame, Initialize);
625 IMP_PYCALLBACK_VOID_(wxPyPreviewFrame, wxPreviewFrame, CreateCanvas);
626 IMP_PYCALLBACK_VOID_(wxPyPreviewFrame, wxPreviewFrame, CreateControlBar);
629 class wxPyPreviewFrame : public wxPreviewFrame
632 wxPyPreviewFrame(wxPrintPreview* preview, wxFrame* parent,
633 const wxString& title,
634 const wxPoint& pos = wxDefaultPosition,
635 const wxSize& size = wxDefaultSize,
636 long style = wxDEFAULT_FRAME_STYLE,
637 const wxString& name = wxPyFrameNameStr);
639 void _setCallbackInfo(PyObject* self, PyObject* _class);
640 %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPyPreviewFrame)"
641 %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
643 void SetPreviewCanvas(wxWindow* canvas);
644 void SetControlBar(wxPreviewControlBar* bar);
646 void base_Initialize();
647 void base_CreateCanvas();
648 void base_CreateControlBar();
655 class wxPyPreviewControlBar : public wxPreviewControlBar
657 DECLARE_CLASS(wxPyPreviewControlBar);
659 wxPyPreviewControlBar(wxPrintPreview *preview,
662 const wxPoint& pos = wxDefaultPosition,
663 const wxSize& size = wxDefaultSize,
665 const wxString& name = wxPyPanelNameStr)
666 : wxPreviewControlBar(preview, buttons, parent, pos, size, style, name)
669 void SetPrintPreview(wxPrintPreview* preview) { m_printPreview = preview; }
671 DEC_PYCALLBACK_VOID_(CreateButtons);
672 DEC_PYCALLBACK_VOID_INT(SetZoomControl);
677 IMPLEMENT_CLASS(wxPyPreviewControlBar, wxPreviewControlBar);
678 IMP_PYCALLBACK_VOID_(wxPyPreviewControlBar, wxPreviewControlBar, CreateButtons);
679 IMP_PYCALLBACK_VOID_INT(wxPyPreviewControlBar, wxPreviewControlBar, SetZoomControl);
682 class wxPyPreviewControlBar : public wxPreviewControlBar
685 wxPyPreviewControlBar(wxPrintPreview *preview,
688 const wxPoint& pos = wxDefaultPosition,
689 const wxSize& size = wxDefaultSize,
691 const wxString& name = wxPyPanelNameStr);
693 void _setCallbackInfo(PyObject* self, PyObject* _class);
694 %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPyPreviewControlBar)"
695 %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
697 void SetPrintPreview(wxPrintPreview* preview);
699 void base_CreateButtons();
700 void base_SetZoomControl(int zoom);
704 //----------------------------------------------------------------------
707 wxPyPtrTypeMap_Add("wxPrintout", "wxPyPrintout");
710 //----------------------------------------------------------------------
711 //----------------------------------------------------------------------