#include "helpers.h"
#include <wx/print.h>
#include <wx/printdlg.h>
+#include <wx/dcps.h>
#include "printfw.h"
%}
//----------------------------------------------------------------------
+%{
+ // Put some wx default wxChar* values into wxStrings.
+ static const wxChar* wxPrintoutTitleStr = wxT("Printout");
+ DECLARE_DEF_STRING(PrintoutTitleStr);
+ static const wxChar* wxPreviewCanvasNameStr = wxT("previewcanvas");
+ DECLARE_DEF_STRING(PreviewCanvasNameStr);
+
+ DECLARE_DEF_STRING(FrameNameStr);
+ DECLARE_DEF_STRING(PanelNameStr);
+ DECLARE_DEF_STRING(DialogNameStr);
+
+%}
+
+//----------------------------------------------------------------------
+
%include typemaps.i
%include my_typemaps.i
//----------------------------------------------------------------------
+enum wxPrintMode
+{
+ wxPRINT_MODE_NONE = 0,
+ wxPRINT_MODE_PREVIEW = 1, // Preview in external application
+ wxPRINT_MODE_FILE = 2, // Print to file
+ wxPRINT_MODE_PRINTER = 3 // Send to printer
+};
+
-class wxPrintData {
+class wxPrintData : public wxObject {
public:
wxPrintData();
~wxPrintData();
bool GetCollate();
int GetOrientation();
+ bool Ok();
+
const wxString& GetPrinterName();
bool GetColour();
wxDuplexMode GetDuplex();
void SetPaperSize(const wxSize& sz);
void SetQuality(wxPrintQuality quality);
-// // PostScript-specific data
-// const wxString& GetPrinterCommand();
-// const wxString& GetPrinterOptions();
-// const wxString& GetPreviewCommand();
-// const wxString& GetFilename();
-// const wxString& GetFontMetricPath();
-// double GetPrinterScaleX();
-// double GetPrinterScaleY();
-// long GetPrinterTranslateX();
-// long GetPrinterTranslateY();
-// wxPrintMode GetPrintMode();
-
-// void SetPrinterCommand(const wxString& command);
-// void SetPrinterOptions(const wxString& options);
-// void SetPreviewCommand(const wxString& command);
-// void SetFilename(const wxString& filename);
-// void SetFontMetricPath(const wxString& path);
-// void SetPrinterScaleX(double x);
-// void SetPrinterScaleY(double y);
-// void SetPrinterScaling(double x, double y);
-// void SetPrinterTranslateX(long x);
-// void SetPrinterTranslateY(long y);
-// void SetPrinterTranslation(long x, long y);
-// void SetPrintMode(wxPrintMode printMode);
-
+ // PostScript-specific data
+ const wxString& GetPrinterCommand();
+ const wxString& GetPrinterOptions();
+ const wxString& GetPreviewCommand();
+ const wxString& GetFilename();
+ const wxString& GetFontMetricPath();
+ double GetPrinterScaleX();
+ double GetPrinterScaleY();
+ long GetPrinterTranslateX();
+ long GetPrinterTranslateY();
+ wxPrintMode GetPrintMode();
+
+ void SetPrinterCommand(const wxString& command);
+ void SetPrinterOptions(const wxString& options);
+ void SetPreviewCommand(const wxString& command);
+ void SetFilename(const wxString& filename);
+ void SetFontMetricPath(const wxString& path);
+ void SetPrinterScaleX(double x);
+ void SetPrinterScaleY(double y);
+ void SetPrinterScaling(double x, double y);
+ void SetPrinterTranslateX(long x);
+ void SetPrinterTranslateY(long y);
+ void SetPrinterTranslation(long x, long y);
+ void SetPrintMode(wxPrintMode printMode);
+
+ %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()"
};
//----------------------------------------------------------------------
//---------------------------------------------------------------------------
-class wxPageSetupDialogData {
+class wxPostScriptDC : public wxDC {
+public:
+ wxPostScriptDC(const wxPrintData& printData);
+// %name(wxPostScriptDC2)wxPostScriptDC(const wxString& output,
+// bool interactive = TRUE,
+// wxWindow* parent = NULL);
+
+ wxPrintData& GetPrintData();
+ void SetPrintData(const wxPrintData& data);
+
+ static void SetResolution(int ppi);
+ static int GetResolution();
+};
+
+//---------------------------------------------------------------------------
+
+class wxPageSetupDialogData : public wxObject {
public:
wxPageSetupDialogData();
~wxPageSetupDialogData();
return new wxPrintData(self->GetPrintData()); // force a copy
}
}
+
+ bool Ok();
+
void SetDefaultInfo(bool flag);
void SetDefaultMinMargins(bool flag);
void SetMarginTopLeft(const wxPoint& pt);
void SetPaperId(wxPaperSize id);
void SetPaperSize(const wxSize& size);
void SetPrintData(const wxPrintData& printData);
+
+ %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()"
};
//----------------------------------------------------------------------
-class wxPrintDialogData {
+class wxPrintDialogData : public wxObject {
public:
wxPrintDialogData();
~wxPrintDialogData();
- void EnableHelp(bool flag);
- void EnablePageNumbers(bool flag);
+ int GetFromPage() const;
+ int GetToPage() const;
+ int GetMinPage() const;
+ int GetMaxPage() const;
+ int GetNoCopies() const;
+ bool GetAllPages() const;
+ bool GetSelection() const;
+ bool GetCollate() const;
+ bool GetPrintToFile() const;
+ bool GetSetupDialog() const;
+
+ void SetFromPage(int v);
+ void SetToPage(int v);
+ void SetMinPage(int v);
+ void SetMaxPage(int v);
+ void SetNoCopies(int v);
+ void SetAllPages(bool flag);
+ void SetSelection(bool flag);
+ void SetCollate(bool flag);
+ void SetPrintToFile(bool flag);
+ void SetSetupDialog(bool flag);
+
void EnablePrintToFile(bool flag);
void EnableSelection(bool flag);
- bool GetAllPages();
- bool GetCollate();
- int GetFromPage();
- int GetMaxPage();
- int GetMinPage();
- int GetNoCopies();
+ void EnablePageNumbers(bool flag);
+ void EnableHelp(bool flag);
+
+ bool GetEnablePrintToFile() const;
+ bool GetEnableSelection() const;
+ bool GetEnablePageNumbers() const;
+ bool GetEnableHelp() const;
+
+ // Is this data OK for showing the print dialog?
+ bool Ok() const;
+
%addmethods {
%new wxPrintData* GetPrintData() {
return new wxPrintData(self->GetPrintData()); // force a copy
}
}
- bool GetPrintToFile();
- int GetToPage();
- void SetCollate(bool flag);
- void SetFromPage(int page);
- void SetMaxPage(int page);
- void SetMinPage(int page);
- void SetNoCopies(int n);
void SetPrintData(const wxPrintData& printData);
- void SetPrintToFile(bool flag);
- void SetSetupDialog(bool flag);
- void SetToPage(int page);
+
+ %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()"
};
// Since this one would be tough and ugly to do with the Macros...
void wxPyPrintout::GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo) {
bool hadErr = FALSE;
+ bool found;
- bool doSave = wxPyRestoreThread();
- if (m_myInst.findCallback("GetPageInfo")) {
+ wxPyBeginBlockThreads();
+ if ((found = m_myInst.findCallback("GetPageInfo"))) {
PyObject* result = m_myInst.callCallbackObj(Py_BuildValue("()"));
if (result && PyTuple_Check(result) && PyTuple_Size(result) == 4) {
PyObject* val;
}
Py_DECREF(result);
}
- else
+ wxPyEndBlockThreads();
+ if (! found)
wxPrintout::GetPageInfo(minPage, maxPage, pageFrom, pageTo);
-
- wxPySaveThread(doSave);
}
void wxPyPrintout::base_GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo) {
// Now define the custom class for SWIGging
-%name(wxPrintout) class wxPyPrintout {
+%name(wxPrintout) class wxPyPrintout : public wxObject {
public:
- wxPyPrintout(const char* title = "Printout");
+ wxPyPrintout(const wxString& title = wxPyPrintoutTitleStr);
- void _setSelf(PyObject* self, PyObject* _class);
- %pragma(python) addtomethod = "__init__:self._setSelf(self, wxPrintout)"
+ void _setCallbackInfo(PyObject* self, PyObject* _class);
+ %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPrintout)"
%addmethods {
void Destroy() { delete self; }
//----------------------------------------------------------------------
-class wxPrinter {
+enum wxPrinterError
+{
+ wxPRINTER_NO_ERROR = 0,
+ wxPRINTER_CANCELLED,
+ wxPRINTER_ERROR
+};
+
+
+class wxPrinter : public wxObject {
public:
wxPrinter(wxPrintDialogData* data = NULL);
~wxPrinter();
-// bool Abort();
void CreateAbortWindow(wxWindow* parent, wxPyPrintout* printout);
wxPrintDialogData& GetPrintDialogData();
bool Print(wxWindow *parent, wxPyPrintout *printout, int prompt=TRUE);
wxDC* PrintDialog(wxWindow *parent);
- void ReportError(wxWindow *parent, wxPyPrintout *printout, char* message);
+ void ReportError(wxWindow *parent, wxPyPrintout *printout, const wxString& message);
bool Setup(wxWindow *parent);
+ bool GetAbort();
+
+ static wxPrinterError GetLastError();
+};
+
+//----------------------------------------------------------------------
+
+class wxPrintAbortDialog: public wxDialog
+{
+public:
+ wxPrintAbortDialog(wxWindow *parent,
+ const wxString& title,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& name = wxPyDialogNameStr);
+
};
//----------------------------------------------------------------------
-class wxPrintPreview {
+class wxPrintPreview : public wxObject {
public:
- wxPrintPreview(wxPyPrintout* printout, wxPyPrintout* printoutForPrinting, wxPrintData* data=NULL);
-// ~wxPrintPreview(); **** ????
+ wxPrintPreview(wxPyPrintout* printout,
+ wxPyPrintout* printoutForPrinting,
+ wxPrintData* data=NULL);
- wxWindow* GetCanvas();
+ virtual bool SetCurrentPage(int pageNum);
int GetCurrentPage();
- wxFrame * GetFrame();
- int GetMaxPage();
- int GetMinPage();
+
+ void SetPrintout(wxPyPrintout *printout);
+ wxPyPrintout *GetPrintout();
+ wxPyPrintout *GetPrintoutForPrinting();
+
+ void SetFrame(wxFrame *frame);
+ void SetCanvas(wxPreviewCanvas *canvas);
+
+ virtual wxFrame *GetFrame();
+ virtual wxPreviewCanvas *GetCanvas();
+
+ // The preview canvas should call this from OnPaint
+ virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc);
+
+ // This draws a blank page onto the preview canvas
+ virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc);
+
+ // This is called by wxPrintPreview to render a page into a wxMemoryDC.
+ virtual bool RenderPage(int pageNum);
+
+ // Adjusts the scrollbars for the current scale
+ virtual void AdjustScrollbars(wxPreviewCanvas *canvas);
+
wxPrintDialogData& GetPrintDialogData();
- wxPyPrintout * GetPrintout();
- wxPyPrintout * GetPrintoutForPrinting();
+
+ virtual void SetZoom(int percent);
int GetZoom();
+
+ int GetMaxPage();
+ int GetMinPage();
+
bool Ok();
- bool Print(bool prompt);
- void SetCanvas(wxWindow* window);
- void SetCurrentPage(int pageNum);
- void SetFrame(wxFrame *frame);
- void SetPrintout(wxPyPrintout *printout);
- void SetZoom(int percent);
+ void SetOk(bool ok);
+
+ virtual bool Print(bool interactive);
+ virtual void DetermineScaling();
+
+ %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()"
};
-//----------------------------------------------------------------------
class wxPreviewFrame : public wxFrame {
public:
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE,
- char* name = "frame");
+ const wxString& name = wxPyFrameNameStr);
- %pragma(python) addtomethod = "__init__:#wx._StdFrameCallbacks(self)"
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
void Initialize();
+ void CreateControlBar();
+ void CreateCanvas();
+
+ wxPreviewControlBar* GetControlBar() const;
+};
+
+
+class wxPreviewCanvas: public wxScrolledWindow
+{
+public:
+ wxPreviewCanvas(wxPrintPreview *preview,
+ wxWindow *parent,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& name = wxPyPreviewCanvasNameStr);
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
+};
+
+
+
+enum {
+ wxPREVIEW_PRINT,
+ wxPREVIEW_PREVIOUS,
+ wxPREVIEW_NEXT,
+ wxPREVIEW_ZOOM,
+ wxPREVIEW_FIRST,
+ wxPREVIEW_LAST,
+ wxPREVIEW_GOTO,
+ wxPREVIEW_DEFAULT,
+
+ wxID_PREVIEW_CLOSE,
+ wxID_PREVIEW_NEXT,
+ wxID_PREVIEW_PREVIOUS,
+ wxID_PREVIEW_PRINT,
+ wxID_PREVIEW_ZOOM,
+ wxID_PREVIEW_FIRST,
+ wxID_PREVIEW_LAST,
+ wxID_PREVIEW_GOTO
+};
+
+class wxPreviewControlBar: public wxPanel
+{
+public:
+ wxPreviewControlBar(wxPrintPreview *preview,
+ long buttons,
+ wxWindow *parent,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL,
+ const wxString& name = wxPyPanelNameStr);
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
+
+ int GetZoomControl();
+ void SetZoomControl(int zoom);
+ wxPrintPreview* GetPrintPreview();
+
+ void OnNext();
+ void OnPrevious();
+ void OnFirst();
+ void OnLast();
+ void OnGoto();
+};
+
+
+//----------------------------------------------------------------------
+// Python-derivable versions of the above preview classes
+
+%{
+
+#define DEC_PYCALLBACK_BOOL_PREWINDC(CBNAME) \
+ bool CBNAME(wxPreviewCanvas* a, wxDC& b); \
+ bool base_##CBNAME(wxPreviewCanvas* a, wxDC& b)
+
+
+#define IMP_PYCALLBACK_BOOL_PREWINDC(CLASS, PCLASS, CBNAME) \
+ bool CLASS::CBNAME(wxPreviewCanvas* a, wxDC& b) { \
+ bool rval=FALSE; \
+ bool found; \
+ wxPyBeginBlockThreads(); \
+ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \
+ PyObject* win = wxPyMake_wxObject(a); \
+ PyObject* dc = wxPyMake_wxObject(&b); \
+ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OO)", win, dc));\
+ Py_DECREF(win); \
+ Py_DECREF(dc); \
+ } \
+ wxPyEndBlockThreads(); \
+ if (! found) \
+ rval = PCLASS::CBNAME(a, b); \
+ return rval; \
+ } \
+ bool CLASS::base_##CBNAME(wxPreviewCanvas* a, wxDC& b) { \
+ return PCLASS::CBNAME(a, b); \
+ }
+
+
+
+
+class wxPyPrintPreview : public wxPrintPreview
+{
+ DECLARE_CLASS(wxPyPrintPreview)
+public:
+ wxPyPrintPreview(wxPyPrintout* printout,
+ wxPyPrintout* printoutForPrinting,
+ wxPrintData* data=NULL)
+ : wxPrintPreview(printout, printoutForPrinting, data)
+ {}
+
+ DEC_PYCALLBACK_BOOL_INT(SetCurrentPage);
+ DEC_PYCALLBACK_BOOL_PREWINDC(PaintPage);
+ DEC_PYCALLBACK_BOOL_PREWINDC(DrawBlankPage);
+ DEC_PYCALLBACK_BOOL_INT(RenderPage);
+ DEC_PYCALLBACK_VOID_INT(SetZoom);
+ DEC_PYCALLBACK_BOOL_BOOL(Print);
+ DEC_PYCALLBACK_VOID_(DetermineScaling);
+
+ PYPRIVATE;
+};
- // **** need to use derived class so these can be properly overridden:
- //void CreateControlBar()
- //void CreateCanvas()
+// Stupid renamed classes... Fix this in 2.5...
+#if defined(__WXMSW__)
+IMPLEMENT_CLASS( wxPyPrintPreview, wxWindowsPrintPreview );
+#elif defined(__WXMAC__)
+IMPLEMENT_CLASS( wxPyPrintPreview, wxMacPrintPreview );
+#else
+IMPLEMENT_CLASS( wxPyPrintPreview, wxPostScriptPrintPreview );
+#endif
+
+IMP_PYCALLBACK_BOOL_INT (wxPyPrintPreview, wxPrintPreview, SetCurrentPage);
+IMP_PYCALLBACK_BOOL_PREWINDC(wxPyPrintPreview, wxPrintPreview, PaintPage);
+IMP_PYCALLBACK_BOOL_PREWINDC(wxPyPrintPreview, wxPrintPreview, DrawBlankPage);
+IMP_PYCALLBACK_BOOL_INT (wxPyPrintPreview, wxPrintPreview, RenderPage);
+IMP_PYCALLBACK_VOID_INT (wxPyPrintPreview, wxPrintPreview, SetZoom);
+IMP_PYCALLBACK_BOOL_BOOL (wxPyPrintPreview, wxPrintPreview, Print);
+IMP_PYCALLBACK_VOID_ (wxPyPrintPreview, wxPrintPreview, DetermineScaling);
+%}
+
+
+class wxPyPrintPreview : public wxPrintPreview
+{
+public:
+ wxPyPrintPreview(wxPyPrintout* printout,
+ wxPyPrintout* printoutForPrinting,
+ wxPrintData* data=NULL);
+
+ void _setCallbackInfo(PyObject* self, PyObject* _class);
+ %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPyPrintPreview)"
+
+ bool base_SetCurrentPage(int pageNum);
+ bool base_PaintPage(wxPreviewCanvas *canvas, wxDC& dc);
+ bool base_DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc);
+ bool base_RenderPage(int pageNum);
+ void base_SetZoom(int percent);
+ bool base_Print(bool interactive);
+ void base_DetermineScaling();
+};
+
+
+
+
+%{
+class wxPyPreviewFrame : public wxPreviewFrame
+{
+ DECLARE_CLASS(wxPyPreviewFrame);
+public:
+ wxPyPreviewFrame(wxPrintPreview* preview, wxFrame* parent,
+ const wxString& title,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxDEFAULT_FRAME_STYLE,
+ const wxString& name = wxPyFrameNameStr)
+ : wxPreviewFrame(preview, parent, title, pos, size, style, name)
+ {}
+
+ void SetPreviewCanvas(wxPreviewCanvas* canvas) { m_previewCanvas = canvas; }
+ void SetControlBar(wxPreviewControlBar* bar) { m_controlBar = bar; }
+
+ DEC_PYCALLBACK_VOID_(Initialize);
+ DEC_PYCALLBACK_VOID_(CreateCanvas);
+ DEC_PYCALLBACK_VOID_(CreateControlBar);
+
+ PYPRIVATE;
+};
+
+IMPLEMENT_CLASS(wxPyPreviewFrame, wxPreviewFrame);
+
+IMP_PYCALLBACK_VOID_(wxPyPreviewFrame, wxPreviewFrame, Initialize);
+IMP_PYCALLBACK_VOID_(wxPyPreviewFrame, wxPreviewFrame, CreateCanvas);
+IMP_PYCALLBACK_VOID_(wxPyPreviewFrame, wxPreviewFrame, CreateControlBar);
+%}
+class wxPyPreviewFrame : public wxPreviewFrame
+{
+public:
+ wxPyPreviewFrame(wxPrintPreview* preview, wxFrame* parent,
+ const wxString& title,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxDEFAULT_FRAME_STYLE,
+ const wxString& name = wxPyFrameNameStr);
+
+ void _setCallbackInfo(PyObject* self, PyObject* _class);
+ %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPyPreviewFrame)"
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
+
+ void SetPreviewCanvas(wxPreviewCanvas* canvas);
+ void SetControlBar(wxPreviewControlBar* bar);
+
+ void base_Initialize();
+ void base_CreateCanvas();
+ void base_CreateControlBar();
};
+
+
+
+%{
+class wxPyPreviewControlBar : public wxPreviewControlBar
+{
+ DECLARE_CLASS(wxPyPreviewControlBar);
+public:
+ wxPyPreviewControlBar(wxPrintPreview *preview,
+ long buttons,
+ wxWindow *parent,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& name = wxPyPanelNameStr)
+ : wxPreviewControlBar(preview, buttons, parent, pos, size, style, name)
+ {}
+
+ void SetPrintPreview(wxPrintPreview* preview) { m_printPreview = preview; }
+
+ DEC_PYCALLBACK_VOID_(CreateButtons);
+ DEC_PYCALLBACK_VOID_INT(SetZoomControl);
+
+ PYPRIVATE;
+};
+
+IMPLEMENT_CLASS(wxPyPreviewControlBar, wxPreviewControlBar);
+IMP_PYCALLBACK_VOID_(wxPyPreviewControlBar, wxPreviewControlBar, CreateButtons);
+IMP_PYCALLBACK_VOID_INT(wxPyPreviewControlBar, wxPreviewControlBar, SetZoomControl);
+%}
+
+class wxPyPreviewControlBar : public wxPreviewControlBar
+{
+public:
+ wxPyPreviewControlBar(wxPrintPreview *preview,
+ long buttons,
+ wxWindow *parent,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& name = wxPyPanelNameStr);
+
+ void _setCallbackInfo(PyObject* self, PyObject* _class);
+ %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPyPreviewControlBar)"
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
+
+ void SetPrintPreview(wxPrintPreview* preview);
+
+ void base_CreateButtons();
+ void base_SetZoomControl(int zoom);
+};
+
+
//----------------------------------------------------------------------
+
+%init %{
+ wxPyPtrTypeMap_Add("wxPrintout", "wxPyPrintout");
+%}
+
//----------------------------------------------------------------------
//----------------------------------------------------------------------