X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7beba2fc73283f5b750227459da57e66bcd475f5..1be06faf7318abf88a35b299b90ceb2a49c0353b:/src/common/cmndata.cpp diff --git a/src/common/cmndata.cpp b/src/common/cmndata.cpp index d5772633af..90ec1c14a4 100644 --- a/src/common/cmndata.cpp +++ b/src/common/cmndata.cpp @@ -40,7 +40,7 @@ #include "wx/log.h" // For compatibility -#if (defined(__WXMOTIF__) || defined(__WXGTK__)) && wxUSE_POSTSCRIPT +#if (defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__)) && wxUSE_POSTSCRIPT #define wxCOMPATIBILITY_WITH_PRINTSETUPDATA 1 #endif @@ -72,15 +72,19 @@ #endif #endif // MSW -#if !USE_SHARED_LIBRARY #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 + +#ifdef __WXMAC__ + #define mm2pt 2.83464566929 + #define pt2mm 0.352777777778 +#endif // Mac // ============================================================================ // implementation @@ -165,7 +169,29 @@ wxFontData::~wxFontData() wxPrintData::wxPrintData() { #ifdef __WXMSW__ - m_devMode = NULL; + m_devMode = (void*) NULL; + m_devNames = (void*) NULL; +#elif defined( __WXMAC__ ) + 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 +/* + UMAPrOpen() ; + m_macPrintInfo = (THPrint) NewHandleClear( sizeof( TPrint ) ) ; + ::PrintDefault( m_macPrintInfo ) ; + OSErr err = PrError() ; + UMAPrClose() ; + wxASSERT( err == noErr ) ; +*/ #endif m_printOrientation = wxPORTRAIT; m_printNoCopies = 1; @@ -195,9 +221,20 @@ wxPrintData::wxPrintData() wxPrintData::wxPrintData(const wxPrintData& printData) { #ifdef __WXMSW__ - m_devMode = NULL; + m_devMode = (void*) NULL; + m_devNames = (void*) NULL; +#elif defined( __WXMAC__ ) + m_macPrintInfo = NULL ; + /* + (THPrint) NewHandleClear( sizeof( TPrint ) ) ; + UMAPrOpen() ; + m_macPrintInfo = (THPrint) NewHandleClear( sizeof( TPrint ) ) ; + ::PrintDefault( m_macPrintInfo ) ; + OSErr err = PrError() ; + UMAPrClose() ; + wxASSERT( err == noErr ) ; + */ #endif - (*this) = printData; } @@ -205,14 +242,20 @@ wxPrintData::~wxPrintData() { #ifdef __WXMSW__ HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; - if (hDevMode ) + if ( hDevMode ) GlobalFree(hDevMode); + HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; + if ( hDevNames ) + GlobalFree(hDevNames); +#elif defined(__WXMAC__) + wxASSERT( m_macPrintInfo ) ; +// ::DisposeHandle( (Handle) m_macPrintInfo ) ; #endif } #if defined(__WXMSW__) // && defined(__WIN32__) -#ifdef __WIN32__ +#if defined(__WXDEBUG__) && defined(__WIN32__) static wxString wxGetPrintDlgError() { DWORD err = CommDlgExtendedError(); @@ -247,9 +290,40 @@ static wxString wxGetPrintDlgError() } #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)(DWORD) m_devMode; + HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; if (!hDevMode) { // Use PRINTDLG as a way of creating a DEVMODE object @@ -291,13 +365,19 @@ void wxPrintData::ConvertToNative() } 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*)(long) hDevMode; - pd->hDevMode = NULL; + // hDevNames = pd->hDevNames; + // m_devNames = (void*)(long) hDevNames; + // pd->hDevnames = NULL; + } delete pd; @@ -305,7 +385,7 @@ void wxPrintData::ConvertToNative() if ( hDevMode ) { - DEVMODE *devMode = (DEVMODE*) GlobalLock(hDevMode); + LPDEVMODE devMode = (LPDEVMODE) GlobalLock(hDevMode); //// Orientation @@ -416,18 +496,27 @@ void wxPrintData::ConvertToNative() GlobalUnlock(hDevMode); } + + if ( hDevNames ) + { + GlobalFree(hDevNames); + } + + // TODO: I hope it's OK to pass some empty strings to DEVNAMES. + m_devNames = (void*) (long) wxCreateDevNames("", m_printerName, ""); } void wxPrintData::ConvertFromNative() { 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 @@ -589,12 +678,52 @@ void wxPrintData::ConvertFromNative() GlobalUnlock(hDevMode); } + + if (hDevNames) + { + LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(hDevNames); + if (lpDevNames) + { + // TODO: Unicode-ification + + // Get the port name + // port is obsolete in WIN32 + // m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset); + + // Get the printer name + wxString printerName = (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 != wxT("")) + m_printerName = printerName; + + GlobalUnlock(hDevNames); + } + } +} + +#endif + +#ifdef __WXMAC__ +void wxPrintData::ConvertToNative() +{ + (**m_macPrintInfo).prJob.iCopies = m_printNoCopies ; } +void wxPrintData::ConvertFromNative() +{ + m_printNoCopies = (**m_macPrintInfo).prJob.iCopies ; +} #endif void wxPrintData::operator=(const wxPrintData& data) { +#ifdef __WXMAC__ + m_macPrintInfo = data.m_macPrintInfo ; + HandToHand( (Handle*) &m_macPrintInfo ) ; +#endif m_printNoCopies = data.m_printNoCopies; m_printCollate = data.m_printCollate; m_printOrientation = data.m_printOrientation; @@ -672,6 +801,9 @@ wxPrintDialogData::wxPrintDialogData() wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData& dialogData) { +#ifdef __WXMSW__ + m_printDlgData = NULL; +#endif (*this) = dialogData; } @@ -742,12 +874,23 @@ void wxPrintDialogData::ConvertToNative() GlobalFree(pd->hDevMode); } + // Pass the devnames data to the PRINTDLG structure, since it'll + // be needed when PrintDlg is called. + if (pd->hDevNames) + { + GlobalFree(pd->hDevNames); + } + pd->hDevMode = (HGLOBAL)(DWORD) m_printData.GetNativeData(); m_printData.SetNativeData((void*) NULL); wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!")); + pd->hDevNames = (HGLOBAL)(DWORD) m_printData.GetNativeDataDevNames(); + + m_printData.SetNativeDataDevNames((void*) NULL); + pd->hDC = (HDC) NULL; pd->nFromPage = (UINT)m_printFromPage; pd->nToPage = (UINT)m_printToPage; @@ -764,7 +907,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; @@ -812,6 +955,18 @@ void wxPrintDialogData::ConvertFromNative() 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(); @@ -861,6 +1016,23 @@ void wxPrintDialogData::SetOwnerWindow(wxWindow* win) } #endif // MSW +#ifdef __WXMAC__ +void wxPrintDialogData::ConvertToNative() +{ + (**m_printData.m_macPrintInfo).prJob.iFstPage = m_printFromPage ; + (**m_printData.m_macPrintInfo).prJob.iLstPage = m_printToPage ; + m_printData.ConvertToNative() ; +} + +void wxPrintDialogData::ConvertFromNative() +{ + m_printData.ConvertFromNative() ; + m_printFromPage = (**m_printData.m_macPrintInfo).prJob.iFstPage ; + m_printToPage = (**m_printData.m_macPrintInfo).prJob.iLstPage ; +} +#endif + + void wxPrintDialogData::operator=(const wxPrintDialogData& data) { m_printFromPage = data.m_printFromPage; @@ -916,6 +1088,9 @@ wxPageSetupDialogData::wxPageSetupDialogData() wxPageSetupDialogData::wxPageSetupDialogData(const wxPageSetupDialogData& dialogData) { +#if defined(__WIN95__) + m_pageSetupData = NULL; +#endif (*this) = dialogData; } @@ -952,6 +1127,8 @@ wxPageSetupDialogData::~wxPageSetupDialogData() PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData; if ( pd && pd->hDevMode ) GlobalFree(pd->hDevMode); + if ( pd && pd->hDevNames ) + GlobalFree(pd->hDevNames); if ( pd ) delete pd; #endif @@ -991,6 +1168,7 @@ void wxPageSetupDialogData::ConvertToNative() { pd = new PAGESETUPDLG; pd->hDevMode = NULL; + pd->hDevNames = NULL; m_pageSetupData = (void *)pd; } @@ -1010,6 +1188,20 @@ void wxPageSetupDialogData::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; @@ -1034,7 +1226,7 @@ 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; @@ -1089,6 +1281,20 @@ void wxPageSetupDialogData::ConvertFromNative() m_printData.ConvertFromNative(); + // Pass the devnames data back to the wxPrintData structure where it really belongs. + if (pd->hDevNames) + { + if (m_printData.GetNativeDataDevNames()) + { + // Make sure we don't leak memory + GlobalFree((HGLOBAL) m_printData.GetNativeDataDevNames()); + } + m_printData.SetNativeDataDevNames((void*) pd->hDevNames); + pd->hDevNames = NULL; + } + + m_printData.ConvertFromNative(); + pd->Flags = PSD_MARGINS|PSD_MINMARGINS; m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS); @@ -1126,6 +1332,54 @@ void wxPageSetupDialogData::SetOwnerWindow(wxWindow* win) } #endif // Win95 +#ifdef __WXMAC__ +void wxPageSetupDialogData::ConvertToNative() +{ + m_printData.ConvertToNative() ; + // on mac the paper rect has a negative top left corner, because the page rect (printable area) is at 0,0 + (**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 ) ; +} + +void wxPageSetupDialogData::ConvertFromNative() +{ + m_printData.ConvertFromNative () ; + + 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 ; + + // 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) @@ -1148,8 +1402,7 @@ void wxPageSetupDialogData::SetPaperSize(wxPaperSize id) void wxPageSetupDialogData::CalculateIdFromPaperSize() { wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), - wxT("wxThePrintPaperDatabase should not be NULL. " - "Do not create global print dialog data objects.") ); + wxT("wxThePrintPaperDatabase should not be NULL. Do not create global print dialog data objects.") ); wxSize sz = GetPaperSize(); @@ -1164,8 +1417,7 @@ void wxPageSetupDialogData::CalculateIdFromPaperSize() void wxPageSetupDialogData::CalculatePaperSizeFromId() { wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), - wxT("wxThePrintPaperDatabase should not be NULL. " - "Do not create global print dialog data objects.") ); + wxT("wxThePrintPaperDatabase should not be NULL. Do not create global print dialog data objects.") ); wxSize sz = wxThePrintPaperDatabase->GetSize(m_printData.GetPaperId());