1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Common GDI data 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart and Markus Holzem 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  21     #pragma implementation "cmndata.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  33     #include "wx/string.h" 
  38 #include "wx/gdicmn.h" 
  39 #include "wx/cmndata.h" 
  44 #if (defined(__WXMOTIF__) || defined(__WXGTK__)) && wxUSE_POSTSCRIPT 
  45     #define wxCOMPATIBILITY_WITH_PRINTSETUPDATA 1 
  48 #if wxCOMPATIBILITY_WITH_PRINTSETUPDATA 
  49     #include "wx/generic/dcpsg.h" 
  55     #if !defined(__WIN32__) 
  60     #if defined(__WATCOMC__) || defined(__SC__) || defined(__SALFORDC__) 
  66 #if !USE_SHARED_LIBRARY 
  67     IMPLEMENT_DYNAMIC_CLASS(wxPrintData
, wxObject
) 
  68     IMPLEMENT_DYNAMIC_CLASS(wxPrintDialogData
, wxObject
) 
  69     IMPLEMENT_DYNAMIC_CLASS(wxPageSetupDialogData
, wxObject
) 
  70     IMPLEMENT_DYNAMIC_CLASS(wxFontData
, wxObject
) 
  71     IMPLEMENT_DYNAMIC_CLASS(wxColourData
, wxObject
) 
  74 // ============================================================================ 
  76 // ============================================================================ 
  78 // ---------------------------------------------------------------------------- 
  80 // ---------------------------------------------------------------------------- 
  82 wxColourData::wxColourData() 
  85     for (i 
= 0; i 
< 16; i
++) 
  86         custColours
[i
].Set(255, 255, 255); 
  89     dataColour
.Set(0,0,0); 
  92 wxColourData::wxColourData(const wxColourData
& data
) 
  97 wxColourData::~wxColourData() 
 101 void wxColourData::SetCustomColour(int i
, wxColour
& colour
) 
 106     custColours
[i
] = colour
; 
 109 wxColour 
wxColourData::GetCustomColour(int i
) 
 112         return wxColour(0,0,0); 
 114     return custColours
[i
]; 
 117 void wxColourData::operator=(const wxColourData
& data
) 
 120     for (i 
= 0; i 
< 16; i
++) 
 121         custColours
[i
] = data
.custColours
[i
]; 
 123     dataColour 
= (wxColour
&)data
.dataColour
; 
 124     chooseFull 
= data
.chooseFull
; 
 127 // ---------------------------------------------------------------------------- 
 129 // ---------------------------------------------------------------------------- 
 131 wxFontData::wxFontData() 
 133     // Intialize colour to black. 
 134     fontColour
.Set(0, 0, 0); 
 138     enableEffects 
= TRUE
; 
 143 wxFontData::wxFontData(const wxFontData
& data
) 
 148 wxFontData::~wxFontData() 
 152 void wxFontData::operator=(const wxFontData
& data
) 
 154     fontColour 
= data
.fontColour
; 
 155     showHelp 
= data
.showHelp
; 
 156     allowSymbols 
= data
.allowSymbols
; 
 157     enableEffects 
= data
.enableEffects
; 
 158     initialFont 
= data
.initialFont
; 
 159     chosenFont 
= data
.chosenFont
; 
 160     minSize 
= data
.minSize
; 
 161     maxSize 
= data
.maxSize
; 
 164 // ---------------------------------------------------------------------------- 
 166 // ---------------------------------------------------------------------------- 
 168 wxPrintData::wxPrintData() 
 173     m_printOrientation 
= wxPORTRAIT
; 
 175     m_printCollate 
= FALSE
; 
 180     m_duplexMode 
= wxDUPLEX_SIMPLEX
; 
 181     m_printQuality 
= wxPRINT_QUALITY_HIGH
; 
 182     m_paperId 
= wxPAPER_A4
; 
 183     m_paperSize 
= wxSize(210, 297); 
 185     // PostScript-specific data 
 186     m_printerCommand 
= ""; 
 187     m_previewCommand 
= ""; 
 188     m_printerOptions 
= ""; 
 191     m_printerScaleX 
= 1.0; 
 192     m_printerScaleY 
= 1.0; 
 193     m_printerTranslateX 
= 0; 
 194     m_printerTranslateY 
= 0; 
 195     m_printMode 
= wxPRINT_MODE_FILE
; 
 198 wxPrintData::wxPrintData(const wxPrintData
& printData
) 
 203 wxPrintData::~wxPrintData() 
 206     HGLOBAL hDevMode 
= (HGLOBAL
) hDevMode
; 
 208         GlobalFree(hDevMode
); 
 210         PRINTDLG *pd = (PRINTDLG *) m_printData; 
 211         if ( pd && pd->hDevMode ) 
 212         GlobalFree(pd->hDevMode); 
 221 void wxPrintData::ConvertToNative() 
 223     HGLOBAL hDevMode 
= (HGLOBAL
) m_devMode
; 
 226         // Use PRINTDLG as a way of creating a DEVMODE object 
 227         PRINTDLG 
*pd 
= new PRINTDLG
; 
 229         // GNU-WIN32 has the wrong size PRINTDLG - can't work out why. 
 231         pd
->lStructSize    
= 66 ; 
 232         memset(pd
, 0, sizeof(PRINTDLG
)); 
 234         pd
->lStructSize    
= sizeof(PRINTDLG
); 
 235         memset(pd
, 0, sizeof(PRINTDLG
)); 
 238         pd
->hwndOwner      
= (HWND
)NULL
; 
 239         pd
->hDevMode       
= NULL
; // Will be created by PrintDlg 
 240         pd
->hDevNames      
= NULL
; // Ditto 
 242         pd
->Flags          
= PD_RETURNDEFAULT
; 
 245         // Fill out the DEVMODE structure 
 246         // so we can use it as input in the 'real' PrintDlg 
 250                 GlobalFree(pd
->hDevMode
); 
 252                 GlobalFree(pd
->hDevNames
); 
 254             pd
->hDevNames 
= NULL
; 
 259                 GlobalFree(pd
->hDevNames
); 
 260             pd
->hDevNames 
= NULL
; 
 262             hDevMode 
= pd
->hDevMode
; 
 263             m_devMode 
= (void*) hDevMode
; 
 272         DEVMODE 
*devMode 
= (DEVMODE
*) GlobalLock(hDevMode
); 
 276         devMode
->dmOrientation 
= m_printOrientation
; 
 277         devMode
->dmFields 
= DM_ORIENTATION
; 
 281         devMode
->dmCollate 
= (m_printCollate 
? DMCOLLATE_TRUE 
: DMCOLLATE_FALSE
); 
 282         devMode
->dmFields 
|= DM_COLLATE
; 
 284         //// Number of copies 
 286         devMode
->dmCopies 
= m_printNoCopies
; 
 287         devMode
->dmFields 
|= DM_COPIES
; 
 291         if (m_printerName 
!= "") 
 293             // TODO: make this Unicode compatible 
 294             int len 
= wxMin(31, m_printerName
.Len()); 
 296             for (i 
= 0; i 
< len
; i
++) 
 297                 devMode
->dmDeviceName
[i
] = m_printerName
.GetChar(i
); 
 298             devMode
->dmDeviceName
[i
] = 0; 
 304             devMode
->dmColor 
= DMCOLOR_COLOR
; 
 306             devMode
->dmColor 
= DMCOLOR_MONOCHROME
; 
 308         devMode
->dmFields 
|= DM_COLOR
; 
 312         if (m_paperId 
== wxPAPER_NONE
) 
 314             devMode
->dmPaperWidth 
= m_paperSize
.x 
* 10; 
 315             devMode
->dmPaperLength 
= m_paperSize
.y 
* 10; 
 316             devMode
->dmFields 
|= DM_PAPERWIDTH
; 
 317             devMode
->dmFields 
|= DM_PAPERLENGTH
; 
 321             if (wxThePrintPaperDatabase
) 
 323                 wxPrintPaperType
* paper 
= wxThePrintPaperDatabase
->FindPaperType(m_paperId
); 
 326                     devMode
->dmPaperSize 
= paper
->GetPlatformId(); 
 327                     devMode
->dmFields 
|= DM_PAPERSIZE
; 
 335         switch (m_duplexMode
) 
 337         case wxDUPLEX_HORIZONTAL
: { 
 338             duplex 
= DMDUP_HORIZONTAL
; break; 
 340         case wxDUPLEX_VERTICAL
: { 
 341             duplex 
= DMDUP_VERTICAL
; break; 
 344         case wxDUPLEX_SIMPLEX
: { 
 345             duplex 
= DMDUP_SIMPLEX
; break; 
 348         devMode
->dmDuplex 
= duplex
; 
 349         devMode
->dmFields 
|= DM_DUPLEX
; 
 354         switch (m_printQuality
) 
 356         case wxPRINT_QUALITY_MEDIUM
: { 
 357             quality 
= DMRES_MEDIUM
; break; 
 359         case wxPRINT_QUALITY_LOW
: { 
 360             quality 
= DMRES_LOW
; break; 
 362         case wxPRINT_QUALITY_DRAFT
: { 
 363             quality 
= DMRES_DRAFT
; break; 
 365         case wxPRINT_QUALITY_HIGH
: { 
 366             quality 
= DMRES_HIGH
; break; 
 369             quality 
= m_printQuality
; break; 
 372         devMode
->dmPrintQuality 
= quality
; 
 373         devMode
->dmFields 
|= DM_PRINTQUALITY
; 
 375         GlobalUnlock(hDevMode
); 
 379 void wxPrintData::ConvertFromNative() 
 381     HGLOBAL hDevMode 
= (HGLOBAL
) m_devMode
; 
 388         DEVMODE 
*devMode 
= (DEVMODE
*) GlobalLock(hDevMode
); 
 392         if (devMode
->dmFields 
& DM_ORIENTATION
) 
 393             m_printOrientation 
= devMode
->dmOrientation
; 
 397         if (devMode
->dmFields 
& DM_COLLATE
) 
 399             if (devMode
->dmCollate 
== DMCOLLATE_TRUE
) 
 400                 m_printCollate 
= TRUE
; 
 402                 m_printCollate 
= FALSE
; 
 405         //// Number of copies 
 407         if (devMode
->dmFields 
& DM_COPIES
) 
 409             m_printNoCopies 
= devMode
->dmCopies
; 
 414         if (devMode
->dmDeviceName
[0] != 0) 
 416             // TODO: make this Unicode compatible 
 419             while (devMode
->dmDeviceName
[i
] != 0) 
 421                 buf
[i
] = devMode
->dmDeviceName
[i
]; 
 431         if (devMode
->dmFields 
& DM_COLOR
) 
 433             if (devMode
->dmColor 
== DMCOLOR_COLOR
) 
 443         if (devMode
->dmFields 
& DM_PAPERSIZE
) 
 445             if (wxThePrintPaperDatabase
) 
 447                 wxPrintPaperType
* paper 
= wxThePrintPaperDatabase
->FindPaperTypeByPlatformId(devMode
->dmPaperSize
); 
 450                     m_paperId 
= paper
->GetId(); 
 451                     m_paperSize
.x 
= paper
->GetWidth() / 10 ; 
 452                     m_paperSize
.y 
= paper
->GetHeight() / 10 ; 
 456                     // Shouldn't really get here 
 457                     wxFAIL_MSG("Couldn't find paper size in paper database."); 
 459                     m_paperId 
= wxPAPER_NONE
; 
 466                 // Shouldn't really get here 
 467                 wxFAIL_MSG("Paper database wasn't initialized in wxPrintData::ConvertFromNative."); 
 469                 m_paperId 
= wxPAPER_NONE
; 
 474         else if ((devMode
->dmFields 
& DM_PAPERWIDTH
) && (devMode
->dmFields 
& DM_PAPERLENGTH
)) 
 476             m_paperSize
.x 
= devMode
->dmPaperWidth 
/ 10; 
 477             m_paperSize
.y 
= devMode
->dmPaperLength 
/ 10; 
 478             m_paperId 
= wxPAPER_NONE
; 
 482             // Shouldn't really get here 
 483             wxFAIL_MSG("Couldn't find paper size from DEVMODE."); 
 487             m_paperId 
= wxPAPER_NONE
; 
 493         if (devMode
->dmFields 
& DM_DUPLEX
) 
 495             switch (devMode
->dmDuplex
) 
 497             case DMDUP_HORIZONTAL
: { 
 498                 m_duplexMode 
= wxDUPLEX_HORIZONTAL
; break; 
 500             case DMDUP_VERTICAL
: { 
 501                 m_duplexMode 
= wxDUPLEX_VERTICAL
; break; 
 504             case DMDUP_SIMPLEX
: { 
 505                 m_duplexMode 
= wxDUPLEX_SIMPLEX
; break; 
 510             m_duplexMode 
= wxDUPLEX_SIMPLEX
; 
 514         if (devMode
->dmFields 
& DM_PRINTQUALITY
) 
 516             switch (devMode
->dmPrintQuality
) 
 519                 m_printQuality 
= wxPRINT_QUALITY_MEDIUM
; break; 
 522                 m_printQuality 
= wxPRINT_QUALITY_LOW
; break; 
 525                 m_printQuality 
= wxPRINT_QUALITY_DRAFT
; break; 
 528                 m_printQuality 
= wxPRINT_QUALITY_HIGH
; break; 
 532                     // TODO: if the printer fills in the resolution in DPI, how 
 533                     // will the application know if it's high, low, draft etc.?? 
 534                     //                    wxFAIL_MSG("Warning: DM_PRINTQUALITY was not one of the standard values."); 
 535                     m_printQuality 
= devMode
->dmPrintQuality
; break; 
 541             m_printQuality 
= wxPRINT_QUALITY_HIGH
; 
 543         GlobalUnlock(hDevMode
); 
 549 void wxPrintData::operator=(const wxPrintData
& data
) 
 551     m_printNoCopies 
= data
.m_printNoCopies
; 
 552     m_printCollate 
= data
.m_printCollate
; 
 553     m_printOrientation 
= data
.m_printOrientation
; 
 554     m_printerName 
= data
.m_printerName
; 
 555     m_colour 
= data
.m_colour
; 
 556     m_duplexMode 
= data
.m_duplexMode
; 
 557     m_printQuality 
= data
.m_printQuality
; 
 558     m_paperId 
= data
.m_paperId
; 
 559     m_paperSize 
= data
.m_paperSize
; 
 561     // PostScript-specific data 
 562     m_printerCommand 
= data
.m_printerCommand
; 
 563     m_previewCommand 
= data
.m_previewCommand
; 
 564     m_printerOptions 
= data
.m_printerOptions
; 
 565     m_filename 
= data
.m_filename
; 
 566     m_afmPath 
= data
.m_afmPath
; 
 567     m_printerScaleX 
= data
.m_printerScaleX
; 
 568     m_printerScaleY 
= data
.m_printerScaleY
; 
 569     m_printerTranslateX 
= data
.m_printerTranslateX
; 
 570     m_printerTranslateY 
= data
.m_printerTranslateY
; 
 571     m_printMode 
= data
.m_printMode
; 
 575 #if wxCOMPATIBILITY_WITH_PRINTSETUPDATA 
 576 void wxPrintData::operator=(const wxPrintSetupData
& setupData
) 
 578     SetPrinterCommand(setupData
.GetPrinterCommand()); 
 579     SetPreviewCommand(setupData
.GetPrintPreviewCommand()); 
 580     SetPrinterOptions(setupData
.GetPrinterOptions()); 
 583     setupData
.GetPrinterTranslation(& xt
, & yt
); 
 584     SetPrinterTranslation(xt
, yt
); 
 587     setupData
.GetPrinterScaling(& xs
, & ys
); 
 588     SetPrinterScaling(xs
, ys
); 
 590     SetOrientation(setupData
.GetPrinterOrientation()); 
 591     SetPrintMode((wxPrintMode
) setupData
.GetPrinterMode()); 
 592     SetFontMetricPath(setupData
.GetAFMPath()); 
 593     if (setupData
.GetPaperName() != "") 
 594         SetPaperId(wxThePrintPaperDatabase
->ConvertNameToId(setupData
.GetPaperName())); 
 595     SetColour(setupData
.GetColour()); 
 596     SetFilename(setupData
.GetPrinterFile()); 
 598 #endif // wxCOMPATIBILITY_WITH_PRINTSETUPDATA 
 601 // ---------------------------------------------------------------------------- 
 603 // ---------------------------------------------------------------------------- 
 605 wxPrintDialogData::wxPrintDialogData() 
 608     m_printDlgData 
= NULL
; 
 615     m_printAllPages 
= FALSE
; 
 616     m_printCollate 
= FALSE
; 
 617     m_printToFile 
= FALSE
; 
 618     m_printEnableSelection 
= FALSE
; 
 619     m_printEnablePageNumbers 
= TRUE
; 
 620     m_printEnablePrintToFile 
= TRUE
; 
 621     m_printEnableHelp 
= FALSE
; 
 622     m_printSetupDialog 
= FALSE
; 
 625 wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData
& dialogData
) 
 627     (*this) = dialogData
; 
 630 wxPrintDialogData::wxPrintDialogData(const wxPrintData
& printData
) 
 633     m_printDlgData 
= NULL
; 
 640     m_printAllPages 
= FALSE
; 
 641     m_printCollate 
= FALSE
; 
 642     m_printToFile 
= FALSE
; 
 643     m_printEnableSelection 
= FALSE
; 
 644     m_printEnablePageNumbers 
= TRUE
; 
 645     m_printEnablePrintToFile 
= TRUE
; 
 646     m_printEnableHelp 
= FALSE
; 
 647     m_printSetupDialog 
= FALSE
; 
 649     m_printData 
= printData
; 
 652 wxPrintDialogData::~wxPrintDialogData() 
 655     PRINTDLG 
*pd 
= (PRINTDLG 
*) m_printDlgData
; 
 656     if ( pd 
&& pd
->hDevMode 
) 
 657         GlobalFree(pd
->hDevMode
); 
 664 void wxPrintDialogData::ConvertToNative() 
 666     m_printData
.ConvertToNative(); 
 668     PRINTDLG 
*pd 
= (PRINTDLG
*) m_printDlgData
; 
 673         m_printDlgData 
= (void*) pd
; 
 675         // GNU-WIN32 has the wrong size PRINTDLG - can't work out why. 
 677         pd
->lStructSize    
= 66 ; 
 680         pd
->lStructSize    
= sizeof(PRINTDLG
); 
 681         pd
->hwndOwner      
= (HWND
)NULL
; 
 682         pd
->hDevMode       
= NULL
; // Will be created by PrintDlg 
 683         pd
->hDevNames      
= NULL
; // Ditto 
 685         pd
->Flags          
= PD_RETURNDEFAULT
; 
 689     // Pass the devmode data to the PRINTDLG structure, since it'll 
 690     // be needed when PrintDlg is called. 
 693         GlobalFree(pd
->hDevMode
); 
 696     pd
->hDevMode 
= (HGLOBAL
) m_printData
.GetNativeData(); 
 698     m_printData
.SetNativeData((void*) NULL
); 
 700     wxASSERT_MSG( (pd
->hDevMode
), "hDevMode must be non-NULL in ConvertToNative!"); 
 702     pd
->hDC 
= (HDC
) NULL
; 
 703     pd
->nFromPage 
= (UINT
)m_printFromPage
; 
 704     pd
->nToPage 
= (UINT
)m_printToPage
; 
 705     pd
->nMinPage 
= (UINT
)m_printMinPage
; 
 706     pd
->nMaxPage 
= (UINT
)m_printMaxPage
; 
 707     pd
->nCopies 
= (UINT
)m_printNoCopies
; 
 709     pd
->Flags 
= PD_RETURNDC 
; 
 712     pd
->lStructSize 
= 66 ; 
 714     pd
->lStructSize 
= sizeof( PRINTDLG 
); 
 717     pd
->hwndOwner
=(HWND
)NULL
; 
 718     pd
->hDevNames
=(HANDLE
)NULL
; 
 719     pd
->hInstance
=(HINSTANCE
)NULL
; 
 720     pd
->lCustData 
= (LPARAM
) NULL
; 
 721     pd
->lpfnPrintHook 
= NULL
; 
 722     pd
->lpfnSetupHook 
= NULL
; 
 723     pd
->lpPrintTemplateName 
= NULL
; 
 724     pd
->lpSetupTemplateName 
= NULL
; 
 725     pd
->hPrintTemplate 
= (HGLOBAL
) NULL
; 
 726     pd
->hSetupTemplate 
= (HGLOBAL
) NULL
; 
 728     if ( m_printAllPages 
) 
 729         pd
->Flags 
|= PD_ALLPAGES
; 
 730     if ( m_printCollate 
) 
 731         pd
->Flags 
|= PD_COLLATE
; 
 733         pd
->Flags 
|= PD_PRINTTOFILE
; 
 734     if ( !m_printEnablePrintToFile 
) 
 735         pd
->Flags 
|= PD_DISABLEPRINTTOFILE
; 
 736     if ( !m_printEnableSelection 
) 
 737         pd
->Flags 
|= PD_NOSELECTION
; 
 738     if ( !m_printEnablePageNumbers 
) 
 739         pd
->Flags 
|= PD_NOPAGENUMS
; 
 740     if ( m_printEnableHelp 
) 
 741         pd
->Flags 
|= PD_SHOWHELP
; 
 742     if ( m_printSetupDialog 
) 
 743         pd
->Flags 
|= PD_PRINTSETUP
; 
 746 void wxPrintDialogData::ConvertFromNative() 
 748     PRINTDLG 
*pd 
= (PRINTDLG
*) m_printDlgData
; 
 752     // Pass the devmode data back to the wxPrintData structure where it really belongs. 
 755         if (m_printData
.GetNativeData()) 
 757             // Make sure we don't leak memory 
 758             GlobalFree((HGLOBAL
) m_printData
.GetNativeData()); 
 760         m_printData
.SetNativeData((void*) pd
->hDevMode
); 
 764     // Now convert the DEVMODE object, passed down from the PRINTDLG object, 
 765     // into wxWindows form. 
 766     m_printData
.ConvertFromNative(); 
 768     m_printFromPage 
= pd
->nFromPage 
; 
 769     m_printToPage 
= pd
->nToPage 
; 
 770     m_printMinPage 
= pd
->nMinPage 
; 
 771     m_printMaxPage 
= pd
->nMaxPage 
; 
 772     m_printNoCopies 
= pd
->nCopies 
; 
 774     m_printAllPages 
= ((pd
->Flags 
& PD_ALLPAGES
) == PD_ALLPAGES
); 
 775     m_printCollate 
= ((pd
->Flags 
& PD_COLLATE
) == PD_COLLATE
); 
 776     m_printToFile 
= ((pd
->Flags 
& PD_PRINTTOFILE
) == PD_PRINTTOFILE
); 
 777     m_printEnablePrintToFile 
= ((pd
->Flags 
& PD_DISABLEPRINTTOFILE
) != PD_DISABLEPRINTTOFILE
); 
 778     m_printEnableSelection 
= ((pd
->Flags 
& PD_NOSELECTION
) != PD_NOSELECTION
); 
 779     m_printEnablePageNumbers 
= ((pd
->Flags 
& PD_NOPAGENUMS
) != PD_NOPAGENUMS
); 
 780     m_printEnableHelp 
= ((pd
->Flags 
& PD_SHOWHELP
) == PD_SHOWHELP
); 
 781     m_printSetupDialog 
= ((pd
->Flags 
& PD_PRINTSETUP
) == PD_PRINTSETUP
); 
 783 /* port is obsolete in WIN32 
 787         LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(pd->hDevNames); 
 789             m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset); 
 790             wxString devName = (LPSTR)lpDevNames + lpDevNames->wDeviceOffset; 
 791             GlobalUnlock(pd->hDevNames); 
 793 //            wxASSERT_MSG( (m_printerName == "" || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!"); 
 799 void wxPrintDialogData::SetOwnerWindow(wxWindow
* win
) 
 801     if ( m_printDlgData 
== NULL 
) 
 804     if ( m_printDlgData 
!= NULL 
&& win 
!= NULL
) 
 806         PRINTDLG 
*pd 
= (PRINTDLG 
*) m_printDlgData 
; 
 807         pd
->hwndOwner
=(HWND
) win
->GetHWND(); 
 812 void wxPrintDialogData::operator=(const wxPrintDialogData
& data
) 
 814     m_printFromPage 
= data
.m_printFromPage
; 
 815     m_printToPage 
= data
.m_printToPage
; 
 816     m_printMinPage 
= data
.m_printMinPage
; 
 817     m_printMaxPage 
= data
.m_printMaxPage
; 
 818     m_printNoCopies 
= data
.m_printNoCopies
; 
 819     m_printAllPages 
= data
.m_printAllPages
; 
 820     m_printCollate 
= data
.m_printCollate
; 
 821     m_printToFile 
= data
.m_printToFile
; 
 822     m_printEnableSelection 
= data
.m_printEnableSelection
; 
 823     m_printEnablePageNumbers 
= data
.m_printEnablePageNumbers
; 
 824     m_printEnableHelp 
= data
.m_printEnableHelp
; 
 825     m_printEnablePrintToFile 
= data
.m_printEnablePrintToFile
; 
 826     m_printSetupDialog 
= data
.m_printSetupDialog
; 
 828     m_printData 
= data
.m_printData
; 
 831 void wxPrintDialogData::operator=(const wxPrintData
& data
) 
 836 // ---------------------------------------------------------------------------- 
 837 // wxPageSetupDialogData 
 838 // ---------------------------------------------------------------------------- 
 840 wxPageSetupDialogData::wxPageSetupDialogData() 
 842 #if defined(__WIN95__) 
 843     m_pageSetupData 
= NULL
; 
 845     m_paperSize 
= wxSize(0, 0); 
 847     CalculatePaperSizeFromId(); 
 849     m_minMarginTopLeft 
= wxPoint(0, 0); 
 850     m_minMarginBottomRight 
= wxPoint(0, 0); 
 851     m_marginTopLeft 
= wxPoint(0, 0); 
 852     m_marginBottomRight 
= wxPoint(0, 0); 
 855     m_defaultMinMargins 
= FALSE
; 
 856     m_enableMargins 
= TRUE
; 
 857     m_enableOrientation 
= TRUE
; 
 858     m_enablePaper 
= TRUE
; 
 859     m_enablePrinter 
= TRUE
; 
 860     m_enableHelp 
= FALSE
; 
 861     m_getDefaultInfo 
= FALSE
; 
 864 wxPageSetupDialogData::wxPageSetupDialogData(const wxPageSetupDialogData
& dialogData
) 
 866     (*this) = dialogData
; 
 869 wxPageSetupDialogData::wxPageSetupDialogData(const wxPrintData
& printData
) 
 871 #if defined(__WIN95__) 
 872     m_pageSetupData 
= NULL
; 
 874     m_paperSize 
= wxSize(0, 0); 
 875     m_minMarginTopLeft 
= wxPoint(0, 0); 
 876     m_minMarginBottomRight 
= wxPoint(0, 0); 
 877     m_marginTopLeft 
= wxPoint(0, 0); 
 878     m_marginBottomRight 
= wxPoint(0, 0); 
 881     m_defaultMinMargins 
= FALSE
; 
 882     m_enableMargins 
= TRUE
; 
 883     m_enableOrientation 
= TRUE
; 
 884     m_enablePaper 
= TRUE
; 
 885     m_enablePrinter 
= TRUE
; 
 886     m_enableHelp 
= FALSE
; 
 887     m_getDefaultInfo 
= FALSE
; 
 889     m_printData 
= printData
; 
 891     // The wxPrintData paper size overrides these values, unless the size cannot 
 893     CalculatePaperSizeFromId(); 
 896 wxPageSetupDialogData::~wxPageSetupDialogData() 
 898 #if defined(__WIN95__) && defined(__WXMSW__) 
 899     PAGESETUPDLG 
*pd 
= (PAGESETUPDLG 
*)m_pageSetupData
; 
 900     if ( pd 
&& pd
->hDevMode 
) 
 901         GlobalFree(pd
->hDevMode
); 
 907 void wxPageSetupDialogData::operator=(const wxPageSetupDialogData
& data
) 
 909     m_paperSize 
= data
.m_paperSize
; 
 910     m_minMarginTopLeft 
= data
.m_minMarginTopLeft
; 
 911     m_minMarginBottomRight 
= data
.m_minMarginBottomRight
; 
 912     m_marginTopLeft 
= data
.m_marginTopLeft
; 
 913     m_marginBottomRight 
= data
.m_marginBottomRight
; 
 914     m_defaultMinMargins 
= data
.m_defaultMinMargins
; 
 915     m_enableMargins 
= data
.m_enableMargins
; 
 916     m_enableOrientation 
= data
.m_enableOrientation
; 
 917     m_enablePaper 
= data
.m_enablePaper
; 
 918     m_enablePrinter 
= data
.m_enablePrinter
; 
 919     m_getDefaultInfo 
= data
.m_getDefaultInfo
;; 
 920     m_enableHelp 
= data
.m_enableHelp
; 
 922     m_printData 
= data
.m_printData
; 
 925 void wxPageSetupDialogData::operator=(const wxPrintData
& data
) 
 930 #if defined(__WIN95__) 
 931 void wxPageSetupDialogData::ConvertToNative() 
 933     m_printData
.ConvertToNative(); 
 935     PAGESETUPDLG 
*pd 
= (PAGESETUPDLG
*) m_pageSetupData
; 
 937     if ( m_pageSetupData 
== NULL 
) 
 939         pd 
= new PAGESETUPDLG
; 
 941         m_pageSetupData 
= (void *)pd
; 
 944     // Pass the devmode data (created in m_printData.ConvertToNative) 
 945     // to the PRINTDLG structure, since it'll 
 946     // be needed when PrintDlg is called. 
 950         GlobalFree(pd
->hDevMode
); 
 955     pd
->hDevMode 
= (HGLOBAL
) m_printData
.GetNativeData(); 
 957     m_printData
.SetNativeData((void*) NULL
); 
 959     wxASSERT_MSG( (pd
->hDevMode
), "hDevMode must be non-NULL in ConvertToNative!"); 
 961 //        pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE)); 
 963     pd
->Flags 
= PSD_MARGINS
|PSD_MINMARGINS
; 
 965     if ( m_defaultMinMargins 
) 
 966         pd
->Flags 
|= PSD_DEFAULTMINMARGINS
; 
 967     if ( !m_enableMargins 
) 
 968         pd
->Flags 
|= PSD_DISABLEMARGINS
; 
 969     if ( !m_enableOrientation 
) 
 970         pd
->Flags 
|= PSD_DISABLEORIENTATION
; 
 971     if ( !m_enablePaper 
) 
 972         pd
->Flags 
|= PSD_DISABLEPAPER
; 
 973     if ( !m_enablePrinter 
) 
 974         pd
->Flags 
|= PSD_DISABLEPRINTER
; 
 975     if ( m_getDefaultInfo 
) 
 976         pd
->Flags 
|= PSD_RETURNDEFAULT
; 
 978         pd
->Flags 
|= PSD_SHOWHELP
; 
 980     // We want the units to be in hundredths of a millimetre 
 981     pd
->Flags 
|= PSD_INHUNDREDTHSOFMILLIMETERS
; 
 983     pd
->lStructSize 
= sizeof( PAGESETUPDLG 
); 
 984     pd
->hwndOwner
=(HWND
)NULL
; 
 985     pd
->hDevNames
=(HWND
)NULL
; 
 986     pd
->hInstance
=(HINSTANCE
)NULL
; 
 988     pd
->ptPaperSize
.x 
= m_paperSize
.x 
* 100; 
 989     pd
->ptPaperSize
.y 
= m_paperSize
.y 
* 100; 
 991     pd
->rtMinMargin
.left 
= m_minMarginTopLeft
.x 
* 100; 
 992     pd
->rtMinMargin
.top 
= m_minMarginTopLeft
.y 
* 100; 
 993     pd
->rtMinMargin
.right 
= m_minMarginBottomRight
.x 
* 100; 
 994     pd
->rtMinMargin
.bottom 
= m_minMarginBottomRight
.y 
* 100; 
 996     pd
->rtMargin
.left 
= m_marginTopLeft
.x 
* 100; 
 997     pd
->rtMargin
.top 
= m_marginTopLeft
.y 
* 100; 
 998     pd
->rtMargin
.right 
= m_marginBottomRight
.x 
* 100; 
 999     pd
->rtMargin
.bottom 
= m_marginBottomRight
.y 
* 100; 
1002     pd
->lpfnPageSetupHook 
= NULL
; 
1003     pd
->lpfnPagePaintHook 
= NULL
; 
1004     pd
->hPageSetupTemplate 
= NULL
; 
1005     pd
->lpPageSetupTemplateName 
= NULL
; 
1010         DEVMODE *devMode = (DEVMODE*) GlobalLock(pd->hDevMode); 
1011         memset(devMode, 0, sizeof(DEVMODE)); 
1012         devMode->dmSize = sizeof(DEVMODE); 
1013         devMode->dmOrientation = m_orientation; 
1014         devMode->dmFields = DM_ORIENTATION; 
1015         GlobalUnlock(pd->hDevMode); 
1020 void wxPageSetupDialogData::ConvertFromNative() 
1022     PAGESETUPDLG 
*pd 
= (PAGESETUPDLG 
*) m_pageSetupData 
; 
1026     // Pass the devmode data back to the wxPrintData structure where it really belongs. 
1029         if (m_printData
.GetNativeData()) 
1031             // Make sure we don't leak memory 
1032             GlobalFree((HGLOBAL
) m_printData
.GetNativeData()); 
1034         m_printData
.SetNativeData((void*) pd
->hDevMode
); 
1035         pd
->hDevMode 
= NULL
; 
1038     m_printData
.ConvertFromNative(); 
1040     pd
->Flags 
= PSD_MARGINS
|PSD_MINMARGINS
; 
1042     m_defaultMinMargins 
= ((pd
->Flags 
& PSD_DEFAULTMINMARGINS
) == PSD_DEFAULTMINMARGINS
); 
1043     m_enableMargins 
= ((pd
->Flags 
& PSD_DISABLEMARGINS
) != PSD_DISABLEMARGINS
); 
1044     m_enableOrientation 
= ((pd
->Flags 
& PSD_DISABLEORIENTATION
) != PSD_DISABLEORIENTATION
); 
1045     m_enablePaper 
= ((pd
->Flags 
& PSD_DISABLEPAPER
) != PSD_DISABLEPAPER
); 
1046     m_enablePrinter 
= ((pd
->Flags 
& PSD_DISABLEPRINTER
) != PSD_DISABLEPRINTER
); 
1047     m_getDefaultInfo 
= ((pd
->Flags 
& PSD_RETURNDEFAULT
) == PSD_RETURNDEFAULT
); 
1048     m_enableHelp 
= ((pd
->Flags 
& PSD_SHOWHELP
) == PSD_SHOWHELP
); 
1050     m_paperSize
.x 
= pd
->ptPaperSize
.x 
/ 100; 
1051     m_paperSize
.y 
= pd
->ptPaperSize
.y 
/ 100; 
1053     m_minMarginTopLeft
.x 
= pd
->rtMinMargin
.left 
/ 100; 
1054     m_minMarginTopLeft
.y 
= pd
->rtMinMargin
.top 
/ 100; 
1055     m_minMarginBottomRight
.x 
= pd
->rtMinMargin
.right 
/ 100; 
1056     m_minMarginBottomRight
.y 
= pd
->rtMinMargin
.bottom 
/ 100; 
1058     m_marginTopLeft
.x 
= pd
->rtMargin
.left 
/ 100 ; 
1059     m_marginTopLeft
.y 
= pd
->rtMargin
.top 
/ 100 ; 
1060     m_marginBottomRight
.x 
= pd
->rtMargin
.right 
/ 100 ; 
1061     m_marginBottomRight
.y 
= pd
->rtMargin
.bottom 
/ 100 ; 
1064 void wxPageSetupDialogData::SetOwnerWindow(wxWindow
* win
) 
1066     if ( m_pageSetupData 
== NULL 
) 
1069     if ( m_pageSetupData 
!= NULL 
&& win 
!= NULL
) 
1071         PAGESETUPDLG 
*pd 
= (PAGESETUPDLG 
*) m_pageSetupData 
; 
1072         pd
->hwndOwner
=(HWND
) win
->GetHWND(); 
1077 // If a corresponding paper type is found in the paper database, will set the m_printData 
1078 // paper size id member as well. 
1079 void wxPageSetupDialogData::SetPaperSize(const wxSize
& sz
) 
1083     CalculateIdFromPaperSize(); 
1086 // Sets the wxPrintData id, plus the paper width/height if found in the paper database. 
1087 void wxPageSetupDialogData::SetPaperSize(wxPaperSize id
) 
1089     m_printData
.SetPaperId(id
); 
1091     CalculatePaperSizeFromId(); 
1094 // Use paper size defined in this object to set the wxPrintData 
1096 void wxPageSetupDialogData::CalculateIdFromPaperSize() 
1098     wxASSERT_MSG( (wxThePrintPaperDatabase 
!= (wxPrintPaperDatabase
*) NULL
), 
1099                   "wxThePrintPaperDatabase should not be NULL. " 
1100                   "Do not create global print dialog data objects." ); 
1102     wxSize sz 
= GetPaperSize(); 
1104     wxPaperSize id 
= wxThePrintPaperDatabase
->GetSize(wxSize(sz
.x
* 10, sz
.y 
* 10)); 
1105     if (id 
!= wxPAPER_NONE
) 
1107         m_printData
.SetPaperId(id
); 
1111 // Use paper id in wxPrintData to set this object's paper size 
1112 void wxPageSetupDialogData::CalculatePaperSizeFromId() 
1114     wxASSERT_MSG( (wxThePrintPaperDatabase 
!= (wxPrintPaperDatabase
*) NULL
), 
1115                   "wxThePrintPaperDatabase should not be NULL. " 
1116                   "Do not create global print dialog data objects." ); 
1118     wxSize sz 
= wxThePrintPaperDatabase
->GetSize(m_printData
.GetPaperId()); 
1122         // sz is in 10ths of a mm, so multiply by 10. 
1123         m_paperSize
.x 
= sz
.x 
* 10; 
1124         m_paperSize
.y 
= sz
.y 
* 10;