X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/082e5b985677852db873ed956da8fad5ae5abc4b..be10c7f969bb460dc79bd8946d59bf54c98ac660:/src/msw/printdlg.cpp diff --git a/src/msw/printdlg.cpp b/src/msw/printdlg.cpp index b9b89b6210..63826efb51 100644 --- a/src/msw/printdlg.cpp +++ b/src/msw/printdlg.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -39,9 +38,57 @@ #include "wx/msw/printdlg.h" #include "wx/msw/dcprint.h" #include "wx/paper.h" +#include "wx/modalhook.h" #include +// smart pointer like class using OpenPrinter and ClosePrinter +class WinPrinter +{ +public: + // default ctor + WinPrinter() + { + m_hPrinter = (HANDLE)NULL; + } + + WinPrinter( const wxString& printerName ) + { + Open( printerName ); + } + + ~WinPrinter() + { + Close(); + } + + BOOL Open( const wxString& printerName, LPPRINTER_DEFAULTS pDefault=(LPPRINTER_DEFAULTS)NULL ) + { + Close(); + return OpenPrinter( wxMSW_CONV_LPTSTR(printerName), &m_hPrinter, pDefault ); + } + + BOOL Close() + { + BOOL result = TRUE; + if( m_hPrinter ) + { + result = ClosePrinter( m_hPrinter ); + m_hPrinter = (HANDLE)NULL; + } + return result; + } + + operator HANDLE() { return m_hPrinter; } + operator bool() { return m_hPrinter != (HANDLE)NULL; } + +private: + HANDLE m_hPrinter; + + wxDECLARE_NO_COPY_CLASS(WinPrinter); +}; + + //---------------------------------------------------------------------------- // wxWindowsPrintNativeData //---------------------------------------------------------------------------- @@ -145,6 +192,9 @@ bool wxWindowsPrintNativeData::IsOk() const bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) { + if ( !m_devMode ) + InitializeDevMode(); + if ( !m_devMode ) return false; @@ -154,7 +204,7 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) //// Orientation if (devMode->dmFields & DM_ORIENTATION) - data.SetOrientation( devMode->dmOrientation ); + data.SetOrientation( (wxPrintOrientation)devMode->dmOrientation ); //// Collation if (devMode->dmFields & DM_COLLATE) @@ -336,27 +386,28 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) return true; } -bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) +void wxWindowsPrintNativeData::InitializeDevMode(const wxString& printerName, WinPrinter* printer) { - HGLOBAL hDevMode = static_cast(m_devMode); - WinPrinter printer; - LPTSTR szPrinterName = (LPTSTR)data.GetPrinterName().wx_str(); + if (m_devMode) + return; + + LPTSTR szPrinterName = wxMSW_CONV_LPTSTR(printerName); // From MSDN: How To Modify Printer Settings with the DocumentProperties() Function // The purpose of this is to fill the DEVMODE with privdata from printer driver. - // If we have a printer name and OpenPrinter sucessfully returns + // If we have a printer name and OpenPrinter successfully returns // this replaces the PrintDlg function which creates the DEVMODE filled only with data from default printer. - if ( !m_devMode && !data.GetPrinterName().IsEmpty() ) + if ( !m_devMode && !printerName.IsEmpty() ) { // Open printer - if ( printer.Open( data.GetPrinterName() ) == TRUE ) + if ( printer && printer->Open( printerName ) == TRUE ) { DWORD dwNeeded, dwRet; // Step 1: // Allocate a buffer of the correct size. dwNeeded = DocumentProperties( NULL, - printer, // Handle to our printer. + *printer, // Handle to our printer. szPrinterName, // Name of the printer. NULL, // Asking for size, so NULL, // these are not used. @@ -367,7 +418,7 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) // Step 2: // Get the default DevMode for the printer dwRet = DocumentProperties( NULL, - printer, + *printer, szPrinterName, tempDevMode, // The address of the buffer to fill. NULL, // Not using the input buffer. @@ -377,12 +428,11 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) { // If failure, cleanup GlobalFree( tempDevMode ); - printer.Close(); + printer->Close(); } else { - hDevMode = tempDevMode; - m_devMode = hDevMode; + m_devMode = tempDevMode; tempDevMode = NULL; } } @@ -424,8 +474,7 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) } else { - hDevMode = pd.hDevMode; - m_devMode = hDevMode; + m_devMode = pd.hDevMode; pd.hDevMode = NULL; // We'll create a new DEVNAMEs structure below. @@ -440,6 +489,18 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) } } +} + +bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) +{ + WinPrinter printer; + LPTSTR szPrinterName = wxMSW_CONV_LPTSTR(data.GetPrinterName()); + + if (!m_devMode) + InitializeDevMode(data.GetPrinterName(), &printer); + + HGLOBAL hDevMode = static_cast(m_devMode); + if ( hDevMode ) { GlobalPtrLock lockDevMode(hDevMode); @@ -463,7 +524,7 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) // NB: the cast is needed in the ANSI build, strangely enough // dmDeviceName is BYTE[] and not char[] there wxStrlcpy(reinterpret_cast(devMode->dmDeviceName), - name.wx_str(), + name.t_str(), WXSIZEOF(devMode->dmDeviceName)); } @@ -677,6 +738,8 @@ wxWindowsPrintDialog::~wxWindowsPrintDialog() int wxWindowsPrintDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + ConvertToNative( m_printDialogData ); PRINTDLG *pd = (PRINTDLG*) m_printDlg; @@ -896,6 +959,8 @@ wxWindowsPageSetupDialog::~wxWindowsPageSetupDialog() int wxWindowsPageSetupDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + ConvertToNative( m_pageSetupData ); PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageDlg; @@ -929,38 +994,34 @@ bool wxWindowsPageSetupDialog::ConvertToNative( wxPageSetupDialogData &data ) return false; pd = new PAGESETUPDLG; - pd->hDevMode = NULL; - pd->hDevNames = NULL; m_pageDlg = (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) + // We must not set hDevMode and hDevNames when using PSD_RETURNDEFAULT, + // otherwise the call to PageSetupDlg() would fail. + if ( data.GetDefaultInfo() ) { - GlobalFree(pd->hDevMode); pd->hDevMode = NULL; + pd->hDevNames = NULL; } - pd->hDevMode = (HGLOBAL) native_data->GetDevMode(); - native_data->SetDevMode(NULL); + else + { + // Pass the devmode data (created in m_printData.ConvertToNative) + // to the PRINTDLG structure, since it'll + // be needed when PrintDlg is called. - // 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->hDevMode = (HGLOBAL) native_data->GetDevMode(); + native_data->SetDevMode(NULL); - // Pass the devnames data (created in m_printData.ConvertToNative) - // to the PRINTDLG structure, since it'll - // be needed when PrintDlg is called. + // 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!")); - if (pd->hDevNames) - { - GlobalFree(pd->hDevNames); - pd->hDevNames = NULL; - } - pd->hDevNames = (HGLOBAL) native_data->GetDevNames(); - native_data->SetDevNames(NULL); + // Pass the devnames data (created in m_printData.ConvertToNative) + // to the PRINTDLG structure, since it'll + // be needed when PrintDlg is called. -// pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE)); + pd->hDevNames = (HGLOBAL) native_data->GetDevNames(); + native_data->SetDevNames(NULL); + } pd->Flags = PSD_MARGINS|PSD_MINMARGINS; @@ -1005,17 +1066,6 @@ bool wxWindowsPageSetupDialog::ConvertToNative( wxPageSetupDialogData &data ) pd->hPageSetupTemplate = NULL; pd->lpPageSetupTemplateName = NULL; -/* - if ( pd->hDevMode ) - { - DEVMODE *devMode = (DEVMODE*) GlobalLock(pd->hDevMode); - memset(devMode, 0, sizeof(DEVMODE)); - devMode->dmSize = sizeof(DEVMODE); - devMode->dmOrientation = m_orientation; - devMode->dmFields = DM_ORIENTATION; - GlobalUnlock(pd->hDevMode); - } -*/ return true; }