]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/prntbase.h
Add support for VK_OEM_102 key under wxMSW.
[wxWidgets.git] / include / wx / prntbase.h
index 9bd3aeb0c1e7cc0c2c328d7b4baf434d448d413e..ac78189a42b535ea97722219e9a3b50bfc51f385 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
-// Name:        prntbase.h
+// Name:        wx/prntbase.h
 // Purpose:     Base classes for printing framework
 // Author:      Julian Smart
 // Modified by:
 // Created:     01/02/97
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:    wxWindows licence
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_PRNTBASEH__
 #define _WX_PRNTBASEH__
 
-#ifdef __GNUG__
-#pragma interface "prntbase.h"
-#endif
-
 #include "wx/defs.h"
+
+#if wxUSE_PRINTING_ARCHITECTURE
+
 #include "wx/event.h"
 #include "wx/cmndata.h"
 #include "wx/panel.h"
 #include "wx/scrolwin.h"
 #include "wx/dialog.h"
 #include "wx/frame.h"
+#include "wx/dc.h"
+
+class WXDLLIMPEXP_FWD_CORE wxDC;
+class WXDLLIMPEXP_FWD_CORE wxButton;
+class WXDLLIMPEXP_FWD_CORE wxChoice;
+class WXDLLIMPEXP_FWD_CORE wxPrintout;
+class WXDLLIMPEXP_FWD_CORE wxPrinterBase;
+class WXDLLIMPEXP_FWD_CORE wxPrintDialogBase;
+class WXDLLIMPEXP_FWD_CORE wxPrintDialog;
+class WXDLLIMPEXP_FWD_CORE wxPageSetupDialogBase;
+class WXDLLIMPEXP_FWD_CORE wxPageSetupDialog;
+class WXDLLIMPEXP_FWD_CORE wxPrintPreviewBase;
+class WXDLLIMPEXP_FWD_CORE wxPreviewCanvas;
+class WXDLLIMPEXP_FWD_CORE wxPreviewControlBar;
+class WXDLLIMPEXP_FWD_CORE wxPreviewFrame;
+class WXDLLIMPEXP_FWD_CORE wxPrintFactory;
+class WXDLLIMPEXP_FWD_CORE wxPrintNativeDataBase;
+class WXDLLIMPEXP_FWD_CORE wxPrintPreview;
+class wxPrintPageMaxCtrl;
+class wxPrintPageTextCtrl;
+
+//----------------------------------------------------------------------------
+// error consts
+//----------------------------------------------------------------------------
+
+enum wxPrinterError
+{
+    wxPRINTER_NO_ERROR = 0,
+    wxPRINTER_CANCELLED,
+    wxPRINTER_ERROR
+};
+
+// Preview frame modality kind used with wxPreviewFrame::Initialize()
+enum wxPreviewFrameModalityKind
+{
+    // Disable all the other top level windows while the preview is shown.
+    wxPreviewFrame_AppModal,
+
+    // Disable only the parent window while the preview is shown.
+    wxPreviewFrame_WindowModal,
+
+    // Don't disable any windows.
+    wxPreviewFrame_NonModal
+};
+
+//----------------------------------------------------------------------------
+// wxPrintFactory
+//----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxPrintFactory
+{
+public:
+    wxPrintFactory() {}
+    virtual ~wxPrintFactory() {}
+
+    virtual wxPrinterBase *CreatePrinter( wxPrintDialogData* data ) = 0;
+
+    virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview,
+                                                    wxPrintout *printout = NULL,
+                                                    wxPrintDialogData *data = NULL ) = 0;
+    virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview,
+                                                    wxPrintout *printout,
+                                                    wxPrintData *data ) = 0;
+
+    virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent,
+                                                  wxPrintDialogData *data = NULL ) = 0;
+    virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent,
+                                                  wxPrintData *data ) = 0;
+
+    virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent,
+                                                          wxPageSetupDialogData * data = NULL ) = 0;
+
+    virtual wxDCImpl* CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ) = 0;
+
+    // What to do and what to show in the wxPrintDialog
+    // a) Use the generic print setup dialog or a native one?
+    virtual bool HasPrintSetupDialog() = 0;
+    virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ) = 0;
+    // b) Provide the "print to file" option ourselves or via print setup?
+    virtual bool HasOwnPrintToFile() = 0;
+    // c) Show current printer
+    virtual bool HasPrinterLine() = 0;
+    virtual wxString CreatePrinterLine() = 0;
+    // d) Show Status line for current printer?
+    virtual bool HasStatusLine() = 0;
+    virtual wxString CreateStatusLine() = 0;
+
+
+    virtual wxPrintNativeDataBase *CreatePrintNativeData() = 0;
+
+    static void SetPrintFactory( wxPrintFactory *factory );
+    static wxPrintFactory *GetFactory();
+private:
+    static wxPrintFactory *m_factory;
+};
+
+class WXDLLIMPEXP_CORE wxNativePrintFactory: public wxPrintFactory
+{
+public:
+    virtual wxPrinterBase *CreatePrinter( wxPrintDialogData *data );
+
+    virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview,
+                                                    wxPrintout *printout = NULL,
+                                                    wxPrintDialogData *data = NULL );
+    virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview,
+                                                    wxPrintout *printout,
+                                                    wxPrintData *data );
+
+    virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent,
+                                                  wxPrintDialogData *data = NULL );
+    virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent,
+                                                  wxPrintData *data );
+
+    virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent,
+                                                          wxPageSetupDialogData * data = NULL );
+
+    virtual wxDCImpl* CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data );
+
+    virtual bool HasPrintSetupDialog();
+    virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data );
+    virtual bool HasOwnPrintToFile();
+    virtual bool HasPrinterLine();
+    virtual wxString CreatePrinterLine();
+    virtual bool HasStatusLine();
+    virtual wxString CreateStatusLine();
+
+    virtual wxPrintNativeDataBase *CreatePrintNativeData();
+};
+
+//----------------------------------------------------------------------------
+// wxPrintNativeDataBase
+//----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxPrintNativeDataBase: public wxObject
+{
+public:
+    wxPrintNativeDataBase();
+    virtual ~wxPrintNativeDataBase() {}
+
+    virtual bool TransferTo( wxPrintData &data ) = 0;
+    virtual bool TransferFrom( const wxPrintData &data ) = 0;
+
+    virtual bool Ok() const { return IsOk(); }
+    virtual bool IsOk() const = 0;
 
-class WXDLLEXPORT wxDC;
-class WXDLLEXPORT wxButton;
-class WXDLLEXPORT wxChoice;
-class WXDLLEXPORT wxPrintout;
-class WXDLLEXPORT wxPrinterBase;
-class WXDLLEXPORT wxPrintDialog;
-class WXDLLEXPORT wxPrintPreviewBase;
-class WXDLLEXPORT wxPreviewCanvas;
-class WXDLLEXPORT wxPreviewControlBar;
-class WXDLLEXPORT wxPreviewFrame;
+    int  m_ref;
+
+private:
+    DECLARE_CLASS(wxPrintNativeDataBase)
+    wxDECLARE_NO_COPY_CLASS(wxPrintNativeDataBase);
+};
+
+//----------------------------------------------------------------------------
+// wxPrinterBase
+//----------------------------------------------------------------------------
 
 /*
  * Represents the printer: manages printing a wxPrintout object
  */
-class WXDLLEXPORT wxPrinterBase: public wxObject
-{
-  DECLARE_CLASS(wxPrinterBase)
 
+class WXDLLIMPEXP_CORE wxPrinterBase: public wxObject
+{
 public:
-  wxPrinterBase(wxPrintData *data = (wxPrintData *) NULL);
-  ~wxPrinterBase();
+    wxPrinterBase(wxPrintDialogData *data = NULL);
+    virtual ~wxPrinterBase();
+
+    virtual wxWindow *CreateAbortWindow(wxWindow *parent, wxPrintout *printout);
+    virtual void ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message);
 
-  virtual wxWindow *CreateAbortWindow(wxWindow *parent, wxPrintout *printout);
-  virtual void ReportError(wxWindow *parent, wxPrintout *printout, char *message);
-  inline wxPrintData& GetPrintData() { return m_printData; };
-  inline bool GetAbort() { return sm_abortIt; }
+    virtual wxPrintDialogData& GetPrintDialogData() const;
+    bool GetAbort() const { return sm_abortIt; }
 
-  ///////////////////////////////////////////////////////////////////////////
-  // OVERRIDES
+    static wxPrinterError GetLastError() { return sm_lastError; }
 
-  virtual bool Setup(wxWindow *parent) = 0;
-  virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = TRUE) = 0;
-  virtual bool PrintDialog(wxWindow *parent) = 0;
+    ///////////////////////////////////////////////////////////////////////////
+    // OVERRIDES
+
+    virtual bool Setup(wxWindow *parent) = 0;
+    virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = true) = 0;
+    virtual wxDC* PrintDialog(wxWindow *parent) = 0;
 
 protected:
-  wxPrintData           m_printData;
-  wxPrintout*           m_currentPrintout;
+    wxPrintDialogData     m_printDialogData;
+    wxPrintout*           m_currentPrintout;
+
+    static wxPrinterError sm_lastError;
+
+public:
+    static wxWindow*      sm_abortWindow;
+    static bool           sm_abortIt;
+
+private:
+    DECLARE_CLASS(wxPrinterBase)
+    wxDECLARE_NO_COPY_CLASS(wxPrinterBase);
+};
+
+//----------------------------------------------------------------------------
+// wxPrinter
+//----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxPrinter: public wxPrinterBase
+{
 public:
-  static wxWindow*      sm_abortWindow;
-  static bool           sm_abortIt;
+    wxPrinter(wxPrintDialogData *data = NULL);
+    virtual ~wxPrinter();
+
+    virtual wxWindow *CreateAbortWindow(wxWindow *parent, wxPrintout *printout);
+    virtual void ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message);
+
+    virtual bool Setup(wxWindow *parent);
+    virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = true);
+    virtual wxDC* PrintDialog(wxWindow *parent);
+
+    virtual wxPrintDialogData& GetPrintDialogData() const;
 
+protected:
+    wxPrinterBase    *m_pimpl;
+
+private:
+    DECLARE_CLASS(wxPrinter)
+    wxDECLARE_NO_COPY_CLASS(wxPrinter);
 };
 
+//----------------------------------------------------------------------------
+// wxPrintout
+//----------------------------------------------------------------------------
+
 /*
- * wxPrintout
  * Represents an object via which a document may be printed.
  * The programmer derives from this, overrides (at least) OnPrintPage,
  * and passes it to a wxPrinter object for printing, or a wxPrintPreview
  * object for previewing.
  */
-class WXDLLEXPORT wxPrintout: public wxObject
-{
-  DECLARE_ABSTRACT_CLASS(wxPrintout)
 
+class WXDLLIMPEXP_CORE wxPrintout: public wxObject
+{
 public:
-  wxPrintout(const wxString& title = "Printout");
-  ~wxPrintout();
+    wxPrintout(const wxString& title = _("Printout"));
+    virtual ~wxPrintout();
 
-  virtual bool OnBeginDocument(int startPage, int endPage);
-  virtual void OnEndDocument();
-  virtual void OnBeginPrinting();
-  virtual void OnEndPrinting();
+    virtual bool OnBeginDocument(int startPage, int endPage);
+    virtual void OnEndDocument();
+    virtual void OnBeginPrinting();
+    virtual void OnEndPrinting();
 
-  // Guaranteed to be before any other functions are called
-  inline virtual void OnPreparePrinting() { }
+    // Guaranteed to be before any other functions are called
+    virtual void OnPreparePrinting() { }
 
-  virtual bool HasPage(int page);
-  virtual bool OnPrintPage(int page) = 0;
-  virtual void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo);
+    virtual bool HasPage(int page);
+    virtual bool OnPrintPage(int page) = 0;
+    virtual void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo);
 
-  inline virtual wxString GetTitle() { return m_printoutTitle; }
+    virtual wxString GetTitle() const { return m_printoutTitle; }
 
-  inline wxDC *GetDC() { return m_printoutDC; }
-  inline void SetDC(wxDC *dc) { m_printoutDC = dc; }
-  inline void SetPageSizePixels(int w, int  h) { m_pageWidthPixels = w; m_pageHeightPixels = h; }
-  inline void GetPageSizePixels(int *w, int  *h) { *w = m_pageWidthPixels; *h = m_pageHeightPixels; }
-  inline void SetPageSizeMM(int w, int  h) { m_pageWidthMM = w; m_pageHeightMM = h; }
-  inline void GetPageSizeMM(int *w, int  *h) { *w = m_pageWidthMM; *h = m_pageHeightMM; }
+    wxDC *GetDC() const { return m_printoutDC; }
+    void SetDC(wxDC *dc) { m_printoutDC = dc; }
 
-  inline void SetPPIScreen(int x, int y) { m_PPIScreenX = x; m_PPIScreenY = y; }
-  inline void GetPPIScreen(int *x, int *y) { *x = m_PPIScreenX; *y = m_PPIScreenY; }
-  inline void SetPPIPrinter(int x, int y) { m_PPIPrinterX = x; m_PPIPrinterY = y; }
-  inline void GetPPIPrinter(int *x, int *y) { *x = m_PPIPrinterX; *y = m_PPIPrinterY; }
+    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();
 
-  inline virtual bool IsPreview() { return m_isPreview; }
+    wxRect GetLogicalPaperRect() const;
+    wxRect GetLogicalPageRect() const;
+    wxRect GetLogicalPageMarginsRect(const wxPageSetupDialogData& pageSetupData) const;
 
-  inline virtual void SetIsPreview(bool p) { m_isPreview = p; }
+    void SetLogicalOrigin(wxCoord x, wxCoord y);
+    void OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff);
+
+    void SetPageSizePixels(int w, int  h) { m_pageWidthPixels = w; m_pageHeightPixels = h; }
+    void GetPageSizePixels(int *w, int  *h) const { *w = m_pageWidthPixels; *h = m_pageHeightPixels; }
+    void SetPageSizeMM(int w, int  h) { m_pageWidthMM = w; m_pageHeightMM = h; }
+    void GetPageSizeMM(int *w, int  *h) const { *w = m_pageWidthMM; *h = m_pageHeightMM; }
+
+    void SetPPIScreen(int x, int y) { m_PPIScreenX = x; m_PPIScreenY = y; }
+    void SetPPIScreen(const wxSize& ppi) { SetPPIScreen(ppi.x, ppi.y); }
+    void GetPPIScreen(int *x, int *y) const { *x = m_PPIScreenX; *y = m_PPIScreenY; }
+    void SetPPIPrinter(int x, int y) { m_PPIPrinterX = x; m_PPIPrinterY = y; }
+    void SetPPIPrinter(const wxSize& ppi) { SetPPIPrinter(ppi.x, ppi.y); }
+    void GetPPIPrinter(int *x, int *y) const { *x = m_PPIPrinterX; *y = m_PPIPrinterY; }
+
+    void SetPaperRectPixels(const wxRect& paperRectPixels) { m_paperRectPixels = paperRectPixels; }
+    wxRect GetPaperRectPixels() const { return m_paperRectPixels; }
+
+    // This must be called by wxPrintPreview to associate itself with the
+    // printout it uses.
+    virtual void SetPreview(wxPrintPreview *preview) { m_preview = preview; }
+
+    wxPrintPreview *GetPreview() const { return m_preview; }
+    virtual bool IsPreview() const { return GetPreview() != NULL; }
 
 private:
-   wxString         m_printoutTitle;
-   wxDC*            m_printoutDC;
+    wxString         m_printoutTitle;
+    wxDC*            m_printoutDC;
+    wxPrintPreview  *m_preview;
+
+    int              m_pageWidthPixels;
+    int              m_pageHeightPixels;
 
-   int              m_pageWidthPixels;
-   int              m_pageHeightPixels;
+    int              m_pageWidthMM;
+    int              m_pageHeightMM;
 
-   int              m_pageWidthMM;
-   int              m_pageHeightMM;
+    int              m_PPIScreenX;
+    int              m_PPIScreenY;
+    int              m_PPIPrinterX;
+    int              m_PPIPrinterY;
 
-   int              m_PPIScreenX;
-   int              m_PPIScreenY;
-   int              m_PPIPrinterX;
-   int              m_PPIPrinterY;
+    wxRect           m_paperRectPixels;
 
-   bool             m_isPreview;
+private:
+    DECLARE_ABSTRACT_CLASS(wxPrintout)
+    wxDECLARE_NO_COPY_CLASS(wxPrintout);
 };
 
+//----------------------------------------------------------------------------
+// wxPreviewCanvas
+//----------------------------------------------------------------------------
+
 /*
- * wxPreviewCanvas
  * Canvas upon which a preview is drawn.
  */
-class WXDLLEXPORT wxPreviewCanvas: public wxScrolledWindow
-{
-  DECLARE_CLASS(wxPreviewCanvas)
 
+class WXDLLIMPEXP_CORE wxPreviewCanvas: public wxScrolledWindow
+{
 public:
-  wxPreviewCanvas(wxPrintPreviewBase *preview, wxWindow *parent,
-    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
-    long style = 0, const wxString& name = "canvas");
-  ~wxPreviewCanvas();
+    wxPreviewCanvas(wxPrintPreviewBase *preview,
+                    wxWindow *parent,
+                    const wxPoint& pos = wxDefaultPosition,
+                    const wxSize& size = wxDefaultSize,
+                    long style = 0,
+                    const wxString& name = wxT("canvas"));
+    virtual ~wxPreviewCanvas();
 
-  void OnPaint(wxPaintEvent& event);
+    void SetPreview(wxPrintPreviewBase *preview) { m_printPreview = preview; }
 
-  // Responds to colour changes
-  void OnSysColourChanged(wxSysColourChangedEvent& event);
+    void OnPaint(wxPaintEvent& event);
+    void OnChar(wxKeyEvent &event);
+    // Responds to colour changes
+    void OnSysColourChanged(wxSysColourChangedEvent& event);
 
 private:
-  wxPrintPreviewBase*       m_printPreview;
+#if wxUSE_MOUSEWHEEL
+    void OnMouseWheel(wxMouseEvent& event);
+#endif // wxUSE_MOUSEWHEEL
+    void OnIdle(wxIdleEvent& event);
+
+    wxPrintPreviewBase* m_printPreview;
 
-DECLARE_EVENT_TABLE()
+    DECLARE_CLASS(wxPreviewCanvas)
+    DECLARE_EVENT_TABLE()
+    wxDECLARE_NO_COPY_CLASS(wxPreviewCanvas);
 };
 
+//----------------------------------------------------------------------------
+// wxPreviewFrame
+//----------------------------------------------------------------------------
+
 /*
- * wxPreviewFrame
  * Default frame for showing preview.
  */
 
-class WXDLLEXPORT wxPreviewFrame: public wxFrame
+class WXDLLIMPEXP_CORE wxPreviewFrame: public wxFrame
 {
-  DECLARE_CLASS(wxPreviewFrame)
-
 public:
-  wxPreviewFrame(wxPrintPreviewBase *preview, wxFrame *parent, const wxString& title = "Print Preview",
-    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
-    long style = wxDEFAULT_FRAME_STYLE, const wxString& name = "frame");
-  ~wxPreviewFrame();
-
-  bool OnClose();
-  virtual void Initialize();
-  virtual void CreateCanvas();
-  virtual void CreateControlBar();
+    wxPreviewFrame(wxPrintPreviewBase *preview,
+                   wxWindow *parent,
+                   const wxString& title = _("Print Preview"),
+                   const wxPoint& pos = wxDefaultPosition,
+                   const wxSize& size = wxDefaultSize,
+                   long style = wxDEFAULT_FRAME_STYLE | wxFRAME_FLOAT_ON_PARENT,
+                   const wxString& name = wxFrameNameStr);
+    virtual ~wxPreviewFrame();
+
+    // Either Initialize() or InitializeWithModality() must be called before
+    // showing the preview frame, the former being just a particular case of
+    // the latter initializing the frame for being showing app-modally.
+
+    // Notice that we must keep Initialize() with its existing signature to
+    // avoid breaking the old code that overrides it and we can't reuse the
+    // same name for the other functions to avoid virtual function hiding
+    // problem and the associated warnings given by some compilers (e.g. from
+    // g++ with -Woverloaded-virtual).
+    virtual void Initialize()
+    {
+        InitializeWithModality(wxPreviewFrame_AppModal);
+    }
+
+    // Also note that this method is not virtual as it doesn't need to be
+    // overridden: it's never called by wxWidgets (of course, the same is true
+    // for Initialize() but, again, it must remain virtual for compatibility).
+    void InitializeWithModality(wxPreviewFrameModalityKind kind);
+
+    void OnCloseWindow(wxCloseEvent& event);
+    virtual void CreateCanvas();
+    virtual void CreateControlBar();
+
+    inline wxPreviewControlBar* GetControlBar() const { return m_controlBar; }
 
 protected:
-  wxWindow*             m_previewCanvas;
-  wxPreviewControlBar*  m_controlBar;
-  wxPrintPreviewBase*   m_printPreview;
+    wxPreviewCanvas*      m_previewCanvas;
+    wxPreviewControlBar*  m_controlBar;
+    wxPrintPreviewBase*   m_printPreview;
+    wxWindowDisabler*     m_windowDisabler;
+
+    wxPreviewFrameModalityKind m_modalityKind;
+
+
+private:
+    void OnChar(wxKeyEvent& event);
+
+    DECLARE_EVENT_TABLE()
+    DECLARE_CLASS(wxPreviewFrame)
+    wxDECLARE_NO_COPY_CLASS(wxPreviewFrame);
 };
 
+//----------------------------------------------------------------------------
+// wxPreviewControlBar
+//----------------------------------------------------------------------------
+
 /*
- * wxPreviewControlBar
  * A panel with buttons for controlling a print preview.
  * The programmer may wish to use other means for controlling
  * the print preview.
@@ -195,8 +454,12 @@ protected:
 #define wxPREVIEW_PREVIOUS     2
 #define wxPREVIEW_NEXT         4
 #define wxPREVIEW_ZOOM         8
+#define wxPREVIEW_FIRST       16
+#define wxPREVIEW_LAST        32
+#define wxPREVIEW_GOTO        64
 
-#define wxPREVIEW_DEFAULT      wxPREVIEW_PREVIOUS|wxPREVIEW_NEXT|wxPREVIEW_ZOOM
+#define wxPREVIEW_DEFAULT  (wxPREVIEW_PREVIOUS|wxPREVIEW_NEXT|wxPREVIEW_ZOOM\
+                            |wxPREVIEW_FIRST|wxPREVIEW_GOTO|wxPREVIEW_LAST)
 
 // Ids for controls
 #define wxID_PREVIEW_CLOSE      1
@@ -204,139 +467,289 @@ protected:
 #define wxID_PREVIEW_PREVIOUS   3
 #define wxID_PREVIEW_PRINT      4
 #define wxID_PREVIEW_ZOOM       5
+#define wxID_PREVIEW_FIRST      6
+#define wxID_PREVIEW_LAST       7
+#define wxID_PREVIEW_GOTO       8
+#define wxID_PREVIEW_ZOOM_IN    9
+#define wxID_PREVIEW_ZOOM_OUT   10
 
-class WXDLLEXPORT wxPreviewControlBar: public wxPanel
+class WXDLLIMPEXP_CORE wxPreviewControlBar: public wxPanel
 {
-  DECLARE_CLASS(wxPreviewControlBar)
+    DECLARE_CLASS(wxPreviewControlBar)
 
 public:
-  wxPreviewControlBar(wxPrintPreviewBase *preview, long buttons,
-    wxWindow *parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
-    long style = 0, const wxString& name = "panel");
-  ~wxPreviewControlBar();
-
-  virtual void CreateButtons();
-  virtual void SetZoomControl(int zoom);
-  virtual int GetZoomControl();
-  inline virtual wxPrintPreviewBase *GetPrintPreview() const { return m_printPreview; }
-
-  void OnPrint(wxCommandEvent& event);
-  void OnWindowClose(wxCommandEvent& event);
-  void OnNext(wxCommandEvent& event);
-  void OnPrevious(wxCommandEvent& event);
-  void OnZoom(wxCommandEvent& event);
-  void OnPaint(wxPaintEvent& event);
+    wxPreviewControlBar(wxPrintPreviewBase *preview,
+                        long buttons,
+                        wxWindow *parent,
+                        const wxPoint& pos = wxDefaultPosition,
+                        const wxSize& size = wxDefaultSize,
+                        long style = wxTAB_TRAVERSAL,
+                        const wxString& name = wxT("panel"));
+    virtual ~wxPreviewControlBar();
+
+    virtual void CreateButtons();
+    virtual void SetPageInfo(int minPage, int maxPage);
+    virtual void SetZoomControl(int zoom);
+    virtual int GetZoomControl();
+    virtual wxPrintPreviewBase *GetPrintPreview() const
+        { return m_printPreview; }
+
+
+    // Implementation only from now on.
+    void OnWindowClose(wxCommandEvent& event);
+    void OnNext();
+    void OnPrevious();
+    void OnFirst();
+    void OnLast();
+    void OnGotoPage();
+    void OnPrint();
+
+    void OnPrintButton(wxCommandEvent& WXUNUSED(event)) { OnPrint(); }
+    void OnNextButton(wxCommandEvent & WXUNUSED(event)) { OnNext(); }
+    void OnPreviousButton(wxCommandEvent & WXUNUSED(event)) { OnPrevious(); }
+    void OnFirstButton(wxCommandEvent & WXUNUSED(event)) { OnFirst(); }
+    void OnLastButton(wxCommandEvent & WXUNUSED(event)) { OnLast(); }
+    void OnPaint(wxPaintEvent& event);
+
+    void OnUpdateNextButton(wxUpdateUIEvent& event)
+        { event.Enable(IsNextEnabled()); }
+    void OnUpdatePreviousButton(wxUpdateUIEvent& event)
+        { event.Enable(IsPreviousEnabled()); }
+    void OnUpdateFirstButton(wxUpdateUIEvent& event)
+        { event.Enable(IsFirstEnabled()); }
+    void OnUpdateLastButton(wxUpdateUIEvent& event)
+        { event.Enable(IsLastEnabled()); }
+    void OnUpdateZoomInButton(wxUpdateUIEvent& event)
+        { event.Enable(IsZoomInEnabled()); }
+    void OnUpdateZoomOutButton(wxUpdateUIEvent& event)
+        { event.Enable(IsZoomOutEnabled()); }
+
+    // These methods are not private because they are called by wxPreviewCanvas.
+    void DoZoomIn();
+    void DoZoomOut();
 
 protected:
-  wxPrintPreviewBase*   m_printPreview;
-  wxButton*             m_closeButton;
-  wxButton*             m_nextPageButton;
-  wxButton*             m_previousPageButton;
-  wxButton*             m_printButton;
-  wxChoice*             m_zoomControl;
-  long                  m_buttonFlags;
-
-DECLARE_EVENT_TABLE()
+    wxPrintPreviewBase*   m_printPreview;
+    wxButton*             m_closeButton;
+    wxChoice*             m_zoomControl;
+    wxPrintPageTextCtrl*  m_currentPageText;
+    wxPrintPageMaxCtrl*   m_maxPageText;
+
+    long                  m_buttonFlags;
+
+private:
+    void DoGotoPage(int page);
+
+    void DoZoom();
+
+    bool IsNextEnabled() const;
+    bool IsPreviousEnabled() const;
+    bool IsFirstEnabled() const;
+    bool IsLastEnabled() const;
+    bool IsZoomInEnabled() const;
+    bool IsZoomOutEnabled() const;
+
+    void OnZoomInButton(wxCommandEvent & WXUNUSED(event)) { DoZoomIn(); }
+    void OnZoomOutButton(wxCommandEvent & WXUNUSED(event)) { DoZoomOut(); }
+    void OnZoomChoice(wxCommandEvent& WXUNUSED(event)) { DoZoom(); }
+
+    DECLARE_EVENT_TABLE()
+    wxDECLARE_NO_COPY_CLASS(wxPreviewControlBar);
 };
 
+//----------------------------------------------------------------------------
+// wxPrintPreviewBase
+//----------------------------------------------------------------------------
+
 /*
- * wxPrintPreview
  * Programmer creates an object of this class to preview a wxPrintout.
  */
-class WXDLLEXPORT wxPrintPreviewBase: public wxObject
-{
-  DECLARE_CLASS(wxPrintPreviewBase)
 
+class WXDLLIMPEXP_CORE wxPrintPreviewBase: public wxObject
+{
 public:
-  wxPrintPreviewBase(wxPrintout *printout, wxPrintout *printoutForPrinting = (wxPrintout *) NULL, wxPrintData *data = (wxPrintData *) NULL);
-  ~wxPrintPreviewBase();
+    wxPrintPreviewBase(wxPrintout *printout,
+                       wxPrintout *printoutForPrinting = NULL,
+                       wxPrintDialogData *data = NULL);
+    wxPrintPreviewBase(wxPrintout *printout,
+                       wxPrintout *printoutForPrinting,
+                       wxPrintData *data);
+    virtual ~wxPrintPreviewBase();
+
+    virtual bool SetCurrentPage(int pageNum);
+    virtual int GetCurrentPage() const;
+
+    virtual void SetPrintout(wxPrintout *printout);
+    virtual wxPrintout *GetPrintout() const;
+    virtual wxPrintout *GetPrintoutForPrinting() const;
+
+    virtual void SetFrame(wxFrame *frame);
+    virtual void SetCanvas(wxPreviewCanvas *canvas);
+
+    virtual wxFrame *GetFrame() const;
+    virtual wxPreviewCanvas *GetCanvas() const;
 
-  virtual bool SetCurrentPage(int pageNum);
-  inline int GetCurrentPage() const { return m_currentPage; };
+    // This is a helper routine, used by the next 4 routines.
 
-  inline void SetPrintout(wxPrintout *printout) { m_previewPrintout = printout; };
-  inline wxPrintout *GetPrintout() const { return m_previewPrintout; };
-  inline wxPrintout *GetPrintoutForPrinting() const { return m_printPrintout; };
+    virtual void CalcRects(wxPreviewCanvas *canvas, wxRect& printableAreaRect, wxRect& paperRect);
 
-  inline void SetFrame(wxFrame *frame) { m_previewFrame = frame; };
-  inline void SetCanvas(wxWindow *canvas) { m_previewCanvas = canvas; };
+    // The preview canvas should call this from OnPaint
+    virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc);
 
-  inline virtual wxFrame *GetFrame() const { return m_previewFrame; }
-  inline virtual wxWindow *GetCanvas() const { return m_previewCanvas; }
+    // Updates rendered page by calling RenderPage() if needed, returns true
+    // if there was some change. Preview canvas should call it at idle time
+    virtual bool UpdatePageRendering();
 
-  // The preview canvas should call this from OnPaint
-  virtual bool PaintPage(wxWindow *canvas, wxDC& dc);
+    // This draws a blank page onto the preview canvas
+    virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc);
 
-  // This draws a blank page onto the preview canvas
-  virtual bool DrawBlankPage(wxWindow *canvas, wxDC& dc);
+    // Adjusts the scrollbars for the current scale
+    virtual void AdjustScrollbars(wxPreviewCanvas *canvas);
 
-  // This is called by wxPrintPreview to render a page into
-  // a wxMemoryDC.
-  virtual bool RenderPage(int pageNum);
+    // This is called by wxPrintPreview to render a page into a wxMemoryDC.
+    virtual bool RenderPage(int pageNum);
 
-  inline wxPrintData& GetPrintData() { return m_printData; }
 
-  virtual void SetZoom(int percent);
-  inline int GetZoom() const { return m_currentZoom; };
+    virtual void SetZoom(int percent);
+    virtual int GetZoom() const;
 
-  inline int GetMaxPage() const { return m_maxPage; }
-  inline int GetMinPage() const { return m_minPage; }
+    virtual wxPrintDialogData& GetPrintDialogData();
 
-  inline bool Ok() const { return m_isOk; }
-  inline void SetOk(bool ok) { m_isOk = ok; }
+    virtual int GetMaxPage() const;
+    virtual int GetMinPage() const;
 
-  ///////////////////////////////////////////////////////////////////////////
-  // OVERRIDES
+    virtual bool Ok() const { return IsOk(); }
+    virtual bool IsOk() const;
+    virtual void SetOk(bool ok);
 
-  // If we own a wxPrintout that can be used for printing, this
-  // will invoke the actual printing procedure. Called
-  // by the wxPreviewControlBar.
-  virtual bool Print(bool interactive) = 0;
+    ///////////////////////////////////////////////////////////////////////////
+    // OVERRIDES
 
-  // Calculate scaling that needs to be done to get roughly
-  // the right scaling for the screen pretending to be
-  // the currently selected printer.
-  virtual void DetermineScaling() = 0;
+    // If we own a wxPrintout that can be used for printing, this
+    // will invoke the actual printing procedure. Called
+    // by the wxPreviewControlBar.
+    virtual bool Print(bool interactive) = 0;
+
+    // Calculate scaling that needs to be done to get roughly
+    // the right scaling for the screen pretending to be
+    // the currently selected printer.
+    virtual void DetermineScaling() = 0;
+
+protected:
+    // helpers for RenderPage():
+    virtual bool RenderPageIntoDC(wxDC& dc, int pageNum);
+    // renders preview into m_previewBitmap
+    virtual bool RenderPageIntoBitmap(wxBitmap& bmp, int pageNum);
+
+    void InvalidatePreviewBitmap();
 
 protected:
-  wxPrintData       m_printData;
-  wxWindow*         m_previewCanvas;
-  wxFrame*          m_previewFrame;
-  wxBitmap*         m_previewBitmap;
-  wxPrintout*       m_previewPrintout;
-  wxPrintout*       m_printPrintout;
-  int               m_currentPage;
-  int               m_currentZoom;
-  float             m_previewScale;
-  int               m_topMargin;
-  int               m_leftMargin;
-  int               m_pageWidth;
-  int               m_pageHeight;
-  int               m_minPage;
-  int               m_maxPage;
- protected:
-  bool              m_isOk;
+    wxPrintDialogData m_printDialogData;
+    wxPreviewCanvas*  m_previewCanvas;
+    wxFrame*          m_previewFrame;
+    wxBitmap*         m_previewBitmap;
+    bool              m_previewFailed;
+    wxPrintout*       m_previewPrintout;
+    wxPrintout*       m_printPrintout;
+    int               m_currentPage;
+    int               m_currentZoom;
+    float             m_previewScaleX;
+    float             m_previewScaleY;
+    int               m_topMargin;
+    int               m_leftMargin;
+    int               m_pageWidth;
+    int               m_pageHeight;
+    int               m_minPage;
+    int               m_maxPage;
+
+    bool              m_isOk;
+    bool              m_printingPrepared; // Called OnPreparePrinting?
+
+private:
+    void Init(wxPrintout *printout, wxPrintout *printoutForPrinting);
+
+    wxDECLARE_NO_COPY_CLASS(wxPrintPreviewBase);
+    DECLARE_CLASS(wxPrintPreviewBase)
 };
 
-/*
- * Abort dialog
- */
+//----------------------------------------------------------------------------
+// wxPrintPreview
+//----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxPrintAbortDialog: public wxDialog
+class WXDLLIMPEXP_CORE wxPrintPreview: public wxPrintPreviewBase
 {
 public:
-  wxPrintAbortDialog(wxWindow *parent,
-    const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
-    long style = 0, const wxString& name = "dialog"):
-   wxDialog(parent, -1, title, pos, size, style, name)
-  {
-  }
+    wxPrintPreview(wxPrintout *printout,
+                   wxPrintout *printoutForPrinting = NULL,
+                   wxPrintDialogData *data = NULL);
+    wxPrintPreview(wxPrintout *printout,
+                   wxPrintout *printoutForPrinting,
+                   wxPrintData *data);
+    virtual ~wxPrintPreview();
+
+    virtual bool SetCurrentPage(int pageNum);
+    virtual int GetCurrentPage() const;
+    virtual void SetPrintout(wxPrintout *printout);
+    virtual wxPrintout *GetPrintout() const;
+    virtual wxPrintout *GetPrintoutForPrinting() const;
+    virtual void SetFrame(wxFrame *frame);
+    virtual void SetCanvas(wxPreviewCanvas *canvas);
+
+    virtual wxFrame *GetFrame() const;
+    virtual wxPreviewCanvas *GetCanvas() const;
+    virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc);
+    virtual bool UpdatePageRendering();
+    virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc);
+    virtual void AdjustScrollbars(wxPreviewCanvas *canvas);
+    virtual bool RenderPage(int pageNum);
+    virtual void SetZoom(int percent);
+    virtual int GetZoom() const;
+
+    virtual bool Print(bool interactive);
+    virtual void DetermineScaling();
+
+    virtual wxPrintDialogData& GetPrintDialogData();
+
+    virtual int GetMaxPage() const;
+    virtual int GetMinPage() const;
+
+    virtual bool Ok() const { return IsOk(); }
+    virtual bool IsOk() const;
+    virtual void SetOk(bool ok);
 
-  void OnCancel(wxCommandEvent& event);
+private:
+    wxPrintPreviewBase *m_pimpl;
 
-  DECLARE_EVENT_TABLE()
+private:
+    DECLARE_CLASS(wxPrintPreview)
+    wxDECLARE_NO_COPY_CLASS(wxPrintPreview);
 };
 
+//----------------------------------------------------------------------------
+// wxPrintAbortDialog
+//----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxPrintAbortDialog: public wxDialog
+{
+public:
+    wxPrintAbortDialog(wxWindow *parent,
+                       const wxString& title,
+                       const wxPoint& pos = wxDefaultPosition,
+                       const wxSize& size = wxDefaultSize,
+                       long style = 0,
+                       const wxString& name = wxT("dialog"))
+        : wxDialog(parent, wxID_ANY, title, pos, size, style, name)
+        {
+        }
+
+    void OnCancel(wxCommandEvent& event);
+
+private:
+    DECLARE_EVENT_TABLE()
+    wxDECLARE_NO_COPY_CLASS(wxPrintAbortDialog);
+};
+
+#endif // wxUSE_PRINTING_ARCHITECTURE
+
 #endif
     // _WX_PRNTBASEH__