X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7bcb11d30764df47144189e164f53d8171ed4a63..236a9de39afa090fdee3cf91cb5364ceca69e3f8:/src/common/cmndata.cpp?ds=sidebyside diff --git a/src/common/cmndata.cpp b/src/common/cmndata.cpp index 08bd0fa4de..2e612f6ad5 100644 --- a/src/common/cmndata.cpp +++ b/src/common/cmndata.cpp @@ -9,66 +9,97 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ -#pragma implementation "cmndata.h" + #pragma implementation "cmndata.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP -#include -#include "wx/string.h" -#include "wx/utils.h" -#include "wx/app.h" + #include + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/app.h" #endif #include "wx/gdicmn.h" #include "wx/cmndata.h" -#include "wx/paper.h" +#include "wx/log.h" // For compatibility -#if (defined(__WXMOTIF__) || defined(__WXGTK__)) && wxUSE_POSTSCRIPT -#include "wx/generic/dcpsg.h" -#endif - -#ifdef __WXMSW__ -#include - -#if !defined(__WIN32__) -#include -#include -#endif - -#if defined(__WATCOMC__) || defined(__SC__) || defined(__SALFORDC__) -#include -#include +#if (defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__)) && wxUSE_POSTSCRIPT + #define wxCOMPATIBILITY_WITH_PRINTSETUPDATA 1 #endif -#endif +#if wxUSE_PRINTING_ARCHITECTURE + #include "wx/paper.h" -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxPrintData, wxObject) -IMPLEMENT_DYNAMIC_CLASS(wxPrintDialogData, wxObject) -IMPLEMENT_DYNAMIC_CLASS(wxPageSetupDialogData, wxObject) -IMPLEMENT_DYNAMIC_CLASS(wxFontData, wxObject) -IMPLEMENT_DYNAMIC_CLASS(wxColourData, wxObject) -#endif + #if wxCOMPATIBILITY_WITH_PRINTSETUPDATA + #include "wx/generic/dcpsg.h" + #endif +#endif // wxUSE_PRINTING_ARCHITECTURE -/* -* wxColourData -*/ +#ifdef __WXMSW__ + #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 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__ + #define mm2pt 2.83464566929 + #define pt2mm 0.352777777778 +#endif // Mac + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxColourData +// ---------------------------------------------------------------------------- wxColourData::wxColourData() { int i; for (i = 0; i < 16; i++) custColours[i].Set(255, 255, 255); - + chooseFull = FALSE; dataColour.Set(0,0,0); } @@ -86,7 +117,7 @@ void wxColourData::SetCustomColour(int i, wxColour& colour) { if (i > 15 || i < 0) return; - + custColours[i] = colour; } @@ -94,7 +125,7 @@ wxColour wxColourData::GetCustomColour(int i) { if (i > 15 || i < 0) return wxColour(0,0,0); - + return custColours[i]; } @@ -103,61 +134,50 @@ void wxColourData::operator=(const wxColourData& data) int i; for (i = 0; i < 16; i++) custColours[i] = data.custColours[i]; - + dataColour = (wxColour&)data.dataColour; chooseFull = data.chooseFull; } -/* -* Font data -*/ +// ---------------------------------------------------------------------------- +// Font data +// ---------------------------------------------------------------------------- wxFontData::wxFontData() { // Intialize colour to black. fontColour.Set(0, 0, 0); - + showHelp = FALSE; allowSymbols = TRUE; 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) -{ - fontColour = data.fontColour; - showHelp = data.showHelp; - allowSymbols = data.allowSymbols; - enableEffects = data.enableEffects; - initialFont = data.initialFont; - chosenFont = data.chosenFont; - minSize = data.minSize; - maxSize = data.maxSize; -} - -/* -* Print data -*/ +#if wxUSE_PRINTING_ARCHITECTURE +// ---------------------------------------------------------------------------- +// Print data +// ---------------------------------------------------------------------------- wxPrintData::wxPrintData() { #ifdef __WXMSW__ - m_devMode = NULL; + m_devMode = (void*) NULL; + m_devNames = (void*) NULL; +#elif defined( __WXMAC__ ) + m_macPrintInfo = NULL ; #endif m_printOrientation = wxPORTRAIT; m_printNoCopies = 1; m_printCollate = FALSE; - + // New, 24/3/99 m_printerName = ""; m_colour = TRUE; @@ -181,51 +201,123 @@ wxPrintData::wxPrintData() wxPrintData::wxPrintData(const wxPrintData& printData) { +#ifdef __WXMSW__ + m_devMode = (void*) NULL; + m_devNames = (void*) NULL; +#elif defined( __WXMAC__ ) + m_macPrintInfo = NULL ; +#endif (*this) = printData; } wxPrintData::~wxPrintData() { #ifdef __WXMSW__ - HGLOBAL hDevMode = (HGLOBAL) hDevMode; - if (hDevMode ) + HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; + if ( hDevMode ) GlobalFree(hDevMode); - /* - PRINTDLG *pd = (PRINTDLG *) m_printData; - if ( pd && pd->hDevMode ) - GlobalFree(pd->hDevMode); - if ( pd ) - delete pd; - */ + HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; + if ( hDevNames ) + GlobalFree(hDevNames); +#elif defined(__WXMAC__) + if ( m_macPrintInfo ) + ::DisposeHandle( (Handle) m_macPrintInfo ) ; #endif } -#ifdef __WXMSW__ +#if defined(__WXMSW__) // && defined(__WIN32__) + +#if defined(__WXDEBUG__) && defined(__WIN32__) +static wxString wxGetPrintDlgError() +{ + DWORD err = CommDlgExtendedError(); + wxString msg = wxT("Unknown"); + switch (err) + { + 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); + 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() { - 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; - + // GNU-WIN32 has the wrong size PRINTDLG - can't work out why. #ifdef __GNUWIN32__ + memset(pd, 0, 66); pd->lStructSize = 66 ; - memset(pd, 0, sizeof(PRINTDLG)); #else - 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->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)) @@ -236,43 +328,59 @@ void wxPrintData::ConvertToNative() GlobalFree(pd->hDevNames); pd->hDevMode = NULL; pd->hDevNames = NULL; + +#if defined(__WXDEBUG__) && defined(__WIN32__) + wxString str(wxT("Printing error: ")); + str += wxGetPrintDlgError(); + wxLogDebug(str); +#endif } else { + hDevMode = pd->hDevMode; + m_devMode = (void*)(long) hDevMode; + pd->hDevMode = NULL; + + // We'll create a new DEVNAMEs structure below. if ( pd->hDevNames ) GlobalFree(pd->hDevNames); pd->hDevNames = NULL; - hDevMode = pd->hDevMode; - m_devMode = (void*) hDevMode; - pd->hDevMode = NULL; + // hDevNames = pd->hDevNames; + // m_devNames = (void*)(long) hDevNames; + // pd->hDevnames = NULL; + } delete pd; } - + 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 - + devMode->dmCopies = m_printNoCopies; devMode->dmFields |= DM_COPIES; - + //// Printer name - - if (m_printerName != "") + + if (m_printerName != wxT("")) { // TODO: make this Unicode compatible int len = wxMin(31, m_printerName.Len()); @@ -281,18 +389,19 @@ void wxPrintData::ConvertToNative() devMode->dmDeviceName[i] = m_printerName.GetChar(i); devMode->dmDeviceName[i] = 0; } - + //// Colour - + if (m_colour) devMode->dmColor = DMCOLOR_COLOR; else devMode->dmColor = DMCOLOR_MONOCHROME; - + devMode->dmFields |= DM_COLOR; - + +#ifndef __WXWINE__ //// Paper size - + if (m_paperId == wxPAPER_NONE) { devMode->dmPaperWidth = m_paperSize.x * 10; @@ -312,9 +421,10 @@ void wxPrintData::ConvertToNative() } } } - +#endif + //// Duplex - + int duplex; switch (m_duplexMode) { @@ -331,9 +441,9 @@ void wxPrintData::ConvertToNative() } devMode->dmDuplex = duplex; devMode->dmFields |= DM_DUPLEX; - + //// Quality - + int quality; switch (m_printQuality) { @@ -355,29 +465,41 @@ void wxPrintData::ConvertToNative() } devMode->dmPrintQuality = quality; devMode->dmFields |= DM_PRINTQUALITY; - + 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() { - 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) @@ -385,16 +507,17 @@ void wxPrintData::ConvertFromNative() else m_printCollate = FALSE; } - +#endif + //// Number of copies - + if (devMode->dmFields & DM_COPIES) { m_printNoCopies = devMode->dmCopies; } - + //// Printer name - + if (devMode->dmDeviceName[0] != 0) { // TODO: make this Unicode compatible @@ -406,12 +529,12 @@ void wxPrintData::ConvertFromNative() i ++; } buf[i] = 0; - + m_printerName = buf; } - + //// Colour - + if (devMode->dmFields & DM_COLOR) { if (devMode->dmColor == DMCOLOR_COLOR) @@ -421,9 +544,10 @@ void wxPrintData::ConvertFromNative() } else m_colour = TRUE; - + +#ifndef __WXWINE__ //// Paper size - + if (devMode->dmFields & DM_PAPERSIZE) { if (wxThePrintPaperDatabase) @@ -438,8 +562,8 @@ void wxPrintData::ConvertFromNative() 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; m_paperSize.y = 0; @@ -448,8 +572,8 @@ 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; m_paperSize.y = 0; @@ -464,16 +588,16 @@ 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 - + if (devMode->dmFields & DM_DUPLEX) { switch (devMode->dmDuplex) @@ -492,9 +616,9 @@ void wxPrintData::ConvertFromNative() } else m_duplexMode = wxDUPLEX_SIMPLEX; - + //// Quality - + if (devMode->dmFields & DM_PRINTQUALITY) { switch (devMode->dmPrintQuality) @@ -517,17 +641,70 @@ void wxPrintData::ConvertFromNative() // will the application know if it's high, low, draft etc.?? // wxFAIL_MSG("Warning: DM_PRINTQUALITY was not one of the standard values."); m_printQuality = devMode->dmPrintQuality; break; - + } } } else m_printQuality = wxPRINT_QUALITY_HIGH; - + 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 + +#ifdef __WXMAC__ +void wxPrintData::ConvertToNative() +{ + if ( !m_macPrintInfo ) + { + m_macPrintInfo = (THPrint) NewHandleClear( sizeof( TPrint ) ) ; + if ( m_macPrintInfo ) + { + ::PrintDefault( m_macPrintInfo ) ; + // todo setup the global pagesetup ? + } + } + if ( m_macPrintInfo ) + { + (**m_macPrintInfo).prJob.iCopies = m_printNoCopies ; + (**m_macPrintInfo).prJob.iFstPage = 0 ; + (**m_macPrintInfo).prJob.iLstPage = 0 ; + } } +void wxPrintData::ConvertFromNative() +{ + if ( m_macPrintInfo ) + { + m_printNoCopies = (**m_macPrintInfo).prJob.iCopies ; + } +} #endif void wxPrintData::operator=(const wxPrintData& data) @@ -556,7 +733,7 @@ void wxPrintData::operator=(const wxPrintData& data) } // For compatibility -#if (defined(__WXMOTIF__) || defined(__WXGTK__)) && wxUSE_POSTSCRIPT +#if wxCOMPATIBILITY_WITH_PRINTSETUPDATA void wxPrintData::operator=(const wxPrintSetupData& setupData) { SetPrinterCommand(setupData.GetPrinterCommand()); @@ -579,17 +756,19 @@ void wxPrintData::operator=(const wxPrintSetupData& setupData) SetColour(setupData.GetColour()); SetFilename(setupData.GetPrinterFile()); } -#endif - +#endif // wxCOMPATIBILITY_WITH_PRINTSETUPDATA -/* - * Print dialog data - */ + +// ---------------------------------------------------------------------------- +// Print dialog data +// ---------------------------------------------------------------------------- wxPrintDialogData::wxPrintDialogData() { #ifdef __WXMSW__ m_printDlgData = NULL; +#elif defined( __WXMAC__ ) + m_macPrintInfo = NULL ; #endif m_printFromPage = 0; m_printToPage = 0; @@ -599,6 +778,7 @@ wxPrintDialogData::wxPrintDialogData() m_printAllPages = FALSE; m_printCollate = FALSE; m_printToFile = FALSE; + m_printSelection = FALSE; m_printEnableSelection = FALSE; m_printEnablePageNumbers = TRUE; m_printEnablePrintToFile = TRUE; @@ -608,6 +788,11 @@ wxPrintDialogData::wxPrintDialogData() wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData& dialogData) { +#ifdef __WXMSW__ + m_printDlgData = NULL; +#elif defined( __WXMAC__ ) + m_macPrintInfo = NULL ; +#endif (*this) = dialogData; } @@ -615,6 +800,8 @@ wxPrintDialogData::wxPrintDialogData(const wxPrintData& printData) { #ifdef __WXMSW__ m_printDlgData = NULL; +#elif defined( __WXMAC__ ) + m_macPrintInfo = NULL ; #endif m_printFromPage = 0; m_printToPage = 0; @@ -624,6 +811,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; @@ -641,6 +829,9 @@ wxPrintDialogData::~wxPrintDialogData() GlobalFree(pd->hDevMode); if ( pd ) delete pd; +#elif defined(__WXMAC__) + if ( m_macPrintInfo ) + ::DisposeHandle( (Handle) m_macPrintInfo ) ; #endif } @@ -660,8 +851,8 @@ void wxPrintDialogData::ConvertToNative() #ifdef __GNUWIN32__ 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 @@ -677,11 +868,22 @@ 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!"); + 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; @@ -689,7 +891,7 @@ void wxPrintDialogData::ConvertToNative() pd->nMinPage = (UINT)m_printMinPage; pd->nMaxPage = (UINT)m_printMaxPage; pd->nCopies = (UINT)m_printNoCopies; - + pd->Flags = PD_RETURNDC ; #ifdef __GNUWIN32__ @@ -699,7 +901,7 @@ void wxPrintDialogData::ConvertToNative() #endif pd->hwndOwner=(HWND)NULL; - pd->hDevNames=(HANDLE)NULL; +// pd->hDevNames=(HANDLE)NULL; pd->hInstance=(HINSTANCE)NULL; pd->lCustData = (LPARAM) NULL; pd->lpfnPrintHook = NULL; @@ -708,9 +910,11 @@ void wxPrintDialogData::ConvertToNative() pd->lpSetupTemplateName = NULL; pd->hPrintTemplate = (HGLOBAL) NULL; pd->hSetupTemplate = (HGLOBAL) NULL; - + if ( m_printAllPages ) pd->Flags |= PD_ALLPAGES; + if ( m_printAllPages ) + pd->Flags |= PD_SELECTION; if ( m_printCollate ) pd->Flags |= PD_COLLATE; if ( m_printToFile ) @@ -739,12 +943,24 @@ 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(); @@ -754,8 +970,9 @@ void wxPrintDialogData::ConvertFromNative() 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); @@ -773,7 +990,7 @@ void wxPrintDialogData::ConvertFromNative() m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset); wxString devName = (LPSTR)lpDevNames + lpDevNames->wDeviceOffset; GlobalUnlock(pd->hDevNames); - + // wxASSERT_MSG( (m_printerName == "" || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!"); } } @@ -784,15 +1001,47 @@ void wxPrintDialogData::SetOwnerWindow(wxWindow* win) { if ( m_printDlgData == NULL ) ConvertToNative(); - + if ( m_printDlgData != NULL && win != NULL) { PRINTDLG *pd = (PRINTDLG *) m_printDlgData ; pd->hwndOwner=(HWND) win->GetHWND(); } } +#endif // MSW + +#ifdef __WXMAC__ +void wxPrintDialogData::ConvertToNative() +{ + if ( !m_macPrintInfo ) + { + m_macPrintInfo = (THPrint) NewHandleClear( sizeof( TPrint ) ) ; + if ( m_macPrintInfo ) + { + ::PrintDefault( m_macPrintInfo ) ; + // todo setup the global pagesetup ? + } + } + if ( m_macPrintInfo ) + { + (**m_macPrintInfo).prJob.iCopies = m_printNoCopies ; + (**m_macPrintInfo).prJob.iFstPage = m_printFromPage ; + (**m_macPrintInfo).prJob.iLstPage = m_printToPage ; + } +} + +void wxPrintDialogData::ConvertFromNative() +{ + if ( m_macPrintInfo ) + { + m_printNoCopies = (**m_macPrintInfo).prJob.iCopies ; + m_printFromPage = (**m_macPrintInfo).prJob.iFstPage ; + m_printToPage = (**m_macPrintInfo).prJob.iLstPage ; + } +} #endif + void wxPrintDialogData::operator=(const wxPrintDialogData& data) { m_printFromPage = data.m_printFromPage; @@ -803,6 +1052,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; @@ -817,14 +1067,16 @@ void wxPrintDialogData::operator=(const wxPrintData& data) m_printData = data; } -/* - * wxPageSetupDialogData - */ +// ---------------------------------------------------------------------------- +// wxPageSetupDialogData +// ---------------------------------------------------------------------------- wxPageSetupDialogData::wxPageSetupDialogData() { #if defined(__WIN95__) m_pageSetupData = NULL; +#elif defined( __WXMAC__ ) + m_macPageSetupInfo = NULL ; #endif m_paperSize = wxSize(0, 0); @@ -847,6 +1099,11 @@ wxPageSetupDialogData::wxPageSetupDialogData() wxPageSetupDialogData::wxPageSetupDialogData(const wxPageSetupDialogData& dialogData) { +#if defined(__WIN95__) + m_pageSetupData = NULL; +#elif defined( __WXMAC__ ) + m_macPageSetupInfo = NULL ; +#endif (*this) = dialogData; } @@ -854,6 +1111,8 @@ wxPageSetupDialogData::wxPageSetupDialogData(const wxPrintData& printData) { #if defined(__WIN95__) m_pageSetupData = NULL; +#elif defined( __WXMAC__ ) + m_macPageSetupInfo = NULL ; #endif m_paperSize = wxSize(0, 0); m_minMarginTopLeft = wxPoint(0, 0); @@ -883,8 +1142,13 @@ 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; +#elif defined( __WXMAC__ ) + if( m_macPageSetupInfo ) + ::DisposeHandle( (Handle) m_macPageSetupInfo ) ; #endif } @@ -911,7 +1175,7 @@ void wxPageSetupDialogData::operator=(const wxPrintData& data) m_printData = data; } -#if defined(__WXMSW__) && defined(__WIN95__) +#if defined(__WIN95__) void wxPageSetupDialogData::ConvertToNative() { m_printData.ConvertToNative(); @@ -922,6 +1186,7 @@ void wxPageSetupDialogData::ConvertToNative() { pd = new PAGESETUPDLG; pd->hDevMode = NULL; + pd->hDevNames = NULL; m_pageSetupData = (void *)pd; } @@ -935,17 +1200,30 @@ 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!"); + 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->Flags = PSD_MARGINS|PSD_MINMARGINS; - + if ( m_defaultMinMargins ) pd->Flags |= PSD_DEFAULTMINMARGINS; if ( !m_enableMargins ) @@ -966,29 +1244,29 @@ void wxPageSetupDialogData::ConvertToNative() pd->lStructSize = sizeof( PAGESETUPDLG ); pd->hwndOwner=(HWND)NULL; - pd->hDevNames=(HWND)NULL; +// pd->hDevNames=(HWND)NULL; pd->hInstance=(HINSTANCE)NULL; - + pd->ptPaperSize.x = m_paperSize.x * 100; pd->ptPaperSize.y = m_paperSize.y * 100; - + pd->rtMinMargin.left = m_minMarginTopLeft.x * 100; pd->rtMinMargin.top = m_minMarginTopLeft.y * 100; pd->rtMinMargin.right = m_minMarginBottomRight.x * 100; pd->rtMinMargin.bottom = m_minMarginBottomRight.y * 100; - + pd->rtMargin.left = m_marginTopLeft.x * 100; pd->rtMargin.top = m_marginTopLeft.y * 100; pd->rtMargin.right = m_marginBottomRight.x * 100; pd->rtMargin.bottom = m_marginBottomRight.y * 100; - + pd->lCustData = 0; pd->lpfnPageSetupHook = NULL; pd->lpfnPagePaintHook = NULL; pd->hPageSetupTemplate = NULL; pd->lpPageSetupTemplateName = NULL; -/* +/* if ( pd->hDevMode ) { DEVMODE *devMode = (DEVMODE*) GlobalLock(pd->hDevMode); @@ -1006,7 +1284,7 @@ void wxPageSetupDialogData::ConvertFromNative() PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData ; if ( !pd ) return; - + // Pass the devmode data back to the wxPrintData structure where it really belongs. if (pd->hDevMode) { @@ -1021,8 +1299,22 @@ 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); m_enableMargins = ((pd->Flags & PSD_DISABLEMARGINS) != PSD_DISABLEMARGINS); m_enableOrientation = ((pd->Flags & PSD_DISABLEORIENTATION) != PSD_DISABLEORIENTATION); @@ -1030,15 +1322,15 @@ void wxPageSetupDialogData::ConvertFromNative() m_enablePrinter = ((pd->Flags & PSD_DISABLEPRINTER) != PSD_DISABLEPRINTER); m_getDefaultInfo = ((pd->Flags & PSD_RETURNDEFAULT) == PSD_RETURNDEFAULT); m_enableHelp = ((pd->Flags & PSD_SHOWHELP) == PSD_SHOWHELP); - + m_paperSize.x = pd->ptPaperSize.x / 100; m_paperSize.y = pd->ptPaperSize.y / 100; - + m_minMarginTopLeft.x = pd->rtMinMargin.left / 100; m_minMarginTopLeft.y = pd->rtMinMargin.top / 100; 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 ; @@ -1049,15 +1341,78 @@ void wxPageSetupDialogData::SetOwnerWindow(wxWindow* win) { if ( m_pageSetupData == NULL ) ConvertToNative(); - + if ( m_pageSetupData != NULL && win != NULL) { PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData ; pd->hwndOwner=(HWND) win->GetHWND(); } } +#endif // Win95 + +#ifdef __WXMAC__ +void wxPageSetupDialogData::ConvertToNative() +{ + if ( !m_macPageSetupInfo ) + { + m_macPageSetupInfo = (THPrint) NewHandleClear( sizeof( TPrint ) ) ; + if ( m_macPageSetupInfo ) + { + ::PrintDefault( m_macPageSetupInfo ) ; + } + } + if ( m_macPageSetupInfo ) + { + // on mac the paper rect has a negative top left corner, because the page rect (printable area) is at 0,0 + (**m_macPageSetupInfo).rPaper.left = int( ((double) m_minMarginTopLeft.x)*mm2pt ) ; + (**m_macPageSetupInfo).rPaper.top = int( ((double) m_minMarginTopLeft.y)*mm2pt ) ; + + (**m_macPageSetupInfo).rPaper.right = int( ((double) m_paperSize.x - m_minMarginTopLeft.x)*mm2pt ) ; + (**m_macPageSetupInfo).rPaper.bottom = int( ((double) m_paperSize.y - m_minMarginTopLeft.y)*mm2pt ) ; + + (**m_macPageSetupInfo).prInfo.rPage.left = 0 ; + (**m_macPageSetupInfo).prInfo.rPage.top = 0 ; + (**m_macPageSetupInfo).prInfo.rPage.right = int( ((double) m_paperSize.x - m_minMarginTopLeft.x - m_minMarginBottomRight.x)*mm2pt ) ; + (**m_macPageSetupInfo).prInfo.rPage.bottom = int( ((double) m_paperSize.y - m_minMarginTopLeft.y - m_minMarginBottomRight.y)*mm2pt ) ; + + //TODO add custom fields in dialog for margins + + } +} + +void wxPageSetupDialogData::ConvertFromNative() +{ + if ( m_macPageSetupInfo ) + { + m_paperSize.x = ((double) (**m_macPageSetupInfo).rPaper.right - (**m_macPageSetupInfo).rPaper.left ) * pt2mm ; + m_paperSize.y = ((double) (**m_macPageSetupInfo).rPaper.bottom - (**m_macPageSetupInfo).rPaper.top ) * pt2mm ; + + m_minMarginTopLeft.x = ((double) -(**m_macPageSetupInfo).rPaper.left ) * pt2mm ; + m_minMarginTopLeft.y = ((double) -(**m_macPageSetupInfo).rPaper.top ) * pt2mm ; + + m_minMarginBottomRight.x = ((double) (**m_macPageSetupInfo).rPaper.right - (**m_macPageSetupInfo).prInfo.rPage.right ) * pt2mm ; + m_minMarginBottomRight.y = ((double)(**m_macPageSetupInfo).rPaper.bottom - (**m_macPageSetupInfo).prInfo.rPage.bottom ) * pt2mm ; + + // 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) @@ -1079,7 +1434,9 @@ void wxPageSetupDialogData::SetPaperSize(wxPaperSize id) // paper id void wxPageSetupDialogData::CalculateIdFromPaperSize() { - wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), "wxThePrintPaperDatabase should not be NULL. Do not create global print dialog data objects." ); + wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), + wxT("wxThePrintPaperDatabase should not be NULL. " + "Do not create global print dialog data objects.") ); wxSize sz = GetPaperSize(); @@ -1089,11 +1446,13 @@ void wxPageSetupDialogData::CalculateIdFromPaperSize() m_printData.SetPaperId(id); } } - + // Use paper id in wxPrintData to set this object's paper size void wxPageSetupDialogData::CalculatePaperSizeFromId() { - wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), "wxThePrintPaperDatabase should not be NULL. Do not create global print dialog data objects." ); + wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), + wxT("wxThePrintPaperDatabase should not be NULL. " + "Do not create global print dialog data objects.") ); wxSize sz = wxThePrintPaperDatabase->GetSize(m_printData.GetPaperId()); @@ -1104,3 +1463,5 @@ void wxPageSetupDialogData::CalculatePaperSizeFromId() m_paperSize.y = sz.y * 10; } } + +#endif // wxUSE_PRINTING_ARCHITECTURE