home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c083 / 11.ddi / OWLSRC.PAK / PRINTDIA.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-02  |  7.1 KB  |  303 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1992, 1993 by Borland International
  3. //   source\owl\printdia.cpp
  4. //   Implementation of Print and PrintDetup common Dialogs
  5. //   classes
  6. //----------------------------------------------------------------------------
  7. #pragma hdrignore SECTION
  8. #include <owl\owlpch.h>
  9. #include <owl\printdia.h>
  10. #include <owl\dc.h>
  11.  
  12. #if !defined(SECTION) || SECTION == 1
  13.  
  14. DEFINE_RESPONSE_TABLE1(TPrintDialog, TCommonDialog)
  15. END_RESPONSE_TABLE;
  16.  
  17. TPrintDialog::TPrintDialog(TWindow*        parent,
  18.                            TData&          data,
  19.                            const char far* printTemplateName,
  20.                            const char far* setupTemplateName,
  21.                            const char far* title,
  22.                            TModule*        module)
  23.   : TCommonDialog(parent, title, module),
  24.     Data(data)
  25. {
  26.   memset(&pd, 0, sizeof(PRINTDLG));
  27.   pd.lStructSize = sizeof(PRINTDLG);
  28.   pd.hwndOwner = Parent ? Parent->HWindow : 0;
  29.   pd.hInstance = *GetModule();
  30.   pd.Flags = PD_ENABLEPRINTHOOK | PD_ENABLESETUPHOOK | Data.Flags;
  31.   pd.Flags &= ~PD_RETURNDEFAULT;
  32.   if (printTemplateName) {
  33.     (LPCSTR)pd.lpPrintTemplateName = printTemplateName;
  34.     pd.Flags |= PD_ENABLEPRINTTEMPLATE;
  35.   } else
  36.     pd.Flags &= ~PD_ENABLEPRINTTEMPLATE;
  37.   if (setupTemplateName) {
  38.     (LPCSTR)pd.lpSetupTemplateName = setupTemplateName;
  39.     pd.Flags |= PD_ENABLESETUPTEMPLATE;
  40.   } else
  41.     pd.Flags &= ~PD_ENABLESETUPTEMPLATE;
  42.   pd.lpfnPrintHook = 0;
  43.   pd.lpfnSetupHook = 0;
  44.  
  45.   pd.nFromPage = (WORD)Data.FromPage;
  46.   pd.nToPage = (WORD)Data.ToPage;
  47.   pd.nMinPage = (WORD)Data.MinPage;
  48.   pd.nMaxPage = (WORD)Data.MaxPage;
  49.   pd.nCopies = (WORD)Data.Copies;
  50. }
  51.  
  52. BOOL
  53. TPrintDialog::DialogFunction(UINT msg, WPARAM wParam, LPARAM lParam)
  54. {
  55.   return TCommonDialog::DialogFunction(msg, wParam, lParam);
  56. }
  57.  
  58. int
  59. TPrintDialog::DoExecute()
  60. {
  61.   (DLGPROC)pd.lpfnPrintHook = (DLGPROC)(FARPROC)StdDlgProcInstance;
  62.   (DLGPROC)pd.lpfnSetupHook = (DLGPROC)(FARPROC)StdDlgProcInstance;
  63.  
  64.   Data.Unlock();
  65.   pd.hDevMode = Data.hDevMode;
  66.   pd.hDevNames = Data.hDevNames;
  67.   int ret = ::PrintDlg(&pd);
  68.   if (ret) {
  69.     Data.Flags = pd.Flags;
  70.     Data.Error = 0;
  71.     Data.hDC = pd.hDC;
  72.     Data.FromPage = pd.nFromPage;
  73.     Data.ToPage = pd.nToPage;
  74.     Data.Copies = pd.nCopies;
  75.   } else {
  76.     Data.Error = ::CommDlgExtendedError();
  77.   }
  78.   Data.hDevMode = pd.hDevMode;
  79.   Data.hDevNames = pd.hDevNames;
  80.   Data.Lock();
  81.   return ret ? IDOK : IDCANCEL;
  82. }
  83.  
  84. BOOL
  85. TPrintDialog::GetDefaultPrinter()
  86. {
  87.   pd.Flags |= PD_RETURNDEFAULT;
  88.   Data.ClearDevMode();
  89.   Data.ClearDevNames();
  90.   return DoExecute() == IDOK;
  91. }
  92.  
  93. //----------------------------------------------------------------------------
  94.  
  95. TPrintDialog::TData::TData()
  96.   : Flags(PD_ALLPAGES|PD_COLLATE), Error(0),
  97.     FromPage(-1), ToPage(-1), MinPage(-1), MaxPage(-1), Copies(1),
  98.     hDevMode(0), DevMode(0), hDevNames(0), DevNames(0), hDC(0)
  99. {
  100. }
  101.  
  102. TPrintDialog::TData::~TData()
  103. {
  104.   if (hDevMode) {
  105.     ::GlobalUnlock(hDevMode);
  106.     ::GlobalFree(hDevMode);
  107.   }
  108.   if (hDevNames) {
  109.     ::GlobalUnlock(hDevNames);
  110.     ::GlobalFree(hDevNames);
  111.   }
  112.   if (hDC)
  113.     ::DeleteDC(hDC);
  114. }
  115.  
  116. void
  117. TPrintDialog::TData::Lock()
  118. {
  119.   if (hDevMode)
  120.     DevMode = (DEVMODE far*)::GlobalLock(hDevMode);
  121.   else
  122.     DevMode = 0;
  123.   if (hDevNames)
  124.     DevNames = (DEVNAMES far*)::GlobalLock(hDevNames);
  125.   else
  126.     DevNames = 0;
  127. }
  128.  
  129. void
  130. TPrintDialog::TData::Unlock()
  131. {
  132.   if (hDevMode) {
  133.     ::GlobalUnlock(hDevMode);
  134.     DevMode = 0;
  135.   }
  136.   if (hDevNames) {
  137.     ::GlobalUnlock(hDevNames);
  138.     DevNames = 0;
  139.   }
  140.   if (hDC) {
  141.     ::DeleteDC(hDC);
  142.     hDC = 0;
  143.   }
  144. }
  145.  
  146. void TPrintDialog::TData::ClearDevMode()
  147. {
  148.   if (hDevMode) {
  149.     ::GlobalUnlock(hDevMode);
  150.     ::GlobalFree(hDevMode);
  151.     hDevMode = 0;
  152.     DevMode = 0;
  153.   }
  154. }
  155.  
  156. void
  157. TPrintDialog::TData::SetDevMode(const DEVMODE far* devMode)
  158. {
  159.   ClearDevMode();
  160.   if (devMode) {
  161.     int size = sizeof(DEVMODE) + devMode->dmDriverExtra;
  162.     hDevMode = ::GlobalAlloc(GHND, size);
  163.     DevMode = (DEVMODE far*)::GlobalLock(hDevMode);
  164.     memcpy(DevMode, devMode, size);
  165.   }
  166. }
  167.  
  168. void
  169. TPrintDialog::TData::ClearDevNames()
  170. {
  171.   if (hDevNames) {
  172.     ::GlobalUnlock(hDevNames);
  173.     ::GlobalFree(hDevNames);
  174.     hDevNames = 0;
  175.     DevNames = 0;
  176.   }
  177. }
  178.  
  179. const char far*
  180. TPrintDialog::TData::GetDriverName() const
  181. {
  182.   return DevNames ? (char far*)DevNames + DevNames->wDriverOffset : 0;
  183. }
  184.  
  185. const char far*
  186. TPrintDialog::TData::GetDeviceName() const
  187. {
  188.   return DevNames ? (char far*)DevNames + DevNames->wDeviceOffset : 0;
  189. }
  190.  
  191. const char far*
  192. TPrintDialog::TData::GetOutputName() const
  193. {
  194.   return DevNames ? (char far*)DevNames + DevNames->wOutputOffset : 0;
  195. }
  196.  
  197. void
  198. TPrintDialog::TData::SetDevNames(const char far* driver,
  199.                                  const char far* device,
  200.                                  const char far* output)
  201. {
  202.   ClearDevNames();
  203.   if (!driver || !device || !output)
  204.     return;
  205.  
  206.   int size1 = strlen(driver)+1;
  207.   int size2 = strlen(device)+1;
  208.   int size3 = strlen(output)+1;
  209.   hDevNames = ::GlobalAlloc(GHND, sizeof(DEVNAMES)+size1+size2+size3);
  210.   DevNames = (DEVNAMES far*)::GlobalLock(hDevNames);
  211.   char far* p = (char far*)(DevNames + 1);
  212.  
  213.   DevNames->wDriverOffset = WORD((char near*)p - (char near*)DevNames);
  214.   if (driver)
  215.     while (*driver)
  216.       *p++ = *driver++;
  217.   *p++ = 0;
  218.  
  219.   DevNames->wDeviceOffset = WORD((char near*)p - (char near*)DevNames);
  220.   if (device)
  221.     while (*device)
  222.       *p++ = *device++;
  223.   *p++ = 0;
  224.  
  225.   DevNames->wOutputOffset = WORD((char near*)p - (char near*)DevNames);
  226.   if (output)
  227.     while (*output)
  228.       *p++ = *output++;
  229.   *p++ = 0;
  230.  
  231.   DevNames->wDefault = FALSE;
  232. }
  233.  
  234. TPrintDC*
  235. TPrintDialog::TData::TransferDC() {
  236.   if (!hDC)
  237.     return 0;
  238.   HDC dc = hDC;
  239.   hDC = 0;
  240.   return new TPrintDC(dc, AutoDelete);
  241. }
  242.  
  243. #endif
  244. #if !defined(SECTION) || SECTION == 2
  245.  
  246. void*
  247. TPrintDialog::TData::Read(ipstream& is, uint32)
  248. {
  249.   is >> Flags;
  250.   is >> FromPage;
  251.   is >> ToPage;
  252.   is >> MinPage;
  253.   is >> MaxPage;
  254.   is >> Copies;
  255.   char far* driver = is.freadString();
  256.   char far* device = is.freadString();
  257.   char far* output = is.freadString();
  258.   WORD deflt;
  259.   is >> deflt;
  260.   SetDevNames(driver, device, output);
  261.   if (DevNames)
  262.     DevNames->wDefault = deflt;
  263.   delete driver;
  264.   delete device;
  265.   delete output;
  266.  
  267.   int16 size;
  268.   is >> size;
  269.   if (size) {
  270.     DEVMODE far* devMode = (DEVMODE far*)new far char[size];
  271.     is.freadBytes(devMode, size);
  272.     SetDevMode(devMode);
  273.     delete devMode;
  274.   } else
  275.     ClearDevMode();
  276.  
  277.   return this;
  278. }
  279.  
  280. void
  281. TPrintDialog::TData::Write(opstream& os)
  282. {
  283.   os << Flags;
  284.   os << FromPage;
  285.   os << ToPage;
  286.   os << MinPage;
  287.   os << MaxPage;
  288.   os << Copies;
  289.   os.fwriteString(GetDriverName());
  290.   os.fwriteString(GetDeviceName());
  291.   os.fwriteString(GetOutputName());
  292.   os << (DevNames ? DevNames->wDefault : WORD(0));
  293.  
  294.   if (DevMode) {
  295.     int16 size = int16(sizeof(DEVMODE) + DevMode->dmDriverExtra);
  296.     os << size;
  297.     os.fwriteBytes(DevMode, size);
  298.   } else
  299.     os << int16(0);
  300. }
  301.  
  302. #endif
  303.