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

  1. //
  2. //----------------------------------------------------------------------------
  3. // ObjectComponents
  4. // (C) Copyright 1994 by Borland International, All Rights Reserved
  5. //
  6. //   Implementation of TOcDataProvider Class
  7. //----------------------------------------------------------------------------
  8. #include <ocf/ocfpch.h>
  9. #include <ocf/ocapp.h>
  10. #include <ocf/ocdata.h>
  11.  
  12. TOcDataProvider::TOcDataProvider(TOcView& ocView, TRegList* regList, IUnknown* outer,
  13.                                  void* userData, TDeleteUserData callBack)
  14. :
  15.   OcView(ocView), BSite(0), BSiteI(0), BLSiteI(0),
  16.   UserData(userData), CBDelete(callBack),
  17. #if defined(BI_DATA_NEAR)
  18.   Origin(*new TPoint(0,0)),
  19.   Extent(*new TSize(0,0))
  20. #else
  21.   Origin(0,0),
  22.   Extent(0,0)
  23. #endif
  24. {
  25.   SetOuter(outer);
  26.   AddRef();    // TUnknown defaults to 0, we need 1
  27.  
  28.   // Create a site for this data provider
  29.   //
  30.   if (SUCCEEDED(OcView.OcApp.BOleComponentCreate(&BSite, (IUnknown*)(IBDataProvider*)this,
  31.       cidBOleSite))) {
  32.  
  33.     if (SUCCEEDED(BSite->QueryInterface(IID_IBSite, &(LPVOID)BSiteI)))
  34.       Release();
  35.  
  36.     // Connect the part and the site
  37.     //
  38.     if (BSiteI) {
  39.       const char* progid = regList->Lookup(OcView.OcApp.IsOptionSet(amDebug) ?
  40.                                            "debugprogid" : "progid");
  41.       BSiteI->Init(this, 0, OleStr(progid), true);
  42.     }
  43.  
  44.     if (SUCCEEDED(BSite->QueryInterface(IID_IBLinkable,&(LPVOID)BLSiteI)))
  45.       BLSiteI->Release();   // avoid deadlock
  46.  
  47.     // Remember the dataprovider in OcView
  48.     //
  49.     OcView.SetOcData(this);
  50.  
  51.     // Set up monikers for selection
  52.     //
  53.     Rename();
  54.   }
  55. }
  56.  
  57. TOcDataProvider::~TOcDataProvider()
  58. {
  59.   // If the TOcDataProvider object is released by the clipboard
  60.   //
  61.   if (OcView.GetOcData() == this)
  62.     OcView.SetOcData(0);
  63.  
  64.   // user data clean up
  65.   //
  66.   if (CBDelete)
  67.     CBDelete(UserData);
  68.  
  69.   if(BSite)
  70.     BSite->Release();
  71. }
  72.  
  73. //
  74. //
  75. //
  76. HRESULT
  77. TOcDataProvider::QueryObject(const IID far& iid, void far* far* iface)
  78. {
  79.   PRECONDITION(iface);
  80.   HRESULT hr;
  81.  
  82.   // interfaces
  83.   //
  84.      SUCCEEDED(hr = IBDataProvider_QueryInterface(this, iid, iface))
  85.  
  86.   // helpers
  87.   //
  88.   || (BSite && SUCCEEDED(hr = BSite->QueryInterface(iid, iface)))
  89.   ;
  90.  
  91.   return hr;
  92. }
  93.  
  94. //
  95. // Disconnect from the site
  96. //
  97. void
  98. TOcDataProvider::Disconnect()
  99. {
  100.   if (BSiteI)
  101.     BSiteI->Disconnect();
  102. }
  103.  
  104. //
  105. // Update item moniker with new name
  106. //
  107. void
  108. TOcDataProvider::Rename()
  109. {
  110.   PRECONDITION(BLSiteI);
  111.  
  112.   OcView.Rename();
  113.  
  114.   // Update the item's moniker
  115.   //
  116.   TOcItemName item(true);
  117.   if (OcView.ForwardEvent(OC_VIEWGETITEMNAME, &item))
  118.     BLSiteI->OnRename(OcView.BLDocumentI, OleStr(item.Name));
  119. }
  120.  
  121. UINT _IFUNC
  122. TOcDataProvider::CountFormats()
  123. {
  124.   return OcView.CountFormats();
  125. }
  126.  
  127. HRESULT _IFUNC
  128. TOcDataProvider::GetFormat(uint index, TOcFormatInfo far* fmt)
  129. {
  130.   PRECONDITION(fmt);
  131.  
  132.   return OcView.GetFormat(index, fmt);
  133. }
  134.  
  135.  
  136. //
  137. // Request native data for pasting into client application.
  138. // This is only called at paste time (not at copy time).
  139. //
  140. HANDLE _IFUNC
  141. TOcDataProvider::GetFormatData(TOcFormatInfo far* fmt)
  142. {
  143.   PRECONDITION(fmt);
  144.  
  145.   TOcFormat* format = OcView.FormatList.Find(fmt->Id);
  146.   if (!format || (*format->GetRegName() == 0))
  147.     return 0;
  148.  
  149.   TOcFormatData formatData(*format, UserData);
  150.   if (OcView.ForwardEvent(OC_VIEWCLIPDATA, &formatData))
  151.     return formatData.Handle;
  152.   else
  153.     return 0;
  154. }
  155.  
  156. //
  157. // Render the data in the DC provided. May be a MetaFile
  158. // Packup all the args & forward message to real view to paint
  159. //
  160. HRESULT _IFUNC
  161. TOcDataProvider::Draw(HDC dc, const RECTL far* pos, const RECTL far* clip,
  162.                  TOcAspect aspect, TOcDraw bd)
  163. {
  164.   PRECONDITION(dc);
  165.   bool metafile = ::GetDeviceCaps(dc, TECHNOLOGY) == DT_METAFILE;
  166.  
  167.   // Rely on the bolero shading
  168.   //
  169.   if (bd == drShadingOnly)
  170.     return HR_NOERROR;
  171.  
  172.   TRect p((int)pos->left, (int)pos->top, (int)pos->right, (int)pos->bottom);
  173.   TRect c((int)clip->left, (int)clip->top, (int)clip->right, (int)clip->bottom);
  174.  
  175.   if (metafile) {
  176.     p.SetNull();
  177.     ::SetMapMode(dc, MM_ANISOTROPIC);
  178.  
  179.     ::SetWindowExtEx(dc, Extent.cx, Extent.cy, 0);
  180.     ::SetWindowOrgEx(dc, 0, 0, 0);
  181.   }
  182.  
  183.   p.Normalize();
  184.   c.Normalize();
  185.   TOcViewPaint vp = { dc, &p, &c, (TOcAspect)aspect, true, 0, UserData };
  186.   bool result = (bool)OcView.ForwardEvent(OC_VIEWPAINT, &vp);
  187.  
  188.   return HRFailIfZero(result);
  189. }
  190.  
  191. //
  192. // Return the 'size' of the document that this view is on
  193. //
  194. HRESULT _IFUNC
  195. TOcDataProvider::GetPartSize(TSize far* size)
  196. {
  197.   TOcPartSize ps(true, 0, UserData);
  198.  
  199.   // Ask the app for initial server extent
  200.   //
  201.   if (!OcView.ForwardEvent(OC_VIEWPARTSIZE, &ps)) {
  202.     // An empty rect as default means that the container
  203.     // decides the size for this server
  204.     //
  205.     ps.PartRect.SetNull();
  206.   }
  207.  
  208.   Extent = ps.PartRect.Size();
  209.   Origin = ps.PartRect.TopLeft();
  210.  
  211.   *size = Extent;
  212.   return HR_NOERROR;
  213. }
  214.  
  215. //
  216. // Save the selection that we are a view on
  217. //
  218. HRESULT _IFUNC
  219. TOcDataProvider::Save(IStorage* storage, BOOL sameAsLoad, BOOL remember)
  220. {
  221.   PRECONDITION(storage);
  222.  
  223.   TOcSaveLoad ocSave(storage, static_cast<bool>(sameAsLoad),
  224.                      static_cast<bool>(remember), true, UserData);
  225.  
  226.   return HRFailIfZero((bool)OcView.ForwardEvent(OC_VIEWSAVEPART, &ocSave));
  227. }
  228.  
  229.  
  230.  
  231.  
  232.