From d5eaa19fdf914e144a1c6c4ccbdcd36ccd0dee12 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Fri, 17 Nov 2006 01:54:48 +0000
Subject: [PATCH] don't set A4 paper size, use the system default instead

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43456 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt              |  1 +
 samples/printing/printing.cpp |  4 +--
 src/common/cmndata.cpp        |  7 +++--
 src/msw/printdlg.cpp          | 52 ++++++++++++++++++-----------------
 4 files changed, 35 insertions(+), 29 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index b1fd11f2dd..b4b7bae080 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -95,6 +95,7 @@ All:
 wxMSW:
 
 - Fixed version script problems when using configure with cygwin/mingw32.
+- Use system default paper size for printing instead of A4
 
 2.7.2
 -----
diff --git a/samples/printing/printing.cpp b/samples/printing/printing.cpp
index bfe2f16192..9701b90f63 100644
--- a/samples/printing/printing.cpp
+++ b/samples/printing/printing.cpp
@@ -82,9 +82,9 @@ bool MyApp::OnInit(void)
     m_testFont.Create(10, wxSWISS, wxNORMAL, wxNORMAL);
 
     g_printData = new wxPrintData;
-    // Set an initial paper size
+    // You could set an initial paper size here
 //    g_printData->SetPaperId(wxPAPER_LETTER); // for Americans
-    g_printData->SetPaperId(wxPAPER_A4);    // for everyone else    
+//    g_printData->SetPaperId(wxPAPER_A4);    // for everyone else    
 
     g_pageSetupData = new wxPageSetupDialogData;
     // copy over initial paper size from print record
diff --git a/src/common/cmndata.cpp b/src/common/cmndata.cpp
index 2ab2f2a670..11f936d581 100644
--- a/src/common/cmndata.cpp
+++ b/src/common/cmndata.cpp
@@ -161,8 +161,11 @@ wxPrintData::wxPrintData()
     m_colour = true;
     m_duplexMode = wxDUPLEX_SIMPLEX;
     m_printQuality = wxPRINT_QUALITY_HIGH;
-    m_paperId = wxPAPER_A4;
-    m_paperSize = wxSize(210, 297);
+
+    // we intentionally don't initialize paper id and size at all, like this
+    // the default system settings will be used for them
+    m_paperId = wxPAPER_NONE;
+    m_paperSize = wxDefaultSize;
 
     m_privData = NULL;
     m_privDataLen = 0;
diff --git a/src/msw/printdlg.cpp b/src/msw/printdlg.cpp
index d88ae7e859..c8586ab3e0 100644
--- a/src/msw/printdlg.cpp
+++ b/src/msw/printdlg.cpp
@@ -444,38 +444,40 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
         devMode->dmFields |= DM_COLOR;
 
         //// Paper size
-        if (data.GetPaperId() == wxPAPER_NONE)
+
+        // Paper id has priority over paper size. If id is specified, then size
+        // is ignored (as it can be filled in even for standard paper sizes)
+
+        wxPrintPaperType *paperType = NULL;
+
+        const wxPaperSize paperId = data.GetPaperId();
+        if ( paperId != wxPAPER_NONE && wxThePrintPaperDatabase )
         {
-            // DEVMODE is in tenths of a milimeter
-            devMode->dmPaperWidth = (short)(data.GetPaperSize().x * 10);
-            devMode->dmPaperLength = (short)(data.GetPaperSize().y * 10);
-            if(m_customWindowsPaperId != 0)
-                devMode->dmPaperSize = m_customWindowsPaperId;
-            else
-                devMode->dmPaperSize = DMPAPER_USER;
-            devMode->dmFields |= DM_PAPERWIDTH;
-            devMode->dmFields |= DM_PAPERLENGTH;
+            paperType = wxThePrintPaperDatabase->FindPaperType(paperId);
         }
-        else
+
+        if ( paperType )
         {
-            if (wxThePrintPaperDatabase)
+            devMode->dmPaperSize = (short)paperType->GetPlatformId();
+            devMode->dmFields |= DM_PAPERSIZE;
+        }
+        else // custom (or no) paper size
+        {
+            const wxSize paperSize = data.GetPaperSize();
+            if ( paperSize != wxDefaultSize )
             {
-                wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperType( data.GetPaperId() );
-                if (paper)
-                {
-                    devMode->dmPaperSize = (short)paper->GetPlatformId();
-                    devMode->dmFields |= DM_PAPERSIZE;
-                }
+                // Fall back on specifying the paper size explicitly
+                if(m_customWindowsPaperId != 0)
+                    devMode->dmPaperSize = m_customWindowsPaperId;
                 else
-                {
-                    // Fall back on specifying the paper size explicitly
-                    devMode->dmPaperWidth = (short)(data.GetPaperSize().x * 10);
-                    devMode->dmPaperLength = (short)(data.GetPaperSize().y * 10);
                     devMode->dmPaperSize = DMPAPER_USER;
-                    devMode->dmFields |= DM_PAPERWIDTH;
-                    devMode->dmFields |= DM_PAPERLENGTH;
-                }
+                devMode->dmPaperWidth = (short)(paperSize.x * 10);
+                devMode->dmPaperLength = (short)(paperSize.y * 10);
+                devMode->dmFields |= DM_PAPERWIDTH;
+                devMode->dmFields |= DM_PAPERLENGTH;
             }
+            //else: neither paper type nor size specified, don't fill DEVMODE
+            //      at all so that the system defaults are used
         }
 
         //// Duplex
-- 
2.47.2