]> git.saurik.com Git - wxWidgets.git/blob - src/common/cmndata.cpp
Correct wrong memset ordering that produced an assert in the printing sample
[wxWidgets.git] / src / common / cmndata.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: cmndata.cpp
3 // Purpose: Common GDI data
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 01/02/97
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #ifdef __GNUG__
21 #pragma implementation "cmndata.h"
22 #endif
23
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
26
27 #ifdef __BORLANDC__
28 #pragma hdrstop
29 #endif
30
31 #ifndef WX_PRECOMP
32 #include <stdio.h>
33 #include "wx/string.h"
34 #include "wx/utils.h"
35 #include "wx/app.h"
36 #endif
37
38 #include "wx/gdicmn.h"
39 #include "wx/cmndata.h"
40
41 #include "wx/paper.h"
42
43 // For compatibility
44 #if (defined(__WXMOTIF__) || defined(__WXGTK__)) && wxUSE_POSTSCRIPT
45 #define wxCOMPATIBILITY_WITH_PRINTSETUPDATA 1
46 #endif
47
48 #if wxCOMPATIBILITY_WITH_PRINTSETUPDATA
49 #include "wx/generic/dcpsg.h"
50 #endif
51
52 #ifdef __WXMSW__
53 #include <windows.h>
54 #include <wx/msw/private.h>
55
56 #if !defined(__WIN32__)
57 #include <print.h>
58 #include <commdlg.h>
59 #endif // Win16
60
61 #if defined(__WATCOMC__) || defined(__SC__) || defined(__SALFORDC__)
62 #include <windowsx.h>
63 #include <commdlg.h>
64 #endif
65 #endif // MSW
66
67 #if !USE_SHARED_LIBRARY
68 IMPLEMENT_DYNAMIC_CLASS(wxPrintData, wxObject)
69 IMPLEMENT_DYNAMIC_CLASS(wxPrintDialogData, wxObject)
70 IMPLEMENT_DYNAMIC_CLASS(wxPageSetupDialogData, wxObject)
71 IMPLEMENT_DYNAMIC_CLASS(wxFontData, wxObject)
72 IMPLEMENT_DYNAMIC_CLASS(wxColourData, wxObject)
73 #endif
74
75 // ============================================================================
76 // implementation
77 // ============================================================================
78
79 // ----------------------------------------------------------------------------
80 // wxColourData
81 // ----------------------------------------------------------------------------
82
83 wxColourData::wxColourData()
84 {
85 int i;
86 for (i = 0; i < 16; i++)
87 custColours[i].Set(255, 255, 255);
88
89 chooseFull = FALSE;
90 dataColour.Set(0,0,0);
91 }
92
93 wxColourData::wxColourData(const wxColourData& data)
94 {
95 (*this) = data;
96 }
97
98 wxColourData::~wxColourData()
99 {
100 }
101
102 void wxColourData::SetCustomColour(int i, wxColour& colour)
103 {
104 if (i > 15 || i < 0)
105 return;
106
107 custColours[i] = colour;
108 }
109
110 wxColour wxColourData::GetCustomColour(int i)
111 {
112 if (i > 15 || i < 0)
113 return wxColour(0,0,0);
114
115 return custColours[i];
116 }
117
118 void wxColourData::operator=(const wxColourData& data)
119 {
120 int i;
121 for (i = 0; i < 16; i++)
122 custColours[i] = data.custColours[i];
123
124 dataColour = (wxColour&)data.dataColour;
125 chooseFull = data.chooseFull;
126 }
127
128 // ----------------------------------------------------------------------------
129 // Font data
130 // ----------------------------------------------------------------------------
131
132 wxFontData::wxFontData()
133 {
134 // Intialize colour to black.
135 fontColour.Set(0, 0, 0);
136
137 showHelp = FALSE;
138 allowSymbols = TRUE;
139 enableEffects = TRUE;
140 minSize = 0;
141 maxSize = 0;
142 }
143
144 wxFontData::wxFontData(const wxFontData& data)
145 {
146 (*this) = data;
147 }
148
149 wxFontData::~wxFontData()
150 {
151 }
152
153 void wxFontData::operator=(const wxFontData& data)
154 {
155 fontColour = data.fontColour;
156 showHelp = data.showHelp;
157 allowSymbols = data.allowSymbols;
158 enableEffects = data.enableEffects;
159 initialFont = data.initialFont;
160 chosenFont = data.chosenFont;
161 minSize = data.minSize;
162 maxSize = data.maxSize;
163 }
164
165 // ----------------------------------------------------------------------------
166 // Print data
167 // ----------------------------------------------------------------------------
168
169 wxPrintData::wxPrintData()
170 {
171 #ifdef __WXMSW__
172 m_devMode = NULL;
173 #endif
174 m_printOrientation = wxPORTRAIT;
175 m_printNoCopies = 1;
176 m_printCollate = FALSE;
177
178 // New, 24/3/99
179 m_printerName = "";
180 m_colour = TRUE;
181 m_duplexMode = wxDUPLEX_SIMPLEX;
182 m_printQuality = wxPRINT_QUALITY_HIGH;
183 m_paperId = wxPAPER_A4;
184 m_paperSize = wxSize(210, 297);
185
186 // PostScript-specific data
187 m_printerCommand = "";
188 m_previewCommand = "";
189 m_printerOptions = "";
190 m_filename = "";
191 m_afmPath = "";
192 m_printerScaleX = 1.0;
193 m_printerScaleY = 1.0;
194 m_printerTranslateX = 0;
195 m_printerTranslateY = 0;
196 m_printMode = wxPRINT_MODE_FILE;
197 }
198
199 wxPrintData::wxPrintData(const wxPrintData& printData)
200 {
201 (*this) = printData;
202 }
203
204 wxPrintData::~wxPrintData()
205 {
206 #ifdef __WXMSW__
207 HGLOBAL hDevMode = (HGLOBAL) m_devMode;
208 if (hDevMode )
209 GlobalFree(hDevMode);
210 #endif
211 }
212
213 #ifdef __WXMSW__
214
215 static wxString wxGetPrintDlgError()
216 {
217 DWORD err = CommDlgExtendedError();
218 wxString msg = "Unknown";
219 switch (err)
220 {
221 case CDERR_FINDRESFAILURE: msg = "CDERR_FINDRESFAILURE"; break;
222 case CDERR_INITIALIZATION: msg = "CDERR_INITIALIZATION"; break;
223 case CDERR_LOADRESFAILURE: msg = "CDERR_LOADRESFAILURE"; break;
224 case CDERR_LOADSTRFAILURE: msg = "CDERR_LOADSTRFAILURE"; break;
225 case CDERR_LOCKRESFAILURE: msg = "CDERR_LOCKRESFAILURE"; break;
226 case CDERR_MEMALLOCFAILURE: msg = "CDERR_MEMALLOCFAILURE"; break;
227 case CDERR_MEMLOCKFAILURE: msg = "CDERR_MEMLOCKFAILURE"; break;
228 case CDERR_NOHINSTANCE: msg = "CDERR_NOHINSTANCE"; break;
229 case CDERR_NOHOOK: msg = "CDERR_NOHOOK"; break;
230 case CDERR_NOTEMPLATE: msg = "CDERR_NOTEMPLATE"; break;
231 case CDERR_STRUCTSIZE: msg = "CDERR_STRUCTSIZE"; break;
232 case PDERR_RETDEFFAILURE: msg = "PDERR_RETDEFFAILURE"; break;
233 case PDERR_PRINTERNOTFOUND: msg = "PDERR_PRINTERNOTFOUND"; break;
234 case PDERR_PARSEFAILURE: msg = "PDERR_PARSEFAILURE"; break;
235 case PDERR_NODEVICES: msg = "PDERR_NODEVICES"; break;
236 case PDERR_NODEFAULTPRN: msg = "PDERR_NODEFAULTPRN"; break;
237 case PDERR_LOADDRVFAILURE: msg = "PDERR_LOADDRVFAILURE"; break;
238 case PDERR_INITFAILURE: msg = "PDERR_INITFAILURE"; break;
239 case PDERR_GETDEVMODEFAIL: msg = "PDERR_GETDEVMODEFAIL"; break;
240 case PDERR_DNDMMISMATCH: msg = "PDERR_DNDMMISMATCH"; break;
241 case PDERR_DEFAULTDIFFERENT: msg = "PDERR_DEFAULTDIFFERENT"; break;
242 case PDERR_CREATEICFAILURE: msg = "PDERR_CREATEICFAILURE"; break;
243 default: break;
244 }
245 return msg;
246 }
247
248
249
250 void wxPrintData::ConvertToNative()
251 {
252 HGLOBAL hDevMode = (HGLOBAL) m_devMode;
253 if (!hDevMode)
254 {
255 // Use PRINTDLG as a way of creating a DEVMODE object
256 PRINTDLG *pd = new PRINTDLG;
257
258 // GNU-WIN32 has the wrong size PRINTDLG - can't work out why.
259 #ifdef __GNUWIN32__
260 memset(pd, 0, 66);
261 pd->lStructSize = 66 ;
262 #else
263 memset(pd, 0, sizeof(PRINTDLG));
264 pd->lStructSize = sizeof(PRINTDLG);
265 #endif
266
267 pd->hwndOwner = (HWND)NULL;
268 pd->hDevMode = NULL; // Will be created by PrintDlg
269 pd->hDevNames = NULL; // Ditto
270 pd->hInstance = (HINSTANCE) wxGetInstance();
271
272 pd->Flags = PD_RETURNDEFAULT;
273 pd->nCopies = 1;
274
275 // Fill out the DEVMODE structure
276 // so we can use it as input in the 'real' PrintDlg
277 if (!PrintDlg(pd))
278 {
279 if ( pd->hDevMode )
280 GlobalFree(pd->hDevMode);
281 if ( pd->hDevNames )
282 GlobalFree(pd->hDevNames);
283 pd->hDevMode = NULL;
284 pd->hDevNames = NULL;
285 #ifdef __WXDEBUG__
286 wxString str("Printing error: ");
287 str += wxGetPrintDlgError();
288 wxLogDebug(str);
289 #endif
290 }
291 else
292 {
293 if ( pd->hDevNames )
294 GlobalFree(pd->hDevNames);
295 pd->hDevNames = NULL;
296
297 hDevMode = pd->hDevMode;
298 m_devMode = (void*) hDevMode;
299 pd->hDevMode = NULL;
300 }
301
302 delete pd;
303 }
304
305 if ( hDevMode )
306 {
307 DEVMODE *devMode = (DEVMODE*) GlobalLock(hDevMode);
308
309 //// Orientation
310
311 devMode->dmOrientation = m_printOrientation;
312 devMode->dmFields = DM_ORIENTATION;
313
314 //// Collation
315
316 devMode->dmCollate = (m_printCollate ? DMCOLLATE_TRUE : DMCOLLATE_FALSE);
317 devMode->dmFields |= DM_COLLATE;
318
319 //// Number of copies
320
321 devMode->dmCopies = m_printNoCopies;
322 devMode->dmFields |= DM_COPIES;
323
324 //// Printer name
325
326 if (m_printerName != "")
327 {
328 // TODO: make this Unicode compatible
329 int len = wxMin(31, m_printerName.Len());
330 int i;
331 for (i = 0; i < len; i++)
332 devMode->dmDeviceName[i] = m_printerName.GetChar(i);
333 devMode->dmDeviceName[i] = 0;
334 }
335
336 //// Colour
337
338 if (m_colour)
339 devMode->dmColor = DMCOLOR_COLOR;
340 else
341 devMode->dmColor = DMCOLOR_MONOCHROME;
342
343 devMode->dmFields |= DM_COLOR;
344
345 //// Paper size
346
347 if (m_paperId == wxPAPER_NONE)
348 {
349 devMode->dmPaperWidth = m_paperSize.x * 10;
350 devMode->dmPaperLength = m_paperSize.y * 10;
351 devMode->dmFields |= DM_PAPERWIDTH;
352 devMode->dmFields |= DM_PAPERLENGTH;
353 }
354 else
355 {
356 if (wxThePrintPaperDatabase)
357 {
358 wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperType(m_paperId);
359 if (paper)
360 {
361 devMode->dmPaperSize = paper->GetPlatformId();
362 devMode->dmFields |= DM_PAPERSIZE;
363 }
364 }
365 }
366
367 //// Duplex
368
369 int duplex;
370 switch (m_duplexMode)
371 {
372 case wxDUPLEX_HORIZONTAL: {
373 duplex = DMDUP_HORIZONTAL; break;
374 }
375 case wxDUPLEX_VERTICAL: {
376 duplex = DMDUP_VERTICAL; break;
377 }
378 default:
379 case wxDUPLEX_SIMPLEX: {
380 duplex = DMDUP_SIMPLEX; break;
381 }
382 }
383 devMode->dmDuplex = duplex;
384 devMode->dmFields |= DM_DUPLEX;
385
386 //// Quality
387
388 int quality;
389 switch (m_printQuality)
390 {
391 case wxPRINT_QUALITY_MEDIUM: {
392 quality = DMRES_MEDIUM; break;
393 }
394 case wxPRINT_QUALITY_LOW: {
395 quality = DMRES_LOW; break;
396 }
397 case wxPRINT_QUALITY_DRAFT: {
398 quality = DMRES_DRAFT; break;
399 }
400 case wxPRINT_QUALITY_HIGH: {
401 quality = DMRES_HIGH; break;
402 }
403 default: {
404 quality = m_printQuality; break;
405 }
406 }
407 devMode->dmPrintQuality = quality;
408 devMode->dmFields |= DM_PRINTQUALITY;
409
410 GlobalUnlock(hDevMode);
411 }
412 }
413
414 void wxPrintData::ConvertFromNative()
415 {
416 HGLOBAL hDevMode = (HGLOBAL) m_devMode;
417
418 if (!hDevMode)
419 return;
420
421 if ( hDevMode )
422 {
423 DEVMODE *devMode = (DEVMODE*) GlobalLock(hDevMode);
424
425 //// Orientation
426
427 if (devMode->dmFields & DM_ORIENTATION)
428 m_printOrientation = devMode->dmOrientation;
429
430 //// Collation
431
432 if (devMode->dmFields & DM_COLLATE)
433 {
434 if (devMode->dmCollate == DMCOLLATE_TRUE)
435 m_printCollate = TRUE;
436 else
437 m_printCollate = FALSE;
438 }
439
440 //// Number of copies
441
442 if (devMode->dmFields & DM_COPIES)
443 {
444 m_printNoCopies = devMode->dmCopies;
445 }
446
447 //// Printer name
448
449 if (devMode->dmDeviceName[0] != 0)
450 {
451 // TODO: make this Unicode compatible
452 char buf[32];
453 int i = 0;
454 while (devMode->dmDeviceName[i] != 0)
455 {
456 buf[i] = devMode->dmDeviceName[i];
457 i ++;
458 }
459 buf[i] = 0;
460
461 m_printerName = buf;
462 }
463
464 //// Colour
465
466 if (devMode->dmFields & DM_COLOR)
467 {
468 if (devMode->dmColor == DMCOLOR_COLOR)
469 m_colour = TRUE;
470 else
471 m_colour = FALSE;
472 }
473 else
474 m_colour = TRUE;
475
476 //// Paper size
477
478 if (devMode->dmFields & DM_PAPERSIZE)
479 {
480 if (wxThePrintPaperDatabase)
481 {
482 wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperTypeByPlatformId(devMode->dmPaperSize);
483 if (paper)
484 {
485 m_paperId = paper->GetId();
486 m_paperSize.x = paper->GetWidth() / 10 ;
487 m_paperSize.y = paper->GetHeight() / 10 ;
488 }
489 else
490 {
491 // Shouldn't really get here
492 wxFAIL_MSG("Couldn't find paper size in paper database.");
493
494 m_paperId = wxPAPER_NONE;
495 m_paperSize.x = 0;
496 m_paperSize.y = 0;
497 }
498 }
499 else
500 {
501 // Shouldn't really get here
502 wxFAIL_MSG("Paper database wasn't initialized in wxPrintData::ConvertFromNative.");
503
504 m_paperId = wxPAPER_NONE;
505 m_paperSize.x = 0;
506 m_paperSize.y = 0;
507 }
508 }
509 else if ((devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH))
510 {
511 m_paperSize.x = devMode->dmPaperWidth / 10;
512 m_paperSize.y = devMode->dmPaperLength / 10;
513 m_paperId = wxPAPER_NONE;
514 }
515 else
516 {
517 // Shouldn't really get here
518 wxFAIL_MSG("Couldn't find paper size from DEVMODE.");
519
520 m_paperSize.x = 0;
521 m_paperSize.y = 0;
522 m_paperId = wxPAPER_NONE;
523 }
524
525
526 //// Duplex
527
528 if (devMode->dmFields & DM_DUPLEX)
529 {
530 switch (devMode->dmDuplex)
531 {
532 case DMDUP_HORIZONTAL: {
533 m_duplexMode = wxDUPLEX_HORIZONTAL; break;
534 }
535 case DMDUP_VERTICAL: {
536 m_duplexMode = wxDUPLEX_VERTICAL; break;
537 }
538 default:
539 case DMDUP_SIMPLEX: {
540 m_duplexMode = wxDUPLEX_SIMPLEX; break;
541 }
542 }
543 }
544 else
545 m_duplexMode = wxDUPLEX_SIMPLEX;
546
547 //// Quality
548
549 if (devMode->dmFields & DM_PRINTQUALITY)
550 {
551 switch (devMode->dmPrintQuality)
552 {
553 case DMRES_MEDIUM: {
554 m_printQuality = wxPRINT_QUALITY_MEDIUM; break;
555 }
556 case DMRES_LOW: {
557 m_printQuality = wxPRINT_QUALITY_LOW; break;
558 }
559 case DMRES_DRAFT: {
560 m_printQuality = wxPRINT_QUALITY_DRAFT; break;
561 }
562 case DMRES_HIGH: {
563 m_printQuality = wxPRINT_QUALITY_HIGH; break;
564 }
565 default:
566 {
567 // TODO: if the printer fills in the resolution in DPI, how
568 // will the application know if it's high, low, draft etc.??
569 // wxFAIL_MSG("Warning: DM_PRINTQUALITY was not one of the standard values.");
570 m_printQuality = devMode->dmPrintQuality; break;
571
572 }
573 }
574 }
575 else
576 m_printQuality = wxPRINT_QUALITY_HIGH;
577
578 GlobalUnlock(hDevMode);
579 }
580 }
581
582 #endif
583
584 void wxPrintData::operator=(const wxPrintData& data)
585 {
586 m_printNoCopies = data.m_printNoCopies;
587 m_printCollate = data.m_printCollate;
588 m_printOrientation = data.m_printOrientation;
589 m_printerName = data.m_printerName;
590 m_colour = data.m_colour;
591 m_duplexMode = data.m_duplexMode;
592 m_printQuality = data.m_printQuality;
593 m_paperId = data.m_paperId;
594 m_paperSize = data.m_paperSize;
595
596 // PostScript-specific data
597 m_printerCommand = data.m_printerCommand;
598 m_previewCommand = data.m_previewCommand;
599 m_printerOptions = data.m_printerOptions;
600 m_filename = data.m_filename;
601 m_afmPath = data.m_afmPath;
602 m_printerScaleX = data.m_printerScaleX;
603 m_printerScaleY = data.m_printerScaleY;
604 m_printerTranslateX = data.m_printerTranslateX;
605 m_printerTranslateY = data.m_printerTranslateY;
606 m_printMode = data.m_printMode;
607 }
608
609 // For compatibility
610 #if wxCOMPATIBILITY_WITH_PRINTSETUPDATA
611 void wxPrintData::operator=(const wxPrintSetupData& setupData)
612 {
613 SetPrinterCommand(setupData.GetPrinterCommand());
614 SetPreviewCommand(setupData.GetPrintPreviewCommand());
615 SetPrinterOptions(setupData.GetPrinterOptions());
616
617 long xt, yt;
618 setupData.GetPrinterTranslation(& xt, & yt);
619 SetPrinterTranslation(xt, yt);
620
621 double xs, ys;
622 setupData.GetPrinterScaling(& xs, & ys);
623 SetPrinterScaling(xs, ys);
624
625 SetOrientation(setupData.GetPrinterOrientation());
626 SetPrintMode((wxPrintMode) setupData.GetPrinterMode());
627 SetFontMetricPath(setupData.GetAFMPath());
628 if (setupData.GetPaperName() != "")
629 SetPaperId(wxThePrintPaperDatabase->ConvertNameToId(setupData.GetPaperName()));
630 SetColour(setupData.GetColour());
631 SetFilename(setupData.GetPrinterFile());
632 }
633 #endif // wxCOMPATIBILITY_WITH_PRINTSETUPDATA
634
635
636 // ----------------------------------------------------------------------------
637 // Print dialog data
638 // ----------------------------------------------------------------------------
639
640 wxPrintDialogData::wxPrintDialogData()
641 {
642 #ifdef __WXMSW__
643 m_printDlgData = NULL;
644 #endif
645 m_printFromPage = 0;
646 m_printToPage = 0;
647 m_printMinPage = 0;
648 m_printMaxPage = 0;
649 m_printNoCopies = 1;
650 m_printAllPages = FALSE;
651 m_printCollate = FALSE;
652 m_printToFile = FALSE;
653 m_printEnableSelection = FALSE;
654 m_printEnablePageNumbers = TRUE;
655 m_printEnablePrintToFile = TRUE;
656 m_printEnableHelp = FALSE;
657 m_printSetupDialog = FALSE;
658 }
659
660 wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData& dialogData)
661 {
662 (*this) = dialogData;
663 }
664
665 wxPrintDialogData::wxPrintDialogData(const wxPrintData& printData)
666 {
667 #ifdef __WXMSW__
668 m_printDlgData = NULL;
669 #endif
670 m_printFromPage = 0;
671 m_printToPage = 0;
672 m_printMinPage = 0;
673 m_printMaxPage = 0;
674 m_printNoCopies = 1;
675 m_printAllPages = FALSE;
676 m_printCollate = FALSE;
677 m_printToFile = FALSE;
678 m_printEnableSelection = FALSE;
679 m_printEnablePageNumbers = TRUE;
680 m_printEnablePrintToFile = TRUE;
681 m_printEnableHelp = FALSE;
682 m_printSetupDialog = FALSE;
683
684 m_printData = printData;
685 }
686
687 wxPrintDialogData::~wxPrintDialogData()
688 {
689 #ifdef __WXMSW__
690 PRINTDLG *pd = (PRINTDLG *) m_printDlgData;
691 if ( pd && pd->hDevMode )
692 GlobalFree(pd->hDevMode);
693 if ( pd )
694 delete pd;
695 #endif
696 }
697
698 #ifdef __WXMSW__
699 void wxPrintDialogData::ConvertToNative()
700 {
701 m_printData.ConvertToNative();
702
703 PRINTDLG *pd = (PRINTDLG*) m_printDlgData;
704
705 if (!pd)
706 {
707 pd = new PRINTDLG;
708 m_printDlgData = (void*) pd;
709
710 // GNU-WIN32 has the wrong size PRINTDLG - can't work out why.
711 #ifdef __GNUWIN32__
712 pd->lStructSize = 66 ;
713 #else
714 #endif
715 pd->lStructSize = sizeof(PRINTDLG);
716 pd->hwndOwner = (HWND)NULL;
717 pd->hDevMode = NULL; // Will be created by PrintDlg
718 pd->hDevNames = NULL; // Ditto
719
720 pd->Flags = PD_RETURNDEFAULT;
721 pd->nCopies = 1;
722 }
723
724 // Pass the devmode data to the PRINTDLG structure, since it'll
725 // be needed when PrintDlg is called.
726 if (pd->hDevMode)
727 {
728 GlobalFree(pd->hDevMode);
729 }
730
731 pd->hDevMode = (HGLOBAL) m_printData.GetNativeData();
732
733 m_printData.SetNativeData((void*) NULL);
734
735 wxASSERT_MSG( (pd->hDevMode), "hDevMode must be non-NULL in ConvertToNative!");
736
737 pd->hDC = (HDC) NULL;
738 pd->nFromPage = (UINT)m_printFromPage;
739 pd->nToPage = (UINT)m_printToPage;
740 pd->nMinPage = (UINT)m_printMinPage;
741 pd->nMaxPage = (UINT)m_printMaxPage;
742 pd->nCopies = (UINT)m_printNoCopies;
743
744 pd->Flags = PD_RETURNDC ;
745
746 #ifdef __GNUWIN32__
747 pd->lStructSize = 66 ;
748 #else
749 pd->lStructSize = sizeof( PRINTDLG );
750 #endif
751
752 pd->hwndOwner=(HWND)NULL;
753 pd->hDevNames=(HANDLE)NULL;
754 pd->hInstance=(HINSTANCE)NULL;
755 pd->lCustData = (LPARAM) NULL;
756 pd->lpfnPrintHook = NULL;
757 pd->lpfnSetupHook = NULL;
758 pd->lpPrintTemplateName = NULL;
759 pd->lpSetupTemplateName = NULL;
760 pd->hPrintTemplate = (HGLOBAL) NULL;
761 pd->hSetupTemplate = (HGLOBAL) NULL;
762
763 if ( m_printAllPages )
764 pd->Flags |= PD_ALLPAGES;
765 if ( m_printCollate )
766 pd->Flags |= PD_COLLATE;
767 if ( m_printToFile )
768 pd->Flags |= PD_PRINTTOFILE;
769 if ( !m_printEnablePrintToFile )
770 pd->Flags |= PD_DISABLEPRINTTOFILE;
771 if ( !m_printEnableSelection )
772 pd->Flags |= PD_NOSELECTION;
773 if ( !m_printEnablePageNumbers )
774 pd->Flags |= PD_NOPAGENUMS;
775 if ( m_printEnableHelp )
776 pd->Flags |= PD_SHOWHELP;
777 if ( m_printSetupDialog )
778 pd->Flags |= PD_PRINTSETUP;
779 }
780
781 void wxPrintDialogData::ConvertFromNative()
782 {
783 PRINTDLG *pd = (PRINTDLG*) m_printDlgData;
784 if ( pd == NULL )
785 return;
786
787 // Pass the devmode data back to the wxPrintData structure where it really belongs.
788 if (pd->hDevMode)
789 {
790 if (m_printData.GetNativeData())
791 {
792 // Make sure we don't leak memory
793 GlobalFree((HGLOBAL) m_printData.GetNativeData());
794 }
795 m_printData.SetNativeData((void*) pd->hDevMode);
796 pd->hDevMode = NULL;
797 }
798
799 // Now convert the DEVMODE object, passed down from the PRINTDLG object,
800 // into wxWindows form.
801 m_printData.ConvertFromNative();
802
803 m_printFromPage = pd->nFromPage ;
804 m_printToPage = pd->nToPage ;
805 m_printMinPage = pd->nMinPage ;
806 m_printMaxPage = pd->nMaxPage ;
807 m_printNoCopies = pd->nCopies ;
808
809 m_printAllPages = ((pd->Flags & PD_ALLPAGES) == PD_ALLPAGES);
810 m_printCollate = ((pd->Flags & PD_COLLATE) == PD_COLLATE);
811 m_printToFile = ((pd->Flags & PD_PRINTTOFILE) == PD_PRINTTOFILE);
812 m_printEnablePrintToFile = ((pd->Flags & PD_DISABLEPRINTTOFILE) != PD_DISABLEPRINTTOFILE);
813 m_printEnableSelection = ((pd->Flags & PD_NOSELECTION) != PD_NOSELECTION);
814 m_printEnablePageNumbers = ((pd->Flags & PD_NOPAGENUMS) != PD_NOPAGENUMS);
815 m_printEnableHelp = ((pd->Flags & PD_SHOWHELP) == PD_SHOWHELP);
816 m_printSetupDialog = ((pd->Flags & PD_PRINTSETUP) == PD_PRINTSETUP);
817
818 /* port is obsolete in WIN32
819 // Get the port name
820 if (pd->hDevNames)
821 {
822 LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(pd->hDevNames);
823 if (lpDevNames) {
824 m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset);
825 wxString devName = (LPSTR)lpDevNames + lpDevNames->wDeviceOffset;
826 GlobalUnlock(pd->hDevNames);
827
828 // wxASSERT_MSG( (m_printerName == "" || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!");
829 }
830 }
831 */
832 }
833
834 void wxPrintDialogData::SetOwnerWindow(wxWindow* win)
835 {
836 if ( m_printDlgData == NULL )
837 ConvertToNative();
838
839 if ( m_printDlgData != NULL && win != NULL)
840 {
841 PRINTDLG *pd = (PRINTDLG *) m_printDlgData ;
842 pd->hwndOwner=(HWND) win->GetHWND();
843 }
844 }
845 #endif // MSW
846
847 void wxPrintDialogData::operator=(const wxPrintDialogData& data)
848 {
849 m_printFromPage = data.m_printFromPage;
850 m_printToPage = data.m_printToPage;
851 m_printMinPage = data.m_printMinPage;
852 m_printMaxPage = data.m_printMaxPage;
853 m_printNoCopies = data.m_printNoCopies;
854 m_printAllPages = data.m_printAllPages;
855 m_printCollate = data.m_printCollate;
856 m_printToFile = data.m_printToFile;
857 m_printEnableSelection = data.m_printEnableSelection;
858 m_printEnablePageNumbers = data.m_printEnablePageNumbers;
859 m_printEnableHelp = data.m_printEnableHelp;
860 m_printEnablePrintToFile = data.m_printEnablePrintToFile;
861 m_printSetupDialog = data.m_printSetupDialog;
862
863 m_printData = data.m_printData;
864 }
865
866 void wxPrintDialogData::operator=(const wxPrintData& data)
867 {
868 m_printData = data;
869 }
870
871 // ----------------------------------------------------------------------------
872 // wxPageSetupDialogData
873 // ----------------------------------------------------------------------------
874
875 wxPageSetupDialogData::wxPageSetupDialogData()
876 {
877 #if defined(__WIN95__)
878 m_pageSetupData = NULL;
879 #endif
880 m_paperSize = wxSize(0, 0);
881
882 CalculatePaperSizeFromId();
883
884 m_minMarginTopLeft = wxPoint(0, 0);
885 m_minMarginBottomRight = wxPoint(0, 0);
886 m_marginTopLeft = wxPoint(0, 0);
887 m_marginBottomRight = wxPoint(0, 0);
888
889 // Flags
890 m_defaultMinMargins = FALSE;
891 m_enableMargins = TRUE;
892 m_enableOrientation = TRUE;
893 m_enablePaper = TRUE;
894 m_enablePrinter = TRUE;
895 m_enableHelp = FALSE;
896 m_getDefaultInfo = FALSE;
897 }
898
899 wxPageSetupDialogData::wxPageSetupDialogData(const wxPageSetupDialogData& dialogData)
900 {
901 (*this) = dialogData;
902 }
903
904 wxPageSetupDialogData::wxPageSetupDialogData(const wxPrintData& printData)
905 {
906 #if defined(__WIN95__)
907 m_pageSetupData = NULL;
908 #endif
909 m_paperSize = wxSize(0, 0);
910 m_minMarginTopLeft = wxPoint(0, 0);
911 m_minMarginBottomRight = wxPoint(0, 0);
912 m_marginTopLeft = wxPoint(0, 0);
913 m_marginBottomRight = wxPoint(0, 0);
914
915 // Flags
916 m_defaultMinMargins = FALSE;
917 m_enableMargins = TRUE;
918 m_enableOrientation = TRUE;
919 m_enablePaper = TRUE;
920 m_enablePrinter = TRUE;
921 m_enableHelp = FALSE;
922 m_getDefaultInfo = FALSE;
923
924 m_printData = printData;
925
926 // The wxPrintData paper size overrides these values, unless the size cannot
927 // be found.
928 CalculatePaperSizeFromId();
929 }
930
931 wxPageSetupDialogData::~wxPageSetupDialogData()
932 {
933 #if defined(__WIN95__) && defined(__WXMSW__)
934 PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData;
935 if ( pd && pd->hDevMode )
936 GlobalFree(pd->hDevMode);
937 if ( pd )
938 delete pd;
939 #endif
940 }
941
942 void wxPageSetupDialogData::operator=(const wxPageSetupDialogData& data)
943 {
944 m_paperSize = data.m_paperSize;
945 m_minMarginTopLeft = data.m_minMarginTopLeft;
946 m_minMarginBottomRight = data.m_minMarginBottomRight;
947 m_marginTopLeft = data.m_marginTopLeft;
948 m_marginBottomRight = data.m_marginBottomRight;
949 m_defaultMinMargins = data.m_defaultMinMargins;
950 m_enableMargins = data.m_enableMargins;
951 m_enableOrientation = data.m_enableOrientation;
952 m_enablePaper = data.m_enablePaper;
953 m_enablePrinter = data.m_enablePrinter;
954 m_getDefaultInfo = data.m_getDefaultInfo;;
955 m_enableHelp = data.m_enableHelp;
956
957 m_printData = data.m_printData;
958 }
959
960 void wxPageSetupDialogData::operator=(const wxPrintData& data)
961 {
962 m_printData = data;
963 }
964
965 #if defined(__WIN95__)
966 void wxPageSetupDialogData::ConvertToNative()
967 {
968 m_printData.ConvertToNative();
969
970 PAGESETUPDLG *pd = (PAGESETUPDLG*) m_pageSetupData;
971
972 if ( m_pageSetupData == NULL )
973 {
974 pd = new PAGESETUPDLG;
975 pd->hDevMode = NULL;
976 m_pageSetupData = (void *)pd;
977 }
978
979 // Pass the devmode data (created in m_printData.ConvertToNative)
980 // to the PRINTDLG structure, since it'll
981 // be needed when PrintDlg is called.
982
983 if (pd->hDevMode)
984 {
985 GlobalFree(pd->hDevMode);
986 pd->hDevMode = NULL;
987 }
988
989
990 pd->hDevMode = (HGLOBAL) m_printData.GetNativeData();
991
992 m_printData.SetNativeData((void*) NULL);
993
994 wxASSERT_MSG( (pd->hDevMode), "hDevMode must be non-NULL in ConvertToNative!");
995
996 // pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE));
997
998 pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
999
1000 if ( m_defaultMinMargins )
1001 pd->Flags |= PSD_DEFAULTMINMARGINS;
1002 if ( !m_enableMargins )
1003 pd->Flags |= PSD_DISABLEMARGINS;
1004 if ( !m_enableOrientation )
1005 pd->Flags |= PSD_DISABLEORIENTATION;
1006 if ( !m_enablePaper )
1007 pd->Flags |= PSD_DISABLEPAPER;
1008 if ( !m_enablePrinter )
1009 pd->Flags |= PSD_DISABLEPRINTER;
1010 if ( m_getDefaultInfo )
1011 pd->Flags |= PSD_RETURNDEFAULT;
1012 if ( m_enableHelp )
1013 pd->Flags |= PSD_SHOWHELP;
1014
1015 // We want the units to be in hundredths of a millimetre
1016 pd->Flags |= PSD_INHUNDREDTHSOFMILLIMETERS;
1017
1018 pd->lStructSize = sizeof( PAGESETUPDLG );
1019 pd->hwndOwner=(HWND)NULL;
1020 pd->hDevNames=(HWND)NULL;
1021 pd->hInstance=(HINSTANCE)NULL;
1022
1023 pd->ptPaperSize.x = m_paperSize.x * 100;
1024 pd->ptPaperSize.y = m_paperSize.y * 100;
1025
1026 pd->rtMinMargin.left = m_minMarginTopLeft.x * 100;
1027 pd->rtMinMargin.top = m_minMarginTopLeft.y * 100;
1028 pd->rtMinMargin.right = m_minMarginBottomRight.x * 100;
1029 pd->rtMinMargin.bottom = m_minMarginBottomRight.y * 100;
1030
1031 pd->rtMargin.left = m_marginTopLeft.x * 100;
1032 pd->rtMargin.top = m_marginTopLeft.y * 100;
1033 pd->rtMargin.right = m_marginBottomRight.x * 100;
1034 pd->rtMargin.bottom = m_marginBottomRight.y * 100;
1035
1036 pd->lCustData = 0;
1037 pd->lpfnPageSetupHook = NULL;
1038 pd->lpfnPagePaintHook = NULL;
1039 pd->hPageSetupTemplate = NULL;
1040 pd->lpPageSetupTemplateName = NULL;
1041
1042 /*
1043 if ( pd->hDevMode )
1044 {
1045 DEVMODE *devMode = (DEVMODE*) GlobalLock(pd->hDevMode);
1046 memset(devMode, 0, sizeof(DEVMODE));
1047 devMode->dmSize = sizeof(DEVMODE);
1048 devMode->dmOrientation = m_orientation;
1049 devMode->dmFields = DM_ORIENTATION;
1050 GlobalUnlock(pd->hDevMode);
1051 }
1052 */
1053 }
1054
1055 void wxPageSetupDialogData::ConvertFromNative()
1056 {
1057 PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData ;
1058 if ( !pd )
1059 return;
1060
1061 // Pass the devmode data back to the wxPrintData structure where it really belongs.
1062 if (pd->hDevMode)
1063 {
1064 if (m_printData.GetNativeData())
1065 {
1066 // Make sure we don't leak memory
1067 GlobalFree((HGLOBAL) m_printData.GetNativeData());
1068 }
1069 m_printData.SetNativeData((void*) pd->hDevMode);
1070 pd->hDevMode = NULL;
1071 }
1072
1073 m_printData.ConvertFromNative();
1074
1075 pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
1076
1077 m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS);
1078 m_enableMargins = ((pd->Flags & PSD_DISABLEMARGINS) != PSD_DISABLEMARGINS);
1079 m_enableOrientation = ((pd->Flags & PSD_DISABLEORIENTATION) != PSD_DISABLEORIENTATION);
1080 m_enablePaper = ((pd->Flags & PSD_DISABLEPAPER) != PSD_DISABLEPAPER);
1081 m_enablePrinter = ((pd->Flags & PSD_DISABLEPRINTER) != PSD_DISABLEPRINTER);
1082 m_getDefaultInfo = ((pd->Flags & PSD_RETURNDEFAULT) == PSD_RETURNDEFAULT);
1083 m_enableHelp = ((pd->Flags & PSD_SHOWHELP) == PSD_SHOWHELP);
1084
1085 m_paperSize.x = pd->ptPaperSize.x / 100;
1086 m_paperSize.y = pd->ptPaperSize.y / 100;
1087
1088 m_minMarginTopLeft.x = pd->rtMinMargin.left / 100;
1089 m_minMarginTopLeft.y = pd->rtMinMargin.top / 100;
1090 m_minMarginBottomRight.x = pd->rtMinMargin.right / 100;
1091 m_minMarginBottomRight.y = pd->rtMinMargin.bottom / 100;
1092
1093 m_marginTopLeft.x = pd->rtMargin.left / 100 ;
1094 m_marginTopLeft.y = pd->rtMargin.top / 100 ;
1095 m_marginBottomRight.x = pd->rtMargin.right / 100 ;
1096 m_marginBottomRight.y = pd->rtMargin.bottom / 100 ;
1097 }
1098
1099 void wxPageSetupDialogData::SetOwnerWindow(wxWindow* win)
1100 {
1101 if ( m_pageSetupData == NULL )
1102 ConvertToNative();
1103
1104 if ( m_pageSetupData != NULL && win != NULL)
1105 {
1106 PAGESETUPDLG *pd = (PAGESETUPDLG *) m_pageSetupData ;
1107 pd->hwndOwner=(HWND) win->GetHWND();
1108 }
1109 }
1110 #endif // Win95
1111
1112 // If a corresponding paper type is found in the paper database, will set the m_printData
1113 // paper size id member as well.
1114 void wxPageSetupDialogData::SetPaperSize(const wxSize& sz)
1115 {
1116 m_paperSize = sz;
1117
1118 CalculateIdFromPaperSize();
1119 }
1120
1121 // Sets the wxPrintData id, plus the paper width/height if found in the paper database.
1122 void wxPageSetupDialogData::SetPaperSize(wxPaperSize id)
1123 {
1124 m_printData.SetPaperId(id);
1125
1126 CalculatePaperSizeFromId();
1127 }
1128
1129 // Use paper size defined in this object to set the wxPrintData
1130 // paper id
1131 void wxPageSetupDialogData::CalculateIdFromPaperSize()
1132 {
1133 wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL),
1134 "wxThePrintPaperDatabase should not be NULL. "
1135 "Do not create global print dialog data objects." );
1136
1137 wxSize sz = GetPaperSize();
1138
1139 wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10));
1140 if (id != wxPAPER_NONE)
1141 {
1142 m_printData.SetPaperId(id);
1143 }
1144 }
1145
1146 // Use paper id in wxPrintData to set this object's paper size
1147 void wxPageSetupDialogData::CalculatePaperSizeFromId()
1148 {
1149 wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL),
1150 "wxThePrintPaperDatabase should not be NULL. "
1151 "Do not create global print dialog data objects." );
1152
1153 wxSize sz = wxThePrintPaperDatabase->GetSize(m_printData.GetPaperId());
1154
1155 if (sz.x != 0)
1156 {
1157 // sz is in 10ths of a mm, so multiply by 10.
1158 m_paperSize.x = sz.x * 10;
1159 m_paperSize.y = sz.y * 10;
1160 }
1161 }
1162