From: Robert Roebling Date: Sun, 31 Oct 2004 16:34:02 +0000 (+0000) Subject: Moved print dialog data conversion code X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/93c2f401e9955dc37df1f8dbfea7881c676b8ddb Moved print dialog data conversion code from cmndata to its msw place. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30204 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/cmndata.h b/include/wx/cmndata.h index d495c8d63c..e18a0c797a 100644 --- a/include/wx/cmndata.h +++ b/include/wx/cmndata.h @@ -307,21 +307,11 @@ public: void operator=(const wxPrintDialogData& data); void operator=(const wxPrintData& data); // Sets internal m_printData member -#ifdef __WXMSW__ - // Convert to/from the PRINTDLG structure - void ConvertToNative(); - void ConvertFromNative(); - void SetOwnerWindow(wxWindow* win); - void* GetNativeData() const { return m_printDlgData; } -#elif defined(__WXMAC__) +#if defined(__WXMAC__) void ConvertToNative(); void ConvertFromNative(); #endif -#ifdef __WXMSW__ - void* m_printDlgData; -#endif - private: int m_printFromPage; int m_printToPage; diff --git a/include/wx/msw/printdlg.h b/include/wx/msw/printdlg.h index 681878516c..e675dcec06 100644 --- a/include/wx/msw/printdlg.h +++ b/include/wx/msw/printdlg.h @@ -71,10 +71,18 @@ public: wxPrintData& GetPrintData() { return m_printDialogData.GetPrintData(); } virtual wxDC *GetPrintDC(); +private: wxPrintDialogData m_printDialogData; wxDC* m_printerDC; bool m_destroyDC; wxWindow* m_dialogParent; + +private: + bool ConvertToNative( wxPrintDialogData &data ); + bool ConvertFromNative( wxPrintDialogData &data ); + + // holds MSW handle + void* m_printDlg; private: DECLARE_NO_COPY_CLASS(wxWindowsPrintDialog) diff --git a/src/common/cmndata.cpp b/src/common/cmndata.cpp index ae0caedd0c..c864ac3f84 100644 --- a/src/common/cmndata.cpp +++ b/src/common/cmndata.cpp @@ -260,9 +260,6 @@ bool wxPrintData::Ok() const wxPrintDialogData::wxPrintDialogData() { -#ifdef __WXMSW__ - m_printDlgData = NULL; -#endif m_printFromPage = 0; m_printToPage = 0; m_printMinPage = 0; @@ -285,17 +282,11 @@ wxPrintDialogData::wxPrintDialogData() wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData& dialogData) : wxObject() { -#ifdef __WXMSW__ - m_printDlgData = NULL; -#endif (*this) = dialogData; } wxPrintDialogData::wxPrintDialogData(const wxPrintData& printData) { -#ifdef __WXMSW__ - m_printDlgData = NULL; -#endif m_printFromPage = 1; m_printToPage = 0; m_printMinPage = 1; @@ -316,198 +307,7 @@ wxPrintDialogData::wxPrintDialogData(const wxPrintData& 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() -{ - wxWindowsPrintNativeData *data = - (wxWindowsPrintNativeData *) m_printData.GetNativeData(); - data->TransferFrom( m_printData ); - - PRINTDLG *pd = (PRINTDLG*) m_printDlgData; - - if (!pd) - { - pd = new PRINTDLG; - memset( pd, 0, sizeof(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); - } - - // 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) data->GetDevMode(); - - data->SetDevMode( (void*) NULL); - - // 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) data->GetDevNames(); - - data->SetDevNames( (void*) NULL); - - pd->hDC = (HDC) NULL; - pd->nFromPage = (WORD)m_printFromPage; - pd->nToPage = (WORD)m_printToPage; - pd->nMinPage = (WORD)m_printMinPage; - pd->nMaxPage = (WORD)m_printMaxPage; - pd->nCopies = (WORD)m_printNoCopies; - - pd->Flags = PD_RETURNDC; - -#ifdef __GNUWIN32__ - pd->lStructSize = 66; -#else - pd->lStructSize = sizeof( PRINTDLG ); -#endif - - pd->hwndOwner=(HWND)NULL; -// pd->hDevNames=(HANDLE)NULL; - pd->hInstance=(HINSTANCE)NULL; - pd->lCustData = (LPARAM) NULL; - pd->lpfnPrintHook = NULL; - pd->lpfnSetupHook = NULL; - pd->lpPrintTemplateName = NULL; - pd->lpSetupTemplateName = NULL; - pd->hPrintTemplate = (HGLOBAL) NULL; - pd->hSetupTemplate = (HGLOBAL) NULL; - - if ( m_printAllPages ) - pd->Flags |= PD_ALLPAGES; - if ( m_printSelection ) - pd->Flags |= PD_SELECTION; - if ( m_printCollate ) - pd->Flags |= PD_COLLATE; - if ( m_printToFile ) - pd->Flags |= PD_PRINTTOFILE; - if ( !m_printEnablePrintToFile ) - pd->Flags |= PD_DISABLEPRINTTOFILE; - if ( !m_printEnableSelection ) - 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 ) - pd->Flags |= PD_PRINTSETUP; -} - -void wxPrintDialogData::ConvertFromNative() -{ - PRINTDLG *pd = (PRINTDLG*) m_printDlgData; - 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 (data->GetDevMode()) - { - // Make sure we don't leak memory - GlobalFree( (HGLOBAL)(DWORD) data->GetDevMode() ); - } - 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 (data->GetDevNames()) - { - // Make sure we don't leak memory - GlobalFree((HGLOBAL)(DWORD) data->GetDevNames()); - } - data->SetDevNames((void*)(long) pd->hDevNames); - pd->hDevNames = NULL; - } - - // Now convert the DEVMODE object, passed down from the PRINTDLG object, - // into wxWidgets form. - data->TransferTo( m_printData ); - - 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_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); - 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 wxPrintDialogData::SetOwnerWindow(wxWindow* win) -{ - if ( m_printDlgData == NULL ) - ConvertToNative(); - - if ( m_printDlgData != NULL && win != NULL) - { - PRINTDLG *pd = (PRINTDLG *) m_printDlgData; - pd->hwndOwner=(HWND) win->GetHWND(); - } } -#endif // MSW #ifdef __WXMAC__ diff --git a/src/msw/printdlg.cpp b/src/msw/printdlg.cpp index 86598e7ca1..2327f9d04f 100644 --- a/src/msw/printdlg.cpp +++ b/src/msw/printdlg.cpp @@ -535,41 +535,49 @@ bool wxWindowsPrintDialog::Create(wxWindow *p, wxPrintDialogData* data) m_printerDC = NULL; m_destroyDC = true; + // MSW handle + m_printDlg = NULL; + if ( data ) m_printDialogData = *data; - m_printDialogData.SetOwnerWindow(p); - return true; } wxWindowsPrintDialog::~wxWindowsPrintDialog() { + PRINTDLG *pd = (PRINTDLG *) m_printDlg; + if (pd && pd->hDevMode) + GlobalFree(pd->hDevMode); + if ( pd ) + delete pd; + if (m_destroyDC && m_printerDC) delete m_printerDC; } int wxWindowsPrintDialog::ShowModal() { - m_printDialogData.ConvertToNative(); + ConvertToNative( m_printDialogData ); - PRINTDLG* p = (PRINTDLG *)m_printDialogData.GetNativeData() ; + PRINTDLG *pd = (PRINTDLG*) m_printDlg; + if (m_dialogParent) - p->hwndOwner = (HWND) m_dialogParent->GetHWND(); + pd->hwndOwner = (HWND) m_dialogParent->GetHWND(); else if (wxTheApp->GetTopWindow()) - p->hwndOwner = (HWND) wxTheApp->GetTopWindow()->GetHWND(); + pd->hwndOwner = (HWND) wxTheApp->GetTopWindow()->GetHWND(); else - p->hwndOwner = 0; + pd->hwndOwner = 0; - bool ret = (PrintDlg( p ) != 0); + bool ret = (PrintDlg( pd ) != 0); - p->hwndOwner = 0; + pd->hwndOwner = 0; - if ( ret != false && ((PRINTDLG *)m_printDialogData.GetNativeData())->hDC) + if ( ret != false && (pd->hDC) ) { - wxPrinterDC *pdc = new wxPrinterDC((WXHDC) ((PRINTDLG *)m_printDialogData.GetNativeData())->hDC); + wxPrinterDC *pdc = new wxPrinterDC( (WXHDC) pd->hDC ); m_printerDC = pdc; - m_printDialogData.ConvertFromNative(); + ConvertFromNative( m_printDialogData ); return wxID_OK; } else @@ -589,6 +597,161 @@ wxDC *wxWindowsPrintDialog::GetPrintDC() return (wxDC*) NULL; } +bool wxWindowsPrintDialog::ConvertToNative( wxPrintDialogData &data ) +{ + wxWindowsPrintNativeData *native_data = + (wxWindowsPrintNativeData *) data.GetPrintData().GetNativeData(); + data.GetPrintData().ConvertToNative(); + + PRINTDLG *pd = (PRINTDLG*) m_printDlg; + + // Shouldn't have been defined anywhere + if (pd) + return false; + + pd = new PRINTDLG; + memset( pd, 0, sizeof(PRINTDLG) ); + m_printDlg = (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); + + // 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) native_data->GetDevMode(); + native_data->SetDevMode( (void*) NULL); + + // 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) native_data->GetDevNames(); + native_data->SetDevNames( (void*) NULL); + + + pd->hDC = (HDC) NULL; + pd->nFromPage = (WORD)data.GetFromPage(); + pd->nToPage = (WORD)data.GetToPage(); + pd->nMinPage = (WORD)data.GetMinPage(); + pd->nMaxPage = (WORD)data.GetMaxPage(); + pd->nCopies = (WORD)data.GetNoCopies(); + + pd->Flags = PD_RETURNDC; + +#ifdef __GNUWIN32__ + pd->lStructSize = 66; +#else + pd->lStructSize = sizeof( PRINTDLG ); +#endif + + pd->hwndOwner=(HWND)NULL; +// pd->hDevNames=(HANDLE)NULL; + pd->hInstance=(HINSTANCE)NULL; + pd->lCustData = (LPARAM) NULL; + pd->lpfnPrintHook = NULL; + pd->lpfnSetupHook = NULL; + pd->lpPrintTemplateName = NULL; + pd->lpSetupTemplateName = NULL; + pd->hPrintTemplate = (HGLOBAL) NULL; + pd->hSetupTemplate = (HGLOBAL) NULL; + + if ( data.GetAllPages() ) + pd->Flags |= PD_ALLPAGES; + if ( data.GetSelection() ) + pd->Flags |= PD_SELECTION; + if ( data.GetCollate() ) + pd->Flags |= PD_COLLATE; + if ( data.GetPrintToFile() ) + pd->Flags |= PD_PRINTTOFILE; + if ( !data.GetEnablePrintToFile() ) + pd->Flags |= PD_DISABLEPRINTTOFILE; + if ( !data.GetEnableSelection() ) + pd->Flags |= PD_NOSELECTION; + if ( !data.GetEnablePageNumbers() ) + pd->Flags |= PD_NOPAGENUMS; + else if ( (!data.GetAllPages()) && (!data.GetSelection()) && (data.GetFromPage() != 0) && (data.GetToPage() != 0)) + pd->Flags |= PD_PAGENUMS; + if ( data.GetEnableHelp() ) + pd->Flags |= PD_SHOWHELP; + if ( data.GetSetupDialog() ) + pd->Flags |= PD_PRINTSETUP; + + return true; +} + +bool wxWindowsPrintDialog::ConvertFromNative( wxPrintDialogData &data ) +{ + PRINTDLG *pd = (PRINTDLG*) m_printDlg; + if ( pd == NULL ) + return false; + + wxWindowsPrintNativeData *native_data = + (wxWindowsPrintNativeData *) data.GetPrintData().GetNativeData(); + + // Pass the devmode data back to the wxPrintData structure where it really belongs. + if (pd->hDevMode) + { + if (native_data->GetDevMode()) + { + // Make sure we don't leak memory + GlobalFree( (HGLOBAL)(DWORD) native_data->GetDevMode() ); + } + native_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 (native_data->GetDevNames()) + { + // Make sure we don't leak memory + GlobalFree((HGLOBAL)(DWORD) native_data->GetDevNames()); + } + native_data->SetDevNames((void*)(long) pd->hDevNames); + pd->hDevNames = NULL; + } + + // Now convert the DEVMODE object, passed down from the PRINTDLG object, + // into wxWidgets form. + native_data->TransferTo( data.GetPrintData() ); + + data.SetFromPage( pd->nFromPage ); + data.SetToPage( pd->nToPage ); + data.SetMinPage( pd->nMinPage ); + data.SetMaxPage( pd->nMaxPage ); + data.SetNoCopies( pd->nCopies ); + + data.SetAllPages( (((pd->Flags & PD_PAGENUMS) != PD_PAGENUMS) && ((pd->Flags & PD_SELECTION) != PD_SELECTION)) ); + data.SetSelection( ((pd->Flags & PD_SELECTION) == PD_SELECTION) ); + data.SetCollate( ((pd->Flags & PD_COLLATE) == PD_COLLATE) ); + data.SetPrintToFile( ((pd->Flags & PD_PRINTTOFILE) == PD_PRINTTOFILE) ); + data.EnablePrintToFile( ((pd->Flags & PD_DISABLEPRINTTOFILE) != PD_DISABLEPRINTTOFILE) ); + data.EnableSelection( ((pd->Flags & PD_NOSELECTION) != PD_NOSELECTION) ); + data.EnablePageNumbers( ((pd->Flags & PD_NOPAGENUMS) != PD_NOPAGENUMS) ); + data.EnableHelp( ((pd->Flags & PD_SHOWHELP) == PD_SHOWHELP) ); + data.SetSetupDialog( ((pd->Flags & PD_PRINTSETUP) == PD_PRINTSETUP) ); + + return true; +} + // --------------------------------------------------------------------------- // wxPageSetupDialog // ---------------------------------------------------------------------------