home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / owlsrc.pak / PRINTDIA.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-24  |  7.2 KB  |  320 lines

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