Added DEVNAMES to wxPrintDialog to remember printer name; fixed wxDC::Clear
to not assert for printer DCs git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5650 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -176,6 +176,8 @@ class WXDLLEXPORT wxPrintData: public wxObject
|
|||||||
void ConvertFromNative();
|
void ConvertFromNative();
|
||||||
void* GetNativeData() const { return m_devMode; }
|
void* GetNativeData() const { return m_devMode; }
|
||||||
void SetNativeData(void* data) { m_devMode = data; }
|
void SetNativeData(void* data) { m_devMode = data; }
|
||||||
|
void* GetNativeDataDevNames() const { return m_devNames; }
|
||||||
|
void SetNativeDataDevNames(void* data) { m_devNames = data; }
|
||||||
#elif defined( __WXMAC__)
|
#elif defined( __WXMAC__)
|
||||||
void ConvertToNative();
|
void ConvertToNative();
|
||||||
void ConvertFromNative();
|
void ConvertFromNative();
|
||||||
@@ -184,6 +186,7 @@ class WXDLLEXPORT wxPrintData: public wxObject
|
|||||||
public:
|
public:
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
void* m_devMode;
|
void* m_devMode;
|
||||||
|
void* m_devNames;
|
||||||
#elif defined( __WXMAC__ )
|
#elif defined( __WXMAC__ )
|
||||||
THPrint m_macPrintInfo ;
|
THPrint m_macPrintInfo ;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -169,7 +169,8 @@ wxFontData::~wxFontData()
|
|||||||
wxPrintData::wxPrintData()
|
wxPrintData::wxPrintData()
|
||||||
{
|
{
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
m_devMode = NULL;
|
m_devMode = (void*) NULL;
|
||||||
|
m_devNames = (void*) NULL;
|
||||||
#elif defined( __WXMAC__ )
|
#elif defined( __WXMAC__ )
|
||||||
m_macPrintInfo = NULL ;
|
m_macPrintInfo = NULL ;
|
||||||
#endif
|
#endif
|
||||||
@@ -201,7 +202,8 @@ wxPrintData::wxPrintData()
|
|||||||
wxPrintData::wxPrintData(const wxPrintData& printData)
|
wxPrintData::wxPrintData(const wxPrintData& printData)
|
||||||
{
|
{
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
m_devMode = NULL;
|
m_devMode = (void*) NULL;
|
||||||
|
m_devNames = (void*) NULL;
|
||||||
#elif defined( __WXMAC__ )
|
#elif defined( __WXMAC__ )
|
||||||
m_macPrintInfo = NULL ;
|
m_macPrintInfo = NULL ;
|
||||||
#endif
|
#endif
|
||||||
@@ -214,6 +216,9 @@ wxPrintData::~wxPrintData()
|
|||||||
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
||||||
if ( hDevMode )
|
if ( hDevMode )
|
||||||
GlobalFree(hDevMode);
|
GlobalFree(hDevMode);
|
||||||
|
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
|
||||||
|
if ( hDevNames )
|
||||||
|
GlobalFree(hDevNames);
|
||||||
#elif defined(__WXMAC__)
|
#elif defined(__WXMAC__)
|
||||||
if ( m_macPrintInfo )
|
if ( m_macPrintInfo )
|
||||||
::DisposeHandle( (Handle) m_macPrintInfo ) ;
|
::DisposeHandle( (Handle) m_macPrintInfo ) ;
|
||||||
@@ -257,9 +262,40 @@ static wxString wxGetPrintDlgError()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static HGLOBAL wxCreateDevNames(const wxString& driverName, const wxString& printerName, const wxString& portName)
|
||||||
|
{
|
||||||
|
HGLOBAL hDev = NULL;
|
||||||
|
// if (!driverName.IsEmpty() && !printerName.IsEmpty() && !portName.IsEmpty())
|
||||||
|
if (driverName.IsEmpty() && printerName.IsEmpty() && portName.IsEmpty())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hDev = GlobalAlloc(GPTR, 4*sizeof(WORD)+
|
||||||
|
driverName.Length() + 1 +
|
||||||
|
printerName.Length() + 1 +
|
||||||
|
portName.Length()+1);
|
||||||
|
LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(hDev);
|
||||||
|
lpDev->wDriverOffset = sizeof(WORD)*4;
|
||||||
|
wxStrcpy((wxChar*)lpDev + lpDev->wDriverOffset, driverName);
|
||||||
|
|
||||||
|
lpDev->wDeviceOffset = (WORD)(lpDev->wDriverOffset + driverName.Length()+1);
|
||||||
|
wxStrcpy((wxChar*)lpDev + lpDev->wDeviceOffset, printerName);
|
||||||
|
|
||||||
|
lpDev->wOutputOffset = (WORD)(lpDev->wDeviceOffset + printerName.Length()+1);
|
||||||
|
wxStrcpy((wxChar*)lpDev + lpDev->wOutputOffset, portName);
|
||||||
|
|
||||||
|
lpDev->wDefault = 0;
|
||||||
|
|
||||||
|
GlobalUnlock(hDev);
|
||||||
|
}
|
||||||
|
return hDev;
|
||||||
|
}
|
||||||
|
|
||||||
void wxPrintData::ConvertToNative()
|
void wxPrintData::ConvertToNative()
|
||||||
{
|
{
|
||||||
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
||||||
|
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
|
||||||
if (!hDevMode)
|
if (!hDevMode)
|
||||||
{
|
{
|
||||||
// Use PRINTDLG as a way of creating a DEVMODE object
|
// Use PRINTDLG as a way of creating a DEVMODE object
|
||||||
@@ -301,13 +337,19 @@ void wxPrintData::ConvertToNative()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
hDevMode = pd->hDevMode;
|
||||||
|
m_devMode = (void*)(long) hDevMode;
|
||||||
|
pd->hDevMode = NULL;
|
||||||
|
|
||||||
|
// We'll create a new DEVNAMEs structure below.
|
||||||
if ( pd->hDevNames )
|
if ( pd->hDevNames )
|
||||||
GlobalFree(pd->hDevNames);
|
GlobalFree(pd->hDevNames);
|
||||||
pd->hDevNames = NULL;
|
pd->hDevNames = NULL;
|
||||||
|
|
||||||
hDevMode = pd->hDevMode;
|
// hDevNames = pd->hDevNames;
|
||||||
m_devMode = (void*)(long) hDevMode;
|
// m_devNames = (void*)(long) hDevNames;
|
||||||
pd->hDevMode = NULL;
|
// pd->hDevnames = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete pd;
|
delete pd;
|
||||||
@@ -426,11 +468,20 @@ void wxPrintData::ConvertToNative()
|
|||||||
|
|
||||||
GlobalUnlock(hDevMode);
|
GlobalUnlock(hDevMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( hDevNames )
|
||||||
|
{
|
||||||
|
GlobalFree(hDevNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: I hope it's OK to pass some empty strings to DEVNAMES.
|
||||||
|
hDevNames = wxCreateDevNames("", m_printerName, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPrintData::ConvertFromNative()
|
void wxPrintData::ConvertFromNative()
|
||||||
{
|
{
|
||||||
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
||||||
|
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
|
||||||
|
|
||||||
if (!hDevMode)
|
if (!hDevMode)
|
||||||
return;
|
return;
|
||||||
@@ -599,6 +650,30 @@ void wxPrintData::ConvertFromNative()
|
|||||||
|
|
||||||
GlobalUnlock(hDevMode);
|
GlobalUnlock(hDevMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hDevNames)
|
||||||
|
{
|
||||||
|
LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(hDevNames);
|
||||||
|
if (lpDevNames)
|
||||||
|
{
|
||||||
|
// TODO: Unicode-ification
|
||||||
|
|
||||||
|
// Get the port name
|
||||||
|
// port is obsolete in WIN32
|
||||||
|
// m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset);
|
||||||
|
|
||||||
|
// Get the printer name
|
||||||
|
wxString printerName = (LPSTR)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!");
|
||||||
|
|
||||||
|
if (printerName != "")
|
||||||
|
m_printerName = printerName;
|
||||||
|
|
||||||
|
GlobalUnlock(hDevNames);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -793,12 +868,23 @@ void wxPrintDialogData::ConvertToNative()
|
|||||||
GlobalFree(pd->hDevMode);
|
GlobalFree(pd->hDevMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pass the devnames data to the PRINTDLG structure, since it'll
|
||||||
|
// be needed when PrintDlg is called.
|
||||||
|
if (pd->hDevNames)
|
||||||
|
{
|
||||||
|
GlobalFree(pd->hDevNames);
|
||||||
|
}
|
||||||
|
|
||||||
pd->hDevMode = (HGLOBAL)(DWORD) m_printData.GetNativeData();
|
pd->hDevMode = (HGLOBAL)(DWORD) m_printData.GetNativeData();
|
||||||
|
|
||||||
m_printData.SetNativeData((void*) NULL);
|
m_printData.SetNativeData((void*) NULL);
|
||||||
|
|
||||||
wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!"));
|
wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!"));
|
||||||
|
|
||||||
|
pd->hDevNames = (HGLOBAL)(DWORD) m_printData.GetNativeDataDevNames();
|
||||||
|
|
||||||
|
m_printData.SetNativeDataDevNames((void*) NULL);
|
||||||
|
|
||||||
pd->hDC = (HDC) NULL;
|
pd->hDC = (HDC) NULL;
|
||||||
pd->nFromPage = (UINT)m_printFromPage;
|
pd->nFromPage = (UINT)m_printFromPage;
|
||||||
pd->nToPage = (UINT)m_printToPage;
|
pd->nToPage = (UINT)m_printToPage;
|
||||||
@@ -815,7 +901,7 @@ void wxPrintDialogData::ConvertToNative()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
pd->hwndOwner=(HWND)NULL;
|
pd->hwndOwner=(HWND)NULL;
|
||||||
pd->hDevNames=(HANDLE)NULL;
|
// pd->hDevNames=(HANDLE)NULL;
|
||||||
pd->hInstance=(HINSTANCE)NULL;
|
pd->hInstance=(HINSTANCE)NULL;
|
||||||
pd->lCustData = (LPARAM) NULL;
|
pd->lCustData = (LPARAM) NULL;
|
||||||
pd->lpfnPrintHook = NULL;
|
pd->lpfnPrintHook = NULL;
|
||||||
@@ -863,6 +949,18 @@ void wxPrintDialogData::ConvertFromNative()
|
|||||||
pd->hDevMode = NULL;
|
pd->hDevMode = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pass the devnames data back to the wxPrintData structure where it really belongs.
|
||||||
|
if (pd->hDevNames)
|
||||||
|
{
|
||||||
|
if (m_printData.GetNativeDataDevNames())
|
||||||
|
{
|
||||||
|
// Make sure we don't leak memory
|
||||||
|
GlobalFree((HGLOBAL)(DWORD) m_printData.GetNativeDataDevNames());
|
||||||
|
}
|
||||||
|
m_printData.SetNativeDataDevNames((void*)(long) pd->hDevNames);
|
||||||
|
pd->hDevNames = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Now convert the DEVMODE object, passed down from the PRINTDLG object,
|
// Now convert the DEVMODE object, passed down from the PRINTDLG object,
|
||||||
// into wxWindows form.
|
// into wxWindows form.
|
||||||
m_printData.ConvertFromNative();
|
m_printData.ConvertFromNative();
|
||||||
@@ -1044,6 +1142,8 @@ wxPageSetupDialogData::~wxPageSetupDialogData()
|
|||||||
PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData;
|
PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData;
|
||||||
if ( pd && pd->hDevMode )
|
if ( pd && pd->hDevMode )
|
||||||
GlobalFree(pd->hDevMode);
|
GlobalFree(pd->hDevMode);
|
||||||
|
if ( pd && pd->hDevNames )
|
||||||
|
GlobalFree(pd->hDevNames);
|
||||||
if ( pd )
|
if ( pd )
|
||||||
delete pd;
|
delete pd;
|
||||||
#elif defined( __WXMAC__ )
|
#elif defined( __WXMAC__ )
|
||||||
@@ -1086,6 +1186,7 @@ void wxPageSetupDialogData::ConvertToNative()
|
|||||||
{
|
{
|
||||||
pd = new PAGESETUPDLG;
|
pd = new PAGESETUPDLG;
|
||||||
pd->hDevMode = NULL;
|
pd->hDevMode = NULL;
|
||||||
|
pd->hDevNames = NULL;
|
||||||
m_pageSetupData = (void *)pd;
|
m_pageSetupData = (void *)pd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1105,6 +1206,20 @@ void wxPageSetupDialogData::ConvertToNative()
|
|||||||
|
|
||||||
wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!"));
|
wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!"));
|
||||||
|
|
||||||
|
// Pass the devnames data (created in m_printData.ConvertToNative)
|
||||||
|
// to the PRINTDLG structure, since it'll
|
||||||
|
// be needed when PrintDlg is called.
|
||||||
|
|
||||||
|
if (pd->hDevNames)
|
||||||
|
{
|
||||||
|
GlobalFree(pd->hDevNames);
|
||||||
|
pd->hDevNames = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pd->hDevNames = (HGLOBAL) m_printData.GetNativeDataDevNames();
|
||||||
|
|
||||||
|
m_printData.SetNativeDataDevNames((void*) NULL);
|
||||||
|
|
||||||
// pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE));
|
// pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE));
|
||||||
|
|
||||||
pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
|
pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
|
||||||
@@ -1129,7 +1244,7 @@ void wxPageSetupDialogData::ConvertToNative()
|
|||||||
|
|
||||||
pd->lStructSize = sizeof( PAGESETUPDLG );
|
pd->lStructSize = sizeof( PAGESETUPDLG );
|
||||||
pd->hwndOwner=(HWND)NULL;
|
pd->hwndOwner=(HWND)NULL;
|
||||||
pd->hDevNames=(HWND)NULL;
|
// pd->hDevNames=(HWND)NULL;
|
||||||
pd->hInstance=(HINSTANCE)NULL;
|
pd->hInstance=(HINSTANCE)NULL;
|
||||||
|
|
||||||
pd->ptPaperSize.x = m_paperSize.x * 100;
|
pd->ptPaperSize.x = m_paperSize.x * 100;
|
||||||
@@ -1184,6 +1299,20 @@ void wxPageSetupDialogData::ConvertFromNative()
|
|||||||
|
|
||||||
m_printData.ConvertFromNative();
|
m_printData.ConvertFromNative();
|
||||||
|
|
||||||
|
// Pass the devnames data back to the wxPrintData structure where it really belongs.
|
||||||
|
if (pd->hDevNames)
|
||||||
|
{
|
||||||
|
if (m_printData.GetNativeDataDevNames())
|
||||||
|
{
|
||||||
|
// Make sure we don't leak memory
|
||||||
|
GlobalFree((HGLOBAL) m_printData.GetNativeDataDevNames());
|
||||||
|
}
|
||||||
|
m_printData.SetNativeDataDevNames((void*) pd->hDevNames);
|
||||||
|
pd->hDevNames = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_printData.ConvertFromNative();
|
||||||
|
|
||||||
pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
|
pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
|
||||||
|
|
||||||
m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS);
|
m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS);
|
||||||
|
@@ -261,7 +261,11 @@ void wxDC::Clear()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_selectedBitmap.Ok(), wxT("this DC can't be cleared") );
|
// No, I think we should simply ignore this if printing on e.g.
|
||||||
|
// a printer DC.
|
||||||
|
// wxCHECK_RET( m_selectedBitmap.Ok(), wxT("this DC can't be cleared") );
|
||||||
|
if (!m_selectedBitmap.Ok())
|
||||||
|
return;
|
||||||
|
|
||||||
rect.left = 0; rect.top = 0;
|
rect.left = 0; rect.top = 0;
|
||||||
rect.right = m_selectedBitmap.GetWidth();
|
rect.right = m_selectedBitmap.GetWidth();
|
||||||
|
Reference in New Issue
Block a user