X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/820477cb34535937e1b6e5c56c4b7907028963e9..dd65d8c83003ebbf9ab3275957fefa8cd7c87cc3:/src/common/cmndata.cpp diff --git a/src/common/cmndata.cpp b/src/common/cmndata.cpp index 59361e1baa..42fca79834 100644 --- a/src/common/cmndata.cpp +++ b/src/common/cmndata.cpp @@ -5,7 +5,7 @@ // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem +// Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "cmndata.h" #endif @@ -38,40 +38,35 @@ #include "wx/gdicmn.h" #include "wx/cmndata.h" #include "wx/log.h" +#include "wx/prntbase.h" +#include "wx/printdlg.h" -// For compatibility -#if (defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__) || defined(__WXMAC__)) && wxUSE_POSTSCRIPT - #define wxCOMPATIBILITY_WITH_PRINTSETUPDATA 1 -#endif +#if wxUSE_FONTDLG + #include "wx/fontdlg.h" +#endif // wxUSE_FONTDLG #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 +#if defined(__WXMSW__) && !defined(__PALMOS__) + #include #include "wx/msw/private.h" - #if !defined(__WIN32__) - #include - #include - #endif // Win16 - - #ifdef __WXWINE__ - #include + #ifndef __SMARTPHONE__ /* of WinCE */ #include #endif - #if defined(__WATCOMC__) || defined(__SC__) || defined(__SALFORDC__) + #if defined(__WATCOMC__) || defined(__SYMANTEC__) || defined(__SALFORDC__) #include #include #endif #endif // MSW +#ifdef __WXMAC__ + #include "wx/mac/private/print.h" +#endif + #if wxUSE_PRINTING_ARCHITECTURE IMPLEMENT_DYNAMIC_CLASS(wxPrintData, wxObject) IMPLEMENT_DYNAMIC_CLASS(wxPrintDialogData, wxObject) @@ -81,13 +76,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxFontData, wxObject) IMPLEMENT_DYNAMIC_CLASS(wxColourData, wxObject) -#ifdef __WXMAC__ - #include "wx/mac/uma.h" - - #define mm2pt 2.83464566929 - #define pt2mm 0.352777777778 -#endif // Mac - #ifndef DMPAPER_USER #define DMPAPER_USER 256 #endif @@ -102,15 +90,13 @@ wxColourData::wxColourData() { - int i; - for (i = 0; i < 16; i++) - custColours[i].Set(255, 255, 255); - - chooseFull = FALSE; - dataColour.Set(0,0,0); + m_chooseFull = false; + m_dataColour.Set(0,0,0); + // m_custColours are wxNullColours initially } wxColourData::wxColourData(const wxColourData& data) + : wxObject() { (*this) = data; } @@ -119,30 +105,29 @@ wxColourData::~wxColourData() { } -void wxColourData::SetCustomColour(int i, wxColour& colour) +void wxColourData::SetCustomColour(int i, const wxColour& colour) { - if (i > 15 || i < 0) - return; + wxCHECK_RET( (i >= 0 && i < 16), _T("custom colour index out of range") ); - custColours[i] = colour; + m_custColours[i] = colour; } wxColour wxColourData::GetCustomColour(int i) { - if (i > 15 || i < 0) - return wxColour(0,0,0); + wxCHECK_MSG( (i >= 0 && i < 16), wxColour(0,0,0), + _T("custom colour index out of range") ); - return custColours[i]; + return m_custColours[i]; } void wxColourData::operator=(const wxColourData& data) { int i; for (i = 0; i < 16; i++) - custColours[i] = data.custColours[i]; + m_custColours[i] = data.m_custColours[i]; - dataColour = (wxColour&)data.dataColour; - chooseFull = data.chooseFull; + m_dataColour = (wxColour&)data.m_dataColour; + m_chooseFull = data.m_chooseFull; } // ---------------------------------------------------------------------------- @@ -152,13 +137,13 @@ void wxColourData::operator=(const wxColourData& data) wxFontData::wxFontData() { // Intialize colour to black. - fontColour.Set(0, 0, 0); + m_fontColour = wxNullColour; - showHelp = FALSE; - allowSymbols = TRUE; - enableEffects = TRUE; - minSize = 0; - maxSize = 0; + m_showHelp = false; + m_allowSymbols = true; + m_enableEffects = true; + m_minSize = 0; + m_maxSize = 0; m_encoding = wxFONTENCODING_SYSTEM; } @@ -167,6 +152,14 @@ wxFontData::~wxFontData() { } +#if wxUSE_FONTDLG + +wxFontDialogBase::~wxFontDialogBase() +{ +} + +#endif // wxUSE_FONTDLG + #if wxUSE_PRINTING_ARCHITECTURE // ---------------------------------------------------------------------------- // Print data @@ -174,622 +167,58 @@ wxFontData::~wxFontData() wxPrintData::wxPrintData() { -#ifdef __WXMSW__ - 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(&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(macPrintSession, m_macPageFormat); - } - - err = PMCreatePrintSettings(&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(macPrintSession, m_macPrintSettings); - } - } - ::UMAPrClose(&macPrintSession) ; - #endif -#else - m_macPrintInfo = (THPrint) NewHandleClear( sizeof( TPrint ) ); - (**m_macPrintInfo).iPrVersion = 0; // something invalid - - (**m_macPrintInfo).prInfo.iHRes = 72; - (**m_macPrintInfo).prInfo.iVRes = 72; - Rect r1 = { 0, 0, 8*72 - 2 * 18, 11*72 - 2 * 36 }; - (**m_macPrintInfo).prInfo.rPage = r1;// must have its top left & (0,0) - - Rect r2 = { -18, -36, 8*72 - 18, 11*72 - 36 }; - (**m_macPrintInfo).rPaper = r2; - (**m_macPrintInfo).prStl.iPageV = 11 * 120 ; // 11 inches in 120th of an inch - (**m_macPrintInfo).prStl.iPageH = 8 * 120 ; // 8 inches in 120th of an inch -#endif +#ifdef __WXMAC__ + m_nativePrintData = wxNativePrintData::Create() ; #endif + m_bin = wxPRINTBIN_DEFAULT; + m_printMode = wxPRINT_MODE_PRINTER; m_printOrientation = wxPORTRAIT; m_printNoCopies = 1; - m_printCollate = FALSE; + m_printCollate = false; // New, 24/3/99 - m_printerName = ""; - m_colour = TRUE; + m_printerName = wxT(""); + m_colour = true; m_duplexMode = wxDUPLEX_SIMPLEX; m_printQuality = wxPRINT_QUALITY_HIGH; m_paperId = wxPAPER_A4; m_paperSize = wxSize(210, 297); - // PostScript-specific data - m_printerCommand = ""; - m_previewCommand = ""; - m_printerOptions = ""; - m_filename = ""; - m_afmPath = ""; - m_printerScaleX = 1.0; - m_printerScaleY = 1.0; - m_printerTranslateX = 0; - m_printerTranslateY = 0; - m_printMode = wxPRINT_MODE_FILE; + m_nativeData = wxPrintFactory::GetFactory()->CreatePrintNativeData(); } 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_macPrintInfo = NULL; -#endif -#endif (*this) = printData; } wxPrintData::~wxPrintData() { -#ifdef __WXMSW__ - 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_macPrintInfo ); - // we should perhaps delete -#endif -#endif -} - -#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 ) * 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)(DWORD) m_devMode; - HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; - if (!hDevMode) - { - // Use PRINTDLG as a way of creating a DEVMODE object - PRINTDLG pd; - - // GNU-WIN32 has the wrong size PRINTDLG - can't work out why. -#ifdef __GNUWIN32__ - memset(&pd, 0, 66); - pd.lStructSize = 66; -#else - 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)) - { - 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(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; - - // hDevNames = pd->hDevNames; - // m_devNames = (void*)(long) hDevNames; - // pd->hDevnames = NULL; - - } - } - - if ( 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 != wxT("")) - { - //int len = wxMin(31, m_printerName.Len()); - wxStrncpy((wxChar*)devMode->dmDeviceName,m_printerName.c_str(),31); - devMode->dmDeviceName[31] = wxT('\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 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; - } - else - { - if (wxThePrintPaperDatabase) - { - wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperType(m_paperId); - if (paper) - { - devMode->dmPaperSize = paper->GetPlatformId(); - devMode->dmFields |= DM_PAPERSIZE; - } - } - } -#endif - - //// Duplex - - int duplex; - switch (m_duplexMode) - { - case wxDUPLEX_HORIZONTAL: { - duplex = DMDUP_HORIZONTAL; break; - } - case wxDUPLEX_VERTICAL: { - duplex = DMDUP_VERTICAL; break; - } - default: - case wxDUPLEX_SIMPLEX: { - duplex = DMDUP_SIMPLEX; break; - } - } - devMode->dmDuplex = duplex; - devMode->dmFields |= DM_DUPLEX; - - //// Quality - - int quality; - switch (m_printQuality) - { - case wxPRINT_QUALITY_MEDIUM: { - quality = DMRES_MEDIUM; break; - } - case wxPRINT_QUALITY_LOW: { - quality = DMRES_LOW; break; - } - case wxPRINT_QUALITY_DRAFT: { - quality = DMRES_DRAFT; break; - } - case wxPRINT_QUALITY_HIGH: { - quality = DMRES_HIGH; break; - } - default: { - quality = m_printQuality; break; - } - } - 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. - m_devNames = (void*) (long) wxCreateDevNames(wxT(""), m_printerName, wxT("")); -} - -void wxPrintData::ConvertFromNative() -{ - HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; - HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; - - if (!hDevMode) - return; - - if ( 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) - m_printCollate = TRUE; - 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 - char buf[32]; - int i = 0; - while (devMode->dmDeviceName[i] != 0) - { - buf[i] = devMode->dmDeviceName[i]; - i ++; - } - buf[i] = 0; - - m_printerName = buf; - } - - //// Colour - - if (devMode->dmFields & DM_COLOR) - { - if (devMode->dmColor == DMCOLOR_COLOR) - m_colour = TRUE; - else - m_colour = FALSE; - } - else - m_colour = TRUE; - -#ifndef __WXWINE__ - //// Paper size - - // 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) - { - wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperTypeByPlatformId(devMode->dmPaperSize); - if (paper) - { - m_paperId = paper->GetId(); - m_paperSize.x = paper->GetWidth() / 10; - m_paperSize.y = paper->GetHeight() / 10; - } - else - { - // Shouldn't really get here - wxFAIL_MSG(wxT("Couldn't find paper size in paper database.")); - - m_paperId = wxPAPER_NONE; - m_paperSize.x = 0; - m_paperSize.y = 0; - } - } - else - { - // Shouldn't really get here - wxFAIL_MSG(wxT("Paper database wasn't initialized in wxPrintData::ConvertFromNative.")); - - m_paperId = wxPAPER_NONE; - m_paperSize.x = 0; - m_paperSize.y = 0; - } - } - 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; - } - else - { - // Shouldn't really get here - wxFAIL_MSG(wxT("Couldn't find paper size from DEVMODE.")); - - m_paperSize.x = 0; - m_paperSize.y = 0; - m_paperId = wxPAPER_NONE; - } + m_nativeData->m_ref--; + if (m_nativeData->m_ref == 0) + delete m_nativeData; + +#ifdef __WXMAC__ + delete m_nativePrintData ; #endif - - //// Duplex - - if (devMode->dmFields & DM_DUPLEX) - { - switch (devMode->dmDuplex) - { - case DMDUP_HORIZONTAL: { - m_duplexMode = wxDUPLEX_HORIZONTAL; break; - } - case DMDUP_VERTICAL: { - m_duplexMode = wxDUPLEX_VERTICAL; break; - } - default: - case DMDUP_SIMPLEX: { - m_duplexMode = wxDUPLEX_SIMPLEX; break; - } - } - } - else - m_duplexMode = wxDUPLEX_SIMPLEX; - - //// Quality - - if (devMode->dmFields & DM_PRINTQUALITY) - { - switch (devMode->dmPrintQuality) - { - case DMRES_MEDIUM: { - m_printQuality = wxPRINT_QUALITY_MEDIUM; break; - } - case DMRES_LOW: { - m_printQuality = wxPRINT_QUALITY_LOW; break; - } - case DMRES_DRAFT: { - m_printQuality = wxPRINT_QUALITY_DRAFT; break; - } - case DMRES_HIGH: { - m_printQuality = wxPRINT_QUALITY_HIGH; break; - } - default: - { - // TODO: if the printer fills in the resolution in DPI, how - // 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 = (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() { -#ifdef TARGET_CARBON -#else - (**m_macPrintInfo).prJob.iCopies = m_printNoCopies; -#endif + m_nativePrintData->TransferFrom( this ) ; } void wxPrintData::ConvertFromNative() { -#ifdef TARGET_CARBON -#else - m_printNoCopies = (**m_macPrintInfo).prJob.iCopies; -#endif + m_nativePrintData->TransferTo( this ) ; } #endif void wxPrintData::operator=(const wxPrintData& data) { -#ifdef __WXMAC__ -#ifdef TARGET_CARBON -#else - m_macPrintInfo = data.m_macPrintInfo; - HandToHand( (Handle*) &m_macPrintInfo ); -#endif -#endif m_printNoCopies = data.m_printNoCopies; m_printCollate = data.m_printCollate; m_printOrientation = data.m_printOrientation; @@ -799,46 +228,24 @@ void wxPrintData::operator=(const wxPrintData& data) m_printQuality = data.m_printQuality; m_paperId = data.m_paperId; m_paperSize = data.m_paperSize; - - // PostScript-specific data - m_printerCommand = data.m_printerCommand; - m_previewCommand = data.m_previewCommand; - m_printerOptions = data.m_printerOptions; - m_filename = data.m_filename; - m_afmPath = data.m_afmPath; - m_printerScaleX = data.m_printerScaleX; - m_printerScaleY = data.m_printerScaleY; - m_printerTranslateX = data.m_printerTranslateX; - m_printerTranslateY = data.m_printerTranslateY; + m_bin = data.m_bin; m_printMode = data.m_printMode; + + m_nativeData = data.GetNativeData(); + m_nativeData->m_ref++; + +#ifdef __WXMAC__ + m_nativePrintData->CopyFrom( data.m_nativePrintData ) ; +#endif } -// For compatibility -#if wxCOMPATIBILITY_WITH_PRINTSETUPDATA -void wxPrintData::operator=(const wxPrintSetupData& setupData) +// Is this data OK for showing the print dialog? +bool wxPrintData::Ok() const { - SetPrinterCommand(setupData.GetPrinterCommand()); - SetPreviewCommand(setupData.GetPrintPreviewCommand()); - SetPrinterOptions(setupData.GetPrinterOptions()); - - long xt, yt; - setupData.GetPrinterTranslation(& xt, & yt); - SetPrinterTranslation(xt, yt); - - double xs, ys; - setupData.GetPrinterScaling(& xs, & ys); - SetPrinterScaling(xs, ys); - - SetOrientation(setupData.GetPrinterOrientation()); - SetPrintMode((wxPrintMode) setupData.GetPrinterMode()); - SetFontMetricPath(setupData.GetAFMPath()); - if (setupData.GetPaperName() != "") - SetPaperId(wxThePrintPaperDatabase->ConvertNameToId(setupData.GetPaperName())); - SetColour(setupData.GetColour()); - SetFilename(setupData.GetPrinterFile()); -} -#endif // wxCOMPATIBILITY_WITH_PRINTSETUPDATA + m_nativeData->TransferFrom( *this ); + return m_nativeData->Ok(); +} // ---------------------------------------------------------------------------- // Print dialog data @@ -854,18 +261,22 @@ wxPrintDialogData::wxPrintDialogData() m_printMinPage = 0; m_printMaxPage = 0; m_printNoCopies = 1; - m_printAllPages = FALSE; - m_printCollate = FALSE; - m_printToFile = FALSE; - m_printSelection = FALSE; - m_printEnableSelection = FALSE; - m_printEnablePageNumbers = TRUE; - m_printEnablePrintToFile = TRUE; - m_printEnableHelp = FALSE; - m_printSetupDialog = FALSE; + m_printAllPages = false; + m_printCollate = false; + m_printToFile = false; + m_printSelection = false; + m_printEnableSelection = false; + m_printEnablePageNumbers = true; + + wxPrintFactory* factory = wxPrintFactory::GetFactory(); + m_printEnablePrintToFile = ! factory->HasOwnPrintToFile(); + + m_printEnableHelp = false; + m_printSetupDialog = false; } wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData& dialogData) + : wxObject() { #ifdef __WXMSW__ m_printDlgData = NULL; @@ -878,20 +289,20 @@ wxPrintDialogData::wxPrintDialogData(const wxPrintData& printData) #ifdef __WXMSW__ m_printDlgData = NULL; #endif - m_printFromPage = 0; + m_printFromPage = 1; m_printToPage = 0; - m_printMinPage = 0; - m_printMaxPage = 0; + m_printMinPage = 1; + m_printMaxPage = 9999; m_printNoCopies = 1; - m_printAllPages = FALSE; - m_printCollate = FALSE; - m_printToFile = FALSE; - m_printSelection = FALSE; - m_printEnableSelection = FALSE; - m_printEnablePageNumbers = TRUE; - m_printEnablePrintToFile = TRUE; - m_printEnableHelp = FALSE; - m_printSetupDialog = FALSE; + m_printAllPages = false; + m_printCollate = false; + m_printToFile = false; + m_printSelection = false; + m_printEnableSelection = false; + m_printEnablePageNumbers = true; + m_printEnablePrintToFile = true; + m_printEnableHelp = false; + m_printSetupDialog = false; m_printData = printData; } @@ -910,7 +321,9 @@ wxPrintDialogData::~wxPrintDialogData() #ifdef __WXMSW__ void wxPrintDialogData::ConvertToNative() { - m_printData.ConvertToNative(); + wxWindowsPrintNativeData *data = + (wxWindowsPrintNativeData *) m_printData.GetNativeData(); + data->TransferFrom( m_printData ); PRINTDLG *pd = (PRINTDLG*) m_printDlgData; @@ -948,15 +361,16 @@ void wxPrintDialogData::ConvertToNative() GlobalFree(pd->hDevNames); } - pd->hDevMode = (HGLOBAL)(DWORD) m_printData.GetNativeData(); + pd->hDevMode = (HGLOBAL)(DWORD) data->GetDevMode(); - m_printData.SetNativeData((void*) NULL); + data->SetDevMode( (void*) NULL); - wxASSERT_MSG( (pd->hDevMode), wxT("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(); + pd->hDevNames = (HGLOBAL)(DWORD) data->GetDevNames(); - m_printData.SetNativeDataDevNames((void*) NULL); + data->SetDevNames( (void*) NULL); pd->hDC = (HDC) NULL; pd->nFromPage = (WORD)m_printFromPage; @@ -998,6 +412,8 @@ void wxPrintDialogData::ConvertToNative() pd->Flags |= PD_NOSELECTION; if ( !m_printEnablePageNumbers ) pd->Flags |= PD_NOPAGENUMS; + else if ( (!m_printAllPages) && (!m_printSelection) && (m_printFromPage != 0) && (m_printToPage != 0)) + pd->Flags |= PD_PAGENUMS; if ( m_printEnableHelp ) pd->Flags |= PD_SHOWHELP; if ( m_printSetupDialog ) @@ -1010,33 +426,36 @@ void wxPrintDialogData::ConvertFromNative() if ( pd == NULL ) return; + wxWindowsPrintNativeData *data = + (wxWindowsPrintNativeData *) m_printData.GetNativeData(); + // Pass the devmode data back to the wxPrintData structure where it really belongs. if (pd->hDevMode) { - if (m_printData.GetNativeData()) + if (data->GetDevMode()) { // Make sure we don't leak memory - GlobalFree((HGLOBAL)(DWORD) m_printData.GetNativeData()); + GlobalFree( (HGLOBAL)(DWORD) data->GetDevMode() ); } - m_printData.SetNativeData((void*)(long) pd->hDevMode); + data->SetDevMode( (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()) + if (data->GetDevNames()) { // Make sure we don't leak memory - GlobalFree((HGLOBAL)(DWORD) m_printData.GetNativeDataDevNames()); + GlobalFree((HGLOBAL)(DWORD) data->GetDevNames()); } - m_printData.SetNativeDataDevNames((void*)(long) pd->hDevNames); + data->SetDevNames((void*)(long) pd->hDevNames); pd->hDevNames = NULL; } // Now convert the DEVMODE object, passed down from the PRINTDLG object, - // into wxWindows form. - m_printData.ConvertFromNative(); + // into wxWidgets form. + data->TransferTo( m_printData ); m_printFromPage = pd->nFromPage; m_printToPage = pd->nToPage; @@ -1044,7 +463,7 @@ void wxPrintDialogData::ConvertFromNative() m_printMaxPage = pd->nMaxPage; m_printNoCopies = pd->nCopies; - m_printAllPages = ((pd->Flags & PD_ALLPAGES) == PD_ALLPAGES); + m_printAllPages = (((pd->Flags & PD_PAGENUMS) != PD_PAGENUMS) && ((pd->Flags & PD_SELECTION) != PD_SELECTION)); m_printSelection = ((pd->Flags & PD_SELECTION) == PD_SELECTION); m_printCollate = ((pd->Flags & PD_COLLATE) == PD_COLLATE); m_printToFile = ((pd->Flags & PD_PRINTTOFILE) == PD_PRINTTOFILE); @@ -1084,25 +503,19 @@ void wxPrintDialogData::SetOwnerWindow(wxWindow* win) #endif // MSW #ifdef __WXMAC__ + void wxPrintDialogData::ConvertToNative() { -#ifdef TARGET_CARBON -#else - (**m_printData.m_macPrintInfo).prJob.iFstPage = m_printFromPage; - (**m_printData.m_macPrintInfo).prJob.iLstPage = m_printToPage; m_printData.ConvertToNative(); -#endif + m_printData.m_nativePrintData->TransferFrom( this ) ; } void wxPrintDialogData::ConvertFromNative() { -#ifdef TARGET_CARBON -#else m_printData.ConvertFromNative(); - m_printFromPage = (**m_printData.m_macPrintInfo).prJob.iFstPage; - m_printToPage = (**m_printData.m_macPrintInfo).prJob.iLstPage; -#endif + m_printData.m_nativePrintData->TransferTo( this ) ; } + #endif @@ -1150,16 +563,17 @@ wxPageSetupDialogData::wxPageSetupDialogData() m_marginBottomRight = wxPoint(0, 0); // Flags - m_defaultMinMargins = FALSE; - m_enableMargins = TRUE; - m_enableOrientation = TRUE; - m_enablePaper = TRUE; - m_enablePrinter = TRUE; - m_enableHelp = FALSE; - m_getDefaultInfo = FALSE; + m_defaultMinMargins = false; + m_enableMargins = true; + m_enableOrientation = true; + m_enablePaper = true; + m_enablePrinter = true; + m_enableHelp = false; + m_getDefaultInfo = false; } wxPageSetupDialogData::wxPageSetupDialogData(const wxPageSetupDialogData& dialogData) + : wxObject() { #if defined(__WIN95__) m_pageSetupData = NULL; @@ -1179,13 +593,13 @@ wxPageSetupDialogData::wxPageSetupDialogData(const wxPrintData& printData) m_marginBottomRight = wxPoint(0, 0); // Flags - m_defaultMinMargins = FALSE; - m_enableMargins = TRUE; - m_enableOrientation = TRUE; - m_enablePaper = TRUE; - m_enablePrinter = TRUE; - m_enableHelp = FALSE; - m_getDefaultInfo = FALSE; + m_defaultMinMargins = false; + m_enableMargins = true; + m_enableOrientation = true; + m_enablePaper = true; + m_enablePrinter = true; + m_enableHelp = false; + m_getDefaultInfo = false; m_printData = printData; @@ -1207,7 +621,7 @@ wxPageSetupDialogData::~wxPageSetupDialogData() #endif } -void wxPageSetupDialogData::operator=(const wxPageSetupDialogData& data) +wxPageSetupDialogData& wxPageSetupDialogData::operator=(const wxPageSetupDialogData& data) { m_paperSize = data.m_paperSize; m_minMarginTopLeft = data.m_minMarginTopLeft; @@ -1223,17 +637,23 @@ 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__) void wxPageSetupDialogData::ConvertToNative() { - m_printData.ConvertToNative(); + wxWindowsPrintNativeData *data = + (wxWindowsPrintNativeData *) m_printData.GetNativeData(); + data->TransferFrom( m_printData ); PAGESETUPDLG *pd = (PAGESETUPDLG*) m_pageSetupData; @@ -1255,11 +675,12 @@ void wxPageSetupDialogData::ConvertToNative() pd->hDevMode = NULL; } - pd->hDevMode = (HGLOBAL) m_printData.GetNativeData(); + pd->hDevMode = (HGLOBAL) data->GetDevMode(); - m_printData.SetNativeData((void*) NULL); + data->SetDevMode( (void*) NULL ); - wxASSERT_MSG( (pd->hDevMode), wxT("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 @@ -1271,9 +692,9 @@ void wxPageSetupDialogData::ConvertToNative() pd->hDevNames = NULL; } - pd->hDevNames = (HGLOBAL) m_printData.GetNativeDataDevNames(); + pd->hDevNames = (HGLOBAL) data->GetDevNames(); - m_printData.SetNativeDataDevNames((void*) NULL); + data->SetDevNames((void*) NULL); // pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE)); @@ -1340,33 +761,36 @@ void wxPageSetupDialogData::ConvertFromNative() if ( !pd ) return; + wxWindowsPrintNativeData *data = + (wxWindowsPrintNativeData *) m_printData.GetNativeData(); + // Pass the devmode data back to the wxPrintData structure where it really belongs. if (pd->hDevMode) { - if (m_printData.GetNativeData()) + if (data->GetDevMode()) { // Make sure we don't leak memory - GlobalFree((HGLOBAL) m_printData.GetNativeData()); + GlobalFree((HGLOBAL) data->GetDevMode()); } - m_printData.SetNativeData((void*) pd->hDevMode); + data->SetDevMode( (void*) pd->hDevMode ); pd->hDevMode = NULL; } - m_printData.ConvertFromNative(); + data->TransferTo( m_printData ); // Pass the devnames data back to the wxPrintData structure where it really belongs. if (pd->hDevNames) { - if (m_printData.GetNativeDataDevNames()) + if (data->GetDevNames()) { // Make sure we don't leak memory - GlobalFree((HGLOBAL) m_printData.GetNativeDataDevNames()); + GlobalFree((HGLOBAL) data->GetDevNames()); } - m_printData.SetNativeDataDevNames((void*) pd->hDevNames); + data->SetDevNames((void*) pd->hDevNames); pd->hDevNames = NULL; } - m_printData.ConvertFromNative(); + data->TransferTo( m_printData ); pd->Flags = PSD_MARGINS|PSD_MINMARGINS; @@ -1410,39 +834,16 @@ void wxPageSetupDialogData::SetOwnerWindow(wxWindow* win) 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 -#ifdef TARGET_CARBON -#else - (**m_printData.m_macPrintInfo).rPaper.left = int( ((double) m_minMarginTopLeft.x)*mm2pt ); - (**m_printData.m_macPrintInfo).rPaper.top = int( ((double) m_minMarginTopLeft.y)*mm2pt ); - - (**m_printData.m_macPrintInfo).rPaper.right = int( ((double) m_paperSize.x - m_minMarginTopLeft.x)*mm2pt ); - (**m_printData.m_macPrintInfo).rPaper.bottom = int( ((double) m_paperSize.y - m_minMarginTopLeft.y)*mm2pt ); - - (**m_printData.m_macPrintInfo).prInfo.rPage.left = 0; - (**m_printData.m_macPrintInfo).prInfo.rPage.top = 0; - (**m_printData.m_macPrintInfo).prInfo.rPage.right = int( ((double) m_paperSize.x - m_minMarginTopLeft.x - m_minMarginBottomRight.x)*mm2pt ); - (**m_printData.m_macPrintInfo).prInfo.rPage.bottom = int( ((double) m_paperSize.y - m_minMarginTopLeft.y - m_minMarginBottomRight.y)*mm2pt ); -#endif + m_printData.m_nativePrintData->TransferFrom( this ) ; } void wxPageSetupDialogData::ConvertFromNative() { m_printData.ConvertFromNative (); - -#ifdef TARGET_CARBON -#else - m_paperSize.x = ((double) (**m_printData.m_macPrintInfo).rPaper.right - (**m_printData.m_macPrintInfo).rPaper.left ) * pt2mm; - m_paperSize.y = ((double) (**m_printData.m_macPrintInfo).rPaper.bottom - (**m_printData.m_macPrintInfo).rPaper.top ) * pt2mm; - - m_minMarginTopLeft.x = ((double) -(**m_printData.m_macPrintInfo).rPaper.left ) * pt2mm; - m_minMarginTopLeft.y = ((double) -(**m_printData.m_macPrintInfo).rPaper.top ) * pt2mm; - - m_minMarginBottomRight.x = ((double) (**m_printData.m_macPrintInfo).rPaper.right - (**m_printData.m_macPrintInfo).prInfo.rPage.right ) * pt2mm; - m_minMarginBottomRight.y = ((double)(**m_printData.m_macPrintInfo).rPaper.bottom - (**m_printData.m_macPrintInfo).prInfo.rPage.bottom ) * pt2mm; -#endif + m_paperSize = m_printData.GetPaperSize() ; + CalculateIdFromPaperSize(); + m_printData.m_nativePrintData->TransferTo( this ) ; // adjust minimal values - //TODO add custom fields in dialog for margins if ( m_marginTopLeft.x < m_minMarginTopLeft.x ) m_marginTopLeft.x = m_minMarginTopLeft.x; @@ -1500,12 +901,9 @@ void wxPageSetupDialogData::CalculatePaperSizeFromId() 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