X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2432b92dd7a837db13d3938a56c1959decd03203..2ebcd5f5fd47cd16915ff3b08c0253f79a1d2220:/src/common/cmndata.cpp diff --git a/src/common/cmndata.cpp b/src/common/cmndata.cpp index 91eb71f5a5..387b2c7f93 100644 --- a/src/common/cmndata.cpp +++ b/src/common/cmndata.cpp @@ -9,61 +9,100 @@ // 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/log.h" + +// For compatibility +#if (defined(__WXMOTIF__) || defined(__WXGTK__)) && wxUSE_POSTSCRIPT + #define wxCOMPATIBILITY_WITH_PRINTSETUPDATA 1 +#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 -#if !defined(__WIN32__) -#include -#include -#endif + #if !defined(__WIN32__) + #include + #include + #endif // Win16 -#if defined(__WATCOMC__) || defined(__SC__) -#include -#include -#endif + #ifdef __WXWINE__ + #include + #include + #endif -#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(wxPageSetupData, wxObject) -IMPLEMENT_DYNAMIC_CLASS(wxFontData, wxObject) -IMPLEMENT_DYNAMIC_CLASS(wxColourData, 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) #endif -/* - * wxColourData - */ +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxColourData +// ---------------------------------------------------------------------------- wxColourData::wxColourData() { - int i; - for (i = 0; i < 16; i++) - custColours[i].Set(255, 255, 255); + int i; + for (i = 0; i < 16; i++) + custColours[i].Set(255, 255, 255); + + chooseFull = FALSE; + dataColour.Set(0,0,0); +} - chooseFull = FALSE; - dataColour.Set(0,0,0); +wxColourData::wxColourData(const wxColourData& data) +{ + (*this) = data; } wxColourData::~wxColourData() @@ -72,44 +111,49 @@ wxColourData::~wxColourData() void wxColourData::SetCustomColour(int i, wxColour& colour) { - if (i > 15 || i < 0) - return; + if (i > 15 || i < 0) + return; - custColours[i] = colour; + custColours[i] = colour; } wxColour wxColourData::GetCustomColour(int i) { - if (i > 15 || i < 0) - return wxColour(0,0,0); + if (i > 15 || i < 0) + return wxColour(0,0,0); - return custColours[i]; + return custColours[i]; } void wxColourData::operator=(const wxColourData& data) { - int i; - for (i = 0; i < 16; i++) - custColours[i] = data.custColours[i]; + int i; + for (i = 0; i < 16; i++) + custColours[i] = data.custColours[i]; - dataColour = (wxColour&)data.dataColour; - chooseFull = data.chooseFull; + dataColour = (wxColour&)data.dataColour; + chooseFull = data.chooseFull; } -/* - * Font data - */ +// ---------------------------------------------------------------------------- +// Font data +// ---------------------------------------------------------------------------- wxFontData::wxFontData() { - // Intialize colour to black. - fontColour.Set(0, 0, 0); + // Intialize colour to black. + fontColour.Set(0, 0, 0); + + showHelp = FALSE; + allowSymbols = TRUE; + enableEffects = TRUE; + minSize = 0; + maxSize = 0; +} - showHelp = FALSE; - allowSymbols = TRUE; - enableEffects = TRUE; - minSize = 0; - maxSize = 0; +wxFontData::wxFontData(const wxFontData& data) +{ + (*this) = data; } wxFontData::~wxFontData() @@ -118,67 +162,127 @@ 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; + 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__ - printData = NULL; + m_devMode = NULL; #endif - printOrientation = wxPORTRAIT; - printFromPage = 0; - printToPage = 0; - printMinPage = 0; - printMaxPage = 0; - printNoCopies = 1; - printAllPages = FALSE; - printCollate = FALSE; - printToFile = FALSE; - printEnableSelection = FALSE; - printEnablePageNumbers = TRUE; - printEnablePrintToFile = TRUE; - printEnableHelp = FALSE; - printSetupDialog = FALSE; + m_printOrientation = wxPORTRAIT; + m_printNoCopies = 1; + m_printCollate = FALSE; + + // New, 24/3/99 + m_printerName = ""; + 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; } -wxPrintData::~wxPrintData() +wxPrintData::wxPrintData(const wxPrintData& printData) { #ifdef __WXMSW__ - PRINTDLG *pd = (PRINTDLG *)printData; - if ( pd && pd->hDevMode ) - GlobalFree(pd->hDevMode); - if ( pd ) - delete pd; + m_devMode = NULL; #endif + + (*this) = printData; } +wxPrintData::~wxPrintData() +{ #ifdef __WXMSW__ + HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; + if (hDevMode ) + GlobalFree(hDevMode); +#endif +} + +#if defined(__WXMSW__) // && defined(__WIN32__) + +#ifdef __WIN32__ +static wxString wxGetPrintDlgError() +{ + DWORD err = CommDlgExtendedError(); + wxString msg = _T("Unknown"); + switch (err) + { + case CDERR_FINDRESFAILURE: msg = _T("CDERR_FINDRESFAILURE"); break; + case CDERR_INITIALIZATION: msg = _T("CDERR_INITIALIZATION"); break; + case CDERR_LOADRESFAILURE: msg = _T("CDERR_LOADRESFAILURE"); break; + case CDERR_LOADSTRFAILURE: msg = _T("CDERR_LOADSTRFAILURE"); break; + case CDERR_LOCKRESFAILURE: msg = _T("CDERR_LOCKRESFAILURE"); break; + case CDERR_MEMALLOCFAILURE: msg = _T("CDERR_MEMALLOCFAILURE"); break; + case CDERR_MEMLOCKFAILURE: msg = _T("CDERR_MEMLOCKFAILURE"); break; + case CDERR_NOHINSTANCE: msg = _T("CDERR_NOHINSTANCE"); break; + case CDERR_NOHOOK: msg = _T("CDERR_NOHOOK"); break; + case CDERR_NOTEMPLATE: msg = _T("CDERR_NOTEMPLATE"); break; + case CDERR_STRUCTSIZE: msg = _T("CDERR_STRUCTSIZE"); break; + case PDERR_RETDEFFAILURE: msg = _T("PDERR_RETDEFFAILURE"); break; + case PDERR_PRINTERNOTFOUND: msg = _T("PDERR_PRINTERNOTFOUND"); break; + case PDERR_PARSEFAILURE: msg = _T("PDERR_PARSEFAILURE"); break; + case PDERR_NODEVICES: msg = _T("PDERR_NODEVICES"); break; + case PDERR_NODEFAULTPRN: msg = _T("PDERR_NODEFAULTPRN"); break; + case PDERR_LOADDRVFAILURE: msg = _T("PDERR_LOADDRVFAILURE"); break; + case PDERR_INITFAILURE: msg = _T("PDERR_INITFAILURE"); break; + case PDERR_GETDEVMODEFAIL: msg = _T("PDERR_GETDEVMODEFAIL"); break; + case PDERR_DNDMMISMATCH: msg = _T("PDERR_DNDMMISMATCH"); break; + case PDERR_DEFAULTDIFFERENT: msg = _T("PDERR_DEFAULTDIFFERENT"); break; + case PDERR_CREATEICFAILURE: msg = _T("PDERR_CREATEICFAILURE"); break; + default: break; + } + return msg; +} +#endif + void wxPrintData::ConvertToNative() { - PRINTDLG *pd = (PRINTDLG*) printData; - if ( pd == NULL ) + HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; + if (!hDevMode) { - pd = new PRINTDLG; - printData = (void*) pd; + // 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. -// pd->lStructSize = sizeof(PRINTDLG); +#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; @@ -193,32 +297,487 @@ void wxPrintData::ConvertToNative() GlobalFree(pd->hDevNames); pd->hDevMode = NULL; pd->hDevNames = NULL; + +#if defined(__WXDEBUG__) && defined(__WIN32__) + wxString str(_T("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; } + + delete pd; } - if ( pd->hDevMode ) + if ( hDevMode ) { - DEVMODE *devMode = (DEVMODE*) GlobalLock(pd->hDevMode); - devMode->dmOrientation = printOrientation; + DEVMODE *devMode = (DEVMODE*) GlobalLock(hDevMode); + + //// Orientation + +#ifndef __WXWINE__ + devMode->dmOrientation = m_printOrientation; +#endif devMode->dmFields = DM_ORIENTATION; - GlobalUnlock(pd->hDevMode); + + //// 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 != _T("")) + { + // 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; + } + + //// 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; + devMode->dmPaperLength = m_paperSize.y * 10; + 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); + } +} + +void wxPrintData::ConvertFromNative() +{ + HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; + + if (!hDevMode) + return; + + if ( hDevMode ) + { + DEVMODE *devMode = (DEVMODE*) 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 + + if (devMode->dmFields & DM_PAPERSIZE) + { + 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(_T("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(_T("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)) + { + m_paperSize.x = devMode->dmPaperWidth / 10; + m_paperSize.y = devMode->dmPaperLength / 10; + m_paperId = wxPAPER_NONE; + } + else + { + // Shouldn't really get here + wxFAIL_MSG(_T("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) + { + 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); + } +} + +#endif + +void wxPrintData::operator=(const wxPrintData& data) +{ + m_printNoCopies = data.m_printNoCopies; + m_printCollate = data.m_printCollate; + m_printOrientation = data.m_printOrientation; + m_printerName = data.m_printerName; + m_colour = data.m_colour; + m_duplexMode = data.m_duplexMode; + 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_printMode = data.m_printMode; +} + +// For compatibility +#if wxCOMPATIBILITY_WITH_PRINTSETUPDATA +void wxPrintData::operator=(const wxPrintSetupData& setupData) +{ + 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 + + +// ---------------------------------------------------------------------------- +// Print dialog data +// ---------------------------------------------------------------------------- + +wxPrintDialogData::wxPrintDialogData() +{ +#ifdef __WXMSW__ + m_printDlgData = NULL; +#endif + m_printFromPage = 0; + m_printToPage = 0; + 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; +} + +wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData& dialogData) +{ + (*this) = dialogData; +} + +wxPrintDialogData::wxPrintDialogData(const wxPrintData& printData) +{ +#ifdef __WXMSW__ + m_printDlgData = NULL; +#endif + m_printFromPage = 0; + m_printToPage = 0; + 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_printData = printData; +} + +wxPrintDialogData::~wxPrintDialogData() +{ +#ifdef __WXMSW__ + PRINTDLG *pd = (PRINTDLG *) m_printDlgData; + if ( pd && pd->hDevMode ) + GlobalFree(pd->hDevMode); + if ( pd ) + delete pd; +#endif +} + +#ifdef __WXMSW__ +void wxPrintDialogData::ConvertToNative() +{ + m_printData.ConvertToNative(); + + PRINTDLG *pd = (PRINTDLG*) m_printDlgData; + + if (!pd) + { + pd = new PRINTDLG; + m_printDlgData = (void*) pd; + + // GNU-WIN32 has the wrong size PRINTDLG - can't work out why. +#ifdef __GNUWIN32__ + pd->lStructSize = 66 ; +#else + pd->lStructSize = sizeof(PRINTDLG); +#endif + pd->hwndOwner = (HWND)NULL; + pd->hDevMode = NULL; // Will be created by PrintDlg + pd->hDevNames = NULL; // Ditto + + pd->Flags = PD_RETURNDEFAULT; + pd->nCopies = 1; } + + // Pass the devmode data to the PRINTDLG structure, since it'll + // be needed when PrintDlg is called. + if (pd->hDevMode) + { + GlobalFree(pd->hDevMode); + } + + pd->hDevMode = (HGLOBAL)(DWORD) m_printData.GetNativeData(); + + m_printData.SetNativeData((void*) NULL); + + wxASSERT_MSG( (pd->hDevMode), _T("hDevMode must be non-NULL in ConvertToNative!")); + pd->hDC = (HDC) NULL; - pd->nFromPage = (UINT)printFromPage; - pd->nToPage = (UINT)printToPage; - pd->nMinPage = (UINT)printMinPage; - pd->nMaxPage = (UINT)printMaxPage; - pd->nCopies = (UINT)printNoCopies; + 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->Flags = PD_RETURNDC ; -// pd->lStructSize = sizeof( PRINTDLG ); + +#ifdef __GNUWIN32__ pd->lStructSize = 66 ; +#else + pd->lStructSize = sizeof( PRINTDLG ); +#endif + pd->hwndOwner=(HWND)NULL; pd->hDevNames=(HANDLE)NULL; pd->hInstance=(HINSTANCE)NULL; @@ -230,110 +789,179 @@ void wxPrintData::ConvertToNative() pd->hPrintTemplate = (HGLOBAL) NULL; pd->hSetupTemplate = (HGLOBAL) NULL; - if ( printAllPages ) + if ( m_printAllPages ) pd->Flags |= PD_ALLPAGES; - if ( printCollate ) + if ( m_printAllPages ) + pd->Flags |= PD_SELECTION; + if ( m_printCollate ) pd->Flags |= PD_COLLATE; - if ( printToFile ) + if ( m_printToFile ) pd->Flags |= PD_PRINTTOFILE; - if ( !printEnablePrintToFile ) + if ( !m_printEnablePrintToFile ) pd->Flags |= PD_DISABLEPRINTTOFILE; - if ( !printEnableSelection ) - pd->Flags |= PD_NOSELECTION; - if ( !printEnablePageNumbers ) - pd->Flags |= PD_NOPAGENUMS; - if ( printEnableHelp ) - pd->Flags |= PD_SHOWHELP; - if ( printSetupDialog ) - pd->Flags |= PD_PRINTSETUP; + if ( !m_printEnableSelection ) + pd->Flags |= PD_NOSELECTION; + if ( !m_printEnablePageNumbers ) + pd->Flags |= PD_NOPAGENUMS; + if ( m_printEnableHelp ) + pd->Flags |= PD_SHOWHELP; + if ( m_printSetupDialog ) + pd->Flags |= PD_PRINTSETUP; } -void wxPrintData::ConvertFromNative() +void wxPrintDialogData::ConvertFromNative() { - PRINTDLG *pd = (PRINTDLG*) printData; + PRINTDLG *pd = (PRINTDLG*) m_printDlgData; if ( pd == NULL ) return; - if ( pd->hDevMode ) + // Pass the devmode data back to the wxPrintData structure where it really belongs. + if (pd->hDevMode) { - DEVMODE *devMode = (DEVMODE*) GlobalLock(pd->hDevMode); - printOrientation = devMode->dmOrientation; - GlobalUnlock(pd->hDevMode); + if (m_printData.GetNativeData()) + { + // Make sure we don't leak memory + GlobalFree((HGLOBAL)(DWORD) m_printData.GetNativeData()); + } + m_printData.SetNativeData((void*)(long) pd->hDevMode); + pd->hDevMode = NULL; } - printFromPage = pd->nFromPage ; - printToPage = pd->nToPage ; - printMinPage = pd->nMinPage ; - printMaxPage = pd->nMaxPage ; - printNoCopies = pd->nCopies ; - printAllPages = ((pd->Flags & PD_ALLPAGES) == PD_ALLPAGES); - printCollate = ((pd->Flags & PD_COLLATE) == PD_COLLATE); - printToFile = ((pd->Flags & PD_PRINTTOFILE) == PD_PRINTTOFILE); - printEnablePrintToFile = ((pd->Flags & PD_DISABLEPRINTTOFILE) != PD_DISABLEPRINTTOFILE); - printEnableSelection = ((pd->Flags & PD_NOSELECTION) != PD_NOSELECTION); - printEnablePageNumbers = ((pd->Flags & PD_NOPAGENUMS) != PD_NOPAGENUMS); - printEnableHelp = ((pd->Flags & PD_SHOWHELP) == PD_SHOWHELP); - printSetupDialog = ((pd->Flags & PD_PRINTSETUP) == PD_PRINTSETUP); + // 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_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); + m_printEnableSelection = ((pd->Flags & PD_NOSELECTION) != PD_NOSELECTION); + m_printEnablePageNumbers = ((pd->Flags & PD_NOPAGENUMS) != PD_NOPAGENUMS); + m_printEnableHelp = ((pd->Flags & PD_SHOWHELP) == PD_SHOWHELP); + m_printSetupDialog = ((pd->Flags & PD_PRINTSETUP) == PD_PRINTSETUP); + +/* port is obsolete in WIN32 + // Get the port name + if (pd->hDevNames) + { + LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(pd->hDevNames); + if (lpDevNames) { + 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!"); + } + } +*/ } -void wxPrintData::SetOwnerWindow(wxWindow* win) +void wxPrintDialogData::SetOwnerWindow(wxWindow* win) { - if ( printData == NULL ) + if ( m_printDlgData == NULL ) ConvertToNative(); - if ( printData != NULL && win != NULL) + if ( m_printDlgData != NULL && win != NULL) { - PRINTDLG *pd = (PRINTDLG *) printData ; - pd->hwndOwner=(HWND) win->GetHWND(); + PRINTDLG *pd = (PRINTDLG *) m_printDlgData ; + pd->hwndOwner=(HWND) win->GetHWND(); } } -#endif +#endif // MSW -void wxPrintData::operator=(const wxPrintData& data) +void wxPrintDialogData::operator=(const wxPrintDialogData& data) { - printFromPage = data.printFromPage; - printToPage = data.printToPage; - printMinPage = data.printMinPage; - printMaxPage = data.printMaxPage; - printNoCopies = data.printNoCopies; - printAllPages = data.printAllPages; - printCollate = data.printCollate; - printToFile = data.printToFile; - printEnableSelection = data.printEnableSelection; - printEnablePageNumbers = data.printEnablePageNumbers; - printEnableHelp = data.printEnableHelp; - printEnablePrintToFile = data.printEnablePrintToFile; - printSetupDialog = data.printSetupDialog; - printOrientation = data.printOrientation; + m_printFromPage = data.m_printFromPage; + m_printToPage = data.m_printToPage; + m_printMinPage = data.m_printMinPage; + m_printMaxPage = data.m_printMaxPage; + m_printNoCopies = data.m_printNoCopies; + 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; + m_printEnablePrintToFile = data.m_printEnablePrintToFile; + m_printSetupDialog = data.m_printSetupDialog; + + m_printData = data.m_printData; } -/* - * wxPageSetupData - */ +void wxPrintDialogData::operator=(const wxPrintData& data) +{ + m_printData = data; +} -wxPageSetupData::wxPageSetupData() +// ---------------------------------------------------------------------------- +// wxPageSetupDialogData +// ---------------------------------------------------------------------------- + +wxPageSetupDialogData::wxPageSetupDialogData() { #if defined(__WIN95__) - m_pageSetupData = NULL; + m_pageSetupData = NULL; #endif - m_paperSize = wxPoint(0, 0); - m_minMarginTopLeft = wxPoint(0, 0); - m_minMarginBottomRight = wxPoint(0, 0); - m_marginTopLeft = wxPoint(0, 0); - m_marginBottomRight = wxPoint(0, 0); - m_orientation = wxPORTRAIT; + m_paperSize = wxSize(0, 0); + + CalculatePaperSizeFromId(); + + m_minMarginTopLeft = wxPoint(0, 0); + m_minMarginBottomRight = wxPoint(0, 0); + m_marginTopLeft = wxPoint(0, 0); + 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; +} + +wxPageSetupDialogData::wxPageSetupDialogData(const wxPageSetupDialogData& dialogData) +{ + (*this) = dialogData; +} - // Flags - m_defaultMinMargins = FALSE; - m_enableMargins = TRUE; - m_enableOrientation = TRUE; - m_enablePaper = TRUE; - m_enablePrinter = TRUE; - m_enableHelp = FALSE; - m_getDefaultInfo = FALSE; +wxPageSetupDialogData::wxPageSetupDialogData(const wxPrintData& printData) +{ +#if defined(__WIN95__) + m_pageSetupData = NULL; +#endif + m_paperSize = wxSize(0, 0); + m_minMarginTopLeft = wxPoint(0, 0); + m_minMarginBottomRight = wxPoint(0, 0); + m_marginTopLeft = wxPoint(0, 0); + 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_printData = printData; + + // The wxPrintData paper size overrides these values, unless the size cannot + // be found. + CalculatePaperSizeFromId(); } -wxPageSetupData::~wxPageSetupData() +wxPageSetupDialogData::~wxPageSetupDialogData() { #if defined(__WIN95__) && defined(__WXMSW__) PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData; @@ -344,35 +972,61 @@ wxPageSetupData::~wxPageSetupData() #endif } -void wxPageSetupData::operator=(const wxPageSetupData& data) +void wxPageSetupDialogData::operator=(const wxPageSetupDialogData& data) { - m_paperSize = data.m_paperSize; - m_minMarginTopLeft = data.m_minMarginTopLeft; - m_minMarginBottomRight = data.m_minMarginBottomRight; - m_marginTopLeft = data.m_marginTopLeft; - m_marginBottomRight = data.m_marginBottomRight; - m_orientation = data.m_orientation; + m_paperSize = data.m_paperSize; + m_minMarginTopLeft = data.m_minMarginTopLeft; + m_minMarginBottomRight = data.m_minMarginBottomRight; + m_marginTopLeft = data.m_marginTopLeft; + m_marginBottomRight = data.m_marginBottomRight; + m_defaultMinMargins = data.m_defaultMinMargins; + m_enableMargins = data.m_enableMargins; + m_enableOrientation = data.m_enableOrientation; + m_enablePaper = data.m_enablePaper; + m_enablePrinter = data.m_enablePrinter; + m_getDefaultInfo = data.m_getDefaultInfo;; + m_enableHelp = data.m_enableHelp; + + m_printData = data.m_printData; +} - m_defaultMinMargins = data.m_defaultMinMargins; - m_enableMargins = data.m_enableMargins; - m_enableOrientation = data.m_enableOrientation; - m_enablePaper = data.m_enablePaper; - m_enablePrinter = data.m_enablePrinter; - m_getDefaultInfo = data.m_getDefaultInfo;; - m_enableHelp = data.m_enableHelp; +void wxPageSetupDialogData::operator=(const wxPrintData& data) +{ + m_printData = data; } -#if defined(__WXMSW__) && defined(__WIN95__) -void wxPageSetupData::ConvertToNative() +#if defined(__WIN95__) +void wxPageSetupDialogData::ConvertToNative() { + m_printData.ConvertToNative(); + PAGESETUPDLG *pd = (PAGESETUPDLG*) m_pageSetupData; + if ( m_pageSetupData == NULL ) { - pd = new PAGESETUPDLG; - pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE)); - m_pageSetupData = (void *)pd; + pd = new PAGESETUPDLG; + pd->hDevMode = NULL; + m_pageSetupData = (void *)pd; } + // Pass the devmode data (created in m_printData.ConvertToNative) + // to the PRINTDLG structure, since it'll + // be needed when PrintDlg is called. + + if (pd->hDevMode) + { + GlobalFree(pd->hDevMode); + pd->hDevMode = NULL; + } + + pd->hDevMode = (HGLOBAL) m_printData.GetNativeData(); + + m_printData.SetNativeData((void*) NULL); + + wxASSERT_MSG( (pd->hDevMode), _T("hDevMode must be non-NULL in ConvertToNative!")); + +// pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE)); + pd->Flags = PSD_MARGINS|PSD_MINMARGINS; if ( m_defaultMinMargins ) @@ -390,23 +1044,26 @@ void wxPageSetupData::ConvertToNative() if ( m_enableHelp ) pd->Flags |= PSD_SHOWHELP; + // We want the units to be in hundredths of a millimetre + pd->Flags |= PSD_INHUNDREDTHSOFMILLIMETERS; + pd->lStructSize = sizeof( PAGESETUPDLG ); pd->hwndOwner=(HWND)NULL; pd->hDevNames=(HWND)NULL; pd->hInstance=(HINSTANCE)NULL; - pd->ptPaperSize.x = m_paperSize.x; - pd->ptPaperSize.y = m_paperSize.y; + pd->ptPaperSize.x = m_paperSize.x * 100; + pd->ptPaperSize.y = m_paperSize.y * 100; - pd->rtMinMargin.left = m_minMarginTopLeft.x; - pd->rtMinMargin.top = m_minMarginTopLeft.y; - pd->rtMinMargin.right = m_minMarginBottomRight.x; - pd->rtMinMargin.bottom = m_minMarginBottomRight.y; + 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; - pd->rtMargin.top = m_marginTopLeft.y; - pd->rtMargin.right = m_marginBottomRight.x; - pd->rtMargin.bottom = m_marginBottomRight.y; + 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; @@ -414,6 +1071,7 @@ void wxPageSetupData::ConvertToNative() pd->hPageSetupTemplate = NULL; pd->lpPageSetupTemplateName = NULL; +/* if ( pd->hDevMode ) { DEVMODE *devMode = (DEVMODE*) GlobalLock(pd->hDevMode); @@ -423,14 +1081,29 @@ void wxPageSetupData::ConvertToNative() devMode->dmFields = DM_ORIENTATION; GlobalUnlock(pd->hDevMode); } +*/ } -void wxPageSetupData::ConvertFromNative() +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) + { + if (m_printData.GetNativeData()) + { + // Make sure we don't leak memory + GlobalFree((HGLOBAL) m_printData.GetNativeData()); + } + m_printData.SetNativeData((void*) pd->hDevMode); + pd->hDevMode = NULL; + } + + m_printData.ConvertFromNative(); + pd->Flags = PSD_MARGINS|PSD_MINMARGINS; m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS); @@ -441,37 +1114,82 @@ void wxPageSetupData::ConvertFromNative() m_getDefaultInfo = ((pd->Flags & PSD_RETURNDEFAULT) == PSD_RETURNDEFAULT); m_enableHelp = ((pd->Flags & PSD_SHOWHELP) == PSD_SHOWHELP); - m_paperSize.x = pd->ptPaperSize.x ; - m_paperSize.y = pd->ptPaperSize.y ; + m_paperSize.x = pd->ptPaperSize.x / 100; + m_paperSize.y = pd->ptPaperSize.y / 100; - m_minMarginTopLeft.x = pd->rtMinMargin.left ; - m_minMarginTopLeft.y = pd->rtMinMargin.top ; - m_minMarginBottomRight.x = pd->rtMinMargin.right ; - m_minMarginBottomRight.y = pd->rtMinMargin.bottom ; + 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 ; - m_marginTopLeft.y = pd->rtMargin.top ; - m_marginBottomRight.x = pd->rtMargin.right ; - m_marginBottomRight.y = pd->rtMargin.bottom ; - - if ( pd->hDevMode ) - { - DEVMODE *devMode = (DEVMODE*) GlobalLock(pd->hDevMode); - m_orientation = devMode->dmOrientation ; - GlobalUnlock(pd->hDevMode); - } + 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 wxPageSetupData::SetOwnerWindow(wxWindow* win) +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(); + PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData ; + pd->hwndOwner=(HWND) win->GetHWND(); + } +} +#endif // Win95 + +// 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) +{ + m_paperSize = sz; + + CalculateIdFromPaperSize(); +} + +// Sets the wxPrintData id, plus the paper width/height if found in the paper database. +void wxPageSetupDialogData::SetPaperSize(wxPaperSize id) +{ + m_printData.SetPaperId(id); + + CalculatePaperSizeFromId(); +} + +// Use paper size defined in this object to set the wxPrintData +// paper id +void wxPageSetupDialogData::CalculateIdFromPaperSize() +{ + wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), + _T("wxThePrintPaperDatabase should not be NULL. " + "Do not create global print dialog data objects.") ); + + wxSize sz = GetPaperSize(); + + wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10)); + if (id != wxPAPER_NONE) + { + m_printData.SetPaperId(id); + } +} + +// Use paper id in wxPrintData to set this object's paper size +void wxPageSetupDialogData::CalculatePaperSizeFromId() +{ + wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), + _T("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; } } -#endif +#endif // wxUSE_PRINTING_ARCHITECTURE