]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/_printfw.i
Revert reentrancy patch (#1573619)
[wxWidgets.git] / wxPython / src / _printfw.i
index 81365330a0e380f10ef59eb24a9fc6a8a8acbe8a..cce346ca10dd0907effa594180cb19c089745dad 100644 (file)
 %{
 #include "wx/wxPython/printfw.h"
 
-    static const wxChar* wxPrintoutTitleStr = wxT("Printout");
-    DECLARE_DEF_STRING(PrintoutTitleStr);
-    static const wxChar* wxPreviewCanvasNameStr = wxT("previewcanvas");
-    DECLARE_DEF_STRING(PreviewCanvasNameStr);
-
 %}
 
+MAKE_CONST_WXSTRING2(PrintoutTitleStr, wxT("Printout"));
+MAKE_CONST_WXSTRING2(PreviewCanvasNameStr, wxT("previewcanvas"));
+
 
 //---------------------------------------------------------------------------
 
@@ -34,21 +32,46 @@ 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
+    wxPRINT_MODE_PRINTER = 3,   // Send to printer
+    wxPRINT_MODE_STREAM = 4     // Send postscript data into a stream 
 };
 
+enum wxPrintBin
+{
+    wxPRINTBIN_DEFAULT,
+
+    wxPRINTBIN_ONLYONE,
+    wxPRINTBIN_LOWER,
+    wxPRINTBIN_MIDDLE,
+    wxPRINTBIN_MANUAL,
+    wxPRINTBIN_ENVELOPE,
+    wxPRINTBIN_ENVMANUAL,
+    wxPRINTBIN_AUTO,
+    wxPRINTBIN_TRACTOR,
+    wxPRINTBIN_SMALLFMT,
+    wxPRINTBIN_LARGEFMT,
+    wxPRINTBIN_LARGECAPACITY,
+    wxPRINTBIN_CASSETTE,
+    wxPRINTBIN_FORMSOURCE,
+
+    wxPRINTBIN_USER,
+};
 
 
 class wxPrintData : public wxObject {
 public:
+    %nokwargs wxPrintData;
     wxPrintData();
+    wxPrintData(const wxPrintData& data);  // for making copies
+    
     ~wxPrintData();
 
     int GetNoCopies();
     bool GetCollate();
     int  GetOrientation();
 
-    bool Ok();
+    bool IsOk();
+    %pythoncode { Ok = IsOk }
 
     const wxString& GetPrinterName();
     bool GetColour();
@@ -56,8 +79,11 @@ public:
     wxPaperSize GetPaperId();
     const wxSize& GetPaperSize();
 
-    wxPrintQuality GetQuality();
-
+    int GetQuality();
+    wxPrintBin GetBin();
+    wxPrintMode GetPrintMode() const;
+    int GetMedia() const;
+    
     void SetNoCopies(int v);
     void SetCollate(bool flag);
     void SetOrientation(int orient);
@@ -67,24 +93,61 @@ public:
     void SetDuplex(wxDuplexMode duplex);
     void SetPaperId(wxPaperSize sizeId);
     void SetPaperSize(const wxSize& sz);
-    void SetQuality(wxPrintQuality quality);
+    void SetQuality(int quality);
+    void SetBin(wxPrintBin bin);
+    void SetPrintMode(wxPrintMode printMode);
+    void SetMedia(int media);
+    
+    wxString GetFilename() const;
+    void SetFilename( const wxString &filename );
+
+    %pythoncode { def __nonzero__(self): return self.IsOk() }
+
+    //char* GetPrivData() const;
+    //int GetPrivDataLen() const;
+    //void SetPrivData( char *privData, int len );
+
+    %extend {
+        PyObject* GetPrivData() {
+            PyObject* data;
+            wxPyBlock_t blocked = wxPyBeginBlockThreads();
+            data = PyString_FromStringAndSize(self->GetPrivData(),
+                                              self->GetPrivDataLen());
+            wxPyEndBlockThreads(blocked);
+            return data;
+        }
+
+        void SetPrivData(PyObject* data) {
+            if (! PyString_Check(data)) {
+                wxPyBLOCK_THREADS(PyErr_SetString(PyExc_TypeError,
+                                                  "Expected string object"));
+                return /* NULL */ ;
+            }
 
+            wxPyBlock_t blocked = wxPyBeginBlockThreads();
+            self->SetPrivData(PyString_AS_STRING(data), PyString_GET_SIZE(data));
+            wxPyEndBlockThreads(blocked);
+        }
+    }
+    
+
+    // NOTE: These are now inside of #if WXWIN_COMPATIBILITY_2_4, so be
+    //       prepared to remove them...
+    
     // PostScript-specific data
+// WXWIN_COMPATIBILITY_2_4
+#if 0
     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);
@@ -92,16 +155,31 @@ public:
     void SetPrinterTranslateX(long x);
     void SetPrinterTranslateY(long y);
     void SetPrinterTranslation(long x, long y);
-    void SetPrintMode(wxPrintMode printMode);
+#endif
 
-    %pythoncode { def __nonzero__(self): return self.Ok() }
+    %property(Bin, GetBin, SetBin, doc="See `GetBin` and `SetBin`");
+    %property(Collate, GetCollate, SetCollate, doc="See `GetCollate` and `SetCollate`");
+    %property(Colour, GetColour, SetColour, doc="See `GetColour` and `SetColour`");
+    %property(Duplex, GetDuplex, SetDuplex, doc="See `GetDuplex` and `SetDuplex`");
+    %property(Filename, GetFilename, SetFilename, doc="See `GetFilename` and `SetFilename`");
+    %property(NoCopies, GetNoCopies, SetNoCopies, doc="See `GetNoCopies` and `SetNoCopies`");
+    %property(Orientation, GetOrientation, SetOrientation, doc="See `GetOrientation` and `SetOrientation`");
+    %property(PaperId, GetPaperId, SetPaperId, doc="See `GetPaperId` and `SetPaperId`");
+    %property(PaperSize, GetPaperSize, SetPaperSize, doc="See `GetPaperSize` and `SetPaperSize`");
+    %property(PrintMode, GetPrintMode, SetPrintMode, doc="See `GetPrintMode` and `SetPrintMode`");
+    %property(PrinterName, GetPrinterName, SetPrinterName, doc="See `GetPrinterName` and `SetPrinterName`");
+    %property(PrivData, GetPrivData, SetPrivData, doc="See `GetPrivData` and `SetPrivData`");
+    %property(Quality, GetQuality, SetQuality, doc="See `GetQuality` and `SetQuality`");   
 };
 
 //---------------------------------------------------------------------------
 
 class wxPageSetupDialogData : public wxObject {
 public:
+    %nokwargs wxPageSetupDialogData;
     wxPageSetupDialogData();
+    wxPageSetupDialogData(const wxPageSetupDialogData& data);  // for making copies
+    wxPageSetupDialogData(const wxPrintData& data); 
     ~wxPageSetupDialogData();
 
     void EnableHelp(bool flag);
@@ -109,6 +187,7 @@ public:
     void EnableOrientation(bool flag);
     void EnablePaper(bool flag);
     void EnablePrinter(bool flag);
+    
     bool GetDefaultMinMargins();
     bool GetEnableMargins();
     bool GetEnableOrientation();
@@ -124,13 +203,9 @@ public:
     wxSize GetPaperSize();
 
     wxPrintData& GetPrintData();
-//     %addmethods {
-//         %new wxPrintData* GetPrintData() {
-//             return new wxPrintData(self->GetPrintData());  // force a copy
-//         }
-//     }
 
-    bool Ok();
+    bool IsOk();
+    %pythoncode { Ok = IsOk }
 
     void SetDefaultInfo(bool flag);
     void SetDefaultMinMargins(bool flag);
@@ -140,21 +215,60 @@ public:
     void SetMinMarginBottomRight(const wxPoint& pt);
     void SetPaperId(wxPaperSize id);
     void SetPaperSize(const wxSize& size);
+    
     void SetPrintData(const wxPrintData& printData);
 
-    %pythoncode { def __nonzero__(self): return self.Ok() }
+    // Use paper size defined in this object to set the wxPrintData
+    // paper id
+    void CalculateIdFromPaperSize();
+
+    // Use paper id in wxPrintData to set this object's paper size
+    void CalculatePaperSizeFromId();
+
+    %pythoncode { def __nonzero__(self): return self.IsOk() }
+
+    %property(DefaultInfo, GetDefaultInfo, SetDefaultInfo, doc="See `GetDefaultInfo` and `SetDefaultInfo`");
+    %property(DefaultMinMargins, GetDefaultMinMargins, SetDefaultMinMargins, doc="See `GetDefaultMinMargins` and `SetDefaultMinMargins`");
+
+//     %property(EnableHelp, GetEnableHelp, doc="See `GetEnableHelp`");
+//     %property(EnableMargins, GetEnableMargins, doc="See `GetEnableMargins`");
+//     %property(EnableOrientation, GetEnableOrientation, doc="See `GetEnableOrientation`");
+//     %property(EnablePaper, GetEnablePaper, doc="See `GetEnablePaper`");
+//     %property(EnablePrinter, GetEnablePrinter, doc="See `GetEnablePrinter`");
+
+    %property(MarginBottomRight, GetMarginBottomRight, SetMarginBottomRight, doc="See `GetMarginBottomRight` and `SetMarginBottomRight`");
+    %property(MarginTopLeft, GetMarginTopLeft, SetMarginTopLeft, doc="See `GetMarginTopLeft` and `SetMarginTopLeft`");
+    %property(MinMarginBottomRight, GetMinMarginBottomRight, SetMinMarginBottomRight, doc="See `GetMinMarginBottomRight` and `SetMinMarginBottomRight`");
+    %property(MinMarginTopLeft, GetMinMarginTopLeft, SetMinMarginTopLeft, doc="See `GetMinMarginTopLeft` and `SetMinMarginTopLeft`");
+    %property(PaperId, GetPaperId, SetPaperId, doc="See `GetPaperId` and `SetPaperId`");
+    %property(PaperSize, GetPaperSize, SetPaperSize, doc="See `GetPaperSize` and `SetPaperSize`");
+    %property(PrintData, GetPrintData, SetPrintData, doc="See `GetPrintData` and `SetPrintData`");
+    
 };
 
 
 
-class wxPageSetupDialog : public wxDialog {
-public:
-    %addtofunc wxPageSetupDialog         "self._setOORInfo(self)"
+// NOTE: Contrary to it's name, this class doesn't derive from wxDialog.  It
+// is a facade in front of a platform-specific (native dialog) provided by the
+// wxPrintFactory.
 
-    wxPageSetupDialog(wxWindow* parent, wxPageSetupDialogData* data = NULL);
+MustHaveApp(wxPageSetupDialog);
 
+class wxPageSetupDialog : public wxObject
+{
+public:
+    wxPageSetupDialog(wxWindow* parent, wxPageSetupDialogData* data = NULL);
+    ~wxPageSetupDialog();
+    
     wxPageSetupDialogData& GetPageSetupData();
+    wxPageSetupDialogData& GetPageSetupDialogData();
     int ShowModal();
+
+    %pythoncode { def Destroy(self): pass }
+
+    %property(PageSetupData, GetPageSetupData, doc="See `GetPageSetupData`");
+    %property(PageSetupDialogData, GetPageSetupDialogData, doc="See `GetPageSetupDialogData`");
+    
 };
 
 //---------------------------------------------------------------------------
@@ -162,7 +276,10 @@ public:
 
 class wxPrintDialogData : public wxObject {
 public:
+    %nokwargs wxPrintDialogData;
     wxPrintDialogData();
+    wxPrintDialogData(const wxPrintData& printData);
+    wxPrintDialogData(const wxPrintDialogData& printData);  // for making copies
     ~wxPrintDialogData();
 
     int GetFromPage() const;
@@ -174,8 +291,12 @@ public:
     bool GetSelection() const;
     bool GetCollate() const;
     bool GetPrintToFile() const;
-    bool GetSetupDialog() const;
 
+    // WXWIN_COMPATIBILITY_2_4
+#if 0
+    bool GetSetupDialog() const;
+    void SetSetupDialog(bool flag);
+#endif
     void SetFromPage(int v);
     void SetToPage(int v);
     void SetMinPage(int v);
@@ -185,7 +306,6 @@ public:
     void SetSelection(bool flag);
     void SetCollate(bool flag);
     void SetPrintToFile(bool flag);
-    void SetSetupDialog(bool flag);
 
     void EnablePrintToFile(bool flag);
     void EnableSelection(bool flag);
@@ -198,32 +318,61 @@ public:
     bool GetEnableHelp() const;
 
     // Is this data OK for showing the print dialog?
-    bool Ok() const;
+    bool IsOk() const;
+    %pythoncode { Ok = IsOk }
 
     
     wxPrintData& GetPrintData();
-//     %addmethods {
-//         %new wxPrintData* GetPrintData() {
-//             return new wxPrintData(self->GetPrintData());  // force a copy
-//         }
-//     }
     void SetPrintData(const wxPrintData& printData);
 
-    %pythoncode { def __nonzero__(self): return self.Ok() }
+    %pythoncode { def __nonzero__(self): return self.IsOk() }
+    
+    %property(AllPages, GetAllPages, SetAllPages, doc="See `GetAllPages` and `SetAllPages`");
+    %property(Collate, GetCollate, SetCollate, doc="See `GetCollate` and `SetCollate`");
+//     %property(EnableHelp, GetEnableHelp, doc="See `GetEnableHelp`");
+//     %property(EnablePageNumbers, GetEnablePageNumbers, doc="See `GetEnablePageNumbers`");
+//     %property(EnablePrintToFile, GetEnablePrintToFile, doc="See `GetEnablePrintToFile`");
+//     %property(EnableSelection, GetEnableSelection, doc="See `GetEnableSelection`");
+    %property(FromPage, GetFromPage, SetFromPage, doc="See `GetFromPage` and `SetFromPage`");
+    %property(MaxPage, GetMaxPage, SetMaxPage, doc="See `GetMaxPage` and `SetMaxPage`");
+    %property(MinPage, GetMinPage, SetMinPage, doc="See `GetMinPage` and `SetMinPage`");
+    %property(NoCopies, GetNoCopies, SetNoCopies, doc="See `GetNoCopies` and `SetNoCopies`");
+    %property(PrintData, GetPrintData, SetPrintData, doc="See `GetPrintData` and `SetPrintData`");
+    %property(PrintToFile, GetPrintToFile, SetPrintToFile, doc="See `GetPrintToFile` and `SetPrintToFile`");
+    %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`");
+    %property(ToPage, GetToPage, SetToPage, doc="See `GetToPage` and `SetToPage`");
 };
 
 
-class wxPrintDialog : public wxDialog {
-public:
-    %addtofunc wxPrintDialog         "self._setOORInfo(self)"
 
+MustHaveApp(wxPrintDialog);
+
+
+// NOTE: Contrary to it's name, this class doesn't derive from wxDialog.  It
+// is a facade in front of a platform-specific (native dialog) provided by the
+// wxPrintFactory.
+
+class wxPrintDialog : public wxObject {
+public:
     wxPrintDialog(wxWindow* parent, wxPrintDialogData* data = NULL);
 
-    wxPrintDialogData& GetPrintDialogData();
+    // TODO?: wxPrintDialog(wxWindow *parent, wxPrintData* data);
+
+    ~wxPrintDialog();
+    
+    virtual int ShowModal();
+
+    virtual wxPrintDialogData& GetPrintDialogData();
+    virtual wxPrintData& GetPrintData();
 
     %newobject GetPrintDC;
-    wxDC* GetPrintDC();
-    int ShowModal();
+    virtual wxDC *GetPrintDC();
+
+    %pythoncode { def Destroy(self): pass }
+    
+    %property(PrintDC, GetPrintDC, doc="See `GetPrintDC`");
+    %property(PrintData, GetPrintData, doc="See `GetPrintData`");
+    %property(PrintDialogData, GetPrintDialogData, doc="See `GetPrintDialogData`");
 };
 
 
@@ -239,34 +388,44 @@ enum wxPrinterError
 };
 
 
+MustHaveApp(wxPrinter);
+
 class wxPrinter : public wxObject {
 public:
     wxPrinter(wxPrintDialogData* data = NULL);
     ~wxPrinter();
 
-    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, const wxString& message);
-    bool Setup(wxWindow *parent);
-    bool GetAbort();
+    virtual wxWindow *CreateAbortWindow(wxWindow *parent, wxPyPrintout *printout);
+    virtual void ReportError(wxWindow *parent, wxPyPrintout *printout, const wxString& message);
 
+    virtual bool Setup(wxWindow *parent);
+    virtual bool Print(wxWindow *parent, wxPyPrintout *printout, bool prompt = true);
+    virtual wxDC* PrintDialog(wxWindow *parent);
+    
+    virtual wxPrintDialogData& GetPrintDialogData() const;
+
+    bool GetAbort();
     static wxPrinterError GetLastError();
+
+    %property(Abort, GetAbort, doc="See `GetAbort`");
+    %property(PrintDialogData, GetPrintDialogData, doc="See `GetPrintDialogData`");
 };
 
 
 //---------------------------------------------------------------------------
-// Custom wxPrintout class that knows how to call python
+// Custom wxPrintout class that knows how to call python, See implementation in
+// include/sx/wxPython/printfw.h
+
 %{
 
+IMPLEMENT_ABSTRACT_CLASS(wxPyPrintout, wxPrintout);
 
 // 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 hadErr = false;
     bool found;
 
-    wxPyBeginBlockThreads();
+    wxPyBlock_t blocked = wxPyBeginBlockThreads();
     if ((found = wxPyCBH_findCallback(m_myInst, "GetPageInfo"))) {
         PyObject* result = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("()"));
         if (result && PyTuple_Check(result) && PyTuple_Size(result) == 4) {
@@ -274,22 +433,22 @@ void wxPyPrintout::GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *p
 
             val = PyTuple_GetItem(result, 0);
             if (PyInt_Check(val))    *minPage = PyInt_AsLong(val);
-            else hadErr = True;
+            else hadErr = true;
 
             val = PyTuple_GetItem(result, 1);
             if (PyInt_Check(val))    *maxPage = PyInt_AsLong(val);
-            else hadErr = True;
+            else hadErr = true;
 
             val = PyTuple_GetItem(result, 2);
             if (PyInt_Check(val))    *pageFrom = PyInt_AsLong(val);
-            else hadErr = True;
+            else hadErr = true;
 
             val = PyTuple_GetItem(result, 3);
             if (PyInt_Check(val))    *pageTo = PyInt_AsLong(val);
-            else hadErr = True;
+            else hadErr = true;
         }
         else
-            hadErr = True;
+            hadErr = true;
 
         if (hadErr) {
             PyErr_SetString(PyExc_TypeError, "GetPageInfo should return a tuple of 4 integers.");
@@ -297,14 +456,11 @@ void wxPyPrintout::GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *p
         }
         Py_DECREF(result);
     }
-    wxPyEndBlockThreads();
+    wxPyEndBlockThreads(blocked);
     if (! found)
         wxPrintout::GetPageInfo(minPage, maxPage, pageFrom, pageTo);
 }
 
-void wxPyPrintout::base_GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo) {
-    wxPrintout::GetPageInfo(minPage, maxPage, pageFrom, pageTo);
-}
 
 
 IMP_PYCALLBACK_BOOL_INTINT(wxPyPrintout, wxPrintout, OnBeginDocument);
@@ -319,14 +475,21 @@ IMP_PYCALLBACK_BOOL_INT(wxPyPrintout, wxPrintout, HasPage);
 %}
 
 
+MustHaveApp(wxPyPrintout);
+
 // Now define the custom class for SWIGging
-%name(Printout) class wxPyPrintout  : public wxObject {
+%rename(Printout) wxPyPrintout;
+class wxPyPrintout  : public wxObject {
 public:
-    %addtofunc wxPyPrintout   "self._setCallbackInfo(self, Printout)"
+    %pythonAppend wxPyPrintout   "self._setCallbackInfo(self, Printout)"
+    %typemap(out) wxPyPrintout*;    // turn off this typemap
 
     wxPyPrintout(const wxString& title = wxPyPrintoutTitleStr);
-    //~wxPyPrintout();      wxPrintPreview object takes ownership...
+    ~wxPyPrintout();      
     
+    // Turn it back on again
+    %typemap(out) wxPyPrintout* { $result = wxPyMake_wxObject($1, $owner); }
+
     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
     
@@ -334,6 +497,23 @@ public:
     wxDC* GetDC();
     void SetDC(wxDC *dc);
 
+    
+    void FitThisSizeToPaper(const wxSize& imageSize);
+    void FitThisSizeToPage(const wxSize& imageSize);
+    void FitThisSizeToPageMargins(const wxSize& imageSize, const wxPageSetupDialogData& pageSetupData);
+    void MapScreenSizeToPaper();
+    void MapScreenSizeToPage();
+    void MapScreenSizeToPageMargins(const wxPageSetupDialogData& pageSetupData);
+    void MapScreenSizeToDevice();
+
+    wxRect GetLogicalPaperRect() const;
+    wxRect GetLogicalPageRect() const;
+    wxRect GetLogicalPageMarginsRect(const wxPageSetupDialogData& pageSetupData) const;
+
+    void SetLogicalOrigin(wxCoord x, wxCoord y);
+    void OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff);
+
+    
     void SetPageSizePixels(int w, int  h);
     DocDeclA(
         void, GetPageSizePixels(int *OUTPUT, int *OUTPUT),
@@ -354,29 +534,49 @@ public:
         void, GetPPIPrinter(int *OUTPUT, int *OUTPUT),
         "GetPPIPrinter() -> (x,y)");
 
+    void SetPaperRectPixels(const wxRect& paperRectPixels);
+    wxRect GetPaperRectPixels() const;
+
     bool IsPreview();
     void SetIsPreview(bool p);
 
     
-    bool base_OnBeginDocument(int startPage, int endPage);
-    void base_OnEndDocument();
-    void base_OnBeginPrinting();
-    void base_OnEndPrinting();
-    void base_OnPreparePrinting();
-    bool base_HasPage(int page);
+    bool OnBeginDocument(int startPage, int endPage);
+    void OnEndDocument();
+    void OnBeginPrinting();
+    void OnEndPrinting();
+    void OnPreparePrinting();
+    bool HasPage(int page);
     DocDeclA(
-        void, base_GetPageInfo(int *OUTPUT, int *OUTPUT, int *OUTPUT, int *OUTPUT),
-        "base_GetPageInfo() -> (minPage, maxPage, pageFrom, pageTo)");
+        void, GetPageInfo(int *OUTPUT, int *OUTPUT, int *OUTPUT, int *OUTPUT),
+        "GetPageInfo() -> (minPage, maxPage, pageFrom, pageTo)");
+    
+    %MAKE_BASE_FUNC(Printout, OnBeginDocument);
+    %MAKE_BASE_FUNC(Printout, OnEndDocument);
+    %MAKE_BASE_FUNC(Printout, OnBeginPrinting);
+    %MAKE_BASE_FUNC(Printout, OnEndPrinting);
+    %MAKE_BASE_FUNC(Printout, OnPreparePrinting);
+    %MAKE_BASE_FUNC(Printout, GetPageInfo);
+
+    
+    %property(DC, GetDC, SetDC, doc="See `GetDC` and `SetDC`");
+    %property(PPIPrinter, GetPPIPrinter, SetPPIPrinter, doc="See `GetPPIPrinter` and `SetPPIPrinter`");
+    %property(PPIScreen, GetPPIScreen, SetPPIScreen, doc="See `GetPPIScreen` and `SetPPIScreen`");
+    %property(PageSizeMM, GetPageSizeMM, SetPageSizeMM, doc="See `GetPageSizeMM` and `SetPageSizeMM`");
+    %property(PageSizePixels, GetPageSizePixels, SetPageSizePixels, doc="See `GetPageSizePixels` and `SetPageSizePixels`");
+    %property(Title, GetTitle, doc="See `GetTitle`");
 };
 
 //---------------------------------------------------------------------------
 
 
 
+MustHaveApp(wxPreviewCanvas);
+
 class wxPreviewCanvas: public wxScrolledWindow
 {
 public:
-    %addtofunc wxPreviewCanvas   "self._setOORInfo(self)"
+    %pythonAppend wxPreviewCanvas   "self._setOORInfo(self)"
 
     wxPreviewCanvas(wxPrintPreview *preview,
                     wxWindow *parent,
@@ -387,21 +587,28 @@ public:
 };
 
 
+MustHaveApp(wxPreviewFrame);
+
 class wxPreviewFrame : public wxFrame {
 public:
-    %addtofunc wxPreviewFrame   "self._setOORInfo(self)"
-
+    %disownarg(wxPrintPreview*);
+    
+    %pythonAppend wxPreviewFrame   "self._setOORInfo(self)"
     wxPreviewFrame(wxPrintPreview* preview, wxFrame* parent, const wxString& title,
                    const wxPoint& pos = wxDefaultPosition,
                    const wxSize&  size = wxDefaultSize,
                    long style = wxDEFAULT_FRAME_STYLE,
                    const wxString& name = wxPyFrameNameStr);
 
+    %cleardisown(wxPrintPreview*);
+
     void Initialize();
     void CreateControlBar();
     void CreateCanvas();
 
     wxPreviewControlBar* GetControlBar() const;
+
+    %property(ControlBar, GetControlBar, doc="See `GetControlBar`");
 };
 
 
@@ -426,10 +633,12 @@ enum {
     wxID_PREVIEW_GOTO
 };
 
+MustHaveApp(wxPreviewControlBar);
+
 class wxPreviewControlBar: public wxPanel
 {
 public:
-    %addtofunc wxPreviewControlBar   "self._setOORInfo(self)"
+    %pythonAppend wxPreviewControlBar   "self._setOORInfo(self)"
 
     wxPreviewControlBar(wxPrintPreview *preview,
                         long buttons,
@@ -448,18 +657,31 @@ public:
     void OnFirst();
     void OnLast();
     void OnGoto();
+
+    %property(PrintPreview, GetPrintPreview, doc="See `GetPrintPreview`");
+    %property(ZoomControl, GetZoomControl, SetZoomControl, doc="See `GetZoomControl` and `SetZoomControl`");    
 };
 
 
 
 //---------------------------------------------------------------------------
 
+MustHaveApp(wxPrintPreview);
+
 class wxPrintPreview : public wxObject {
 public:
+    %disownarg(wxPyPrintout*);
+    
+    %nokwargs wxPrintPreview;
     wxPrintPreview(wxPyPrintout* printout,
                    wxPyPrintout* printoutForPrinting,
-                   wxPrintData* data=NULL);
+                   wxPrintDialogData *data=NULL);
+    wxPrintPreview(wxPyPrintout* printout,
+                  wxPyPrintout* printoutForPrinting,
+                  wxPrintData* data);
 
+    ~wxPrintPreview();
+    
     virtual bool SetCurrentPage(int pageNum);
     int GetCurrentPage();
 
@@ -467,6 +689,8 @@ public:
     wxPyPrintout *GetPrintout();
     wxPyPrintout *GetPrintoutForPrinting();
 
+    %cleardisown(wxPyPrintout*);
+    
     void SetFrame(wxFrame *frame);
     void SetCanvas(wxPreviewCanvas *canvas);
 
@@ -493,13 +717,24 @@ public:
     int GetMaxPage();
     int GetMinPage();
 
-    bool Ok();
+    bool IsOk();
+    %pythoncode { Ok = IsOk }
     void SetOk(bool ok);
 
     virtual bool Print(bool interactive);
     virtual void DetermineScaling();
 
-    %pythoncode { def __nonzero__(self): return self.Ok() }
+    %pythoncode { def __nonzero__(self): return self.IsOk() }
+    
+    %property(Canvas, GetCanvas, SetCanvas, doc="See `GetCanvas` and `SetCanvas`");
+    %property(CurrentPage, GetCurrentPage, SetCurrentPage, doc="See `GetCurrentPage` and `SetCurrentPage`");
+    %property(Frame, GetFrame, SetFrame, doc="See `GetFrame` and `SetFrame`");
+    %property(MaxPage, GetMaxPage, doc="See `GetMaxPage`");
+    %property(MinPage, GetMinPage, doc="See `GetMinPage`");
+    %property(PrintDialogData, GetPrintDialogData, doc="See `GetPrintDialogData`");
+    %property(Printout, GetPrintout, SetPrintout, doc="See `GetPrintout` and `SetPrintout`");
+    %property(PrintoutForPrinting, GetPrintoutForPrinting, doc="See `GetPrintoutForPrinting`");
+    %property(Zoom, GetZoom, SetZoom, doc="See `GetZoom` and `SetZoom`");
 };
 
 
@@ -510,31 +745,27 @@ public:
 
 %{
 
-#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);                                            \
-    }
+#define DEC_PYCALLBACK_BOOL_PREWINDC(CBNAME)                                            \
+    bool 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;                                                                     \
+        wxPyBlock_t blocked = wxPyBeginBlockThreads();                                  \
+        if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) {                        \
+            PyObject* win = wxPyMake_wxObject(a,false);                                 \
+            PyObject* dc  = wxPyMake_wxObject(&b,false);                                \
+            rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OO)", win, dc));      \
+            Py_DECREF(win);                                                             \
+            Py_DECREF(dc);                                                              \
+        }                                                                               \
+        wxPyEndBlockThreads(blocked);                                                   \
+        if (! found)                                                                    \
+            rval = PCLASS::CBNAME(a, b);                                                \
+        return rval;                                                                    \
+    }                                       
 
 
 
@@ -545,7 +776,12 @@ class wxPyPrintPreview : public wxPrintPreview
 public:
     wxPyPrintPreview(wxPyPrintout* printout,
                      wxPyPrintout* printoutForPrinting,
-                     wxPrintData* data=NULL)
+                     wxPrintDialogData* data=NULL)
+        : wxPrintPreview(printout, printoutForPrinting, data)
+    {}
+    wxPyPrintPreview(wxPyPrintout* printout,
+                     wxPyPrintout* printoutForPrinting,
+                     wxPrintData* data)
         : wxPrintPreview(printout, printoutForPrinting, data)
     {}
 
@@ -579,24 +815,41 @@ IMP_PYCALLBACK_VOID_        (wxPyPrintPreview, wxPrintPreview, DetermineScaling)
 %}
 
 
+MustHaveApp(wxPyPrintPreview);
+
 class wxPyPrintPreview : public wxPrintPreview
 {
 public:
-    %addtofunc wxPyPrintPreview   "self._setCallbackInfo(self, PyPrintPreview)"
+    %disownarg(wxPyPrintout*);
 
+    %pythonAppend wxPyPrintPreview   "self._setCallbackInfo(self, PyPrintPreview)"
+    %nokwargs wxPyPrintPreview;
+    wxPyPrintPreview(wxPyPrintout* printout,
+                     wxPyPrintout* printoutForPrinting,
+                     wxPrintDialogData* data=NULL);
     wxPyPrintPreview(wxPyPrintout* printout,
                      wxPyPrintout* printoutForPrinting,
-                     wxPrintData* data=NULL);
+                     wxPrintData* data);
 
+    %cleardisown(wxPyPrintout*);
+    
     void _setCallbackInfo(PyObject* self, PyObject* _class);
     
-    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();
+    bool SetCurrentPage(int pageNum);
+    bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc);
+    bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc);
+    bool RenderPage(int pageNum);
+    void SetZoom(int percent);
+    bool Print(bool interactive);
+    void DetermineScaling();
+
+    %MAKE_BASE_FUNC(PyPrintPreview, SetCurrentPage);
+    %MAKE_BASE_FUNC(PyPrintPreview, PaintPage);
+    %MAKE_BASE_FUNC(PyPrintPreview, DrawBlankPage);
+    %MAKE_BASE_FUNC(PyPrintPreview, RenderPage);
+    %MAKE_BASE_FUNC(PyPrintPreview, SetZoom);
+    %MAKE_BASE_FUNC(PyPrintPreview, Print);
+    %MAKE_BASE_FUNC(PyPrintPreview, DetermineScaling);
 };
 
 
@@ -605,7 +858,7 @@ public:
 %{
 class wxPyPreviewFrame : public wxPreviewFrame
 {
-    DECLARE_CLASS(wxPyPreviewFrame);
+    DECLARE_CLASS(wxPyPreviewFrame)
 public:
     wxPyPreviewFrame(wxPrintPreview* preview, wxFrame* parent,
                      const wxString& title,
@@ -634,10 +887,12 @@ IMP_PYCALLBACK_VOID_(wxPyPreviewFrame, wxPreviewFrame, CreateControlBar);
 %}
 
 
+MustHaveApp(wxPyPreviewFrame);
+
 class wxPyPreviewFrame : public wxPreviewFrame
 {
 public:
-    %addtofunc wxPyPreviewFrame "self._setCallbackInfo(self, PyPreviewFrame); self._setOORInfo(self)"
+    %pythonAppend wxPyPreviewFrame "self._setCallbackInfo(self, PyPreviewFrame); self._setOORInfo(self)"
 
     wxPyPreviewFrame(wxPrintPreview* preview, wxFrame* parent,
                      const wxString& title,
@@ -651,9 +906,13 @@ public:
     void SetPreviewCanvas(wxPreviewCanvas* canvas);
     void SetControlBar(wxPreviewControlBar* bar);
 
-    void base_Initialize();
-    void base_CreateCanvas();
-    void base_CreateControlBar();
+    void Initialize();
+    void CreateCanvas();
+    void CreateControlBar();
+
+    %MAKE_BASE_FUNC(PyPreviewFrame, Initialize);
+    %MAKE_BASE_FUNC(PyPreviewFrame, CreateCanvas);
+    %MAKE_BASE_FUNC(PyPreviewFrame, CreateControlBar);
 };
 
 
@@ -662,7 +921,7 @@ public:
 %{
 class wxPyPreviewControlBar : public wxPreviewControlBar
 {
-    DECLARE_CLASS(wxPyPreviewControlBar);
+    DECLARE_CLASS(wxPyPreviewControlBar)
 public:
     wxPyPreviewControlBar(wxPrintPreview *preview,
                           long buttons,
@@ -688,10 +947,12 @@ IMP_PYCALLBACK_VOID_INT(wxPyPreviewControlBar, wxPreviewControlBar, SetZoomContr
 %}
 
 
+MustHaveApp(wxPyPreviewControlBar);
+
 class wxPyPreviewControlBar : public wxPreviewControlBar
 {
 public:
-    %addtofunc wxPyPreviewControlBar   "self._setCallbackInfo(self, PyPreviewControlBar); self._setOORInfo(self)"
+    %pythonAppend wxPyPreviewControlBar   "self._setCallbackInfo(self, PyPreviewControlBar); self._setOORInfo(self)"
 
     wxPyPreviewControlBar(wxPrintPreview *preview,
                           long buttons,
@@ -705,10 +966,12 @@ public:
 
     void SetPrintPreview(wxPrintPreview* preview);
 
-    void base_CreateButtons();
-    void base_SetZoomControl(int zoom);
-};
+    void CreateButtons();
+    void SetZoomControl(int zoom);
 
+    %MAKE_BASE_FUNC(PreviewControlBar, CreateButtons);
+    %MAKE_BASE_FUNC(PreviewControlBar, SetZoomControl);
+};
 
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------