home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / odtlktv4.zip / ODTLKT / TOOLKIT / SAMPLES / OPENDOC / PARTS / COOKBOOK / CKBKUTL.CPP next >
Text File  |  1995-12-15  |  11KB  |  396 lines

  1. //----------------------------------------------------------------------------
  2. // File:         ckbkutl.cpp
  3. //
  4. // Contains:     CookbookPart utility functions & classes source file
  5. //
  6. // Modified by:  Lynda Salvetti
  7. // Written by:   Steve Smith (original)
  8. //
  9. // Copyright:  ⌐ 1994 by Apple Computer, Inc., all rights reserved.
  10. // Copyright:    1995 by IBM, Inc., all rights reserved.
  11. //
  12. //----------------------------------------------------------------------------
  13.  
  14. // --- OpenDoc Includes ---
  15.  
  16. #ifndef _ODTYPES_
  17. #include <ODTypes.h>
  18. #endif
  19.  
  20. #ifndef SOM_ODPart_xh
  21. #include <Part.xh>
  22. #endif
  23.  
  24. #ifndef SOM_Module_OpenDoc_StdProps_defined
  25. #include <StdProps.xh>
  26. #endif
  27.  
  28. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  29. #include <StdTypes.xh>
  30. #endif
  31.  
  32. #ifndef SOM_ODFrame_xh
  33. #include <Frame.xh>
  34. #endif
  35.  
  36. #ifndef SOM_ODDraft_xh
  37. #include <Draft.xh>
  38. #endif
  39.  
  40. #ifndef SOM_ODFrameFacetIterator_xh
  41. #include <Frfaitr.xh>
  42. #endif
  43.  
  44. #ifndef SOM_ODCanvas_xh
  45. #include <Canvas.xh>
  46. #endif
  47.  
  48. #ifndef SOM_ODTransform_xh
  49. #include <Trnsform.xh>
  50. #endif
  51.  
  52. #ifndef SOM_ODStorageUnit_xh
  53. #include <StorageU.xh>
  54. #endif
  55.  
  56. // --- CookbookPart Includes ---
  57.  
  58. #ifndef _COOKBOOKPARTUTILS_
  59. #include "ckbkutl.hpp"
  60. #endif
  61.  
  62. #ifndef SOM_CookbookPart_xih
  63. #include "cookbook.xih"
  64. #endif
  65.  
  66. #ifndef _COOKBOOKDEFS_
  67. #include "cookbook.hpp"
  68. #endif
  69.  
  70. //====================================================================
  71. // Utility Functions
  72. //====================================================================
  73.  
  74. //--------------------------------------------------------------------
  75. // CountFacets
  76. //--------------------------------------------------------------------
  77.  
  78. ODUShort CountFramesFacets(Environment* ev, ODFrame* frame)
  79. {
  80.    ODUShort facetCount = 0;
  81.    ODFacet* facet;
  82.    ODFrameFacetIterator* ffiter;
  83.  
  84.    ffiter = frame->CreateFacetIterator(ev);
  85.    facet = ffiter->First(ev);
  86.    while ( ffiter->IsNotComplete(ev) )
  87.    {
  88.       facetCount++;
  89.       facet = ffiter->Next(ev);
  90.    }
  91.    delete ffiter;
  92.  
  93.    return facetCount;
  94. }
  95.  
  96. //====================================================================
  97. // CLinkedList
  98. //====================================================================
  99.  
  100. CLinkedList::CLinkedList():CLink()
  101. {
  102. }
  103.  
  104.  
  105. CLinkedList::~CLinkedList()
  106. {
  107.    // Delete all links:
  108.    while (fNext != this)
  109.       delete fNext;
  110. }
  111.  
  112.  
  113. void CLinkedList::Add(ODPtr content)
  114. {
  115.    // The new link has already hooked itself into my chain so
  116.    // I don't need to remember it elsewhere.
  117.    new CLink(content,this);
  118. }
  119.  
  120.  
  121. void CLinkedList::Remove(ODPtr content)
  122. {
  123.    CLink *link;
  124.    for (link=this->First(); link->Content(); link=link->Next())
  125.        if (link->Content() == content)
  126.        {
  127.           delete link;
  128.           return;
  129.        }
  130. }
  131.  
  132.  
  133. ODBoolean CLinkedList::Contains(ODPtr content)
  134. {
  135.    CLink *link;
  136.    for (link=this->First(); link->Content(); link=link->Next())
  137.        if (link->Content() == content)
  138.           return kODTrue;
  139.    return kODFalse;
  140. }
  141.  
  142.  
  143. ODUShort CLinkedList::Count()
  144. {
  145.    ODUShort count = 0;
  146.    CLink *link;
  147.    for (link=this->First(); link->Content(); link=link->Next())
  148.        count++;
  149.    return count;
  150. }
  151.  
  152.  
  153. //====================================================================
  154. // CLink
  155. //====================================================================
  156.  
  157. CLink::CLink()
  158.     :fContent(kODNULL),
  159.      fPrev(this),
  160.      fNext(this)
  161. {
  162. }
  163.  
  164.  
  165. CLink::CLink(ODPtr content, CLinkedList* list)
  166.     :fContent(content),
  167.      fPrev(list),
  168.      fNext(list->fNext)
  169. {
  170.    list->fNext = this;
  171.    fNext->fPrev = this;
  172. }
  173.  
  174.  
  175. CLink::~CLink()
  176. {
  177.    if (fPrev)
  178.       fPrev->fNext = fNext;
  179.    if (fNext)
  180.       fNext->fPrev = fPrev;
  181. }
  182.  
  183. //=========================================================================
  184. // CFrameInfo
  185. //=========================================================================
  186.  
  187. //-------------------------------------------------------------------------
  188. // CFrameInfo::CFrameInfo
  189. //-------------------------------------------------------------------------
  190.  
  191. CFrameInfo::CFrameInfo()
  192. {
  193.    fFrameActive = kODFalse;
  194.    fFrameReactivate  = kODFalse;
  195.    fActiveFacet = kODNULL;
  196.    fSourceFrame = kODNULL;
  197.    fAttachedFrames = kODNULL;
  198.    fPartWindow = kODNULL;
  199. }
  200.  
  201. //-------------------------------------------------------------------------
  202. // CFrameInfo::~CFrameInfo
  203. //-------------------------------------------------------------------------
  204.  
  205. CFrameInfo::~CFrameInfo()
  206. {
  207.    if ( fAttachedFrames )
  208.       delete fAttachedFrames;
  209. }
  210.  
  211. //-------------------------------------------------------------------------
  212. // CFrameInfo::Externalize
  213. //-------------------------------------------------------------------------
  214.  
  215. void CFrameInfo::Externalize(Environment* ev,
  216.                              ODStorageUnitView* storageUnitView)
  217. {
  218.    // This method assumes that OpenDoc has passed us a storageUnitView
  219.    // that is focused to a property, but no particular value.
  220.  
  221.    ODStorageUnit* storageUnit = storageUnitView->GetStorageUnit(ev);
  222.  
  223.    this->ExternalizeFrameInfo(ev, storageUnit, 0, kODNULL);
  224. }
  225.  
  226. //-------------------------------------------------------------------------
  227. // CFrameInfo::ExternalizeFrameInfo
  228. //-------------------------------------------------------------------------
  229.  
  230. void CFrameInfo::ExternalizeFrameInfo(Environment* ev,
  231.                                       ODStorageUnit* storageUnit,
  232.                                       ODDraftKey key, ODFrame* scopeFrame)
  233. {
  234.    if ( storageUnit->Exists(ev, kODNULL, kCookbookPartInfo, 0) )
  235.    {
  236.       // Persistent object references are stored in a side table, rather
  237.       // than in the property/value stream. Thus, deleting the contents of
  238.       // a value will not "delete" the references previously written to
  239.       // that value. To completely "delete" all references written to the
  240.       // value, we must remove the value and add it back.
  241.  
  242.       storageUnit->Focus(ev, kODNULL, kODPosSame, kCookbookPartInfo,
  243.                          0, kODPosUndefined);
  244.       storageUnit->Remove(ev);
  245.    }
  246.     
  247.    if ( fSourceFrame )
  248.    {
  249.       ODStorageUnitRef weakRef;
  250.       ODID frameID = fSourceFrame->GetID(ev);
  251.       ODID scopeFrameID = ( scopeFrame ? scopeFrame->GetID(ev) : 0 );
  252.       ODDraft* fromDraft = fSourceFrame->GetStorageUnit(ev)->GetDraft(ev);
  253.  
  254.       storageUnit->AddValue(ev, kCookbookPartInfo);
  255.     
  256.       // If a draft key exists, then we are being cloned to another draft.
  257.       // We must "weak" clone our display frame and reference the cloned
  258.       // frame. The part re-uses the frameID variable so there aren't two
  259.       // different GetWeakStorageUnitRef calls.
  260.       if ( key )
  261.          frameID = fromDraft->WeakClone(ev, key, frameID, 0, scopeFrameID);
  262.     
  263.       // Write out weak references to each of the part's display frames.
  264.       storageUnit->GetWeakStorageUnitRef(ev, frameID, weakRef);
  265.       StorageUnitSetValue(storageUnit, ev, sizeof(ODStorageUnitRef),
  266.                          (ODPtr)&weakRef);
  267.    }
  268. }
  269.  
  270. //-------------------------------------------------------------------------
  271. // CFrameInfo::CloneInto
  272. //-------------------------------------------------------------------------
  273.  
  274. void CFrameInfo::CloneInto(Environment *ev, ODDraftKey key,
  275.                     ODStorageUnitView* storageUnitView, ODFrame* scopeFrame)
  276. {
  277.    // This method assumes that OpenDoc has passed us a storageUnitView
  278.    // that is focused to a property, but no particular value.
  279.  
  280.    ODStorageUnit* storageUnit = storageUnitView->GetStorageUnit(ev);
  281.  
  282.    if ( storageUnit->Exists(ev, kODNULL, kCookbookPartInfo, 0) == kODFalse )
  283.    {
  284.       this->ExternalizeFrameInfo(ev, storageUnit, key, scopeFrame);
  285.    }
  286. }
  287.  
  288. //-------------------------------------------------------------------------
  289. // CFrameInfo::InitFromStorage
  290. //------------------------------------------------------------------------------
  291.  
  292. void CFrameInfo::InitFromStorage(Environment* ev,
  293.                                  ODStorageUnitView* storageUnitView)
  294. {
  295.    // This method assumes that OpenDoc has passed us a storageUnitView
  296.    // that is focused to a property, but no particular value.
  297.  
  298.    ODStorageUnit* storageUnit = storageUnitView->GetStorageUnit(ev);
  299.  
  300.    if ( storageUnit->Exists(ev, kODNULL, kCookbookPartInfo, 0) )
  301.    {
  302.       storageUnit->Focus(ev, kODNULL, kODPosSame,
  303.                          kCookbookPartInfo, 0 , kODPosUndefined);
  304.  
  305.       ODULong size = storageUnit->GetSize(ev);
  306.  
  307.       // If the frame does not have a source frame, make sure the value
  308.       // is empty.    
  309.       if ( size > 0 )
  310.       {
  311.          ODStorageUnitRef weakRef;
  312.       
  313.          StorageUnitGetValue(storageUnit, ev, sizeof(ODStorageUnitRef),
  314.                              (ODPtr)&weakRef);
  315.       
  316.          if ( storageUnit->IsValidStorageUnitRef(ev, weakRef) )
  317.          {
  318.             ODID sourceID = storageUnit->GetIDFromStorageUnitRef(ev,
  319.                                                                weakRef);
  320.             ODFrame* frame = storageUnit->GetDraft(ev)->AcquireFrame(ev,
  321.                                                               sourceID);
  322.             fSourceFrame = frame;
  323.             frame->Release(ev);
  324.          }
  325.          else
  326.          {
  327.             fSourceFrame = kODNULL;
  328.          }
  329.       }
  330.    }
  331. }
  332.  
  333. //-------------------------------------------------------------------------
  334. // CFrameInfo::SetSourceFrame
  335. //-------------------------------------------------------------------------
  336.  
  337. void CFrameInfo::SetSourceFrame(Environment* ev, ODFrame* sourceFrame)
  338. {
  339.    if ( sourceFrame != kODNULL )
  340.    {
  341.       fSourceFrame = sourceFrame;
  342.       fSourceFrame->Acquire(ev);
  343.    }
  344. }
  345.  
  346. //-------------------------------------------------------------------------
  347. // CFrameInfo::ReleaseSourceFrame
  348. //-------------------------------------------------------------------------
  349.  
  350. void CFrameInfo::ReleaseSourceFrame(Environment* ev)
  351. {
  352.    if ( fSourceFrame != kODNULL )
  353.    {
  354.       fSourceFrame->Release(ev);
  355.       fSourceFrame = kODNULL;
  356.    }
  357. }
  358.  
  359. //-------------------------------------------------------------------------
  360. // CFrameInfo::AttachFrame
  361. //-------------------------------------------------------------------------
  362.  
  363. void CFrameInfo::AttachFrame(Environment* ev, ODFrame* frame)
  364. {
  365.    if ( fAttachedFrames == kODNULL )
  366.       fAttachedFrames = new CLinkedList;
  367.  
  368.    if ( !fAttachedFrames->Contains((ODPtr)frame) )
  369.    {
  370.       frame->Acquire(ev);
  371.       fAttachedFrames->Add((ODPtr)frame);
  372.    }
  373. }
  374.  
  375. //-------------------------------------------------------------------------
  376. // CFrameInfo::DetachFrame
  377. //-------------------------------------------------------------------------
  378.  
  379. void CFrameInfo::DetachFrame(Environment* ev, ODFrame* frame)
  380. {
  381.    if ( fAttachedFrames->Contains((ODPtr)frame) )
  382.    {
  383.       fAttachedFrames->Remove((ODPtr)frame);
  384.       frame->Release(ev);
  385.    }
  386.  
  387.    if ( fAttachedFrames->Count() == 0 )
  388.    {
  389.       delete fAttachedFrames;
  390.       fAttachedFrames = kODNULL;
  391.    }
  392. }
  393.  
  394.  
  395.  
  396.