X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/58a33cb4e6e2de9d6ea6da16b52e53d840797059..24f588af92d50c77142e299ff66ba45b88915c8c:/src/common/cmndata.cpp diff --git a/src/common/cmndata.cpp b/src/common/cmndata.cpp index ab9bc7b4e2..4ee83e61e9 100644 --- a/src/common/cmndata.cpp +++ b/src/common/cmndata.cpp @@ -37,39 +37,73 @@ #include "wx/gdicmn.h" #include "wx/cmndata.h" +#include "wx/log.h" -#include "wx/paper.h" +#if wxUSE_FONTDLG + #include "wx/fontdlg.h" +#endif // wxUSE_FONTDLG // For compatibility -#if (defined(__WXMOTIF__) || defined(__WXGTK__)) && wxUSE_POSTSCRIPT +#if (defined(__WXMOTIF__) || defined(__WXMGL__) || defined(__WXGTK__) || defined(__WXX11__)|| defined(__WXPM__) || defined(__WXMAC__)) && wxUSE_POSTSCRIPT #define wxCOMPATIBILITY_WITH_PRINTSETUPDATA 1 #endif -#if wxCOMPATIBILITY_WITH_PRINTSETUPDATA - #include "wx/generic/dcpsg.h" -#endif +#if wxUSE_PRINTING_ARCHITECTURE + #include "wx/paper.h" + + #if wxCOMPATIBILITY_WITH_PRINTSETUPDATA + #include "wx/generic/dcpsg.h" + #endif +#endif // wxUSE_PRINTING_ARCHITECTURE #ifdef __WXMSW__ #include - #include + #include "wx/msw/private.h" #if !defined(__WIN32__) #include #include #endif // Win16 + #ifdef __WXWINE__ + #include + #include + #endif + #if defined(__WATCOMC__) || defined(__SC__) || defined(__SALFORDC__) #include #include #endif #endif // MSW -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxPrintData, wxObject) - IMPLEMENT_DYNAMIC_CLASS(wxPrintDialogData, wxObject) - IMPLEMENT_DYNAMIC_CLASS(wxPageSetupDialogData, wxObject) + #if wxUSE_PRINTING_ARCHITECTURE + IMPLEMENT_DYNAMIC_CLASS(wxPrintData, wxObject) + IMPLEMENT_DYNAMIC_CLASS(wxPrintDialogData, wxObject) + IMPLEMENT_DYNAMIC_CLASS(wxPageSetupDialogData, wxObject) + #endif // wxUSE_PRINTING_ARCHITECTURE + IMPLEMENT_DYNAMIC_CLASS(wxFontData, wxObject) IMPLEMENT_DYNAMIC_CLASS(wxColourData, wxObject) + +#ifdef __WXMAC__ + #include "wx/mac/uma.h" + +#if defined(TARGET_CARBON) && !defined(__DARWIN__) +# if PM_USE_SESSION_APIS +# include +# endif +# include +#endif + +#ifndef __DARWIN__ + #include "Printing.h" +#endif + #define mm2pt 2.83464566929 + #define pt2mm 0.352777777778 +#endif // Mac + +#ifndef DMPAPER_USER + #define DMPAPER_USER 256 #endif // ============================================================================ @@ -91,6 +125,7 @@ wxColourData::wxColourData() } wxColourData::wxColourData(const wxColourData& data) + : wxObject() { (*this) = data; } @@ -99,7 +134,7 @@ wxColourData::~wxColourData() { } -void wxColourData::SetCustomColour(int i, wxColour& colour) +void wxColourData::SetCustomColour(int i, const wxColour& colour) { if (i > 15 || i < 0) return; @@ -139,29 +174,23 @@ wxFontData::wxFontData() enableEffects = TRUE; minSize = 0; maxSize = 0; -} -wxFontData::wxFontData(const wxFontData& data) -{ - (*this) = data; + m_encoding = wxFONTENCODING_SYSTEM; } wxFontData::~wxFontData() { } -void wxFontData::operator=(const wxFontData& data) +#if wxUSE_FONTDLG + +wxFontDialogBase::~wxFontDialogBase() { - fontColour = data.fontColour; - showHelp = data.showHelp; - allowSymbols = data.allowSymbols; - enableEffects = data.enableEffects; - initialFont = data.initialFont; - chosenFont = data.chosenFont; - minSize = data.minSize; - maxSize = data.maxSize; } +#endif // wxUSE_FONTDLG + +#if wxUSE_PRINTING_ARCHITECTURE // ---------------------------------------------------------------------------- // Print data // ---------------------------------------------------------------------------- @@ -169,7 +198,58 @@ void wxFontData::operator=(const wxFontData& data) wxPrintData::wxPrintData() { #ifdef __WXMSW__ - m_devMode = NULL; + m_devMode = (void*) NULL; + m_devNames = (void*) NULL; +#elif defined( __WXMAC__ ) +#if TARGET_CARBON + m_macPageFormat = kPMNoPageFormat; + m_macPrintSettings = kPMNoPrintSettings; + + #if PM_USE_SESSION_APIS + PMPrintSession macPrintSession = kPMNoReference; + OSStatus err; + + err = ::UMAPrOpen(&macPrintSession) ; + if ( err == noErr ) + { + err = PMCreatePageFormat((PMPageFormat *)&m_macPageFormat); + + // Note that PMPageFormat is not session-specific, but calling + // PMSessionDefaultPageFormat assigns values specific to the printer + // associated with the current printing session. + if ((err == noErr) && (m_macPageFormat != kPMNoPageFormat)) + { + err = PMSessionDefaultPageFormat((PMPrintSession)macPrintSession, + (PMPageFormat)m_macPageFormat); + } + + err = PMCreatePrintSettings((PMPrintSettings *)&m_macPrintSettings); + + // Note that PMPrintSettings is not session-specific, but calling + // PMSessionDefaultPrintSettings assigns values specific to the printer + // associated with the current printing session. + if ((err == noErr) && (m_macPrintSettings != kPMNoPrintSettings)) + { + err = PMSessionDefaultPrintSettings((PMPrintSession)macPrintSession, + (PMPrintSettings)m_macPrintSettings); + } + } + ::UMAPrClose(&macPrintSession) ; + #endif +#else + m_macPrintSettings = (THPrint) NewHandleClear( sizeof( TPrint ) ); + (**(THPrint)m_macPrintSettings).iPrVersion = 0; // something invalid + + (**(THPrint)m_macPrintSettings).prInfo.iHRes = 72; + (**(THPrint)m_macPrintSettings).prInfo.iVRes = 72; + Rect r1 = { 0, 0, 8*72 - 2 * 18, 11*72 - 2 * 36 }; + (**(THPrint)m_macPrintSettings).prInfo.rPage = r1;// must have its top left & (0,0) + + Rect r2 = { -18, -36, 8*72 - 18, 11*72 - 36 }; + (**(THPrint)m_macPrintSettings).rPaper = r2; + (**(THPrint)m_macPrintSettings).prStl.iPageV = 11 * 120 ; // 11 inches in 120th of an inch + (**(THPrint)m_macPrintSettings).prStl.iPageH = 8 * 120 ; // 8 inches in 120th of an inch +#endif #endif m_printOrientation = wxPORTRAIT; m_printNoCopies = 1; @@ -197,125 +277,208 @@ wxPrintData::wxPrintData() } wxPrintData::wxPrintData(const wxPrintData& printData) + : wxObject() { +#ifdef __WXMSW__ + m_devMode = (void*) NULL; + m_devNames = (void*) NULL; +#elif defined( __WXMAC__ ) +#if TARGET_CARBON + m_macPageFormat = kPMNoPageFormat; + m_macPrintSettings = kPMNoPrintSettings; +#else + m_macPrintSettings = NULL; +#endif +#endif (*this) = printData; } wxPrintData::~wxPrintData() { #ifdef __WXMSW__ - HGLOBAL hDevMode = (HGLOBAL) m_devMode; - if (hDevMode ) + HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; + if ( hDevMode ) GlobalFree(hDevMode); + HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; + if ( hDevNames ) + GlobalFree(hDevNames); +#elif defined(__WXMAC__) +#if TARGET_CARBON + if (m_macPageFormat != kPMNoPageFormat) + { + #if PM_USE_SESSION_APIS + (void)PMRelease(m_macPageFormat); + #else + (void)PMDisposePageFormat(m_macPageFormat); + #endif + m_macPageFormat = kPMNoPageFormat; + } + + if (m_macPrintSettings != kPMNoPrintSettings) + { + #if PM_USE_SESSION_APIS + (void)PMRelease(m_macPrintSettings); + #else + (void)PMDisposePrintSettings(m_macPrintSettings); + #endif + m_macPrintSettings = kPMNoPrintSettings; + } + +#else + wxASSERT( m_macPrintSettings ); + // we should perhaps delete +#endif #endif } -#if defined(__WXMSW__) && defined(__WIN32__) +#if defined(__WXMSW__) // && defined(__WIN32__) +#if defined(__WXDEBUG__) && defined(__WIN32__) static wxString wxGetPrintDlgError() { DWORD err = CommDlgExtendedError(); - wxString msg = "Unknown"; + wxString msg = wxT("Unknown"); switch (err) { - case CDERR_FINDRESFAILURE: msg = "CDERR_FINDRESFAILURE"; break; - case CDERR_INITIALIZATION: msg = "CDERR_INITIALIZATION"; break; - case CDERR_LOADRESFAILURE: msg = "CDERR_LOADRESFAILURE"; break; - case CDERR_LOADSTRFAILURE: msg = "CDERR_LOADSTRFAILURE"; break; - case CDERR_LOCKRESFAILURE: msg = "CDERR_LOCKRESFAILURE"; break; - case CDERR_MEMALLOCFAILURE: msg = "CDERR_MEMALLOCFAILURE"; break; - case CDERR_MEMLOCKFAILURE: msg = "CDERR_MEMLOCKFAILURE"; break; - case CDERR_NOHINSTANCE: msg = "CDERR_NOHINSTANCE"; break; - case CDERR_NOHOOK: msg = "CDERR_NOHOOK"; break; - case CDERR_NOTEMPLATE: msg = "CDERR_NOTEMPLATE"; break; - case CDERR_STRUCTSIZE: msg = "CDERR_STRUCTSIZE"; break; - case PDERR_RETDEFFAILURE: msg = "PDERR_RETDEFFAILURE"; break; - case PDERR_PRINTERNOTFOUND: msg = "PDERR_PRINTERNOTFOUND"; break; - case PDERR_PARSEFAILURE: msg = "PDERR_PARSEFAILURE"; break; - case PDERR_NODEVICES: msg = "PDERR_NODEVICES"; break; - case PDERR_NODEFAULTPRN: msg = "PDERR_NODEFAULTPRN"; break; - case PDERR_LOADDRVFAILURE: msg = "PDERR_LOADDRVFAILURE"; break; - case PDERR_INITFAILURE: msg = "PDERR_INITFAILURE"; break; - case PDERR_GETDEVMODEFAIL: msg = "PDERR_GETDEVMODEFAIL"; break; - case PDERR_DNDMMISMATCH: msg = "PDERR_DNDMMISMATCH"; break; - case PDERR_DEFAULTDIFFERENT: msg = "PDERR_DEFAULTDIFFERENT"; break; - case PDERR_CREATEICFAILURE: msg = "PDERR_CREATEICFAILURE"; break; + case CDERR_FINDRESFAILURE: msg = wxT("CDERR_FINDRESFAILURE"); break; + case CDERR_INITIALIZATION: msg = wxT("CDERR_INITIALIZATION"); break; + case CDERR_LOADRESFAILURE: msg = wxT("CDERR_LOADRESFAILURE"); break; + case CDERR_LOADSTRFAILURE: msg = wxT("CDERR_LOADSTRFAILURE"); break; + case CDERR_LOCKRESFAILURE: msg = wxT("CDERR_LOCKRESFAILURE"); break; + case CDERR_MEMALLOCFAILURE: msg = wxT("CDERR_MEMALLOCFAILURE"); break; + case CDERR_MEMLOCKFAILURE: msg = wxT("CDERR_MEMLOCKFAILURE"); break; + case CDERR_NOHINSTANCE: msg = wxT("CDERR_NOHINSTANCE"); break; + case CDERR_NOHOOK: msg = wxT("CDERR_NOHOOK"); break; + case CDERR_NOTEMPLATE: msg = wxT("CDERR_NOTEMPLATE"); break; + case CDERR_STRUCTSIZE: msg = wxT("CDERR_STRUCTSIZE"); break; + case PDERR_RETDEFFAILURE: msg = wxT("PDERR_RETDEFFAILURE"); break; + case PDERR_PRINTERNOTFOUND: msg = wxT("PDERR_PRINTERNOTFOUND"); break; + case PDERR_PARSEFAILURE: msg = wxT("PDERR_PARSEFAILURE"); break; + case PDERR_NODEVICES: msg = wxT("PDERR_NODEVICES"); break; + case PDERR_NODEFAULTPRN: msg = wxT("PDERR_NODEFAULTPRN"); break; + case PDERR_LOADDRVFAILURE: msg = wxT("PDERR_LOADDRVFAILURE"); break; + case PDERR_INITFAILURE: msg = wxT("PDERR_INITFAILURE"); break; + case PDERR_GETDEVMODEFAIL: msg = wxT("PDERR_GETDEVMODEFAIL"); break; + case PDERR_DNDMMISMATCH: msg = wxT("PDERR_DNDMMISMATCH"); break; + case PDERR_DEFAULTDIFFERENT: msg = wxT("PDERR_DEFAULTDIFFERENT"); break; + case PDERR_CREATEICFAILURE: msg = wxT("PDERR_CREATEICFAILURE"); break; default: break; } return msg; } - +#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 ) * sizeof(wxChar) ); + LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(hDev); + lpDev->wDriverOffset = sizeof(WORD)*4; + wxStrcpy((wxChar*)((char*)lpDev + lpDev->wDriverOffset ), driverName); + lpDev->wDeviceOffset = (WORD)( lpDev->wDriverOffset + + sizeof(wxChar) * ( driverName.Length() + 1 ) ); + wxStrcpy((wxChar*)((char*)lpDev + lpDev->wDeviceOffset ), printerName); + + lpDev->wOutputOffset = (WORD)( lpDev->wDeviceOffset + + sizeof(wxChar) * ( printerName.Length() + 1 ) ); + wxStrcpy((wxChar*)((char*) lpDev + lpDev->wOutputOffset ), portName); + + lpDev->wDefault = 0; + + GlobalUnlock(hDev); + } + + return hDev; +} void wxPrintData::ConvertToNative() { - HGLOBAL hDevMode = (HGLOBAL) m_devMode; + HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; + HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; if (!hDevMode) { // Use PRINTDLG as a way of creating a DEVMODE object - PRINTDLG *pd = new PRINTDLG; + PRINTDLG pd; // GNU-WIN32 has the wrong size PRINTDLG - can't work out why. #ifdef __GNUWIN32__ - memset(pd, 0, 66); - pd->lStructSize = 66 ; + memset(&pd, 0, 66); + pd.lStructSize = 66; #else - memset(pd, 0, sizeof(PRINTDLG)); - pd->lStructSize = sizeof(PRINTDLG); + memset(&pd, 0, sizeof(PRINTDLG)); + pd.lStructSize = sizeof(PRINTDLG); #endif - pd->hwndOwner = (HWND)NULL; - pd->hDevMode = NULL; // Will be created by PrintDlg - pd->hDevNames = NULL; // Ditto - pd->hInstance = (HINSTANCE) wxGetInstance(); + pd.hwndOwner = (HWND)NULL; + pd.hDevMode = NULL; // Will be created by PrintDlg + pd.hDevNames = NULL; // Ditto + //pd.hInstance = (HINSTANCE) wxGetInstance(); - pd->Flags = PD_RETURNDEFAULT; - pd->nCopies = 1; + pd.Flags = PD_RETURNDEFAULT; + pd.nCopies = 1; // Fill out the DEVMODE structure // so we can use it as input in the 'real' PrintDlg - if (!PrintDlg(pd)) + if (!PrintDlg(&pd)) { - if ( pd->hDevMode ) - GlobalFree(pd->hDevMode); - if ( pd->hDevNames ) - GlobalFree(pd->hDevNames); - pd->hDevMode = NULL; - pd->hDevNames = NULL; + if ( pd.hDevMode ) + GlobalFree(pd.hDevMode); + if ( pd.hDevNames ) + GlobalFree(pd.hDevNames); + pd.hDevMode = NULL; + pd.hDevNames = NULL; #if defined(__WXDEBUG__) && defined(__WIN32__) - wxString str("Printing error: "); + wxString str(wxT("Printing error: ")); str += wxGetPrintDlgError(); wxLogDebug(str); #endif } else { - if ( pd->hDevNames ) - GlobalFree(pd->hDevNames); - pd->hDevNames = NULL; + hDevMode = pd.hDevMode; + m_devMode = (void*)(long) hDevMode; + pd.hDevMode = NULL; - hDevMode = pd->hDevMode; - m_devMode = (void*) hDevMode; - pd->hDevMode = NULL; - } + // We'll create a new DEVNAMEs structure below. + if ( pd.hDevNames ) + GlobalFree(pd.hDevNames); + pd.hDevNames = NULL; - delete pd; + // hDevNames = pd->hDevNames; + // m_devNames = (void*)(long) hDevNames; + // pd->hDevnames = NULL; + + } } if ( hDevMode ) { - DEVMODE *devMode = (DEVMODE*) GlobalLock(hDevMode); + LPDEVMODE devMode = (LPDEVMODE) GlobalLock(hDevMode); //// Orientation +#ifndef __WXWINE__ devMode->dmOrientation = m_printOrientation; +#endif devMode->dmFields = DM_ORIENTATION; //// Collation +#ifndef __WIN16__ devMode->dmCollate = (m_printCollate ? DMCOLLATE_TRUE : DMCOLLATE_FALSE); devMode->dmFields |= DM_COLLATE; +#endif //// Number of copies @@ -324,14 +487,11 @@ void wxPrintData::ConvertToNative() //// Printer name - if (m_printerName != "") + if (m_printerName != wxT("")) { - // TODO: make this Unicode compatible - int len = wxMin(31, m_printerName.Len()); - int i; - for (i = 0; i < len; i++) - devMode->dmDeviceName[i] = m_printerName.GetChar(i); - devMode->dmDeviceName[i] = 0; + //int len = wxMin(31, m_printerName.Len()); + wxStrncpy((wxChar*)devMode->dmDeviceName,m_printerName.c_str(),31); + devMode->dmDeviceName[31] = wxT('\0'); } //// Colour @@ -343,12 +503,15 @@ void wxPrintData::ConvertToNative() devMode->dmFields |= DM_COLOR; +#ifndef __WXWINE__ //// Paper size if (m_paperId == wxPAPER_NONE) { + // DEVMODE is in tenths of a milimeter devMode->dmPaperWidth = m_paperSize.x * 10; devMode->dmPaperLength = m_paperSize.y * 10; + devMode->dmPaperSize = DMPAPER_USER; devMode->dmFields |= DM_PAPERWIDTH; devMode->dmFields |= DM_PAPERLENGTH; } @@ -364,6 +527,7 @@ void wxPrintData::ConvertToNative() } } } +#endif //// Duplex @@ -410,26 +574,38 @@ void wxPrintData::ConvertToNative() GlobalUnlock(hDevMode); } + + if ( hDevNames ) + { + GlobalFree(hDevNames); + } + + // TODO: I hope it's OK to pass some empty strings to DEVNAMES. + m_devNames = (void*) (long) wxCreateDevNames(wxT(""), m_printerName, wxT("")); } void wxPrintData::ConvertFromNative() { - HGLOBAL hDevMode = (HGLOBAL) m_devMode; + HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; + HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; if (!hDevMode) return; if ( hDevMode ) { - DEVMODE *devMode = (DEVMODE*) GlobalLock(hDevMode); + LPDEVMODE devMode = (LPDEVMODE)GlobalLock(hDevMode); +#ifndef __WXWINE__ //// Orientation if (devMode->dmFields & DM_ORIENTATION) m_printOrientation = devMode->dmOrientation; +#endif //// Collation +#ifndef __WIN16__ if (devMode->dmFields & DM_COLLATE) { if (devMode->dmCollate == DMCOLLATE_TRUE) @@ -437,6 +613,7 @@ void wxPrintData::ConvertFromNative() else m_printCollate = FALSE; } +#endif //// Number of copies @@ -474,9 +651,14 @@ void wxPrintData::ConvertFromNative() else m_colour = TRUE; +#ifndef __WXWINE__ //// Paper size - if (devMode->dmFields & DM_PAPERSIZE) + // We don't know size of user defined paper and some buggy drivers + // 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. + if ((devMode->dmFields & DM_PAPERSIZE) && (devMode->dmPaperSize < DMPAPER_USER)) { if (wxThePrintPaperDatabase) { @@ -484,13 +666,13 @@ void wxPrintData::ConvertFromNative() if (paper) { m_paperId = paper->GetId(); - m_paperSize.x = paper->GetWidth() / 10 ; - m_paperSize.y = paper->GetHeight() / 10 ; + m_paperSize.x = paper->GetWidth() / 10; + m_paperSize.y = paper->GetHeight() / 10; } else { // Shouldn't really get here - wxFAIL_MSG("Couldn't find paper size in paper database."); + wxFAIL_MSG(wxT("Couldn't find paper size in paper database.")); m_paperId = wxPAPER_NONE; m_paperSize.x = 0; @@ -500,7 +682,7 @@ void wxPrintData::ConvertFromNative() else { // Shouldn't really get here - wxFAIL_MSG("Paper database wasn't initialized in wxPrintData::ConvertFromNative."); + wxFAIL_MSG(wxT("Paper database wasn't initialized in wxPrintData::ConvertFromNative.")); m_paperId = wxPAPER_NONE; m_paperSize.x = 0; @@ -509,6 +691,7 @@ void wxPrintData::ConvertFromNative() } else if ((devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH)) { + // DEVMODE is in tenths of a milimeter m_paperSize.x = devMode->dmPaperWidth / 10; m_paperSize.y = devMode->dmPaperLength / 10; m_paperId = wxPAPER_NONE; @@ -516,13 +699,13 @@ void wxPrintData::ConvertFromNative() else { // Shouldn't really get here - wxFAIL_MSG("Couldn't find paper size from DEVMODE."); + wxFAIL_MSG(wxT("Couldn't find paper size from DEVMODE.")); m_paperSize.x = 0; m_paperSize.y = 0; m_paperId = wxPAPER_NONE; } - +#endif //// Duplex @@ -578,12 +761,61 @@ void wxPrintData::ConvertFromNative() 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 = (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!"); + + if (printerName != wxT("")) + m_printerName = printerName; + + GlobalUnlock(hDevNames); + } + } } #endif +#ifdef __WXMAC__ +void wxPrintData::ConvertToNative() +{ +#if TARGET_CARBON +#else + (**(THPrint)m_macPrintSettings).prJob.iCopies = m_printNoCopies; +#endif +} + +void wxPrintData::ConvertFromNative() +{ +#if TARGET_CARBON +#else + m_printNoCopies = (**(THPrint)m_macPrintSettings).prJob.iCopies; +#endif +} +#endif + void wxPrintData::operator=(const wxPrintData& data) { +#ifdef __WXMAC__ +#if TARGET_CARBON +#else + m_macPrintSettings = data.m_macPrintSettings; + HandToHand( (Handle*) &m_macPrintSettings ); +#endif +#endif m_printNoCopies = data.m_printNoCopies; m_printCollate = data.m_printCollate; m_printOrientation = data.m_printOrientation; @@ -633,6 +865,16 @@ void wxPrintData::operator=(const wxPrintSetupData& setupData) } #endif // wxCOMPATIBILITY_WITH_PRINTSETUPDATA +// Is this data OK for showing the print dialog? +bool wxPrintData::Ok() const +{ +#ifdef __WXMSW__ + ((wxPrintData*)this)->ConvertToNative(); + return (m_devMode != NULL) ; +#else + return TRUE; +#endif +} // ---------------------------------------------------------------------------- // Print dialog data @@ -651,6 +893,7 @@ wxPrintDialogData::wxPrintDialogData() m_printAllPages = FALSE; m_printCollate = FALSE; m_printToFile = FALSE; + m_printSelection = FALSE; m_printEnableSelection = FALSE; m_printEnablePageNumbers = TRUE; m_printEnablePrintToFile = TRUE; @@ -659,7 +902,11 @@ wxPrintDialogData::wxPrintDialogData() } wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData& dialogData) + : wxObject() { +#ifdef __WXMSW__ + m_printDlgData = NULL; +#endif (*this) = dialogData; } @@ -676,6 +923,7 @@ wxPrintDialogData::wxPrintDialogData(const wxPrintData& printData) m_printAllPages = FALSE; m_printCollate = FALSE; m_printToFile = FALSE; + m_printSelection = FALSE; m_printEnableSelection = FALSE; m_printEnablePageNumbers = TRUE; m_printEnablePrintToFile = TRUE; @@ -706,14 +954,15 @@ void wxPrintDialogData::ConvertToNative() if (!pd) { pd = new PRINTDLG; + memset( pd, 0, sizeof(PRINTDLG) ); m_printDlgData = (void*) pd; // GNU-WIN32 has the wrong size PRINTDLG - can't work out why. #ifdef __GNUWIN32__ - pd->lStructSize = 66 ; + pd->lStructSize = 66; #else -#endif pd->lStructSize = sizeof(PRINTDLG); +#endif pd->hwndOwner = (HWND)NULL; pd->hDevMode = NULL; // Will be created by PrintDlg pd->hDevNames = NULL; // Ditto @@ -729,29 +978,41 @@ void wxPrintDialogData::ConvertToNative() GlobalFree(pd->hDevMode); } - pd->hDevMode = (HGLOBAL) m_printData.GetNativeData(); + // 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(); m_printData.SetNativeData((void*) NULL); - wxASSERT_MSG( (pd->hDevMode), "hDevMode must be non-NULL in ConvertToNative!"); + // Shouldn't assert; we should be able to test Ok-ness at a higher level + //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->nFromPage = (UINT)m_printFromPage; - pd->nToPage = (UINT)m_printToPage; - pd->nMinPage = (UINT)m_printMinPage; - pd->nMaxPage = (UINT)m_printMaxPage; - pd->nCopies = (UINT)m_printNoCopies; + pd->nFromPage = (WORD)m_printFromPage; + pd->nToPage = (WORD)m_printToPage; + pd->nMinPage = (WORD)m_printMinPage; + pd->nMaxPage = (WORD)m_printMaxPage; + pd->nCopies = (WORD)m_printNoCopies; - pd->Flags = PD_RETURNDC ; + pd->Flags = PD_RETURNDC; #ifdef __GNUWIN32__ - pd->lStructSize = 66 ; + pd->lStructSize = 66; #else pd->lStructSize = sizeof( PRINTDLG ); #endif pd->hwndOwner=(HWND)NULL; - pd->hDevNames=(HANDLE)NULL; +// pd->hDevNames=(HANDLE)NULL; pd->hInstance=(HINSTANCE)NULL; pd->lCustData = (LPARAM) NULL; pd->lpfnPrintHook = NULL; @@ -763,6 +1024,8 @@ void wxPrintDialogData::ConvertToNative() if ( m_printAllPages ) pd->Flags |= PD_ALLPAGES; + if ( m_printSelection ) + pd->Flags |= PD_SELECTION; if ( m_printCollate ) pd->Flags |= PD_COLLATE; if ( m_printToFile ) @@ -791,23 +1054,36 @@ void wxPrintDialogData::ConvertFromNative() if (m_printData.GetNativeData()) { // Make sure we don't leak memory - GlobalFree((HGLOBAL) m_printData.GetNativeData()); + GlobalFree((HGLOBAL)(DWORD) m_printData.GetNativeData()); } - m_printData.SetNativeData((void*) pd->hDevMode); + m_printData.SetNativeData((void*)(long) pd->hDevMode); 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, // into wxWindows form. m_printData.ConvertFromNative(); - m_printFromPage = pd->nFromPage ; - m_printToPage = pd->nToPage ; - m_printMinPage = pd->nMinPage ; - m_printMaxPage = pd->nMaxPage ; - m_printNoCopies = pd->nCopies ; + m_printFromPage = pd->nFromPage; + m_printToPage = pd->nToPage; + m_printMinPage = pd->nMinPage; + m_printMaxPage = pd->nMaxPage; + m_printNoCopies = pd->nCopies; m_printAllPages = ((pd->Flags & PD_ALLPAGES) == PD_ALLPAGES); + m_printSelection = ((pd->Flags & PD_SELECTION) == PD_SELECTION); m_printCollate = ((pd->Flags & PD_COLLATE) == PD_COLLATE); m_printToFile = ((pd->Flags & PD_PRINTTOFILE) == PD_PRINTTOFILE); m_printEnablePrintToFile = ((pd->Flags & PD_DISABLEPRINTTOFILE) != PD_DISABLEPRINTTOFILE); @@ -839,12 +1115,35 @@ void wxPrintDialogData::SetOwnerWindow(wxWindow* win) if ( m_printDlgData != NULL && win != NULL) { - PRINTDLG *pd = (PRINTDLG *) m_printDlgData ; + PRINTDLG *pd = (PRINTDLG *) m_printDlgData; pd->hwndOwner=(HWND) win->GetHWND(); } } #endif // MSW +#ifdef __WXMAC__ +void wxPrintDialogData::ConvertToNative() +{ +#if TARGET_CARBON +#else + (**(THPrint)m_printData.m_macPrintSettings).prJob.iFstPage = m_printFromPage; + (**(THPrint)m_printData.m_macPrintSettings).prJob.iLstPage = m_printToPage; + m_printData.ConvertToNative(); +#endif +} + +void wxPrintDialogData::ConvertFromNative() +{ +#if TARGET_CARBON +#else + m_printData.ConvertFromNative(); + m_printFromPage = (**(THPrint)m_printData.m_macPrintSettings).prJob.iFstPage; + m_printToPage = (**(THPrint)m_printData.m_macPrintSettings).prJob.iLstPage; +#endif +} +#endif + + void wxPrintDialogData::operator=(const wxPrintDialogData& data) { m_printFromPage = data.m_printFromPage; @@ -855,6 +1154,7 @@ void wxPrintDialogData::operator=(const wxPrintDialogData& data) m_printAllPages = data.m_printAllPages; m_printCollate = data.m_printCollate; m_printToFile = data.m_printToFile; + m_printSelection = data.m_printSelection; m_printEnableSelection = data.m_printEnableSelection; m_printEnablePageNumbers = data.m_printEnablePageNumbers; m_printEnableHelp = data.m_printEnableHelp; @@ -898,7 +1198,11 @@ wxPageSetupDialogData::wxPageSetupDialogData() } wxPageSetupDialogData::wxPageSetupDialogData(const wxPageSetupDialogData& dialogData) + : wxObject() { +#if defined(__WIN95__) + m_pageSetupData = NULL; +#endif (*this) = dialogData; } @@ -935,12 +1239,14 @@ wxPageSetupDialogData::~wxPageSetupDialogData() PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData; if ( pd && pd->hDevMode ) GlobalFree(pd->hDevMode); + if ( pd && pd->hDevNames ) + GlobalFree(pd->hDevNames); if ( pd ) delete pd; #endif } -void wxPageSetupDialogData::operator=(const wxPageSetupDialogData& data) +wxPageSetupDialogData& wxPageSetupDialogData::operator=(const wxPageSetupDialogData& data) { m_paperSize = data.m_paperSize; m_minMarginTopLeft = data.m_minMarginTopLeft; @@ -956,11 +1262,15 @@ void wxPageSetupDialogData::operator=(const wxPageSetupDialogData& data) m_enableHelp = data.m_enableHelp; m_printData = data.m_printData; + + return *this; } -void wxPageSetupDialogData::operator=(const wxPrintData& data) +wxPageSetupDialogData& wxPageSetupDialogData::operator=(const wxPrintData& data) { m_printData = data; + + return *this; } #if defined(__WIN95__) @@ -974,6 +1284,7 @@ void wxPageSetupDialogData::ConvertToNative() { pd = new PAGESETUPDLG; pd->hDevMode = NULL; + pd->hDevNames = NULL; m_pageSetupData = (void *)pd; } @@ -987,12 +1298,26 @@ void wxPageSetupDialogData::ConvertToNative() pd->hDevMode = NULL; } - pd->hDevMode = (HGLOBAL) m_printData.GetNativeData(); m_printData.SetNativeData((void*) NULL); - wxASSERT_MSG( (pd->hDevMode), "hDevMode must be non-NULL in ConvertToNative!"); + // Shouldn't assert; we should be able to test Ok-ness at a higher level + //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)); @@ -1018,9 +1343,9 @@ void wxPageSetupDialogData::ConvertToNative() pd->lStructSize = sizeof( PAGESETUPDLG ); pd->hwndOwner=(HWND)NULL; - pd->hDevNames=(HWND)NULL; +// pd->hDevNames=(HWND)NULL; pd->hInstance=(HINSTANCE)NULL; - + // PAGESETUPDLG is in hundreds of a mm pd->ptPaperSize.x = m_paperSize.x * 100; pd->ptPaperSize.y = m_paperSize.y * 100; @@ -1055,7 +1380,7 @@ void wxPageSetupDialogData::ConvertToNative() void wxPageSetupDialogData::ConvertFromNative() { - PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData ; + PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData; if ( !pd ) return; @@ -1073,6 +1398,20 @@ void wxPageSetupDialogData::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; m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS); @@ -1083,6 +1422,7 @@ void wxPageSetupDialogData::ConvertFromNative() m_getDefaultInfo = ((pd->Flags & PSD_RETURNDEFAULT) == PSD_RETURNDEFAULT); m_enableHelp = ((pd->Flags & PSD_SHOWHELP) == PSD_SHOWHELP); + // PAGESETUPDLG is in hundreds of a mm m_paperSize.x = pd->ptPaperSize.x / 100; m_paperSize.y = pd->ptPaperSize.y / 100; @@ -1091,10 +1431,10 @@ void wxPageSetupDialogData::ConvertFromNative() m_minMarginBottomRight.x = pd->rtMinMargin.right / 100; m_minMarginBottomRight.y = pd->rtMinMargin.bottom / 100; - m_marginTopLeft.x = pd->rtMargin.left / 100 ; - m_marginTopLeft.y = pd->rtMargin.top / 100 ; - m_marginBottomRight.x = pd->rtMargin.right / 100 ; - m_marginBottomRight.y = pd->rtMargin.bottom / 100 ; + m_marginTopLeft.x = pd->rtMargin.left / 100; + m_marginTopLeft.y = pd->rtMargin.top / 100; + m_marginBottomRight.x = pd->rtMargin.right / 100; + m_marginBottomRight.y = pd->rtMargin.bottom / 100; } void wxPageSetupDialogData::SetOwnerWindow(wxWindow* win) @@ -1104,12 +1444,65 @@ void wxPageSetupDialogData::SetOwnerWindow(wxWindow* win) if ( m_pageSetupData != NULL && win != NULL) { - PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData ; + PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData; pd->hwndOwner=(HWND) win->GetHWND(); } } #endif // Win95 +#ifdef __WXMAC__ +void wxPageSetupDialogData::ConvertToNative() +{ + m_printData.ConvertToNative(); + // on mac the paper rect has a negative top left corner, because the page rect (printable area) is at 0,0 +#if TARGET_CARBON +#else + (**(THPrint)m_printData.m_macPrintSettings).rPaper.left = int( ((double) m_minMarginTopLeft.x)*mm2pt ); + (**(THPrint)m_printData.m_macPrintSettings).rPaper.top = int( ((double) m_minMarginTopLeft.y)*mm2pt ); + + (**(THPrint)m_printData.m_macPrintSettings).rPaper.right = int( ((double) m_paperSize.x - m_minMarginTopLeft.x)*mm2pt ); + (**(THPrint)m_printData.m_macPrintSettings).rPaper.bottom = int( ((double) m_paperSize.y - m_minMarginTopLeft.y)*mm2pt ); + + (**(THPrint)m_printData.m_macPrintSettings).prInfo.rPage.left = 0; + (**(THPrint)m_printData.m_macPrintSettings).prInfo.rPage.top = 0; + (**(THPrint)m_printData.m_macPrintSettings).prInfo.rPage.right = int( ((double) m_paperSize.x - m_minMarginTopLeft.x - m_minMarginBottomRight.x)*mm2pt ); + (**(THPrint)m_printData.m_macPrintSettings).prInfo.rPage.bottom = int( ((double) m_paperSize.y - m_minMarginTopLeft.y - m_minMarginBottomRight.y)*mm2pt ); +#endif +} + +void wxPageSetupDialogData::ConvertFromNative() +{ + m_printData.ConvertFromNative (); + +#if TARGET_CARBON +#else + m_paperSize.x = ((double) (**(THPrint)m_printData.m_macPrintSettings).rPaper.right - (**(THPrint)m_printData.m_macPrintSettings).rPaper.left ) * pt2mm; + m_paperSize.y = ((double) (**(THPrint)m_printData.m_macPrintSettings).rPaper.bottom - (**(THPrint)m_printData.m_macPrintSettings).rPaper.top ) * pt2mm; + + m_minMarginTopLeft.x = ((double) -(**(THPrint)m_printData.m_macPrintSettings).rPaper.left ) * pt2mm; + m_minMarginTopLeft.y = ((double) -(**(THPrint)m_printData.m_macPrintSettings).rPaper.top ) * pt2mm; + + m_minMarginBottomRight.x = ((double) (**(THPrint)m_printData.m_macPrintSettings).rPaper.right - (**(THPrint)m_printData.m_macPrintSettings).prInfo.rPage.right ) * pt2mm; + m_minMarginBottomRight.y = ((double)(**(THPrint)m_printData.m_macPrintSettings).rPaper.bottom - (**(THPrint)m_printData.m_macPrintSettings).prInfo.rPage.bottom ) * pt2mm; +#endif + // adjust minimal values + //TODO add custom fields in dialog for margins + + if ( m_marginTopLeft.x < m_minMarginTopLeft.x ) + m_marginTopLeft.x = m_minMarginTopLeft.x; + + if ( m_marginBottomRight.x < m_minMarginBottomRight.x ) + m_marginBottomRight.x = m_minMarginBottomRight.x; + + if ( m_marginTopLeft.y < m_minMarginTopLeft.y ) + m_marginTopLeft.y = m_minMarginTopLeft.y; + + if ( m_marginBottomRight.y < m_minMarginBottomRight.y ) + m_marginBottomRight.y = m_minMarginBottomRight.y; +} +#endif + + // If a corresponding paper type is found in the paper database, will set the m_printData // paper size id member as well. void wxPageSetupDialogData::SetPaperSize(const wxSize& sz) @@ -1132,8 +1525,7 @@ void wxPageSetupDialogData::SetPaperSize(wxPaperSize id) void wxPageSetupDialogData::CalculateIdFromPaperSize() { wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), - "wxThePrintPaperDatabase should not be NULL. " - "Do not create global print dialog data objects." ); + wxT("wxThePrintPaperDatabase should not be NULL. Do not create global print dialog data objects.") ); wxSize sz = GetPaperSize(); @@ -1148,16 +1540,13 @@ void wxPageSetupDialogData::CalculateIdFromPaperSize() void wxPageSetupDialogData::CalculatePaperSizeFromId() { wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), - "wxThePrintPaperDatabase should not be NULL. " - "Do not create global print dialog data objects." ); + wxT("wxThePrintPaperDatabase should not be NULL. Do not create global print dialog data objects.") ); wxSize sz = wxThePrintPaperDatabase->GetSize(m_printData.GetPaperId()); - if (sz.x != 0) - { - // sz is in 10ths of a mm, so multiply by 10. - m_paperSize.x = sz.x * 10; - m_paperSize.y = sz.y * 10; - } + // sz is in 10ths of a mm, while paper size is in mm + m_paperSize.x = sz.x / 10; + m_paperSize.y = sz.y / 10; } +#endif // wxUSE_PRINTING_ARCHITECTURE