home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / sdiole.pak / SAMPCONT.CPP < prev    next >
C/C++ Source or Header  |  1997-07-23  |  9KB  |  308 lines

  1. ///----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1994 by Borland International
  3. //----------------------------------------------------------------------------
  4. #include <owl/owlpch.h>
  5. #include <owl/applicat.h>
  6. #include <owl/gdiobjec.h>
  7.  
  8. #include <ocf/ocfpch.h>
  9. #include <ocf/ocapp.h>
  10. #include <ocf/ocdoc.h>
  11. #include <ocf/ocview.h>
  12. #include <ocf/ocstorag.h>
  13. #include <ocf/ocreg.h>
  14.  
  15. #include <owl/ocfevent.h>
  16. #include <owl/uihandle.h>
  17. #include <owl/printer.h>
  18. #include <owl/preview.h>
  19.  
  20. #include <owl/oleframe.h>
  21. #include <owl/docview.rh>
  22.  
  23. #include "sampcont.h"
  24. #define USE_WINDOW_PRINTOUT
  25.  
  26. //----------------------------------------------------------------------------
  27. // Printout class that prints the contents of a window
  28. //
  29. class TWindowPrintout : public TPrintout {
  30.   public:
  31.     TWindowPrintout(const char* title, TWindow* window, BOOL scale = TRUE)
  32.       : TPrintout(title)
  33.       { Window = window;
  34.         Scale = scale;
  35.         MapMode = MM_ISOTROPIC;    // Respect aspect ratio of window
  36.         //MapMode = MM_ANISOTROPIC;  // Make printout fill the page
  37.       }
  38.  
  39.     void GetDialogInfo(int& minPage, int& maxPage, int& selFromPage, int& selToPage);
  40.     void PrintPage(int page, TRect& rect, unsigned flags);
  41.  
  42.   protected:
  43.     TWindow*  Window;
  44.     BOOL      Scale;
  45.     int       MapMode;
  46. };
  47.  
  48.  
  49. // Do not enable page range in the print dialog since only one page is
  50. // available to be printed
  51. //
  52. void TWindowPrintout::GetDialogInfo(int& minPage, int& maxPage, int& selFromPage, int& selToPage)
  53. {
  54.   minPage = 0;
  55.   maxPage = 0;
  56.   selFromPage = selToPage = 0;
  57. }
  58.  
  59.  
  60. void TWindowPrintout::PrintPage(int /*page*/, TRect& bandRect, unsigned /*flags*/)
  61. {
  62.   // Conditionally scale the DC to the window so the printout will
  63.   // resemble the window
  64.   //
  65.   int    oldMode;
  66.   TSize  oldVExt, oldWExt;
  67.   if (Scale) {
  68.     oldMode = DC->SetMapMode(MapMode);
  69.     TRect clientR = Window->GetClientRect();
  70.     DC->SetViewportExt(PageSize, &oldVExt);
  71.     DC->SetWindowExt(clientR.Size(), &oldWExt);
  72.     DC->IntersectClipRect(clientR);
  73.     DC->DPtoLP(bandRect, 2);
  74.   }
  75.  
  76.   // Call the window to paint itself to the printer DC.
  77.   //
  78.   Window->Paint(*DC, FALSE, bandRect);
  79.  
  80.   // Restore changes made to the DC
  81.   //
  82.   if (Scale) {
  83.     DC->SetWindowExt(oldWExt);
  84.     DC->SetViewportExt(oldVExt);
  85.     DC->SetMapMode(oldMode);
  86.   }
  87. }
  88.  
  89. //----------------------------------------------------------------------------
  90.  
  91. class TModalFrame : public TFrameWindow {
  92.   public:
  93.     TModalFrame(TWindow* parent, const char far* title, TWindow* client) :
  94.       TFrameWindow(parent, title, client),
  95.       TWindow(parent, title)  {}
  96.  
  97.     virtual void Destroy(int ret);
  98. };
  99.  
  100.  
  101. void TModalFrame::Destroy(int ret)
  102. {
  103.   GetApplication()->EndModal(IDCANCEL);
  104.   GetApplication()->MainWindow->EnableWindow(TRUE);
  105.  
  106.   TWindow::Destroy(ret);
  107. }
  108.  
  109. //----------------------------------------------------------------------------
  110.  
  111. DEFINE_RESPONSE_TABLE1(TOleSampContainer, TOleWindow)
  112.   EV_COMMAND(CM_FILESAVE, CmFileSave),
  113.   EV_COMMAND(CM_FILESAVEAS, CmFileSaveAs),
  114.   EV_COMMAND(CM_EXIT, CmExit),
  115.   EV_COMMAND(CM_FILEPRINT, CmFilePrint),
  116.   EV_COMMAND(CM_FILEPRINTERSETUP, CmFilePrinterSetup),
  117.   EV_COMMAND(CM_FILEPRINTPREVIEW, CmPrintPreview),
  118. END_RESPONSE_TABLE;
  119.  
  120. BEGIN_REGISTRATION(docReg)
  121.   REGDATA(progid,     "MdiOle")
  122.   REGDATA(description,"MdiOle Document")
  123.   REGFORMAT(0, ocrEmbedSource,  ocrContent,  ocrIStorage, ocrGet)
  124.   REGFORMAT(1, ocrMetafilePict, ocrContent,  ocrMfPict|ocrStaticMed, ocrGet)
  125.   REGFORMAT(2, ocrBitmap, ocrContent,  ocrGDI|ocrStaticMed, ocrGet)
  126.   REGFORMAT(3, ocrDib, ocrContent,  ocrHGlobal|ocrStaticMed, ocrGet)
  127.   REGFORMAT(4, ocrLinkSource, ocrContent,  ocrIStream, ocrGet)
  128. END_REGISTRATION
  129.  
  130.  
  131. TOleSampContainer::TOleSampContainer(TWindow*        parent,
  132.                                      const char far* fileName,
  133.                                      TModule*        module)
  134.   : TOleWindow(parent, module)
  135. {
  136.   // Create a OcDocument object to hold the ole parts that we create
  137.   // and a OcView to provide ole services
  138.   //
  139.   OcDoc = new TOcDocument(*OcApp, fileName);
  140.   OcView = new TOcView(*OcDoc, &docReg);
  141.  
  142.   // Perform actual file loading, and let the OcDoc load its parts
  143.   //
  144.   if (fileName) {
  145.     strcpy(FileData.FileName, fileName);
  146.     OcDoc->LoadParts();
  147.   } else {
  148.     strcpy(FileData.FileName, "");
  149.   }
  150.   FileData.Flags = OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
  151.   FileData.SetFilter(string(*GetModule(), IDS_DOCFILEFILTER).c_str());
  152.   Printer = new TPrinter;
  153. }
  154.  
  155. TOleSampContainer::~TOleSampContainer()
  156. {
  157.   delete Printer;
  158. }
  159.  
  160. //
  161. // Perform normal SetupWindow, plus let the OcView object know our HWND so that
  162. // it can talk to us.
  163. //
  164. void
  165. TOleSampContainer::SetupWindow()
  166. {
  167.   TOleWindow::SetupWindow();
  168.   SetDocTitle(*FileData.FileName ? FileData.FileName : "Untitled", 0);
  169. }
  170.  
  171. void
  172. TOleSampContainer::CleanupWindow()
  173. {
  174.   TOleWindow::CleanupWindow();
  175. }
  176.  
  177. void
  178. TOleSampContainer::CmExit()
  179. {
  180.   OcView->EvClose();  // close shop
  181.   OcDoc->Close();
  182.   TWindow::CmExit();
  183. }
  184.  
  185. //
  186. // Perform a save operation (or saveAs if doc is untitled) This saves the parts
  187. // and commits the storage
  188. //
  189. void
  190. TOleSampContainer::CmFileSave()
  191. {
  192.   if (!OcDoc->GetName().length()) {
  193.     CmFileSaveAs();
  194.   } else {
  195.     OcDoc->SaveParts(0, true);
  196.     OcDoc->GetStorage()->Commit(STGC_DEFAULT);
  197.   }
  198. }
  199.  
  200. //
  201. // Save the document to a new storage file
  202. //
  203. void
  204. TOleSampContainer::CmFileSaveAs()
  205. {
  206.   *FileData.FileName = 0;
  207.   if (TFileSaveDialog(this, FileData).Execute() == IDOK) {
  208.     if (OcDoc->SaveToFile(FileData.FileName)) {
  209.       OcDoc->GetStorage()->Commit(STGC_DEFAULT);
  210.       SetDocTitle(FileData.FileName, 0);
  211.     } else
  212.       MessageBox("Cannot save to new file", "File save error", MB_OK); 
  213.   }
  214. }
  215.  
  216. void
  217. TOleSampContainer::CmFilePrint()          // Execute File:Print command
  218. {
  219.   if (Printer) {
  220.     TWindowPrintout printout("OLE2 Container", this);
  221.     Printer->Print(this, printout, TRUE);
  222.   }
  223. }
  224.  
  225. void
  226. TOleSampContainer::CmFilePrinterSetup()    // Execute File:Printer-setup command
  227. {
  228.   if (Printer)
  229.     Printer->Setup(this);
  230. }
  231.  
  232. void TOleSampContainer::CmPrintPreview()
  233. {
  234.   // Create the printer DC. If it fails, let the print dialog report the error
  235.   // for us.
  236.   //
  237.   TPrintDC* prnDC;
  238.   try {
  239.     prnDC = new TPrintDC(Printer->GetSetup().GetDriverName(),
  240.                          Printer->GetSetup().GetDeviceName(),
  241.                          Printer->GetSetup().GetOutputName(),
  242.                          Printer->GetSetup().GetDevMode());
  243.   }
  244.   catch (TGdiBase::TXGdi) {
  245.     TPrintDialog(Parent, Printer->GetSetup()).Execute();
  246.     return;
  247.   }
  248.  
  249.   TSize printExtent(prnDC->GetDeviceCaps(HORZRES), prnDC->GetDeviceCaps(VERTRES));
  250.  
  251.   #if defined(USE_WINDOW_PRINTOUT)
  252.     TWindowPrintout printout("Print Preview", this);
  253.   #else
  254.     TTestPrintout   printout("Print Preview");
  255.   #endif
  256.  
  257.   TLayoutWindow* layout = new TLayoutWindow(0);
  258.   layout->SetBkgndColor(GetSysColor(COLOR_APPWORKSPACE));
  259.  
  260.   for (int i = 0; i < 1; i++) {
  261.     TPreviewPage* page = new TPreviewPage(layout, printout, *prnDC, printExtent);
  262.  
  263.     TLayoutMetrics metrics;
  264.     metrics.X.Set(lmLeft, lmRightOf, lmParent, lmLeft, 15);
  265.     metrics.Y.Set(lmTop, lmBelow, lmParent, lmTop, 15);
  266.  
  267.     //
  268.     // Determine major axis of preview page, have that follow parent size.
  269.     // Make minor axis a percentage (aspect ratio) of the page's major axis
  270.     //
  271.     if (printExtent.cx > printExtent.cy) {
  272.       metrics.Width.Set(lmRight, lmLeftOf, lmParent, lmRight, 15);
  273.       metrics.Height.PercentOf(page, int((long(printExtent.cy)*100)/printExtent.cx),
  274.                                lmWidth);
  275.     } else {
  276.       metrics.Height.Set(lmBottom, lmAbove, lmParent, lmBottom, 15);
  277.       metrics.Width.PercentOf(page, int((long(printExtent.cx)*100)/printExtent.cy),
  278.                               lmHeight);
  279.     }
  280.  
  281.     layout->SetChildLayoutMetrics(*page, metrics);
  282.   }
  283.  
  284.   TFrameWindow* frame = new TModalFrame(this, "Preview", layout);
  285.   frame->Create();
  286.   frame->ShowWindow(SW_SHOWNORMAL);
  287.  
  288.   GetApplication()->BeginModal(Parent);
  289.   delete prnDC;
  290. }
  291.  
  292. //
  293. // See if we can close. Also let OcView know we are going away
  294. //
  295. BOOL
  296. TOleSampContainer::CanClose()
  297. {
  298.   if (!TOleWindow::CanClose())
  299.     return false;
  300.  
  301.   OcView->EvClose();  
  302.   OcDoc->Close();
  303.  
  304.   return true;
  305. }
  306.  
  307.  
  308.