home *** CD-ROM | disk | FTP | other *** search
- //----------------------------------------------------------------------------
- // ObjectWindows - (C) Copyright 1992, 1993 by Borland International
- // source\owl\printdia.cpp
- // Implementation of Print and PrintDetup common Dialogs
- // classes
- //----------------------------------------------------------------------------
- #pragma hdrignore SECTION
- #include <owl\owlpch.h>
- #include <owl\printdia.h>
- #include <owl\dc.h>
-
- #if !defined(SECTION) || SECTION == 1
-
- DEFINE_RESPONSE_TABLE1(TPrintDialog, TCommonDialog)
- END_RESPONSE_TABLE;
-
- TPrintDialog::TPrintDialog(TWindow* parent,
- TData& data,
- const char far* printTemplateName,
- const char far* setupTemplateName,
- const char far* title,
- TModule* module)
- : TCommonDialog(parent, title, module),
- Data(data)
- {
- memset(&pd, 0, sizeof(PRINTDLG));
- pd.lStructSize = sizeof(PRINTDLG);
- pd.hwndOwner = Parent ? Parent->HWindow : 0;
- pd.hInstance = *GetModule();
- pd.Flags = PD_ENABLEPRINTHOOK | PD_ENABLESETUPHOOK | Data.Flags;
- pd.Flags &= ~PD_RETURNDEFAULT;
- if (printTemplateName) {
- (LPCSTR)pd.lpPrintTemplateName = printTemplateName;
- pd.Flags |= PD_ENABLEPRINTTEMPLATE;
- } else
- pd.Flags &= ~PD_ENABLEPRINTTEMPLATE;
- if (setupTemplateName) {
- (LPCSTR)pd.lpSetupTemplateName = setupTemplateName;
- pd.Flags |= PD_ENABLESETUPTEMPLATE;
- } else
- pd.Flags &= ~PD_ENABLESETUPTEMPLATE;
- pd.lpfnPrintHook = 0;
- pd.lpfnSetupHook = 0;
-
- pd.nFromPage = (WORD)Data.FromPage;
- pd.nToPage = (WORD)Data.ToPage;
- pd.nMinPage = (WORD)Data.MinPage;
- pd.nMaxPage = (WORD)Data.MaxPage;
- pd.nCopies = (WORD)Data.Copies;
- }
-
- BOOL
- TPrintDialog::DialogFunction(UINT msg, WPARAM wParam, LPARAM lParam)
- {
- return TCommonDialog::DialogFunction(msg, wParam, lParam);
- }
-
- int
- TPrintDialog::DoExecute()
- {
- (DLGPROC)pd.lpfnPrintHook = (DLGPROC)(FARPROC)StdDlgProcInstance;
- (DLGPROC)pd.lpfnSetupHook = (DLGPROC)(FARPROC)StdDlgProcInstance;
-
- Data.Unlock();
- pd.hDevMode = Data.hDevMode;
- pd.hDevNames = Data.hDevNames;
- int ret = ::PrintDlg(&pd);
- if (ret) {
- Data.Flags = pd.Flags;
- Data.Error = 0;
- Data.hDC = pd.hDC;
- Data.FromPage = pd.nFromPage;
- Data.ToPage = pd.nToPage;
- Data.Copies = pd.nCopies;
- } else {
- Data.Error = ::CommDlgExtendedError();
- }
- Data.hDevMode = pd.hDevMode;
- Data.hDevNames = pd.hDevNames;
- Data.Lock();
- return ret ? IDOK : IDCANCEL;
- }
-
- BOOL
- TPrintDialog::GetDefaultPrinter()
- {
- pd.Flags |= PD_RETURNDEFAULT;
- Data.ClearDevMode();
- Data.ClearDevNames();
- return DoExecute() == IDOK;
- }
-
- //----------------------------------------------------------------------------
-
- TPrintDialog::TData::TData()
- : Flags(PD_ALLPAGES|PD_COLLATE), Error(0),
- FromPage(-1), ToPage(-1), MinPage(-1), MaxPage(-1), Copies(1),
- hDevMode(0), DevMode(0), hDevNames(0), DevNames(0), hDC(0)
- {
- }
-
- TPrintDialog::TData::~TData()
- {
- if (hDevMode) {
- ::GlobalUnlock(hDevMode);
- ::GlobalFree(hDevMode);
- }
- if (hDevNames) {
- ::GlobalUnlock(hDevNames);
- ::GlobalFree(hDevNames);
- }
- if (hDC)
- ::DeleteDC(hDC);
- }
-
- void
- TPrintDialog::TData::Lock()
- {
- if (hDevMode)
- DevMode = (DEVMODE far*)::GlobalLock(hDevMode);
- else
- DevMode = 0;
- if (hDevNames)
- DevNames = (DEVNAMES far*)::GlobalLock(hDevNames);
- else
- DevNames = 0;
- }
-
- void
- TPrintDialog::TData::Unlock()
- {
- if (hDevMode) {
- ::GlobalUnlock(hDevMode);
- DevMode = 0;
- }
- if (hDevNames) {
- ::GlobalUnlock(hDevNames);
- DevNames = 0;
- }
- if (hDC) {
- ::DeleteDC(hDC);
- hDC = 0;
- }
- }
-
- void TPrintDialog::TData::ClearDevMode()
- {
- if (hDevMode) {
- ::GlobalUnlock(hDevMode);
- ::GlobalFree(hDevMode);
- hDevMode = 0;
- DevMode = 0;
- }
- }
-
- void
- TPrintDialog::TData::SetDevMode(const DEVMODE far* devMode)
- {
- ClearDevMode();
- if (devMode) {
- int size = sizeof(DEVMODE) + devMode->dmDriverExtra;
- hDevMode = ::GlobalAlloc(GHND, size);
- DevMode = (DEVMODE far*)::GlobalLock(hDevMode);
- memcpy(DevMode, devMode, size);
- }
- }
-
- void
- TPrintDialog::TData::ClearDevNames()
- {
- if (hDevNames) {
- ::GlobalUnlock(hDevNames);
- ::GlobalFree(hDevNames);
- hDevNames = 0;
- DevNames = 0;
- }
- }
-
- const char far*
- TPrintDialog::TData::GetDriverName() const
- {
- return DevNames ? (char far*)DevNames + DevNames->wDriverOffset : 0;
- }
-
- const char far*
- TPrintDialog::TData::GetDeviceName() const
- {
- return DevNames ? (char far*)DevNames + DevNames->wDeviceOffset : 0;
- }
-
- const char far*
- TPrintDialog::TData::GetOutputName() const
- {
- return DevNames ? (char far*)DevNames + DevNames->wOutputOffset : 0;
- }
-
- void
- TPrintDialog::TData::SetDevNames(const char far* driver,
- const char far* device,
- const char far* output)
- {
- ClearDevNames();
- if (!driver || !device || !output)
- return;
-
- int size1 = strlen(driver)+1;
- int size2 = strlen(device)+1;
- int size3 = strlen(output)+1;
- hDevNames = ::GlobalAlloc(GHND, sizeof(DEVNAMES)+size1+size2+size3);
- DevNames = (DEVNAMES far*)::GlobalLock(hDevNames);
- char far* p = (char far*)(DevNames + 1);
-
- DevNames->wDriverOffset = WORD((char near*)p - (char near*)DevNames);
- if (driver)
- while (*driver)
- *p++ = *driver++;
- *p++ = 0;
-
- DevNames->wDeviceOffset = WORD((char near*)p - (char near*)DevNames);
- if (device)
- while (*device)
- *p++ = *device++;
- *p++ = 0;
-
- DevNames->wOutputOffset = WORD((char near*)p - (char near*)DevNames);
- if (output)
- while (*output)
- *p++ = *output++;
- *p++ = 0;
-
- DevNames->wDefault = FALSE;
- }
-
- TPrintDC*
- TPrintDialog::TData::TransferDC() {
- if (!hDC)
- return 0;
- HDC dc = hDC;
- hDC = 0;
- return new TPrintDC(dc, AutoDelete);
- }
-
- #endif
- #if !defined(SECTION) || SECTION == 2
-
- void*
- TPrintDialog::TData::Read(ipstream& is, uint32)
- {
- is >> Flags;
- is >> FromPage;
- is >> ToPage;
- is >> MinPage;
- is >> MaxPage;
- is >> Copies;
- char far* driver = is.freadString();
- char far* device = is.freadString();
- char far* output = is.freadString();
- WORD deflt;
- is >> deflt;
- SetDevNames(driver, device, output);
- if (DevNames)
- DevNames->wDefault = deflt;
- delete driver;
- delete device;
- delete output;
-
- int16 size;
- is >> size;
- if (size) {
- DEVMODE far* devMode = (DEVMODE far*)new far char[size];
- is.freadBytes(devMode, size);
- SetDevMode(devMode);
- delete devMode;
- } else
- ClearDevMode();
-
- return this;
- }
-
- void
- TPrintDialog::TData::Write(opstream& os)
- {
- os << Flags;
- os << FromPage;
- os << ToPage;
- os << MinPage;
- os << MaxPage;
- os << Copies;
- os.fwriteString(GetDriverName());
- os.fwriteString(GetDeviceName());
- os.fwriteString(GetOutputName());
- os << (DevNames ? DevNames->wDefault : WORD(0));
-
- if (DevMode) {
- int16 size = int16(sizeof(DEVMODE) + DevMode->dmDriverExtra);
- os << size;
- os.fwriteBytes(DevMode, size);
- } else
- os << int16(0);
- }
-
- #endif
-