]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/printdlg.cpp
update from Hakki Dogusan
[wxWidgets.git] / src / msw / printdlg.cpp
index 02892c45100bbaeae8049e8391bbf4bacb1abdfd..c64b054463cb9e7727672e6a0f5871002f1f9f04 100644 (file)
@@ -128,6 +128,7 @@ wxWindowsPrintNativeData::wxWindowsPrintNativeData()
 {
     m_devMode = (void*) NULL;
     m_devNames = (void*) NULL;
+    m_customWindowsPaperId = 0;
 }
 
 wxWindowsPrintNativeData::~wxWindowsPrintNativeData()
@@ -198,6 +199,8 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data )
         // set both DM_PAPERSIZE and DM_PAPERWIDTH & DM_PAPERLENGTH. Since
         // dmPaperSize >= DMPAPER_USER wouldn't be in wxWin's database, this
         // code wouldn't set m_paperSize correctly.
+
+        bool foundPaperSize = false;
         if ((devMode->dmFields & DM_PAPERSIZE) && (devMode->dmPaperSize < DMPAPER_USER))
         {
             if (wxThePrintPaperDatabase)
@@ -207,13 +210,8 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data )
                 {
                     data.SetPaperId( paper->GetId() );
                     data.SetPaperSize( wxSize(paper->GetWidth() / 10,paper->GetHeight() / 10) );
-                }
-                else
-                {
-                    // Shouldn't really get here
-                    wxFAIL_MSG(wxT("Couldn't find paper size in paper database."));
-                    data.SetPaperId( wxPAPER_NONE );
-                    data.SetPaperSize( wxSize(0,0) );
+                    m_customWindowsPaperId = 0;
+                    foundPaperSize = true;
                 }
             }
             else
@@ -222,20 +220,29 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data )
                 wxFAIL_MSG(wxT("Paper database wasn't initialized in wxPrintData::ConvertFromNative."));
                 data.SetPaperId( wxPAPER_NONE );
                 data.SetPaperSize( wxSize(0,0) );
+                m_customWindowsPaperId = 0;
+                
+                GlobalUnlock(hDevMode);
+                return false;
             }
         }
-        else if ((devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH))
+
+        if (!foundPaperSize && (devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH))
         {
             // DEVMODE is in tenths of a milimeter
-            data.SetPaperId( wxPAPER_NONE );
             data.SetPaperSize( wxSize(devMode->dmPaperWidth / 10, devMode->dmPaperLength / 10) );
+            data.SetPaperId( wxPAPER_NONE );
+            m_customWindowsPaperId = devMode->dmPaperSize;
         }
         else
         {
-            // Shouldn't really get here
-            wxFAIL_MSG(wxT("Couldn't find paper size from DEVMODE."));
-            data.SetPaperId( wxPAPER_NONE );
+            // Often will reach this for non-standard paper sizes (sizes which
+            // wouldn't be in wxWidget's paper database). Setting
+            // m_customWindowsPaperId to devMode->dmPaperSize should be enough
+            // to get this paper size working.
             data.SetPaperSize( wxSize(0,0) );
+            data.SetPaperId( wxPAPER_NONE );
+            m_customWindowsPaperId = devMode->dmPaperSize;
         }
 
         //// Duplex
@@ -414,7 +421,10 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
             // DEVMODE is in tenths of a milimeter
             devMode->dmPaperWidth = (short)(data.GetPaperSize().x * 10);
             devMode->dmPaperLength = (short)(data.GetPaperSize().y * 10);
-            devMode->dmPaperSize = DMPAPER_USER;
+            if(m_customWindowsPaperId != 0)
+                devMode->dmPaperSize = m_customWindowsPaperId;
+            else
+                devMode->dmPaperSize = DMPAPER_USER;
             devMode->dmFields |= DM_PAPERWIDTH;
             devMode->dmFields |= DM_PAPERLENGTH;
         }
@@ -428,6 +438,15 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
                     devMode->dmPaperSize = (short)paper->GetPlatformId();
                     devMode->dmFields |= DM_PAPERSIZE;
                 }
+                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;
+                }
             }
         }