#include <stdlib.h>
-#include "wx/msw/private.h"
-
-#include <commdlg.h>
+#include "wx/msw/wrapcdlg.h"
#ifndef __WIN32__
#include <print.h>
{
m_devMode = (void*) NULL;
m_devNames = (void*) NULL;
+ m_customWindowsPaperId = 0;
}
wxWindowsPrintNativeData::~wxWindowsPrintNativeData()
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
if (!hDevMode)
+ {
return false;
-
- if ( hDevMode )
+ }
+ else
{
LPDEVMODE devMode = (LPDEVMODE)GlobalLock(hDevMode);
// 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)
{
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
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
else
data.SetQuality( wxPRINT_QUALITY_HIGH );
+ if (devMode->dmDriverExtra > 0)
+ data.SetPrivData( (char *)devMode+devMode->dmSize, devMode->dmDriverExtra );
+ else
+ data.SetPrivData( NULL, 0 );
+
GlobalUnlock(hDevMode);
}
wxString printerName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset;
// Not sure if we should check for this mismatch
-// wxASSERT_MSG( (m_printerName == "" || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!");
+// wxASSERT_MSG( (m_printerName.empty() || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!");
if (!printerName.empty())
data.SetPrinterName( printerName );
// 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;
}
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;
+ }
}
}
devMode->dmPrintQuality = quality;
devMode->dmFields |= DM_PRINTQUALITY;
+ if (data.GetPrivDataLen() > 0)
+ {
+ memcpy( (char *)devMode+devMode->dmSize, data.GetPrivData(), data.GetPrivDataLen() );
+ devMode->dmDriverExtra = (WXWORD)data.GetPrivDataLen();
+ }
+
if (data.GetBin() != wxPRINTBIN_DEFAULT)
{
switch (data.GetBin())