]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dcpsg.cpp
Listctrl should now send char and key_down events.
[wxWidgets.git] / src / generic / dcpsg.cpp
index dcd5c76c05e4fbe4cc5cd1900653ccfbb114e9c1..c6f1a559f43dd234ae63ad91083087ba97368137 100644 (file)
@@ -42,6 +42,7 @@
 #include "wx/radiobox.h"
 #include "wx/textctrl.h"
 #include "wx/prntbase.h"
 #include "wx/radiobox.h"
 #include "wx/textctrl.h"
 #include "wx/prntbase.h"
+#include "wx/paper.h"
 
 #include <math.h>
 
 
 #include <math.h>
 
@@ -231,34 +232,37 @@ static char wxPostScriptHeaderReencodeISO2[] =
 wxPostScriptDC::wxPostScriptDC ()
 {
     m_pstream = (ofstream*) NULL;
 wxPostScriptDC::wxPostScriptDC ()
 {
     m_pstream = (ofstream*) NULL;
-    
+
     m_currentRed = 0;
     m_currentGreen = 0;
     m_currentBlue = 0;
     m_currentRed = 0;
     m_currentGreen = 0;
     m_currentBlue = 0;
-    
+
     m_pageNumber = 0;
     m_pageNumber = 0;
-    
+
     m_clipping = FALSE;
     m_clipping = FALSE;
-    
+
     m_underlinePosition = 0.0;
     m_underlineThickness = 0.0;
 
     m_signX =  1;  // default x-axis left to right
     m_signY = -1;  // default y-axis bottom up -> top down
     m_underlinePosition = 0.0;
     m_underlineThickness = 0.0;
 
     m_signX =  1;  // default x-axis left to right
     m_signY = -1;  // default y-axis bottom up -> top down
+
+    // Compatibility only
+    m_printData = * wxThePrintSetupData;
 }
 
 wxPostScriptDC::wxPostScriptDC (const wxString& file, bool interactive, wxWindow *parent)
 {
     m_pstream = (ofstream*) NULL;
 }
 
 wxPostScriptDC::wxPostScriptDC (const wxString& file, bool interactive, wxWindow *parent)
 {
     m_pstream = (ofstream*) NULL;
-    
+
     m_currentRed = 0;
     m_currentGreen = 0;
     m_currentBlue = 0;
     m_currentRed = 0;
     m_currentGreen = 0;
     m_currentBlue = 0;
-    
+
     m_pageNumber = 0;
     m_pageNumber = 0;
-    
+
     m_clipping = FALSE;
     m_clipping = FALSE;
-    
+
     m_underlinePosition = 0.0;
     m_underlineThickness = 0.0;
 
     m_underlinePosition = 0.0;
     m_underlineThickness = 0.0;
 
@@ -273,11 +277,11 @@ bool wxPostScriptDC::Create(const wxString& file, bool interactive, wxWindow *pa
     m_isInteractive = interactive;
 
     m_title = "";
     m_isInteractive = interactive;
 
     m_title = "";
-    m_filename = file;
+    m_printData.SetFilename(file);
 
 #ifdef __WXMSW__
     // Can only send to file in Windows
 
 #ifdef __WXMSW__
     // Can only send to file in Windows
-    wxThePrintSetupData->SetPrinterMode(PS_FILE);
+    m_printData.SetPrintMode(wxPRINT_MODE_FILE);
 #endif
 
     if (m_isInteractive)
 #endif
 
     if (m_isInteractive)
@@ -288,10 +292,33 @@ bool wxPostScriptDC::Create(const wxString& file, bool interactive, wxWindow *pa
     {
         m_ok = TRUE;
     }
     {
         m_ok = TRUE;
     }
-    
+
     return m_ok;
 }
 
     return m_ok;
 }
 
+wxPostScriptDC::wxPostScriptDC (const wxPrintData& printData)
+{
+    m_pstream = (ofstream*) NULL;
+
+    m_currentRed = 0;
+    m_currentGreen = 0;
+    m_currentBlue = 0;
+
+    m_pageNumber = 0;
+
+    m_clipping = FALSE;
+
+    m_underlinePosition = 0.0;
+    m_underlineThickness = 0.0;
+
+    m_signX =  1;  // default x-axis left to right
+    m_signY = -1;  // default y-axis bottom up -> top down
+
+    m_printData = printData;
+
+    m_ok = TRUE;
+}
+
 wxPostScriptDC::~wxPostScriptDC ()
 {
     if (m_pstream) delete m_pstream;
 wxPostScriptDC::~wxPostScriptDC ()
 {
     if (m_pstream) delete m_pstream;
@@ -301,50 +328,49 @@ bool wxPostScriptDC::Ok() const
 {
   return m_ok;
 }
 {
   return m_ok;
 }
-  
+
+// This dialog is deprecated now: use wxGenericPrintDialog or the printing framework
 bool wxPostScriptDC::PrinterDialog(wxWindow *parent)
 {
 bool wxPostScriptDC::PrinterDialog(wxWindow *parent)
 {
-    wxPostScriptPrintDialog dialog( parent, _("Printer Settings"), wxPoint(150, 150), wxSize(400, 400), 
+    wxPostScriptPrintDialog dialog( parent, _("Printer Settings"), wxPoint(150, 150), wxSize(400, 400),
                                     wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL );
     m_ok = (dialog.ShowModal () == wxID_OK);
 
     if (!m_ok) return FALSE;
 
                                     wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL );
     m_ok = (dialog.ShowModal () == wxID_OK);
 
     if (!m_ok) return FALSE;
 
-    if ((m_filename == "") && 
-        (wxThePrintSetupData->GetPrinterMode() == PS_PREVIEW  || 
-         wxThePrintSetupData->GetPrinterMode() == PS_PRINTER))
+    if ((m_printData.GetFilename() == "") &&
+        (m_printData.GetPrintMode() == wxPRINT_MODE_PREVIEW  ||
+         m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER))
     {
 // steve, 05.09.94
 #ifdef __VMS__
     {
 // steve, 05.09.94
 #ifdef __VMS__
-      wxThePrintSetupData->SetPrinterFile("preview");
+      m_printData.SetFilename("preview");
 #else
       // For PS_PRINTER action this depends on a Unix-style print spooler
       // since the wx_printer_file can be destroyed during a session
       // @@@ TODO: a Windows-style answer for non-Unix
 #else
       // For PS_PRINTER action this depends on a Unix-style print spooler
       // since the wx_printer_file can be destroyed during a session
       // @@@ TODO: a Windows-style answer for non-Unix
-      char userId[256];
+      wxChar userId[256];
       wxGetUserId (userId, sizeof (userId) / sizeof (char));
       wxGetUserId (userId, sizeof (userId) / sizeof (char));
-      char tmp[256];
-      strcpy (tmp, "/tmp/preview_");
-      strcat (tmp, userId);
-      wxThePrintSetupData->SetPrinterFile(tmp);
+      wxChar tmp[256];
+      wxStrcpy (tmp, _T("/tmp/preview_"));
+      wxStrcat (tmp, userId);
+      m_printData.SetFilename(tmp);
 #endif
 #endif
-      char tmp2[256];
-      strcpy(tmp2, wxThePrintSetupData->GetPrinterFile());
-      strcat (tmp2, ".ps");
-      wxThePrintSetupData->SetPrinterFile(tmp2);
-      m_filename = tmp2;
+      wxChar tmp2[256];
+      wxStrcpy(tmp2, m_printData.GetFilename());
+      wxStrcat (tmp2, _T(".ps"));
+      m_printData.SetFilename(tmp2);
     }
     }
-    else if ((m_filename == "") && (wxThePrintSetupData->GetPrinterMode() == PS_FILE))
+    else if ((m_printData.GetFilename() == _T("")) && (m_printData.GetPrintMode() == wxPRINT_MODE_FILE))
     {
     {
-      wxString file = wxSaveFileSelector (_("PostScript"), "ps");
+      wxString file = wxSaveFileSelector (_("PostScript"), _T("ps"));
       if ( file.IsEmpty() )
       {
         m_ok = FALSE;
         return FALSE;
       }
 
       if ( file.IsEmpty() )
       {
         m_ok = FALSE;
         return FALSE;
       }
 
-      wxThePrintSetupData->SetPrinterFile(file);
-      m_filename = file;
+      m_printData.SetFilename(file);
       m_ok = TRUE;
     }
 
       m_ok = TRUE;
     }
 
@@ -353,15 +379,15 @@ bool wxPostScriptDC::PrinterDialog(wxWindow *parent)
 
 void wxPostScriptDC::SetClippingRegion (long x, long y, long w, long h)
 {
 
 void wxPostScriptDC::SetClippingRegion (long x, long y, long w, long h)
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (m_clipping) return;
 
     wxDC::SetClippingRegion( x, y, w, h );
     if (m_clipping) return;
 
     wxDC::SetClippingRegion( x, y, w, h );
-    
+
     m_clipping = TRUE;
     m_clipping = TRUE;
-    *m_pstream << "gsave\n" 
-               << "newpath\n" 
+    *m_pstream << "gsave\n"
+               << "newpath\n"
            << XLOG2DEV(x)   << " " << YLOG2DEV(y)   << " moveto\n"
            << XLOG2DEV(x+w) << " " << YLOG2DEV(y)   << " lineto\n"
            << XLOG2DEV(x+w) << " " << YLOG2DEV(y+h) << " lineto\n"
            << XLOG2DEV(x)   << " " << YLOG2DEV(y)   << " moveto\n"
            << XLOG2DEV(x+w) << " " << YLOG2DEV(y)   << " lineto\n"
            << XLOG2DEV(x+w) << " " << YLOG2DEV(y+h) << " lineto\n"
@@ -375,10 +401,10 @@ void wxPostScriptDC::SetClippingRegion( const wxRegion &WXUNUSED(region) )
 
 void wxPostScriptDC::DestroyClippingRegion()
 {
 
 void wxPostScriptDC::DestroyClippingRegion()
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     wxDC::DestroyClippingRegion();
     wxDC::DestroyClippingRegion();
-    
+
     if (m_clipping)
     {
         m_clipping = FALSE;
     if (m_clipping)
     {
         m_clipping = FALSE;
@@ -388,61 +414,61 @@ void wxPostScriptDC::DestroyClippingRegion()
 
 void wxPostScriptDC::Clear()
 {
 
 void wxPostScriptDC::Clear()
 {
-    wxFAIL_MSG( "wxPostScriptDC::Clear not implemented." );
+    wxFAIL_MSG( _T("wxPostScriptDC::Clear not implemented.") );
 }
 
 }
 
-void wxPostScriptDC::FloodFill (long WXUNUSED(x), long WXUNUSED(y), const wxColour &WXUNUSED(col), int WXUNUSED(style))
+void wxPostScriptDC::DoFloodFill (long WXUNUSED(x), long WXUNUSED(y), const wxColour &WXUNUSED(col), int WXUNUSED(style))
 {
 {
-    wxFAIL_MSG( "wxPostScriptDC::FloodFill not implemented." );
+    wxFAIL_MSG( _T("wxPostScriptDC::FloodFill not implemented.") );
 }
 
 }
 
-bool wxPostScriptDC::GetPixel (long WXUNUSED(x), long WXUNUSED(y), wxColour * WXUNUSED(col)) const
+bool wxPostScriptDC::DoGetPixel (long WXUNUSED(x), long WXUNUSED(y), wxColour * WXUNUSED(col)) const
 {
 {
-    wxFAIL_MSG( "wxPostScriptDC::GetPixel not implemented." );
+    wxFAIL_MSG( _T("wxPostScriptDC::GetPixel not implemented.") );
     return FALSE;
 }
 
     return FALSE;
 }
 
-void wxPostScriptDC::CrossHair (long WXUNUSED(x), long WXUNUSED(y))
+void wxPostScriptDC::DoCrossHair (long WXUNUSED(x), long WXUNUSED(y))
 {
 {
-    wxFAIL_MSG( "wxPostScriptDC::CrossHair not implemented." );
+    wxFAIL_MSG( _T("wxPostScriptDC::CrossHair not implemented.") );
 }
 
 }
 
-void wxPostScriptDC::DrawLine (long x1, long y1, long x2, long y2)
+void wxPostScriptDC::DoDrawLine (long x1, long y1, long x2, long y2)
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if  (m_pen.GetStyle() == wxTRANSPARENT) return;
     if  (m_pen.GetStyle() == wxTRANSPARENT) return;
-    
+
     SetPen( m_pen );
     SetPen( m_pen );
-    
+
     *m_pstream << "newpath\n"
            <<  XLOG2DEV(x1) << " " <<  YLOG2DEV (y1) << " moveto\n"
            <<  XLOG2DEV(x2) << " " <<  YLOG2DEV (y2) << " lineto\n"
            << "stroke\n";
     *m_pstream << "newpath\n"
            <<  XLOG2DEV(x1) << " " <<  YLOG2DEV (y1) << " moveto\n"
            <<  XLOG2DEV(x2) << " " <<  YLOG2DEV (y2) << " lineto\n"
            << "stroke\n";
-           
+
     CalcBoundingBox( x1, y1 );
     CalcBoundingBox( x2, y2 );
 }
 
 #define RAD2DEG 57.29577951308
 
     CalcBoundingBox( x1, y1 );
     CalcBoundingBox( x2, y2 );
 }
 
 #define RAD2DEG 57.29577951308
 
-void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long yc)
+void wxPostScriptDC::DoDrawArc (long x1, long y1, long x2, long y2, long xc, long yc)
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     long dx = x1 - xc;
     long dy = y1 - yc;
     long radius = (long) sqrt(dx*dx+dy*dy);
     double alpha1, alpha2;
 
     long dx = x1 - xc;
     long dy = y1 - yc;
     long radius = (long) sqrt(dx*dx+dy*dy);
     double alpha1, alpha2;
 
-    if (x1 == x2 && y1 == y2) 
+    if (x1 == x2 && y1 == y2)
     {
     alpha1 = 0.0;
     alpha2 = 360.0;
     {
     alpha1 = 0.0;
     alpha2 = 360.0;
-    } else if (radius == 0.0) 
+    } else if (radius == 0.0)
     {
     alpha1 = alpha2 = 0.0;
     {
     alpha1 = alpha2 = 0.0;
-    } else 
+    } else
     {
     alpha1 = (x1 - xc == 0) ?
         (y1 - yc < 0) ? 90.0 : -90.0 :
     {
     alpha1 = (x1 - xc == 0) ?
         (y1 - yc < 0) ? 90.0 : -90.0 :
@@ -456,7 +482,7 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long
     while (alpha1 > 360)  alpha1 -= 360; // 0 and 360 degree
     while (alpha2 > 360)  alpha2 -= 360;
 
     while (alpha1 > 360)  alpha1 -= 360; // 0 and 360 degree
     while (alpha2 > 360)  alpha2 -= 360;
 
-    if (m_brush.GetStyle() != wxTRANSPARENT) 
+    if (m_brush.GetStyle() != wxTRANSPARENT)
     {
     SetBrush( m_brush );
     *m_pstream << "newpath\n"
     {
     SetBrush( m_brush );
     *m_pstream << "newpath\n"
@@ -471,8 +497,8 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long
          << "closepath\n"
              << "fill\n";
     }
          << "closepath\n"
              << "fill\n";
     }
-    
-    if (m_pen.GetStyle() != wxTRANSPARENT) 
+
+    if (m_pen.GetStyle() != wxTRANSPARENT)
     {
     SetPen( m_pen );
     *m_pstream << "newpath\n"
     {
     SetPen( m_pen );
     *m_pstream << "newpath\n"
@@ -484,20 +510,20 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long
          << alpha2               << " ellipse\n"
              << "stroke\n";
     }
          << alpha2               << " ellipse\n"
              << "stroke\n";
     }
-    
+
     CalcBoundingBox( xc-radius, yc-radius );
     CalcBoundingBox( xc+radius, yc+radius );
 }
 
     CalcBoundingBox( xc-radius, yc-radius );
     CalcBoundingBox( xc+radius, yc+radius );
 }
 
-void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,double ea)
+void wxPostScriptDC::DoDrawEllipticArc(long x,long y,long w,long h,double sa,double ea)
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (sa>=360 || sa<=-360) sa=sa-int(sa/360)*360;
     if (ea>=360 || ea<=-360) ea=ea-int(ea/360)*360;
     if (sa<0) sa+=360;
     if (ea<0) ea+=360;
     if (sa>=360 || sa<=-360) sa=sa-int(sa/360)*360;
     if (ea>=360 || ea<=-360) ea=ea-int(ea/360)*360;
     if (sa<0) sa+=360;
     if (ea<0) ea+=360;
-    
+
     if (sa==ea)
     {
         DrawEllipse(x,y,w,h);
     if (sa==ea)
     {
         DrawEllipse(x,y,w,h);
@@ -508,22 +534,22 @@ void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,doubl
     {
         SetBrush( m_brush );
 
     {
         SetBrush( m_brush );
 
-        *m_pstream << "newpath\n" 
-               << XLOG2DEV(x+w/2) << " " << YLOG2DEV(y+h/2) << " " 
-           << XLOG2DEVREL(w/2) << " " << YLOG2DEVREL(h/2) << " " 
+        *m_pstream << "newpath\n"
+               << XLOG2DEV(x+w/2) << " " << YLOG2DEV(y+h/2) << " "
+           << XLOG2DEVREL(w/2) << " " << YLOG2DEVREL(h/2) << " "
            << int(sa) <<" "<< int(ea) << " true ellipticarc\n";
 
         CalcBoundingBox( x ,y );
         CalcBoundingBox( x+w, y+h );
     }
            << int(sa) <<" "<< int(ea) << " true ellipticarc\n";
 
         CalcBoundingBox( x ,y );
         CalcBoundingBox( x+w, y+h );
     }
-    
+
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen( m_pen );
 
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen( m_pen );
 
-        *m_pstream << "newpath\n" 
-               << XLOG2DEV(x+w/2) << " " << YLOG2DEV(y+h/2) << " " 
-           << XLOG2DEVREL(w/2) << " " << XLOG2DEVREL(h/2) << " " 
+        *m_pstream << "newpath\n"
+               << XLOG2DEV(x+w/2) << " " << YLOG2DEV(y+h/2) << " "
+           << XLOG2DEVREL(w/2) << " " << XLOG2DEVREL(h/2) << " "
            << int(sa) <<" "<< int(ea) << " false ellipticarc\n";
 
         CalcBoundingBox( x, y );
            << int(sa) <<" "<< int(ea) << " false ellipticarc\n";
 
         CalcBoundingBox( x, y );
@@ -531,32 +557,32 @@ void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,doubl
     }
 }
 
     }
 }
 
-void wxPostScriptDC::DrawPoint (long x, long y)
+void wxPostScriptDC::DoDrawPoint (long x, long y)
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (m_pen.GetStyle() == wxTRANSPARENT) return;
     if (m_pen.GetStyle() == wxTRANSPARENT) return;
-    
+
     SetPen (m_pen);
     SetPen (m_pen);
-    
+
     *m_pstream << "newpath\n"
          << XLOG2DEV(x)   << " " << YLOG2DEV (y) << " moveto\n"
          << XLOG2DEV(x+1) << " " << YLOG2DEV (y) << " lineto\n"
          << "stroke\n";
     *m_pstream << "newpath\n"
          << XLOG2DEV(x)   << " " << YLOG2DEV (y) << " moveto\n"
          << XLOG2DEV(x+1) << " " << YLOG2DEV (y) << " lineto\n"
          << "stroke\n";
-    
+
     CalcBoundingBox( x, y );
 }
 
     CalcBoundingBox( x, y );
 }
 
-void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle))
+void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle))
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (n <= 0) return;
     if (n <= 0) return;
-    
+
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
     SetBrush( m_brush );
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
     SetBrush( m_brush );
-      
+
     *m_pstream << "newpath\n";
 
     long xx = XLOG2DEV(points[0].x + xoffset);
     *m_pstream << "newpath\n";
 
     long xx = XLOG2DEV(points[0].x + xoffset);
@@ -577,7 +603,7 @@ void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yo
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
     SetPen( m_pen );
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
     SetPen( m_pen );
-    
+
     *m_pstream << "newpath\n";
 
     long xx = XLOG2DEV(points[0].x + xoffset);
     *m_pstream << "newpath\n";
 
     long xx = XLOG2DEV(points[0].x + xoffset);
@@ -597,17 +623,17 @@ void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yo
     }
 }
 
     }
 }
 
-void wxPostScriptDC::DrawLines (int n, wxPoint points[], long xoffset, long yoffset)
+void wxPostScriptDC::DoDrawLines (int n, wxPoint points[], long xoffset, long yoffset)
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (m_pen.GetStyle() == wxTRANSPARENT)
         return;
     if (n <= 0)
         return;
     if (m_pen.GetStyle() == wxTRANSPARENT)
         return;
     if (n <= 0)
         return;
-  
+
     SetPen (m_pen);
     SetPen (m_pen);
-    
+
     int i;
     for ( i =0; i<n ; i++ )
     {
     int i;
     for ( i =0; i<n ; i++ )
     {
@@ -617,20 +643,20 @@ void wxPostScriptDC::DrawLines (int n, wxPoint points[], long xoffset, long yoff
     *m_pstream << "newpath\n"
                << XLOG2DEV(points[0].x+xoffset) << " "
                << YLOG2DEV(points[0].y+yoffset) << " moveto\n";
     *m_pstream << "newpath\n"
                << XLOG2DEV(points[0].x+xoffset) << " "
                << YLOG2DEV(points[0].y+yoffset) << " moveto\n";
-         
-    for (i = 1; i < n; i++) 
+
+    for (i = 1; i < n; i++)
     {
         *m_pstream << XLOG2DEV(points[i].x+xoffset) << " "
                    << YLOG2DEV(points[i].y+yoffset) << " lineto\n";
     }
     {
         *m_pstream << XLOG2DEV(points[i].x+xoffset) << " "
                    << YLOG2DEV(points[i].y+yoffset) << " lineto\n";
     }
-    
+
     *m_pstream << "stroke\n";
 }
 
     *m_pstream << "stroke\n";
 }
 
-void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height)
+void wxPostScriptDC::DoDrawRectangle (long x, long y, long width, long height)
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush( m_brush );
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush( m_brush );
@@ -646,7 +672,7 @@ void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height)
         CalcBoundingBox( x, y );
         CalcBoundingBox( x + width, y + height );
     }
         CalcBoundingBox( x, y );
         CalcBoundingBox( x + width, y + height );
     }
-    
+
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
@@ -664,10 +690,10 @@ void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height)
     }
 }
 
     }
 }
 
-void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long height, double radius)
+void wxPostScriptDC::DoDrawRoundedRectangle (long x, long y, long width, long height, double radius)
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (radius < 0.0)
     {
         // Now, a negative radius is interpreted to mean
     if (radius < 0.0)
     {
         // Now, a negative radius is interpreted to mean
@@ -679,13 +705,13 @@ void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long heig
         smallest = height;
         radius =  (-radius * smallest);
     }
         smallest = height;
         radius =  (-radius * smallest);
     }
-    
+
     long rad = (long) radius;
 
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush( m_brush );
     long rad = (long) radius;
 
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush( m_brush );
-    
+
         // Draw rectangle anticlockwise
         *m_pstream << "newpath\n"
                    << XLOG2DEV(x + rad) << " " << YLOG2DEV(y + rad) << " " << XLOG2DEVREL(rad) << " 90 180 arc\n"
         // Draw rectangle anticlockwise
         *m_pstream << "newpath\n"
                    << XLOG2DEV(x + rad) << " " << YLOG2DEV(y + rad) << " " << XLOG2DEVREL(rad) << " 90 180 arc\n"
@@ -702,11 +728,11 @@ void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long heig
         CalcBoundingBox( x, y );
         CalcBoundingBox( x + width, y + height );
     }
         CalcBoundingBox( x, y );
         CalcBoundingBox( x + width, y + height );
     }
-    
+
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
-    
+
         // Draw rectangle anticlockwise
         *m_pstream << "newpath\n"
                    << XLOG2DEV(x + rad) << " " << YLOG2DEV(y + rad) << " " << XLOG2DEVREL(rad) << " 90 180 arc\n"
         // Draw rectangle anticlockwise
         *m_pstream << "newpath\n"
                    << XLOG2DEV(x + rad) << " " << YLOG2DEV(y + rad) << " " << XLOG2DEVREL(rad) << " 90 180 arc\n"
@@ -725,30 +751,30 @@ void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long heig
     }
 }
 
     }
 }
 
-void wxPostScriptDC::DrawEllipse (long x, long y, long width, long height)
+void wxPostScriptDC::DoDrawEllipse (long x, long y, long width, long height)
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush (m_brush);
 
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush (m_brush);
 
-        *m_pstream << "newpath\n" 
-                   << XLOG2DEV(x + width / 2) << " " << YLOG2DEV(y + height / 2) << " " 
-                   << XLOG2DEV(width / 2) << " " << YLOG2DEVREL(height / 2) << " 0 360 ellipse\n" 
+        *m_pstream << "newpath\n"
+                   << XLOG2DEV(x + width / 2) << " " << YLOG2DEV(y + height / 2) << " "
+                   << XLOG2DEV(width / 2) << " " << YLOG2DEVREL(height / 2) << " 0 360 ellipse\n"
                    << "fill\n";
 
         CalcBoundingBox( x - width, y - height );
         CalcBoundingBox( x + width, y + height );
     }
                    << "fill\n";
 
         CalcBoundingBox( x - width, y - height );
         CalcBoundingBox( x + width, y + height );
     }
-    
+
     if (m_pen.Ok() && m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
 
     if (m_pen.Ok() && m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
 
-        *m_pstream << "newpath\n" 
-                   << XLOG2DEV(x + width / 2) << " " << YLOG2DEV(y + height / 2) << " " 
-                   << XLOG2DEV(width / 2) << " " << YLOG2DEVREL(height / 2) << " 0 360 ellipse\n" 
+        *m_pstream << "newpath\n"
+                   << XLOG2DEV(x + width / 2) << " " << YLOG2DEV(y + height / 2) << " "
+                   << XLOG2DEV(width / 2) << " " << YLOG2DEVREL(height / 2) << " 0 360 ellipse\n"
                    << "stroke\n";
 
         CalcBoundingBox( x - width, y - height );
                    << "stroke\n";
 
         CalcBoundingBox( x - width, y - height );
@@ -756,31 +782,31 @@ void wxPostScriptDC::DrawEllipse (long x, long y, long width, long height)
     }
 }
 
     }
 }
 
-void wxPostScriptDC::DrawIcon( const wxIcon& icon, long x, long y )
+void wxPostScriptDC::DoDrawIcon( const wxIcon& icon, long x, long y )
 {
     DrawBitmap( icon, x, y, TRUE );
 }
 
 {
     DrawBitmap( icon, x, y, TRUE );
 }
 
-void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool WXUNUSED(useMask) )
+void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, long x, long y, bool WXUNUSED(useMask) )
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
 
     if (!bitmap.Ok()) return;
 
     if (!bitmap.Ok()) return;
-    
+
     wxImage image( bitmap );
     wxImage image( bitmap );
-    
+
     if (!image.Ok()) return;
     if (!image.Ok()) return;
-    
+
     int ww = XLOG2DEVREL(image.GetWidth());
     int hh = YLOG2DEVREL(image.GetHeight());
     int ww = XLOG2DEVREL(image.GetWidth());
     int hh = YLOG2DEVREL(image.GetHeight());
-    
+
     image = image.Scale( ww, hh );
     image = image.Scale( ww, hh );
-    
+
     if (!image.Ok()) return;
     if (!image.Ok()) return;
-    
+
     int xx = XLOG2DEV(x);
     int yy = YLOG2DEV(y + bitmap.GetHeight());
     int xx = XLOG2DEV(x);
     int yy = YLOG2DEV(y + bitmap.GetHeight());
-    
+
     *m_pstream << "/origstate save def\n"
                << "20 dict begin\n"
                << "/pix " << ww << " string def\n"
     *m_pstream << "/origstate save def\n"
                << "20 dict begin\n"
                << "/pix " << ww << " string def\n"
@@ -793,12 +819,12 @@ void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool WX
                << "[" << ww << " 0 0 " << (-hh) << " 0 " << hh << "]\n"
                << "{currentfile pix readhexstring pop}\n"
                << "false 3 colorimage\n";
                << "[" << ww << " 0 0 " << (-hh) << " 0 " << hh << "]\n"
                << "{currentfile pix readhexstring pop}\n"
                << "false 3 colorimage\n";
-  
+
     for (int j = 0; j < hh; j++)
     {
         for (int i = 0; i < ww; i++)
         {
     for (int j = 0; j < hh; j++)
     {
         for (int i = 0; i < ww; i++)
         {
-        char buffer[5];
+        wxChar buffer[5];
         buffer[2] = 0;
         wxDecToHex( image.GetRed(i,j), buffer );
             *m_pstream << buffer;
         buffer[2] = 0;
         wxDecToHex( image.GetRed(i,j), buffer );
             *m_pstream << buffer;
@@ -812,15 +838,15 @@ void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool WX
 
     *m_pstream << "end\n";
     *m_pstream << "origstate restore\n";
 
     *m_pstream << "end\n";
     *m_pstream << "origstate restore\n";
-    
+
 }
 
 void wxPostScriptDC::SetFont( const wxFont& font )
 {
 }
 
 void wxPostScriptDC::SetFont( const wxFont& font )
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (!font.Ok())  return;
     if (!font.Ok())  return;
-    
+
     m_font = font;
 
     const char *name;
     m_font = font;
 
     const char *name;
@@ -898,7 +924,7 @@ void wxPostScriptDC::SetFont( const wxFont& font )
     char buf[100];
     strcpy (buf, name);
     strcat (buf, style);
     char buf[100];
     strcpy (buf, name);
     strcat (buf, style);
-    
+
     *m_pstream << buf << " reencodeISO def\n";
     *m_pstream << buf << " findfont\n";
     *m_pstream << YLOG2DEVREL(m_font.GetPointSize()) << " scalefont setfont\n";
     *m_pstream << buf << " reencodeISO def\n";
     *m_pstream << buf << " findfont\n";
     *m_pstream << YLOG2DEVREL(m_font.GetPointSize()) << " scalefont setfont\n";
@@ -906,10 +932,10 @@ void wxPostScriptDC::SetFont( const wxFont& font )
 
 void wxPostScriptDC::SetPen( const wxPen& pen )
 {
 
 void wxPostScriptDC::SetPen( const wxPen& pen )
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (!pen.Ok()) return;
     if (!pen.Ok()) return;
-    
+
     int oldStyle = m_pen.GetStyle();
 
     m_pen = pen;
     int oldStyle = m_pen.GetStyle();
 
     m_pen = pen;
@@ -918,7 +944,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
 
 /*
      Line style - WRONG: 2nd arg is OFFSET
 
 /*
      Line style - WRONG: 2nd arg is OFFSET
-     
+
      Here, I'm afraid you do not conceive meaning of parameters of 'setdash'
      operator correctly. You should look-up this in the Red Book: the 2nd parame-
      ter is not number of values in the array of the first one, but an offset
      Here, I'm afraid you do not conceive meaning of parameters of 'setdash'
      operator correctly. You should look-up this in the Red Book: the 2nd parame-
      ter is not number of values in the array of the first one, but an offset
@@ -944,7 +970,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
         case wxTRANSPARENT:
         default:              psdash = "[] 0";         break;
     }
         case wxTRANSPARENT:
         default:              psdash = "[] 0";         break;
     }
-    
+
     if (oldStyle != m_pen.GetStyle())
     {
         *m_pstream << psdash << " setdash\n";
     if (oldStyle != m_pen.GetStyle())
     {
         *m_pstream << psdash << " setdash\n";
@@ -965,16 +991,15 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
         green = (unsigned char) 0;
         blue = (unsigned char) 0;
     }
         green = (unsigned char) 0;
         blue = (unsigned char) 0;
     }
-    
+
     // setgray here ?
     }
 
     if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
     {
     // setgray here ?
     }
 
     if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
     {
-       long redPS = (long) (((int) red) / 255.0);
-       long bluePS = (long) (((int) blue) / 255.0);
-       long greenPS = (long) (((int) green) / 255.0);
-
+       float redPS = (float)(red) / 255.0;
+       float bluePS = (float)(blue) / 255.0;
+       float greenPS = (float)(green) / 255.0;
        *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
 
        m_currentRed = red;
        *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
 
        m_currentRed = red;
@@ -985,16 +1010,16 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
 
 void wxPostScriptDC::SetBrush( const wxBrush& brush )
 {
 
 void wxPostScriptDC::SetBrush( const wxBrush& brush )
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (!brush.Ok()) return;
     if (!brush.Ok()) return;
-    
+
     m_brush = brush;
 
     // Brush colour
     m_brush = brush;
 
     // Brush colour
-    unsigned char red = m_brush.GetColour ().Red ();
-    unsigned char blue = m_brush.GetColour ().Blue ();
-    unsigned char green = m_brush.GetColour ().Green ();
+    unsigned char red = m_brush.GetColour().Red();
+    unsigned char blue = m_brush.GetColour().Blue();
+    unsigned char green = m_brush.GetColour().Green();
 
     if (!m_colour)
     {
 
     if (!m_colour)
     {
@@ -1006,15 +1031,15 @@ void wxPostScriptDC::SetBrush( const wxBrush& brush )
         green = (unsigned char) 255;
         blue = (unsigned char) 255;
     }
         green = (unsigned char) 255;
         blue = (unsigned char) 255;
     }
-    
+
     // setgray here ?
     }
 
     if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
     {
     // setgray here ?
     }
 
     if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
     {
-       long redPS = (long) (((int) red) / 255.0);
-       long bluePS = (long) (((int) blue) / 255.0);
-       long greenPS = (long) (((int) green) / 255.0);
+       float redPS = (float)(red) / 255.0;
+       float bluePS = (float)(blue) / 255.0;
+       float greenPS = (float)(green) / 255.0;
        *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
        m_currentRed = red;
        m_currentBlue = blue;
        *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
        m_currentRed = red;
        m_currentBlue = blue;
@@ -1022,10 +1047,10 @@ void wxPostScriptDC::SetBrush( const wxBrush& brush )
     }
 }
 
     }
 }
 
-void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUSED(use16bit) )
+void wxPostScriptDC::DoDrawText( const wxString& text, long x, long y )
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     SetFont( m_font );
 
     if (m_textForegroundColour.Ok ())
     SetFont( m_font );
 
     if (m_textForegroundColour.Ok ())
@@ -1045,14 +1070,14 @@ void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUS
           blue = (unsigned char) 0;
         }
     }
           blue = (unsigned char) 0;
         }
     }
-    
+
     // maybe setgray here ?
     // maybe setgray here ?
-    
+
         if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
         {
         if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
         {
-            long redPS = (long) (((int) red) / 255.0);
-            long bluePS = (long) (((int) blue) / 255.0);
-            long greenPS = (long) (((int) green) / 255.0);
+            float redPS = (float)(red) / 255.0;
+            float bluePS = (float)(blue) / 255.0;
+            float greenPS = (float)(green) / 255.0;
             *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
 
             m_currentRed = red;
             *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
 
             m_currentRed = red;
@@ -1065,13 +1090,14 @@ void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUS
 
     long by = y + (long)floor( float(size) * 2.0 / 3.0 ); // approximate baseline
     *m_pstream << XLOG2DEV(x) << " " << YLOG2DEV(by) << " moveto\n";
 
     long by = y + (long)floor( float(size) * 2.0 / 3.0 ); // approximate baseline
     *m_pstream << XLOG2DEV(x) << " " << YLOG2DEV(by) << " moveto\n";
-    
+
     *m_pstream << "(";
     *m_pstream << "(";
-    int len = strlen ((char *)(const char *)text);
+    const wxWX2MBbuf textbuf = text.mb_str();
+    int len = strlen (textbuf);
     int i;
     for (i = 0; i < len; i++)
     {
     int i;
     for (i = 0; i < len; i++)
     {
-        int c = (unsigned char) text[i];
+        int c = (unsigned char) textbuf[i];
         if ( c == ')' || c == '(' || c == '\\')
         {
             *m_pstream << "\\" << (char) c;
         if ( c == ')' || c == '(' || c == '\\')
         {
             *m_pstream << "\\" << (char) c;
@@ -1094,14 +1120,14 @@ void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUS
         long uy = (long)(y + size - m_underlinePosition);
         long w, h;
         GetTextExtent(text, &w, &h);
         long uy = (long)(y + size - m_underlinePosition);
         long w, h;
         GetTextExtent(text, &w, &h);
-      
+
         *m_pstream << "gsave " << XLOG2DEV(x) << " " << YLOG2DEV(uy)
                    << " moveto\n"
                    << (long)m_underlineThickness << " setlinewidth "
                    << XLOG2DEV(x + w) << " " << YLOG2DEV(uy)
                    << " lineto stroke grestore\n";
     }
         *m_pstream << "gsave " << XLOG2DEV(x) << " " << YLOG2DEV(uy)
                    << " moveto\n"
                    << (long)m_underlineThickness << " setlinewidth "
                    << XLOG2DEV(x + w) << " " << YLOG2DEV(uy)
                    << " lineto stroke grestore\n";
     }
-    
+
     CalcBoundingBox( x, y );
     CalcBoundingBox( x + size * text.Length() * 2/3 , y );
 }
     CalcBoundingBox( x, y );
     CalcBoundingBox( x + size * text.Length() * 2/3 , y );
 }
@@ -1114,13 +1140,13 @@ void wxPostScriptDC::SetBackground (const wxBrush& brush)
 
 void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function))
 {
 
 void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function))
 {
-    wxFAIL_MSG( "wxPostScriptDC::SetLogicalFunction not implemented." );
+    wxFAIL_MSG( _T("wxPostScriptDC::SetLogicalFunction not implemented.") );
 }
 
 }
 
-void wxPostScriptDC::DrawSpline( wxList *points )
+void wxPostScriptDC::DoDrawSpline( wxList *points )
 {
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     SetPen( m_pen );
 
     double a, b, c, d, x1, y1, x2, y2, x3, y3;
     SetPen( m_pen );
 
     double a, b, c, d, x1, y1, x2, y2, x3, y3;
@@ -1128,20 +1154,20 @@ void wxPostScriptDC::DrawSpline( wxList *points )
 
     wxNode *node = points->First();
     p = (wxPoint *)node->Data();
 
     wxNode *node = points->First();
     p = (wxPoint *)node->Data();
-    x1 = p->x; 
+    x1 = p->x;
     y1 = p->y;
 
     node = node->Next();
     p = (wxPoint *)node->Data();
     y1 = p->y;
 
     node = node->Next();
     p = (wxPoint *)node->Data();
-    c = p->x; 
+    c = p->x;
     d = p->y;
     x3 = a = (double)(x1 + c) / 2;
     y3 = b = (double)(y1 + d) / 2;
 
     d = p->y;
     x3 = a = (double)(x1 + c) / 2;
     y3 = b = (double)(y1 + d) / 2;
 
-    *m_pstream  << "newpath " 
-                << XLOG2DEV((long)x1) << " " << YLOG2DEV((long)y1) << " moveto " 
+    *m_pstream  << "newpath "
+                << XLOG2DEV((long)x1) << " " << YLOG2DEV((long)y1) << " moveto "
         << XLOG2DEV((long)x3) << " " << YLOG2DEV((long)y3) << " lineto\n";
         << XLOG2DEV((long)x3) << " " << YLOG2DEV((long)y3) << " lineto\n";
-        
+
     CalcBoundingBox( (long)x1, (long)y1 );
     CalcBoundingBox( (long)x3, (long)y3 );
 
     CalcBoundingBox( (long)x1, (long)y1 );
     CalcBoundingBox( (long)x3, (long)y3 );
 
@@ -1149,22 +1175,22 @@ void wxPostScriptDC::DrawSpline( wxList *points )
     {
         q = (wxPoint *)node->Data();
 
     {
         q = (wxPoint *)node->Data();
 
-    x1 = x3; 
+    x1 = x3;
     y1 = y3;
     y1 = y3;
-    x2 = c;  
+    x2 = c;
     y2 = d;
     y2 = d;
-    c = q->x; 
+    c = q->x;
     d = q->y;
         x3 = (double)(x2 + c) / 2;
         y3 = (double)(y2 + d) / 2;
     d = q->y;
         x3 = (double)(x2 + c) / 2;
         y3 = (double)(y2 + d) / 2;
-        *m_pstream << XLOG2DEV((long)x1) << " " << YLOG2DEV((long)y1) << " " 
+        *m_pstream << XLOG2DEV((long)x1) << " " << YLOG2DEV((long)y1) << " "
                << XLOG2DEV((long)x2) << " " << YLOG2DEV((long)y2) << " "
                    << XLOG2DEV((long)x3) << " " << YLOG2DEV((long)y3) << " DrawSplineSection\n";
 
         CalcBoundingBox( (long)x1, (long)y1 );
         CalcBoundingBox( (long)x3, (long)y3 );
     }
                << XLOG2DEV((long)x2) << " " << YLOG2DEV((long)y2) << " "
                    << XLOG2DEV((long)x3) << " " << YLOG2DEV((long)y3) << " DrawSplineSection\n";
 
         CalcBoundingBox( (long)x1, (long)y1 );
         CalcBoundingBox( (long)x3, (long)y3 );
     }
-    
+
 /*
      At this point, (x2,y2) and (c,d) are the position of the
      next-to-last and last point respectively, in the point list
 /*
      At this point, (x2,y2) and (c,d) are the position of the
      next-to-last and last point respectively, in the point list
@@ -1173,7 +1199,7 @@ void wxPostScriptDC::DrawSpline( wxList *points )
     *m_pstream << XLOG2DEV((long)c) << " " << YLOG2DEV((long)d) << " lineto stroke\n";
 }
 
     *m_pstream << XLOG2DEV((long)c) << " " << YLOG2DEV((long)d) << " lineto stroke\n";
 }
 
-long wxPostScriptDC::GetCharWidth ()
+long wxPostScriptDC::GetCharWidth() const
 {
     // Chris Breeze: reasonable approximation using wxMODERN/Courier
     return (long) (GetCharHeight() * 72.0 / 120.0);
 {
     // Chris Breeze: reasonable approximation using wxMODERN/Courier
     return (long) (GetCharHeight() * 72.0 / 120.0);
@@ -1182,11 +1208,11 @@ long wxPostScriptDC::GetCharWidth ()
 
 void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
 {
 
 void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     m_signX = (xLeftRight ? 1 : -1);
     m_signY = (yBottomUp  ? 1 : -1);
     m_signX = (xLeftRight ? 1 : -1);
     m_signY = (yBottomUp  ? 1 : -1);
-    
+
     // FIXME there is no such function in MSW
 #ifndef __WXMSW__
     ComputeScaleAndOrigin();
     // FIXME there is no such function in MSW
 #ifndef __WXMSW__
     ComputeScaleAndOrigin();
@@ -1195,29 +1221,27 @@ void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
 
 void wxPostScriptDC::SetDeviceOrigin( long x, long y )
 {
 
 void wxPostScriptDC::SetDeviceOrigin( long x, long y )
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     int h = 0;
     int w = 0;
     GetSize( &w, &h );
     int h = 0;
     int w = 0;
     GetSize( &w, &h );
-  
+
     wxDC::SetDeviceOrigin( x, h-y );
 }
 
     wxDC::SetDeviceOrigin( x, h-y );
 }
 
-void wxPostScriptDC::GetSize(int* width, int* height) const
+void wxPostScriptDC::DoGetSize(int* width, int* height) const
 {
 {
-    const char *paperType = wxThePrintSetupData->GetPaperName();
-    
-    if (!paperType) paperType = _("A4 210 x 297 mm");
+    wxPaperSize id = m_printData.GetPaperId();
+
+    wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(id);
+
+    if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4);
 
 
-    wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(paperType);
-    
-    if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(_("A4 210 x 297 mm"));
-    
     if (paper)
     {
     if (paper)
     {
-        if (width) *width = paper->widthPixels;
-        if (height) *height = paper->heightPixels;
+        if (width) *width = paper->GetSizeDeviceUnits().x;
+        if (height) *height = paper->GetSizeDeviceUnits().y;
     }
     else
     {
     }
     else
     {
@@ -1226,30 +1250,54 @@ void wxPostScriptDC::GetSize(int* width, int* height) const
     }
 }
 
     }
 }
 
-bool wxPostScriptDC::StartDoc (const wxString& message)
+void wxPostScriptDC::DoGetSizeMM(int *width, int *height) const
 {
 {
-    wxCHECK_MSG( m_ok, FALSE, "invalid postscript dc" );
-    
-    if (m_filename == "")
+    wxPaperSize id = m_printData.GetPaperId();
+
+    wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(id);
+
+    if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4);
+
+    if (paper)
     {
     {
-        m_filename = wxGetTempFileName("ps");
-        wxThePrintSetupData->SetPrinterFile((char *)(const char *)m_filename);
-        m_ok = TRUE;
+        if (width) *width = paper->GetWidth() / 10;
+        if (height) *height = paper->GetHeight() / 10;
     }
     else
     {
     }
     else
     {
-    wxThePrintSetupData->SetPrinterFile((char *)(const char *)m_filename);
+       if (width) *width = 210;
+       if (height) *height = 297;
+    }
+}
+
+// Resolution in pixels per logical inch
+wxSize wxPostScriptDC::GetPPI(void) const
+{
+    return wxSize(72, 72);
+}
+
+
+bool wxPostScriptDC::StartDoc (const wxString& message)
+{
+    wxCHECK_MSG( m_ok, FALSE, _T("invalid postscript dc") );
+
+    if (m_printData.GetFilename() == "")
+    {
+        wxString filename = wxGetTempFileName("ps");
+        m_printData.SetFilename(filename);
+
+        m_ok = TRUE;
     }
 
     }
 
-    m_pstream = new ofstream (wxThePrintSetupData->GetPrinterFile());
-      
+    m_pstream = new ofstream (m_printData.GetFilename().fn_str());
+
     if (!m_pstream || !m_pstream->good())
     {
     if (!m_pstream || !m_pstream->good())
     {
-    wxMessageBox (_("Cannot open file!"), _("Error"), wxOK);
-    m_ok = FALSE;
-    return FALSE;
+        wxMessageBox (_("Cannot open file!"), _("Error"), wxOK);
+        m_ok = FALSE;
+        return FALSE;
     }
     }
-    
+
     m_ok = TRUE;
 
     SetBrush( *wxBLACK_BRUSH );
     m_ok = TRUE;
 
     SetBrush( *wxBLACK_BRUSH );
@@ -1259,7 +1307,7 @@ bool wxPostScriptDC::StartDoc (const wxString& message)
 
     // set origin according to paper size
     SetDeviceOrigin( 0,0 );
 
     // set origin according to paper size
     SetDeviceOrigin( 0,0 );
-    
+
     wxPageNumber = 1;
     m_pageNumber = 1;
     m_title = message;
     wxPageNumber = 1;
     m_pageNumber = 1;
     m_title = message;
@@ -1268,8 +1316,8 @@ bool wxPostScriptDC::StartDoc (const wxString& message)
 
 void wxPostScriptDC::EndDoc ()
 {
 
 void wxPostScriptDC::EndDoc ()
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     if (m_clipping)
     {
         m_clipping = FALSE;
     if (m_clipping)
     {
         m_clipping = FALSE;
@@ -1282,39 +1330,43 @@ void wxPostScriptDC::EndDoc ()
         m_pstream = (ofstream *) NULL;
     }
 
         m_pstream = (ofstream *) NULL;
     }
 
-    char *header_file = wxGetTempFileName("ps");
-    
-    m_pstream = new ofstream( header_file );
+    wxChar *header_file = wxGetTempFileName("ps");
+
+    m_pstream = new ofstream( wxConv_file.cWX2MB(header_file) );
 
     *m_pstream << "%!PS-Adobe-2.0\n";   /* PostScript magic strings */
 
     *m_pstream << "%!PS-Adobe-2.0\n";   /* PostScript magic strings */
-    *m_pstream << "%%Title: " << (const char *) m_title << "\n";
+    *m_pstream << "%%Title: " << m_title.mb_str() << "\n";
     *m_pstream << "%%Creator: " << wxTheApp->argv[0] << "\n";
     *m_pstream << "%%Creator: " << wxTheApp->argv[0] << "\n";
-    *m_pstream << "%%CreationDate: " << wxNow() << "\n";
+    *m_pstream << "%%CreationDate: " << wxNow().mb_str() << "\n";
 
 
-    char userID[256];
+    wxChar userID[256];
     if ( wxGetEmailAddress(userID, sizeof(userID)) )
     {
     if ( wxGetEmailAddress(userID, sizeof(userID)) )
     {
-        *m_pstream << "%%For: " << (char *)userID;
-        char userName[245];
+        *m_pstream << "%%For: " << MBSTRINGCAST wxConv_libc.cWX2MB(userID);
+        wxChar userName[245];
         if (wxGetUserName(userName, sizeof(userName)))
         if (wxGetUserName(userName, sizeof(userName)))
-            *m_pstream << " (" << (char *)userName << ")";
+            *m_pstream << " (" << MBSTRINGCAST wxConv_libc.cWX2MB(userName) << ")";
         *m_pstream << "\n";
     }
     else if ( wxGetUserName(userID, sizeof(userID)) )
     {
         *m_pstream << "\n";
     }
     else if ( wxGetUserName(userID, sizeof(userID)) )
     {
-        *m_pstream << "%%For: " << (char *)userID << "\n";
+        *m_pstream << "%%For: " << MBSTRINGCAST wxConv_libc.cWX2MB(userID) << "\n";
     }
 
     // THE FOLLOWING HAS BEEN CONTRIBUTED BY Andy Fyfe <andy@hyperparallel.com>
 
     long wx_printer_translate_x, wx_printer_translate_y;
     double wx_printer_scale_x, wx_printer_scale_y;
     }
 
     // THE FOLLOWING HAS BEEN CONTRIBUTED BY Andy Fyfe <andy@hyperparallel.com>
 
     long wx_printer_translate_x, wx_printer_translate_y;
     double wx_printer_scale_x, wx_printer_scale_y;
-    wxThePrintSetupData->GetPrinterTranslation(&wx_printer_translate_x, &wx_printer_translate_y);
-    wxThePrintSetupData->GetPrinterScaling(&wx_printer_scale_x, &wx_printer_scale_y);
 
 
-    if (wxThePrintSetupData->GetPrinterOrientation() == PS_LANDSCAPE)
+    wx_printer_translate_x = m_printData.GetPrinterTranslateX();
+    wx_printer_translate_y = m_printData.GetPrinterTranslateY();
+
+    wx_printer_scale_x = m_printData.GetPrinterScaleX();
+    wx_printer_scale_y = m_printData.GetPrinterScaleY();
+
+    if (m_printData.GetOrientation() == wxLANDSCAPE)
     {
     {
-    *m_pstream << "%%Orientation: Landscape\n";
+        *m_pstream << "%%Orientation: Landscape\n";
     }
     else
     {
     }
     else
     {
@@ -1329,7 +1381,7 @@ void wxPostScriptDC::EndDoc ()
     long ury = (long) ((YLOG2DEV(m_maxY)+wx_printer_translate_y)*wx_printer_scale_y);
 
     // If we're landscape, our sense of "x" and "y" is reversed.
     long ury = (long) ((YLOG2DEV(m_maxY)+wx_printer_translate_y)*wx_printer_scale_y);
 
     // If we're landscape, our sense of "x" and "y" is reversed.
-    if (wxThePrintSetupData->GetPrinterOrientation() == PS_LANDSCAPE)
+    if (m_printData.GetOrientation() == wxLANDSCAPE)
     {
         long tmp;
         tmp = llx; llx = lly; lly = tmp;
     {
         long tmp;
         tmp = llx; llx = lly; lly = tmp;
@@ -1375,49 +1427,56 @@ void wxPostScriptDC::EndDoc ()
     delete m_pstream;
     m_pstream = (ofstream *) NULL;
 
     delete m_pstream;
     m_pstream = (ofstream *) NULL;
 
-    char *tmp_file = wxGetTempFileName("ps");
+    wxChar *tmp_file = wxGetTempFileName("ps");
 
     // Paste header Before wx_printer_file
 
     // Paste header Before wx_printer_file
-    wxConcatFiles (header_file, wxThePrintSetupData->GetPrinterFile(), tmp_file);
+    wxConcatFiles (header_file, m_printData.GetFilename(), tmp_file);
     wxRemoveFile (header_file);
     wxRemoveFile (header_file);
-    wxRemoveFile (wxThePrintSetupData->GetPrinterFile());
-    wxRenameFile(tmp_file, wxThePrintSetupData->GetPrinterFile());
+    wxRemoveFile (m_printData.GetFilename());
+    wxRenameFile(tmp_file, m_printData.GetFilename());
 
 #if defined(__X__) || defined(__WXGTK__)
   if (m_ok)
     {
 
 #if defined(__X__) || defined(__WXGTK__)
   if (m_ok)
     {
-      switch (wxThePrintSetupData->GetPrinterMode()) {
-    case PS_PREVIEW:
+      wxString previewCommand(m_printData.GetPreviewCommand());
+      wxString printerCommand(m_printData.GetPrinterCommand());
+      wxString printerOptions(m_printData.GetPrinterOptions());
+      wxString filename(m_printData.GetFilename());
+
+      switch (m_printData.GetPrintMode()) {
+
+    case wxPRINT_MODE_PREVIEW:
     {
     {
-          char *argv[3];
-          argv[0] = wxThePrintSetupData->GetPrintPreviewCommand();
-          argv[1] = wxThePrintSetupData->GetPrinterFile();
-          argv[2] = (char *) NULL;
-      wxExecute (argv, TRUE);
-          wxRemoveFile(wxThePrintSetupData->GetPrinterFile());
+          wxChar *argv[3];
+          argv[0] = WXSTRINGCAST previewCommand;
+          argv[1] = WXSTRINGCAST filename;
+          argv[2] = (wxChar*) NULL;
+          wxExecute (argv, TRUE);
+          wxRemoveFile(m_printData.GetFilename());
     }
     break;
 
     }
     break;
 
-    case PS_PRINTER:
+    case wxPRINT_MODE_PRINTER:
     {
     {
-          char *argv[4];
+          wxChar *argv[4];
           int argc = 0;
           int argc = 0;
-          argv[argc++] = wxThePrintSetupData->GetPrinterCommand();
+          argv[argc++] = WXSTRINGCAST printerCommand;
 
           // !SM! If we simply assign to argv[1] here, if printer options
           // are blank, we get an annoying and confusing message from lpr.
 
           // !SM! If we simply assign to argv[1] here, if printer options
           // are blank, we get an annoying and confusing message from lpr.
-          char * opts = wxThePrintSetupData->GetPrinterOptions();
+          wxChar * opts = WXSTRINGCAST printerOptions;
           if (opts && *opts)
               argv[argc++] = opts;
 
           if (opts && *opts)
               argv[argc++] = opts;
 
-          argv[argc++] = wxThePrintSetupData->GetPrinterFile();
-          argv[argc++] = (char *) NULL;
-      wxExecute (argv, TRUE);
-          wxRemoveFile(wxThePrintSetupData->GetPrinterFile());
+          argv[argc++] = WXSTRINGCAST filename;
+          argv[argc++] = (wxChar *) NULL;
+          wxExecute (argv, TRUE);
+          wxRemoveFile(filename);
     }
     break;
 
     }
     break;
 
-    case PS_FILE:
+    case wxPRINT_MODE_FILE:
+    case wxPRINT_MODE_NONE:
       break;
     }
     }
       break;
     }
     }
@@ -1426,10 +1485,10 @@ void wxPostScriptDC::EndDoc ()
 
 void wxPostScriptDC::StartPage ()
 {
 
 void wxPostScriptDC::StartPage ()
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     *m_pstream << "%%Page: " << (wxPageNumber++) << "\n";
     *m_pstream << "%%Page: " << (wxPageNumber++) << "\n";
-    
+
 //  *m_pstream << "matrix currentmatrix\n";
 
     // Added by Chris Breeze
 //  *m_pstream << "matrix currentmatrix\n";
 
     // Added by Chris Breeze
@@ -1437,48 +1496,52 @@ void wxPostScriptDC::StartPage ()
     // Each page starts with an "initgraphics" which resets the
     // transformation and so we need to reset the origin
     // (and rotate the page for landscape printing)
     // Each page starts with an "initgraphics" which resets the
     // transformation and so we need to reset the origin
     // (and rotate the page for landscape printing)
-    
+
 /*
     m_scaleFactor = 1.0;
     m_logicalOriginX = 0;
     m_logicalOriginY = 0;
 */
 /*
     m_scaleFactor = 1.0;
     m_logicalOriginX = 0;
     m_logicalOriginY = 0;
 */
-       // Output scaling
-       long translate_x, translate_y;
-       double scale_x, scale_y;
-       wxThePrintSetupData->GetPrinterTranslation(&translate_x, &translate_y);
-       wxThePrintSetupData->GetPrinterScaling(&scale_x, &scale_y);
+    // Output scaling
+    long translate_x, translate_y;
+    double scale_x, scale_y;
+
+    translate_x = m_printData.GetPrinterTranslateX();
+    translate_y = m_printData.GetPrinterTranslateY();
 
 
-       if (wxThePrintSetupData->GetPrinterOrientation() == PS_LANDSCAPE)
-       {
-               translate_y -= m_maxY;
-               *m_pstream << "90 rotate\n";
-       }
+    scale_x = m_printData.GetPrinterScaleX();
+    scale_y = m_printData.GetPrinterScaleY();
 
 
-       *m_pstream << scale_x << " " << scale_y << " scale\n";
-       *m_pstream << translate_x << " " << translate_y << " translate\n";
+    if (m_printData.GetOrientation() == wxLANDSCAPE)
+    {
+        translate_y -= m_maxY;
+        *m_pstream << "90 rotate\n";
+    }
+
+    *m_pstream << scale_x << " " << scale_y << " scale\n";
+    *m_pstream << translate_x << " " << translate_y << " translate\n";
 }
 
 void wxPostScriptDC::EndPage ()
 {
 }
 
 void wxPostScriptDC::EndPage ()
 {
-    wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+    wxCHECK_RET( m_ok && m_pstream, _T("invalid postscript dc") );
+
     *m_pstream << "showpage\n";
 }
 
     *m_pstream << "showpage\n";
 }
 
-bool wxPostScriptDC::Blit( long xdest, long ydest, 
+bool wxPostScriptDC::DoBlit( long xdest, long ydest,
                            long fwidth, long fheight,
                            long fwidth, long fheight,
-                           wxDC *source, 
-                           long xsrc, long ysrc, 
+                           wxDC *source,
+                           long xsrc, long ysrc,
                            int rop, bool WXUNUSED(useMask) )
 {
                            int rop, bool WXUNUSED(useMask) )
 {
-    wxCHECK_MSG( m_ok && m_pstream, FALSE, "invalid postscript dc" );
-    
-    wxCHECK_MSG( source, FALSE, "invalid source dc" );
-    
+    wxCHECK_MSG( m_ok && m_pstream, FALSE, _T("invalid postscript dc") );
+
+    wxCHECK_MSG( source, FALSE, _T("invalid source dc") );
+
     /* blit into a bitmap */
     /* blit into a bitmap */
-  
-    wxBitmap bitmap( fwidth, fheight );
+
+    wxBitmap bitmap( (int)fwidth, (int)fheight );
     wxMemoryDC memDC;
     memDC.SelectObject(bitmap);
     memDC.Blit(0, 0, fwidth, fheight, source, xsrc, ysrc, rop); /* TODO: Blit transparently? */
     wxMemoryDC memDC;
     memDC.SelectObject(bitmap);
     memDC.Blit(0, 0, fwidth, fheight, source, xsrc, ysrc, rop); /* TODO: Blit transparently? */
@@ -1487,11 +1550,11 @@ bool wxPostScriptDC::Blit( long xdest, long ydest,
     /* draw bitmap. scaling and positioning is done there */
 
     DrawBitmap( bitmap, xdest, ydest );
     /* draw bitmap. scaling and positioning is done there */
 
     DrawBitmap( bitmap, xdest, ydest );
-    
+
     return TRUE;
 }
 
     return TRUE;
 }
 
-long wxPostScriptDC::GetCharHeight()
+long wxPostScriptDC::GetCharHeight() const
 {
     if (m_font.Ok())
         return  m_font.GetPointSize();
 {
     if (m_font.Ok())
         return  m_font.GetPointSize();
@@ -1500,70 +1563,71 @@ long wxPostScriptDC::GetCharHeight()
 }
 
 void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
 }
 
 void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
-                                    long *descent, long *externalLeading, wxFont *theFont,
-                                    bool WXUNUSED(use16) )
+                                    long *descent, long *externalLeading, wxFont *theFont ) const
 {
     wxFont *fontToUse = theFont;
 {
     wxFont *fontToUse = theFont;
-  
+
     if (!fontToUse) fontToUse = (wxFont*) &m_font;
 
     if (!fontToUse) fontToUse = (wxFont*) &m_font;
 
-    wxCHECK_RET( fontToUse, "GetTextExtent: no font defined" );
-    wxCHECK_RET( x, "GetTextExtent: x == NULL" );
-    wxCHECK_RET( y, "GetTextExtent: y == NULL" );
+    wxCHECK_RET( fontToUse, _T("GetTextExtent: no font defined") );
+    wxCHECK_RET( x, _T("GetTextExtent: x == NULL") );
+    wxCHECK_RET( y, _T("GetTextExtent: y == NULL") );
+
+    const wxWX2MBbuf strbuf = string.mb_str();
 
 #if !USE_AFM_FOR_POSTSCRIPT
     /* Provide a VERY rough estimate (avoid using it).
      * Produces accurate results for mono-spaced font
      * such as Courier (aka wxMODERN) */
 
 #if !USE_AFM_FOR_POSTSCRIPT
     /* Provide a VERY rough estimate (avoid using it).
      * Produces accurate results for mono-spaced font
      * such as Courier (aka wxMODERN) */
-     
+
     int height = 12;
     if (fontToUse)
     {
     int height = 12;
     if (fontToUse)
     {
-       height = fontToUse->GetPointSize();
+        height = fontToUse->GetPointSize();
     }
     }
-    *x = strlen (string) * height * 72 / 120;
-    *y = (long) (height * 1.32);       /* allow for descender */
+    *x = strlen (strbuf) * height * 72 / 120;
+    *y = (long) (height * 1.32);    /* allow for descender */
     if (descent) *descent = 0;
     if (externalLeading) *externalLeading = 0;
 #else
 
     if (descent) *descent = 0;
     if (externalLeading) *externalLeading = 0;
 #else
 
-   /* method for calculating string widths in postscript:
-   /  read in the AFM (adobe font metrics) file for the
-   /  actual font, parse it and extract the character widths
-   /  and also the descender. this may be improved, but for now
-   /  it works well. the AFM file is only read in if the
-   /  font is changed. this may be chached in the future.
-   /  calls to GetTextExtent with the font unchanged are rather
-   /  efficient!!!
-   /
-   /  for each font and style used there is an AFM file necessary.
-   /  currently i have only files for the roman font family.
-   /  I try to get files for the other ones!
-   /
-   /  CAVE: the size of the string is currently always calculated
-   /        in 'points' (1/72 of an inch). this should later on be
-   /        changed to depend on the mapping mode.
-   /  CAVE: the path to the AFM files must be set before calling this
-   /        function. this is usually done by a call like the following:
-   /        wxSetAFMPath("d:\\wxw161\\afm\\");
-   /
-   /  example:
-   /
-   /    wxPostScriptDC dc(NULL, TRUE);
-   /    if (dc.Ok()){
-   /      wxSetAFMPath("d:\\wxw161\\afm\\");
-   /      dc.StartDoc("Test");
-   /      dc.StartPage();
-   /      long w,h;
-   /      dc.SetFont(new wxFont(10, wxROMAN, wxNORMAL, wxNORMAL));
-   /      dc.GetTextExtent("Hallo",&w,&h);
-   /      dc.EndPage();
-   /      dc.EndDoc();
-   /    }
-   /
-   /  by steve (stefan.hammes@urz.uni-heidelberg.de)
-   /  created: 10.09.94
-   /  updated: 14.05.95 */
+    /* method for calculating string widths in postscript:
+    /  read in the AFM (adobe font metrics) file for the
+    /  actual font, parse it and extract the character widths
+    /  and also the descender. this may be improved, but for now
+    /  it works well. the AFM file is only read in if the
+    /  font is changed. this may be chached in the future.
+    /  calls to GetTextExtent with the font unchanged are rather
+    /  efficient!!!
+    /
+    /  for each font and style used there is an AFM file necessary.
+    /  currently i have only files for the roman font family.
+    /  I try to get files for the other ones!
+    /
+    /  CAVE: the size of the string is currently always calculated
+    /        in 'points' (1/72 of an inch). this should later on be
+    /        changed to depend on the mapping mode.
+    /  CAVE: the path to the AFM files must be set before calling this
+    /        function. this is usually done by a call like the following:
+    /        wxSetAFMPath("d:\\wxw161\\afm\\");
+    /
+    /  example:
+    /
+    /    wxPostScriptDC dc(NULL, TRUE);
+    /    if (dc.Ok()){
+    /      wxSetAFMPath("d:\\wxw161\\afm\\");
+    /      dc.StartDoc("Test");
+    /      dc.StartPage();
+    /      long w,h;
+    /      dc.SetFont(new wxFont(10, wxROMAN, wxNORMAL, wxNORMAL));
+    /      dc.GetTextExtent("Hallo",&w,&h);
+    /      dc.EndPage();
+    /      dc.EndDoc();
+    /    }
+    /
+    /  by steve (stefan.hammes@urz.uni-heidelberg.de)
+    /  created: 10.09.94
+    /  updated: 14.05.95 */
 
     /* these static vars are for storing the state between calls */
     static int lastFamily= INT_MIN;
 
     /* these static vars are for storing the state between calls */
     static int lastFamily= INT_MIN;
@@ -1591,51 +1655,52 @@ void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
         char *name = (char*) NULL;
 
         switch (Family)
         char *name = (char*) NULL;
 
         switch (Family)
-       {
-           case wxMODERN:
-           {
-                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "CourBoO";
-               else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "CourBo";
-               else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "Cour0";
-               else name = "Cour";
-           }
-           break;
-           case wxROMAN:
-           {
-                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "TimesBoO";
-               else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "TimesBo";
-               else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "TimesO";
-               else if name = "TimesRo";  /* no typo */
-           }
-           break;
-           default:
-           {
-                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "HelvBoO";
-               else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "HelvBo";
-               else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "Helv0";
-               else name = "Helv";
-           }
-           break;
-       }
+        {
+            case wxMODERN:
+                {
+                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "CourBoO";
+                    else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "CourBo";
+                    else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "Cour0";
+                    else name = "Cour";
+                }
+                break;
+            case wxROMAN:
+                {
+                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "TimesBoO";
+                    else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "TimesBo";
+                    else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "TimesO";
+                    else if name = "TimesRo";  /* no typo */
+                }
+                break;
+            default:
+                {
+                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "HelvBoO";
+                    else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "HelvBo";
+                    else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "Helv0";
+                    else name = "Helv";
+                }
+                break;
+        }
 
         /* get the directory of the AFM files */
         char afmName[256];
         afmName[0] = 0;
 
         /* get the directory of the AFM files */
         char afmName[256];
         afmName[0] = 0;
-        if (wxGetAFMPath()) strcpy( afmName, wxGetAFMPath() );
-
-    /* 2. open and process the file
-    /  a short explanation of the AFM format:
-    /  we have for each character a line, which gives its size
-    /  e.g.:
-    / 
-    /    C 63 ; WX 444 ; N question ; B 49 -14 395 676 ;
-    / 
-    /  that means, we have a character with ascii code 63, and width
-    /  (444/1000 * fontSize) points.
-    /  the other data is ignored for now!
-    / 
-    /  when the font has changed, we read in the right AFM file and store the
-    /  character widths in an array, which is processed below (see point 3.). */
+        wxString fmPath(m_printData.GetFontMetricPath());
+        if (fmPath != "") strcpy( afmName, (const char*) fmPath );
+
+        /* 2. open and process the file
+           /  a short explanation of the AFM format:
+           /  we have for each character a line, which gives its size
+           /  e.g.:
+           /
+           /    C 63 ; WX 444 ; N question ; B 49 -14 395 676 ;
+           /
+           /  that means, we have a character with ascii code 63, and width
+           /  (444/1000 * fontSize) points.
+           /  the other data is ignored for now!
+           /
+           /  when the font has changed, we read in the right AFM file and store the
+           /  character widths in an array, which is processed below (see point 3.). */
 
         /* new elements JC Sun Aug 25 23:21:44 MET DST 1996 */
 
 
         /* new elements JC Sun Aug 25 23:21:44 MET DST 1996 */
 
@@ -1649,8 +1714,8 @@ void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
             for (int i=0; i<256; i++) lastWidths[i] = 500; /* an approximate value */
             lastDescender = -150; /* dito. */
         }
             for (int i=0; i<256; i++) lastWidths[i] = 500; /* an approximate value */
             lastDescender = -150; /* dito. */
         }
-       else
-       {
+        else
+        {
             /* init the widths array */
             for(int i=0; i<256; i++) lastWidths[i] = INT_MIN;
             /* some variables for holding parts of a line */
             /* init the widths array */
             for(int i=0; i<256; i++) lastWidths[i] = INT_MIN;
             /* some variables for holding parts of a line */
@@ -1660,67 +1725,67 @@ void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
             int ascii,cWidth;
             /* read in the file and parse it */
             while(fgets(line,sizeof(line),afmFile)!=NULL)
             int ascii,cWidth;
             /* read in the file and parse it */
             while(fgets(line,sizeof(line),afmFile)!=NULL)
-           {
+            {
                 /* A.) check for descender definition */
                 if (strncmp(line,"Descender",9)==0)
                 /* A.) check for descender definition */
                 if (strncmp(line,"Descender",9)==0)
-               {
+                {
                     if ((sscanf(line,"%s%d",descString,&lastDescender)!=2) ||
                     if ((sscanf(line,"%s%d",descString,&lastDescender)!=2) ||
-                       (strcmp(descString,"Descender")!=0)) 
-                   {
-                       wxLogDebug( "AFM-file '%s': line '%s' has error (bad descender)\n", afmName,line );
+                            (strcmp(descString,"Descender")!=0))
+                    {
+                        wxLogDebug( "AFM-file '%s': line '%s' has error (bad descender)\n", afmName,line );
                     }
                 }
                 /* JC 1.) check for UnderlinePosition */
                 else if(strncmp(line,"UnderlinePosition",17)==0)
                     }
                 }
                 /* JC 1.) check for UnderlinePosition */
                 else if(strncmp(line,"UnderlinePosition",17)==0)
-               {
+                {
                     if ((sscanf(line,"%s%lf",upString,&UnderlinePosition)!=2) ||
                     if ((sscanf(line,"%s%lf",upString,&UnderlinePosition)!=2) ||
-                       (strcmp(upString,"UnderlinePosition")!=0)) 
-                   {
-                       wxLogDebug( "AFM-file '%s': line '%s' has error (bad UnderlinePosition)\n", afmName, line );
+                            (strcmp(upString,"UnderlinePosition")!=0))
+                    {
+                        wxLogDebug( "AFM-file '%s': line '%s' has error (bad UnderlinePosition)\n", afmName, line );
                     }
                 }
                     }
                 }
-               /* JC 2.) check for UnderlineThickness */
+                /* JC 2.) check for UnderlineThickness */
                 else if(strncmp(line,"UnderlineThickness",18)==0)
                 else if(strncmp(line,"UnderlineThickness",18)==0)
-               {
+                {
                     if ((sscanf(line,"%s%lf",utString,&UnderlineThickness)!=2) ||
                     if ((sscanf(line,"%s%lf",utString,&UnderlineThickness)!=2) ||
-                       (strcmp(utString,"UnderlineThickness")!=0)) 
-                   {
-                       wxLogDebug( "AFM-file '%s': line '%s' has error (bad UnderlineThickness)\n", afmName, line );
+                            (strcmp(utString,"UnderlineThickness")!=0))
+                    {
+                        wxLogDebug( "AFM-file '%s': line '%s' has error (bad UnderlineThickness)\n", afmName, line );
                     }
                 }
                     }
                 }
-               /* JC 3.) check for EncodingScheme */
+                /* JC 3.) check for EncodingScheme */
                 else if(strncmp(line,"EncodingScheme",14)==0)
                 else if(strncmp(line,"EncodingScheme",14)==0)
-               {
+                {
                     if ((sscanf(line,"%s%s",utString,encString)!=2) ||
                     if ((sscanf(line,"%s%s",utString,encString)!=2) ||
-                       (strcmp(utString,"EncodingScheme")!=0)) 
-                   {
-                       wxLogDebug("AFM-file '%s': line '%s' has error (bad EncodingScheme)\n", afmName, line );
+                            (strcmp(utString,"EncodingScheme")!=0))
+                    {
+                        wxLogDebug("AFM-file '%s': line '%s' has error (bad EncodingScheme)\n", afmName, line );
                     }
                     else if (strncmp(encString, "AdobeStandardEncoding", 21))
                     {
                     }
                     else if (strncmp(encString, "AdobeStandardEncoding", 21))
                     {
-                       wxLogDebug( "AFM-file '%s': line '%s' has error (unsupported EncodingScheme %s)\n",
-                                   afmName,line, encString);
+                        wxLogDebug( "AFM-file '%s': line '%s' has error (unsupported EncodingScheme %s)\n",
+                                afmName,line, encString);
                     }
                 }
                 /* B.) check for char-width */
                 else if(strncmp(line,"C ",2)==0)
                     }
                 }
                 /* B.) check for char-width */
                 else if(strncmp(line,"C ",2)==0)
-               {
+                {
                     if (sscanf(line,"%s%d%s%s%d",cString,&ascii,semiString,WXString,&cWidth)!=5)
                     if (sscanf(line,"%s%d%s%s%d",cString,&ascii,semiString,WXString,&cWidth)!=5)
-                   {
+                    {
                         wxLogDebug("AFM-file '%s': line '%s' has an error (bad character width)\n",afmName,line);
                     }
                     if(strcmp(cString,"C")!=0 || strcmp(semiString,";")!=0 || strcmp(WXString,"WX")!=0)
                         wxLogDebug("AFM-file '%s': line '%s' has an error (bad character width)\n",afmName,line);
                     }
                     if(strcmp(cString,"C")!=0 || strcmp(semiString,";")!=0 || strcmp(WXString,"WX")!=0)
-                   {
+                    {
                         wxLogDebug("AFM-file '%s': line '%s' has a format error\n",afmName,line);
                     }
                     /* printf("            char '%c'=%d has width '%d'\n",ascii,ascii,cWidth); */
                     if (ascii>=0 && ascii<256)
                         wxLogDebug("AFM-file '%s': line '%s' has a format error\n",afmName,line);
                     }
                     /* printf("            char '%c'=%d has width '%d'\n",ascii,ascii,cWidth); */
                     if (ascii>=0 && ascii<256)
-                   {
+                    {
                         lastWidths[ascii] = cWidth; /* store width */
                     }
                         lastWidths[ascii] = cWidth; /* store width */
                     }
-                   else
-                   {
-                       /* MATTHEW: this happens a lot; don't print an error */
+                    else
+                    {
+                        /* MATTHEW: this happens a lot; don't print an error */
                         /* wxLogDebug("AFM-file '%s': ASCII value %d out of range\n",afmName,ascii); */
                     }
                 }
                         /* wxLogDebug("AFM-file '%s': ASCII value %d out of range\n",afmName,ascii); */
                     }
                 }
@@ -1729,9 +1794,9 @@ void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
             fclose(afmFile);
         }
         /* hack to compute correct values for german 'Umlaute'
             fclose(afmFile);
         }
         /* hack to compute correct values for german 'Umlaute'
-        /  the correct way would be to map the character names
-        /  like 'adieresis' to corresp. positions of ISOEnc and read
-        /  these values from AFM files, too. Maybe later ... */
+           /  the correct way would be to map the character names
+           /  like 'adieresis' to corresp. positions of ISOEnc and read
+           /  these values from AFM files, too. Maybe later ... */
         lastWidths[196] = lastWidths['A'];  // Ä
         lastWidths[228] = lastWidths['a'];  // ä
         lastWidths[214] = lastWidths['O'];  // Ö
         lastWidths[196] = lastWidths['A'];  // Ä
         lastWidths[228] = lastWidths['a'];  // ä
         lastWidths[214] = lastWidths['O'];  // Ö
@@ -1746,25 +1811,25 @@ void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
     m_underlineThickness = m_underlineThickness * fontToUse->GetPointSize() / 1000.0f * m_scaleFactor;
 
     /* 3. now the font metrics are read in, calc size this
     m_underlineThickness = m_underlineThickness * fontToUse->GetPointSize() / 1000.0f * m_scaleFactor;
 
     /* 3. now the font metrics are read in, calc size this
-    /  is done by adding the widths of the characters in the
-    /  string. they are given in 1/1000 of the size! */
+       /  is done by adding the widths of the characters in the
+       /  string. they are given in 1/1000 of the size! */
 
     long widthSum=0;
     long height=Size; /* by default */
     unsigned char *p;
 
     long widthSum=0;
     long height=Size; /* by default */
     unsigned char *p;
-    for(p=(unsigned char *)(const char *)string; *p; p++)
+    for(p=(unsigned char *)strbuf; *p; p++)
     {
         if(lastWidths[*p]== INT_MIN)
     {
         if(lastWidths[*p]== INT_MIN)
-       {
+        {
             wxLogDebug("GetTextExtent: undefined width for character '%c' (%d)\n", *p,*p);
             widthSum += (long)(lastWidths[' ']/1000.0F * Size); /* assume space */
         }
             wxLogDebug("GetTextExtent: undefined width for character '%c' (%d)\n", *p,*p);
             widthSum += (long)(lastWidths[' ']/1000.0F * Size); /* assume space */
         }
-       else
-       {
+        else
+        {
             widthSum += (long)((lastWidths[*p]/1000.0F)*Size);
         }
     }
             widthSum += (long)((lastWidths[*p]/1000.0F)*Size);
         }
     }
-    
+
     /* add descender to height (it is usually a negative value) */
     if (lastDescender!=INT_MIN)
     {
     /* add descender to height (it is usually a negative value) */
     if (lastDescender!=INT_MIN)
     {
@@ -1779,12 +1844,12 @@ void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
     if (descent)
     {
         if(lastDescender!=INT_MIN)
     if (descent)
     {
         if(lastDescender!=INT_MIN)
-       {
+        {
             *descent = (long)(((-lastDescender)/1000.0F) * Size); /* MATTHEW: forgot scale */
         }
             *descent = (long)(((-lastDescender)/1000.0F) * Size); /* MATTHEW: forgot scale */
         }
-       else
-       {
-           *descent = 0;
+        else
+        {
+            *descent = 0;
         }
     }
 
         }
     }
 
@@ -1794,28 +1859,6 @@ void wxPostScriptDC::GetTextExtent( const wxString& string, long *x, long *y,
 #endif
 }
 
 #endif
 }
 
-void wxPostScriptDC::GetSizeMM(long *width, long *height) const
-{
-    const char *paperType = wxThePrintSetupData->GetPaperName();
-  
-    if (!paperType) paperType = _("A4 210 x 297 mm");
-
-    wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(paperType);
-    
-    if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(_("A4 210 x 297 mm"));
-    
-    if (paper)
-    {
-        if (width) *width = paper->widthMM;
-        if (height) *height = paper->heightMM;
-    }
-    else
-    {
-       if (width) *width = 210;
-       if (height) *height = 297;
-    }
-}
-
 // Determine the Default Postscript Previewer
 // available on the platform
 #if defined(__SUN__) && defined(__XVIEW__)
 // Determine the Default Postscript Previewer
 // available on the platform
 #if defined(__SUN__) && defined(__XVIEW__)
@@ -1869,7 +1912,7 @@ wxPostScriptPrintDialog::wxPostScriptPrintDialog (wxWindow *parent, const wxStri
    print_modes[2] = _("Preview Only");
 
 
    print_modes[2] = _("Preview Only");
 
 
-  
+
    wxButton *okBut = new wxButton (this, wxID_OK, _("OK"), wxPoint(5, 5));
    (void) new wxButton (this, wxID_CANCEL, _("Cancel"), wxPoint(40, 5));
    okBut->SetDefault();
    wxButton *okBut = new wxButton (this, wxID_OK, _("OK"), wxPoint(5, 5));
    (void) new wxButton (this, wxID_CANCEL, _("Cancel"), wxPoint(40, 5));
    okBut->SetDefault();
@@ -1895,18 +1938,18 @@ wxPostScriptPrintDialog::wxPostScriptPrintDialog (wxWindow *parent, const wxStri
    radio0->SetSelection((int)wxThePrintSetupData->GetPrinterOrientation() - 1);
 
   // @@@ Configuration hook
    radio0->SetSelection((int)wxThePrintSetupData->GetPrinterOrientation() - 1);
 
   // @@@ Configuration hook
-   if (wxThePrintSetupData->GetPrintPreviewCommand() == NULL)
+   if ( !wxThePrintSetupData->GetPrintPreviewCommand() )
       wxThePrintSetupData->SetPrintPreviewCommand(PS_VIEWER_PROG);
 
       wxThePrintSetupData->SetPrintPreviewCommand(PS_VIEWER_PROG);
 
-   wxGetResource ("wxWindows", "PSView", &wxThePrintSetupData->previewCommand);
+   //   wxGetResource ("wxWindows", "PSView", &wxThePrintSetupData->m_previewCommand);
 
    features = (wxThePrintSetupData->GetPrintPreviewCommand() &&
 
    features = (wxThePrintSetupData->GetPrintPreviewCommand() &&
-               *wxThePrintSetupData->GetPrintPreviewCommand()) ? 3 : 2; 
-  
+               *wxThePrintSetupData->GetPrintPreviewCommand()) ? 3 : 2;
+
    wxRadioBox *radio1 = new wxRadioBox(this, wxID_PRINTER_MODES, _("PostScript:"),
                                        wxPoint(150, yPos),
                                        wxSize(-1,-1), features,
    wxRadioBox *radio1 = new wxRadioBox(this, wxID_PRINTER_MODES, _("PostScript:"),
                                        wxPoint(150, yPos),
                                        wxSize(-1,-1), features,
-                                       print_modes, features, wxRA_SPECIFY_ROWS); 
+                                       print_modes, features, wxRA_SPECIFY_ROWS);
 
 #ifdef __WXMSW__
    radio1->Enable(0, FALSE);
 
 #ifdef __WXMSW__
    radio1->Enable(0, FALSE);
@@ -1937,7 +1980,7 @@ wxPostScriptPrintDialog::wxPostScriptPrintDialog (wxWindow *parent, const wxStri
    (void) new wxStaticText(this, -1, _("Y Translation"), wxPoint(220, yPos));
    sprintf (buf, "%.2ld", wx_printer_translate_y);
    /* wxTextCtrl *text4 = */ (void) new wxTextCtrl(this, wxID_PRINTER_Y_TRANS, buf, wxPoint(320, yPos), wxSize(100, -1));
    (void) new wxStaticText(this, -1, _("Y Translation"), wxPoint(220, yPos));
    sprintf (buf, "%.2ld", wx_printer_translate_y);
    /* wxTextCtrl *text4 = */ (void) new wxTextCtrl(this, wxID_PRINTER_Y_TRANS, buf, wxPoint(320, yPos), wxSize(100, -1));
-  
+
    Fit ();
 
    delete[] orientation;
    Fit ();
 
    delete[] orientation;
@@ -1959,17 +2002,17 @@ int wxPostScriptPrintDialog::ShowModal ()
       wxRadioBox *radio0 = (wxRadioBox *)FindWindow(wxID_PRINTER_ORIENTATION);
       wxRadioBox *radio1 = (wxRadioBox *)FindWindow(wxID_PRINTER_MODES);
 
       wxRadioBox *radio0 = (wxRadioBox *)FindWindow(wxID_PRINTER_ORIENTATION);
       wxRadioBox *radio1 = (wxRadioBox *)FindWindow(wxID_PRINTER_MODES);
 
-      StringToDouble (WXSTRINGCAST text1->GetValue (), &wxThePrintSetupData->printerScaleX);
-      StringToDouble (WXSTRINGCAST text2->GetValue (), &wxThePrintSetupData->printerScaleY);
-      StringToLong (WXSTRINGCAST text3->GetValue (), &wxThePrintSetupData->printerTranslateX);
-      StringToLong (WXSTRINGCAST text4->GetValue (), &wxThePrintSetupData->printerTranslateY);
+      StringToDouble (WXSTRINGCAST text1->GetValue (), &wxThePrintSetupData->m_printerScaleX);
+      StringToDouble (WXSTRINGCAST text2->GetValue (), &wxThePrintSetupData->m_printerScaleY);
+      StringToLong (WXSTRINGCAST text3->GetValue (), &wxThePrintSetupData->m_printerTranslateX);
+      StringToLong (WXSTRINGCAST text4->GetValue (), &wxThePrintSetupData->m_printerTranslateY);
 
 #ifdef __X__
       //      wxThePrintSetupData->SetPrinterOptions(WXSTRINGCAST text0->GetValue ());
       //      wxThePrintSetupData->SetPrinterCommand(WXSTRINGCAST text_prt->GetValue ());
 #endif
 
 
 #ifdef __X__
       //      wxThePrintSetupData->SetPrinterOptions(WXSTRINGCAST text0->GetValue ());
       //      wxThePrintSetupData->SetPrinterCommand(WXSTRINGCAST text_prt->GetValue ());
 #endif
 
-      wxThePrintSetupData->SetPrinterOrientation((radio0->GetSelection() == 1 ? PS_LANDSCAPE : PS_PORTRAIT));
+      wxThePrintSetupData->SetPrinterOrientation((radio0->GetSelection() == 1 ? wxLANDSCAPE : wxPORTRAIT));
 
       // C++ wants this
       switch ( radio1->GetSelection() ) {
 
       // C++ wants this
       switch ( radio1->GetSelection() ) {
@@ -1986,22 +2029,22 @@ int wxPostScriptPrintDialog::ShowModal ()
 
 // PostScript printer settings
 // RETAINED FOR BACKWARD COMPATIBILITY
 
 // PostScript printer settings
 // RETAINED FOR BACKWARD COMPATIBILITY
-void wxSetPrinterCommand(const char *cmd)
+void wxSetPrinterCommand(const wxString& cmd)
 {
   wxThePrintSetupData->SetPrinterCommand(cmd);
 }
 
 {
   wxThePrintSetupData->SetPrinterCommand(cmd);
 }
 
-void wxSetPrintPreviewCommand(const char *cmd)
+void wxSetPrintPreviewCommand(const wxString& cmd)
 {
   wxThePrintSetupData->SetPrintPreviewCommand(cmd);
 }
 
 {
   wxThePrintSetupData->SetPrintPreviewCommand(cmd);
 }
 
-void wxSetPrinterOptions(const char *flags)
+void wxSetPrinterOptions(const wxString& flags)
 {
   wxThePrintSetupData->SetPrinterOptions(flags);
 }
 
 {
   wxThePrintSetupData->SetPrinterOptions(flags);
 }
 
-void wxSetPrinterFile(const char *f)
+void wxSetPrinterFile(const wxString& f)
 {
   wxThePrintSetupData->SetPrinterFile(f);
 }
 {
   wxThePrintSetupData->SetPrinterFile(f);
 }
@@ -2027,28 +2070,28 @@ void wxSetPrinterMode(int mode)
   wxThePrintSetupData->SetPrinterMode(mode);
 }
 
   wxThePrintSetupData->SetPrinterMode(mode);
 }
 
-void wxSetAFMPath(const char *f)
+void wxSetAFMPath(const wxString& f)
 {
   wxThePrintSetupData->SetAFMPath(f);
 }
 
 // Get current values
 {
   wxThePrintSetupData->SetAFMPath(f);
 }
 
 // Get current values
-char *wxGetPrinterCommand()
+wxString wxGetPrinterCommand()
 {
   return wxThePrintSetupData->GetPrinterCommand();
 }
 
 {
   return wxThePrintSetupData->GetPrinterCommand();
 }
 
-char *wxGetPrintPreviewCommand()
+wxString wxGetPrintPreviewCommand()
 {
   return wxThePrintSetupData->GetPrintPreviewCommand();
 }
 
 {
   return wxThePrintSetupData->GetPrintPreviewCommand();
 }
 
-char *wxGetPrinterOptions()
+wxString wxGetPrinterOptions()
 {
   return wxThePrintSetupData->GetPrinterOptions();
 }
 
 {
   return wxThePrintSetupData->GetPrinterOptions();
 }
 
-char *wxGetPrinterFile()
+wxString wxGetPrinterFile()
 {
   return wxThePrintSetupData->GetPrinterFile();
 }
 {
   return wxThePrintSetupData->GetPrinterFile();
 }
@@ -2073,7 +2116,7 @@ int wxGetPrinterMode()
   return wxThePrintSetupData->GetPrinterMode();
 }
 
   return wxThePrintSetupData->GetPrinterMode();
 }
 
-char *wxGetAFMPath()
+wxString wxGetAFMPath()
 {
   return wxThePrintSetupData->GetAFMPath();
 }
 {
   return wxThePrintSetupData->GetAFMPath();
 }
@@ -2084,200 +2127,17 @@ char *wxGetAFMPath()
 
 wxPrintSetupData::wxPrintSetupData()
 {
 
 wxPrintSetupData::wxPrintSetupData()
 {
-  printerCommand = (char *) NULL;
-  previewCommand = (char *) NULL;
-  printerFlags = (char *) NULL;
-  printerOrient = PS_PORTRAIT;
-  printerScaleX = (double)1.0;
-  printerScaleY = (double)1.0;
-  printerTranslateX = 0;
-  printerTranslateY = 0;
-  // 1 = Preview, 2 = print to file, 3 = send to printer
-  printerMode = 3;
-  afmPath = (char *) NULL;
-  paperName = (char *) NULL;
-  printColour = TRUE;
-  printerFile = (char *) NULL;
+  m_printerOrient = wxPORTRAIT;
+  m_printerScaleX = (double)1.0;
+  m_printerScaleY = (double)1.0;
+  m_printerTranslateX = 0;
+  m_printerTranslateY = 0;
+  m_printerMode = wxPRINT_MODE_FILE;
+  m_printColour = TRUE;
 }
 
 wxPrintSetupData::~wxPrintSetupData()
 {
 }
 
 wxPrintSetupData::~wxPrintSetupData()
 {
-  if (printerCommand)
-    delete[] printerCommand;
-  if (previewCommand)
-    delete[] previewCommand;
-  if (printerFlags)
-    delete[] printerFlags;
-  if (afmPath)
-    delete[] afmPath;
-  if (paperName)
-    delete[] paperName;
-  if (printerFile)
-    delete[] printerFile;
-}
-
-void wxPrintSetupData::SetPrinterCommand(const char *cmd)
-{
-  if (cmd == printerCommand)
-    return;
-
-  if (printerCommand)
-    delete[] printerCommand;
-  if (cmd)
-    printerCommand = copystring(cmd);
-  else
-    printerCommand = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPrintPreviewCommand(const char *cmd)
-{
-  if (cmd == previewCommand)
-    return;
-
-  if (previewCommand)
-    delete[] previewCommand;
-  if (cmd)
-    previewCommand = copystring(cmd);
-  else
-    previewCommand = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPaperName(const char *name)
-{
-  if (name == paperName)
-    return;
-
-  if (paperName)
-    delete[] paperName;
-  if (name)
-    paperName = copystring(name);
-  else
-    paperName = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPrinterOptions(const char *flags)
-{
-  if (printerFlags == flags)
-    return;
-
-  if (printerFlags)
-    delete[] printerFlags;
-  if (flags)
-    printerFlags = copystring(flags);
-  else
-    printerFlags = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPrinterFile(const char *f)
-{
-  if (f == printerFile)
-    return;
-
-  if (printerFile)
-    delete[] printerFile;
-  if (f)
-    printerFile = copystring(f);
-  else
-    printerFile = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPrinterOrientation(int orient)
-{
-  printerOrient = orient;
-}
-
-void wxPrintSetupData::SetPrinterScaling(double x, double y)
-{
-  printerScaleX = x;
-  printerScaleY = y;
-}
-
-void wxPrintSetupData::SetPrinterTranslation(long x, long y)
-{
-  printerTranslateX = x;
-  printerTranslateY = y;
-}
-
-// 1 = Preview, 2 = print to file, 3 = send to printer
-void wxPrintSetupData::SetPrinterMode(int mode)
-{
-  printerMode = mode;
-}
-
-void wxPrintSetupData::SetAFMPath(const char *f)
-{
-  if (f == afmPath)
-    return;
-
-  if (afmPath)
-    delete[] afmPath;
-  if (f)
-    afmPath = copystring(f);
-  else
-    afmPath = (char *) NULL;
-}
-
-void wxPrintSetupData::SetColour(bool col)
-{
-  printColour = col;
-}
-
-// Get current values
-char *wxPrintSetupData::GetPrinterCommand()
-{
-  return printerCommand;
-}
-
-char *wxPrintSetupData::GetPrintPreviewCommand()
-{
-  return previewCommand;
-}
-
-char *wxPrintSetupData::GetPrinterOptions()
-{
-  return printerFlags;
-}
-
-char *wxPrintSetupData::GetPrinterFile()
-{
-  return printerFile;
-}
-
-char *wxPrintSetupData::GetPaperName()
-{
-  return paperName;
-}
-
-int wxPrintSetupData::GetPrinterOrientation()
-{
-  return printerOrient;
-}
-
-void wxPrintSetupData::GetPrinterScaling(double *x, double *y)
-{
-  *x = printerScaleX;
-  *y = printerScaleY;
-}
-
-void wxPrintSetupData::GetPrinterTranslation(long *x, long *y)
-{
-  *x = printerTranslateX;
-  *y = printerTranslateY;
-}
-
-int wxPrintSetupData::GetPrinterMode()
-{
-  return printerMode;
-}
-
-char *wxPrintSetupData::GetAFMPath()
-{
-  return afmPath;
-}
-
-bool wxPrintSetupData::GetColour()
-{
-  return printColour;
 }
 
 void wxPrintSetupData::operator=(wxPrintSetupData& data)
 }
 
 void wxPrintSetupData::operator=(wxPrintSetupData& data)
@@ -2300,6 +2160,22 @@ void wxPrintSetupData::operator=(wxPrintSetupData& data)
   SetColour(data.GetColour());
 }
 
   SetColour(data.GetColour());
 }
 
+// Initialize from a wxPrintData object (wxPrintData should now be used instead of wxPrintSetupData).
+void wxPrintSetupData::operator=(const wxPrintData& data)
+{
+    SetPrinterCommand(data.GetPrinterCommand());
+    SetPrintPreviewCommand(data.GetPreviewCommand());
+    SetPrinterOptions(data.GetPrinterOptions());
+    SetPrinterTranslation(data.GetPrinterTranslateX(), data.GetPrinterTranslateY());
+    SetPrinterScaling(data.GetPrinterScaleX(), data.GetPrinterScaleY());
+    SetPrinterOrientation(data.GetOrientation());
+    SetPrinterMode((int) data.GetPrintMode());
+    SetAFMPath(data.GetFontMetricPath());
+    SetPaperName(wxThePrintPaperDatabase->ConvertIdToName(data.GetPaperId()));
+    SetColour(data.GetColour());
+    SetPrinterFile(data.GetFilename());
+}
+
 void wxInitializePrintSetupData(bool init)
 {
   if (init)
 void wxInitializePrintSetupData(bool init)
 {
   if (init)
@@ -2307,9 +2183,9 @@ void wxInitializePrintSetupData(bool init)
     wxThePrintSetupData = new wxPrintSetupData;
 
     wxThePrintSetupData->SetPrintPreviewCommand(PS_VIEWER_PROG);
     wxThePrintSetupData = new wxPrintSetupData;
 
     wxThePrintSetupData->SetPrintPreviewCommand(PS_VIEWER_PROG);
-    wxThePrintSetupData->SetPrinterOrientation(PS_PORTRAIT);
-    wxThePrintSetupData->SetPrinterMode(PS_PREVIEW);
-    wxThePrintSetupData->SetPaperName(_("A4 210 x 297 mm"));
+    wxThePrintSetupData->SetPrinterOrientation(wxPORTRAIT);
+    wxThePrintSetupData->SetPrinterMode(wxPRINT_MODE_PREVIEW);
+    wxThePrintSetupData->SetPaperName(_("A4 sheet, 210 x 297 mm"));
 
     // Could have a .ini file to read in some defaults
     // - and/or use environment variables, e.g. WXWIN
 
     // Could have a .ini file to read in some defaults
     // - and/or use environment variables, e.g. WXWIN
@@ -2321,12 +2197,12 @@ void wxInitializePrintSetupData(bool init)
 #ifdef __WXMSW__
     wxThePrintSetupData->SetPrinterCommand("print");
     wxThePrintSetupData->SetAFMPath("c:\\windows\\system\\");
 #ifdef __WXMSW__
     wxThePrintSetupData->SetPrinterCommand("print");
     wxThePrintSetupData->SetAFMPath("c:\\windows\\system\\");
-    wxThePrintSetupData->SetPrinterOptions(NULL);
+    wxThePrintSetupData->SetPrinterOptions("");
 #endif
 #if !defined(__VMS__) && !defined(__WXMSW__)
     wxThePrintSetupData->SetPrinterCommand("lpr");
 #endif
 #if !defined(__VMS__) && !defined(__WXMSW__)
     wxThePrintSetupData->SetPrinterCommand("lpr");
-    wxThePrintSetupData->SetPrinterOptions((char *) NULL);
-    wxThePrintSetupData->SetAFMPath((char *) NULL);
+    wxThePrintSetupData->SetPrinterOptions("");
+    wxThePrintSetupData->SetAFMPath("");
 #endif
   }
   else
 #endif
   }
   else