home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Framewrk / FWSemEvt / FWScpCol.cpp < prev    next >
Encoding:
Text File  |  1996-09-17  |  10.5 KB  |  351 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWSemCol.cpp
  4. //    Release Version:    $ ODF 2 $
  5. //
  6. //    Copyright:            (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #ifndef FWSCPCOL_H
  11. #include "FWScpCol.h"
  12. #endif
  13.  
  14. #ifndef FWAPLEVT_H
  15. #include "FWAplEvt.h"
  16. #endif
  17.  
  18. #ifndef FWDSCOPR_H
  19. #include "FWDscOpr.h"
  20. #endif
  21.  
  22. //========================================================================================
  23. //    Runtime Information
  24. //========================================================================================
  25.  
  26. #ifdef FW_BUILD_MAC    
  27. #pragma segment fwsemevt
  28. #endif
  29.  
  30. FW_DEFINE_AUTO(FW_CScriptableCollection)
  31.  
  32. //========================================================================================
  33. // CLASS FW_CScriptableCollection
  34. //========================================================================================
  35.  
  36. FW_DEFINE_CLASS_M1(FW_CScriptableCollection, FW_MScriptable)
  37.  
  38. //---------------------------------------------------------------------------------------
  39. //    FW_CScriptableCollection::FW_CScriptableCollection
  40. //---------------------------------------------------------------------------------------
  41.  
  42. FW_CScriptableCollection::FW_CScriptableCollection() :
  43.     fRefCount(1),
  44.     fRep(FW_NEW(FW_TOrderedCollection<FW_MScriptable>, ()))
  45. {
  46.     FW_END_CONSTRUCTOR
  47. }
  48.  
  49. //---------------------------------------------------------------------------------------
  50. //    FW_CScriptableCollection::~FW_CScriptableCollection
  51. //---------------------------------------------------------------------------------------
  52.  
  53. FW_CScriptableCollection::~FW_CScriptableCollection()
  54. {
  55.     FW_START_DESTRUCTOR
  56.     
  57.     FW_ASSERT(fRefCount == 0);
  58.     
  59.     FW_MScriptable* element = fRep->First();
  60.  
  61.     while (element)
  62.     {
  63.         Remove(element);
  64.         element = fRep->First();
  65.     }
  66.     delete fRep;
  67. }
  68.  
  69. //---------------------------------------------------------------------------------------
  70. //    FW_CScriptableCollection::AcquireScriptable
  71. //---------------------------------------------------------------------------------------
  72.  
  73. long FW_CScriptableCollection::AcquireScriptable()
  74. {
  75.     return ++fRefCount;
  76. }
  77.  
  78. //---------------------------------------------------------------------------------------
  79. //    FW_CScriptableCollection::ReleaseScriptable
  80. //---------------------------------------------------------------------------------------
  81.  
  82. long FW_CScriptableCollection::ReleaseScriptable()
  83. {
  84.     FW_ASSERT(fRefCount > 0);
  85.     
  86.     long result = --fRefCount;
  87.     
  88.     if (result == 0)
  89.         delete this;
  90.     
  91.     return result;
  92. }
  93.  
  94. //---------------------------------------------------------------------------------------
  95. //    FW_CScriptableCollection::Add
  96. //---------------------------------------------------------------------------------------
  97.  
  98. void FW_CScriptableCollection::Add(FW_MScriptable* element)
  99. {
  100.     fRep->AddLast(element);
  101.     element->AcquireScriptable();
  102.     element->AddDependent(this);
  103. }
  104.  
  105. //---------------------------------------------------------------------------------------
  106. //    FW_CScriptableCollection::Remove
  107. //---------------------------------------------------------------------------------------
  108.  
  109. void FW_CScriptableCollection::Remove(FW_MScriptable* element)
  110. {
  111.     fRep->Remove(element);
  112.     element->RemoveDependent(this);
  113.     element->ReleaseScriptable();
  114. }
  115.  
  116. //---------------------------------------------------------------------------------------
  117. //    FW_CScriptableCollection::AdjustMarks
  118. //---------------------------------------------------------------------------------------
  119.  
  120. void FW_CScriptableCollection::AdjustMarks(Environment* ev,
  121.                                         ODSLong newStart,
  122.                                         ODSLong newStop)
  123. {
  124. FW_UNUSED(ev);
  125.     long elementsToDelete = Count() - newStop;
  126.     while (elementsToDelete > 0)
  127.     {
  128.         Remove(fRep->Last());
  129.         --elementsToDelete;
  130.     }
  131.     
  132.     elementsToDelete = newStart - 1;
  133.     while (elementsToDelete > 0)
  134.     {
  135.         Remove(fRep->First());
  136.         --elementsToDelete;
  137.     }
  138. }
  139.  
  140. //---------------------------------------------------------------------------------------
  141. //    FW_CScriptableCollection::GetFrame
  142. //---------------------------------------------------------------------------------------
  143.  
  144. FW_CFrame* FW_CScriptableCollection::GetFrame(Environment* ev,
  145.                                             FW_CPart* part) const
  146. {
  147.     FW_MScriptable* first = NULL;
  148.  
  149.     if (Count() > 0)
  150.         first = fRep->First();
  151.     
  152.     return first ? first->GetFrame(ev, part) : FW_MScriptable::GetFrame(ev, part);
  153. }
  154.  
  155. //---------------------------------------------------------------------------------------
  156. //    FW_CScriptableCollection::DoAECountElements
  157. //---------------------------------------------------------------------------------------
  158.  
  159. void FW_CScriptableCollection::DoAECountElements(Environment* ev,    
  160.                                                     FW_CPart* part,
  161.                                                     const FW_CAppleEvent& event,
  162.                                                     FW_CAppleEvent& reply)
  163. {
  164. FW_UNUSED(ev);
  165. FW_UNUSED(part);
  166. FW_UNUSED(event);
  167.     reply.PutLongInteger(Count(), keyAEResult);
  168. }
  169.  
  170. //---------------------------------------------------------------------------------------
  171. //    FW_CScriptableCollection::DoAEGetData
  172. //---------------------------------------------------------------------------------------
  173.  
  174. void FW_CScriptableCollection::DoAEGetData(Environment* ev,    
  175.                                             FW_CPart* part,
  176.                                             const FW_CAppleEvent& event,
  177.                                             FW_CAppleEvent& reply)
  178. {
  179.     FW_TRY
  180.     {
  181.         FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  182.         
  183.         FW_CDesc        localDesc;
  184.         FW_CDesc        replyList;
  185.         
  186.         for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  187.         {
  188.             semObj->DoAEGetData(ev, part, event, reply);
  189.             
  190.             localDesc.Clear();
  191.             reply.GetDataByDesc(localDesc, keyAEResult);
  192.             
  193.             replyList.PutDataByDesc(localDesc);
  194.             
  195.             reply.DeleteItemByKey(keyAEResult);
  196.         }
  197.         
  198.         reply.PutDataByDesc(replyList, keyAEResult);
  199.     }
  200.     FW_CATCH_BEGIN
  201.     FW_CATCH_EVERYTHING()
  202.     {
  203.         if (reply.HasDataKey(keyAEResult))
  204.             reply.DeleteItemByKey(keyAEResult);
  205.             
  206.         FW_THROW_SAME();
  207.     }
  208.     FW_CATCH_END
  209. }
  210.  
  211. //---------------------------------------------------------------------------------------
  212. //    FW_CScriptableCollection::DoAESetData
  213. //---------------------------------------------------------------------------------------
  214.  
  215. void FW_CScriptableCollection::DoAESetData(Environment* ev,    
  216.                                                 FW_CPart* part,
  217.                                                 const FW_CAppleEvent& event,
  218.                                                 FW_CAppleEvent& reply)
  219. {
  220.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  221.     
  222.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  223.     {
  224.         semObj->DoAESetData(ev, part, event, reply);
  225.     }
  226. }
  227.  
  228. //---------------------------------------------------------------------------------------
  229. //    FW_CScriptableCollection::HasProperty
  230. //---------------------------------------------------------------------------------------
  231.  
  232. FW_Boolean FW_CScriptableCollection::HasProperty(ODDescType whichProperty) const
  233. {
  234.     FW_MScriptable* first = NULL;
  235.  
  236.     if (Count() > 0)
  237.         first = fRep->First();
  238.     
  239.     return first ? first->HasProperty(whichProperty) : FW_MScriptable::HasProperty(whichProperty);
  240. }
  241.  
  242. //---------------------------------------------------------------------------------------
  243. //    FW_CScriptableCollection::GetPropertyInfo
  244. //---------------------------------------------------------------------------------------
  245.  
  246. void FW_CScriptableCollection::GetPropertyInfo(Environment* ev,    
  247.                                                         FW_CPart* part,
  248.                                                         FW_Boolean& canUndo,
  249.                                                         FW_Boolean& causesChange) const
  250. {
  251.     FW_MScriptable::GetPropertyInfo(ev, part, canUndo, causesChange);
  252.     
  253.     if (Count() > 0)
  254.     {
  255.         FW_MScriptable* first = fRep->First();
  256.         if (first)
  257.             first->GetPropertyInfo(ev, part, canUndo, causesChange);
  258.     }
  259. }
  260.  
  261. //---------------------------------------------------------------------------------------
  262. //    FW_CScriptableCollection::GetProperty
  263. //---------------------------------------------------------------------------------------
  264.  
  265. FW_Boolean FW_CScriptableCollection::GetProperty(Environment* ev, 
  266.                                                     FW_CPart* part,
  267.                                                     FW_CDesc& propertyValue, 
  268.                                                     ODDescType whichProperty,
  269.                                                     ODDescType desiredType) const
  270. {
  271.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  272.     FW_CDesc eachProperty;
  273.  
  274.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  275.     {
  276.         eachProperty.Clear();
  277.         semObj->GetProperty(ev, part, eachProperty, whichProperty, desiredType);
  278.         
  279.         propertyValue << eachProperty;
  280.     }
  281.     return TRUE;
  282. }
  283.  
  284. //---------------------------------------------------------------------------------------
  285. //    FW_CScriptableCollection::SetProperty
  286. //---------------------------------------------------------------------------------------
  287.  
  288. void FW_CScriptableCollection::SetProperty(Environment* ev, 
  289.                                             FW_CPart* part,
  290.                                             FW_CDesc& propertyValue, 
  291.                                             ODDescType whichProperty)
  292. {
  293.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  294.         
  295.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  296.     {
  297.         semObj->SetProperty(ev, part, propertyValue, whichProperty);
  298.     }
  299. }
  300.  
  301. //---------------------------------------------------------------------------------------
  302. //    FW_CScriptableCollection::RestoreProperty
  303. //---------------------------------------------------------------------------------------
  304.  
  305. void FW_CScriptableCollection::RestoreProperty(Environment* ev,
  306.                                                 FW_CPart* part,
  307.                                                 FW_CDesc& propertyValue,
  308.                                                 ODDescType whichProperty)
  309. {
  310.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  311.     FW_CDesc eachProperty;
  312.     long index = 1;
  313.         
  314.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  315.     {
  316.         eachProperty.Clear();
  317.         propertyValue.GetDescFromList(index++, eachProperty);
  318.         semObj->SetProperty(ev, part, eachProperty, whichProperty);
  319.     }
  320. }
  321.  
  322. //---------------------------------------------------------------------------------------
  323. //    FW_CScriptableCollection::GetUndoStrings
  324. //---------------------------------------------------------------------------------------
  325.  
  326. void FW_CScriptableCollection::GetUndoStrings(Environment* ev,
  327.                                                 FW_CPart* part,
  328.                                                 ODDescType whichProperty,
  329.                                                 FW_CString& undoString,
  330.                                                 FW_CString& redoString) const
  331. {
  332.     FW_MScriptable* first = NULL;
  333.     
  334.     if (Count() > 0)
  335.         first = fRep->First();
  336.     
  337.     if (first)
  338.         first->GetUndoStrings(ev, part, whichProperty, undoString, redoString);
  339.     else
  340.         FW_MScriptable::GetUndoStrings(ev, part, whichProperty, undoString, redoString);
  341. }
  342.  
  343. //---------------------------------------------------------------------------------------
  344. //    FW_CScriptableCollection::HandlePrimaryDeleted
  345. //---------------------------------------------------------------------------------------
  346.  
  347. void FW_CScriptableCollection::HandlePrimaryDeleted(FW_MScriptable* primary)
  348. {
  349.     fRep->Remove(primary);
  350. }
  351.