X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fd64de596c085f81aa3ef7d8ee6b2f4afebbed8e..d35dce3a2e3ca417093eaa192f1e9e54e55a22ba:/src/msw/printdlg.cpp diff --git a/src/msw/printdlg.cpp b/src/msw/printdlg.cpp index 86598e7ca1..5198ea044a 100644 --- a/src/msw/printdlg.cpp +++ b/src/msw/printdlg.cpp @@ -38,6 +38,7 @@ #include "wx/cmndata.h" #include "wx/printdlg.h" +#include "wx/msw/printdlg.h" #include "wx/dcprint.h" #include "wx/paper.h" @@ -535,41 +536,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,66 +598,387 @@ 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 WXWIN_COMPATIBILITY_2_4 + if ( data.GetSetupDialog() ) + pd->Flags |= PD_PRINTSETUP; +#endif + + 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) ); +#if WXWIN_COMPATIBILITY_2_4 + data.SetSetupDialog( ((pd->Flags & PD_PRINTSETUP) == PD_PRINTSETUP) ); +#endif + return true; +} + // --------------------------------------------------------------------------- -// wxPageSetupDialog +// wxWidnowsPageSetupDialog // --------------------------------------------------------------------------- -IMPLEMENT_CLASS(wxPageSetupDialog, wxDialog) +IMPLEMENT_CLASS(wxWindowsPageSetupDialog, wxPageSetupDialogBase) -wxPageSetupDialog::wxPageSetupDialog() +wxWindowsPageSetupDialog::wxWindowsPageSetupDialog() { m_dialogParent = NULL; + m_pageDlg = NULL; } -wxPageSetupDialog::wxPageSetupDialog(wxWindow *p, wxPageSetupData *data) +wxWindowsPageSetupDialog::wxWindowsPageSetupDialog(wxWindow *p, wxPageSetupDialogData *data) { Create(p, data); } -bool wxPageSetupDialog::Create(wxWindow *p, wxPageSetupData *data) +bool wxWindowsPageSetupDialog::Create(wxWindow *p, wxPageSetupDialogData *data) { m_dialogParent = p; + m_pageDlg = NULL; if (data) m_pageSetupData = (*data); -#if defined(__WIN95__) - m_pageSetupData.SetOwnerWindow(p); -#endif return true; } -wxPageSetupDialog::~wxPageSetupDialog() +wxWindowsPageSetupDialog::~wxWindowsPageSetupDialog() { + PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageDlg; + if ( pd && pd->hDevMode ) + GlobalFree(pd->hDevMode); + if ( pd && pd->hDevNames ) + GlobalFree(pd->hDevNames); + if ( pd ) + delete pd; } -int wxPageSetupDialog::ShowModal() +int wxWindowsPageSetupDialog::ShowModal() { -#ifdef __WIN95__ - m_pageSetupData.ConvertToNative(); - PAGESETUPDLG *p = (PAGESETUPDLG *)m_pageSetupData.GetNativeData(); + ConvertToNative( m_pageSetupData ); + + PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageDlg; 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; - BOOL retVal = PageSetupDlg( p ) ; - p->hwndOwner = 0; + pd->hwndOwner = 0; + BOOL retVal = PageSetupDlg( pd ) ; + pd->hwndOwner = 0; if (retVal) { - m_pageSetupData.ConvertFromNative(); + ConvertFromNative( m_pageSetupData ); return wxID_OK; } else return wxID_CANCEL; -#else - wxGenericPageSetupDialog *genericPageSetupDialog = new wxGenericPageSetupDialog(GetParent(), & m_pageSetupData); - int ret = genericPageSetupDialog->ShowModal(); - m_pageSetupData = genericPageSetupDialog->GetPageSetupData(); - genericPageSetupDialog->Close(true); - return ret; -#endif +} + +bool wxWindowsPageSetupDialog::ConvertToNative( wxPageSetupDialogData &data ) +{ + wxWindowsPrintNativeData *native_data = + (wxWindowsPrintNativeData *) data.GetPrintData().GetNativeData(); + data.GetPrintData().ConvertToNative(); + + PAGESETUPDLG *pd = (PAGESETUPDLG*) m_pageDlg; + + // Shouldn't have been defined anywhere + if (pd) + 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) + { + GlobalFree(pd->hDevMode); + pd->hDevMode = NULL; + } + pd->hDevMode = (HGLOBAL) 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!")); + + // 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) native_data->GetDevNames(); + native_data->SetDevNames((void*) NULL); + +// pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE)); + + pd->Flags = PSD_MARGINS|PSD_MINMARGINS; + + if ( data.GetDefaultMinMargins() ) + pd->Flags |= PSD_DEFAULTMINMARGINS; + if ( !data.GetEnableMargins() ) + pd->Flags |= PSD_DISABLEMARGINS; + if ( !data.GetEnableOrientation() ) + pd->Flags |= PSD_DISABLEORIENTATION; + if ( !data.GetEnablePaper() ) + pd->Flags |= PSD_DISABLEPAPER; + if ( !data.GetEnablePrinter() ) + pd->Flags |= PSD_DISABLEPRINTER; + if ( data.GetDefaultInfo() ) + pd->Flags |= PSD_RETURNDEFAULT; + if ( data.GetEnableHelp() ) + 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; + // PAGESETUPDLG is in hundreds of a mm + pd->ptPaperSize.x = data.GetPaperSize().x * 100; + pd->ptPaperSize.y = data.GetPaperSize().y * 100; + + pd->rtMinMargin.left = data.GetMinMarginTopLeft().x * 100; + pd->rtMinMargin.top = data.GetMinMarginTopLeft().y * 100; + pd->rtMinMargin.right = data.GetMinMarginBottomRight().x * 100; + pd->rtMinMargin.bottom = data.GetMinMarginBottomRight().y * 100; + + pd->rtMargin.left = data.GetMarginTopLeft().x * 100; + pd->rtMargin.top = data.GetMarginTopLeft().y * 100; + pd->rtMargin.right = data.GetMarginBottomRight().x * 100; + pd->rtMargin.bottom = data.GetMarginBottomRight().y * 100; + + pd->lCustData = 0; + pd->lpfnPageSetupHook = NULL; + pd->lpfnPagePaintHook = NULL; + 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; +} + +bool wxWindowsPageSetupDialog::ConvertFromNative( wxPageSetupDialogData &data ) +{ + PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageDlg; + if ( !pd ) + 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) native_data->GetDevMode()); + } + native_data->SetDevMode( (void*) pd->hDevMode ); + pd->hDevMode = NULL; + } + + // Isn't this superfluous? It's called again below. + // data.GetPrintData().ConvertFromNative(); + + // 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) native_data->GetDevNames()); + } + native_data->SetDevNames((void*) pd->hDevNames); + pd->hDevNames = NULL; + } + + data.GetPrintData().ConvertFromNative(); + + pd->Flags = PSD_MARGINS|PSD_MINMARGINS; + + data.SetDefaultMinMargins( ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS) ); + data.EnableMargins( ((pd->Flags & PSD_DISABLEMARGINS) != PSD_DISABLEMARGINS) ); + data.EnableOrientation( ((pd->Flags & PSD_DISABLEORIENTATION) != PSD_DISABLEORIENTATION) ); + data.EnablePaper( ((pd->Flags & PSD_DISABLEPAPER) != PSD_DISABLEPAPER) ); + data.EnablePrinter( ((pd->Flags & PSD_DISABLEPRINTER) != PSD_DISABLEPRINTER) ); + data.SetDefaultInfo( ((pd->Flags & PSD_RETURNDEFAULT) == PSD_RETURNDEFAULT) ); + data.EnableHelp( ((pd->Flags & PSD_SHOWHELP) == PSD_SHOWHELP) ); + + // PAGESETUPDLG is in hundreds of a mm + data.SetPaperSize( wxSize(pd->ptPaperSize.x / 100, pd->ptPaperSize.y / 100) ); + + data.SetMinMarginTopLeft( wxPoint(pd->rtMinMargin.left / 100, pd->rtMinMargin.top / 100) ); + data.SetMinMarginBottomRight( wxPoint(pd->rtMinMargin.right / 100, pd->rtMinMargin.bottom / 100) ); + + data.SetMarginTopLeft( wxPoint(pd->rtMargin.left / 100, pd->rtMargin.top / 100) ); + data.SetMarginBottomRight( wxPoint(pd->rtMargin.right / 100, pd->rtMargin.bottom / 100) ); + + return true; } #endif