collect.inc 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 1999-2000 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {****************************************************************************}
  11. {* TCollectionItem *}
  12. {****************************************************************************}
  13. function TCollectionItem.GetIndex: Integer;
  14. begin
  15. if FCollection<>nil then
  16. Result:=FCollection.FItems.IndexOf(Pointer(Self))
  17. else
  18. Result:=-1;
  19. end;
  20. procedure TCollectionItem.SetCollection(Value: TCollection);
  21. begin
  22. IF Value<>FCollection then
  23. begin
  24. If FCollection<>Nil then FCollection.RemoveItem(Self);
  25. if Value<>Nil then Value.InsertItem(Self);
  26. FCollection:=Value;
  27. end;
  28. end;
  29. procedure TCollectionItem.Changed(AllItems: Boolean);
  30. begin
  31. If (FCollection<>Nil) then
  32. begin
  33. If AllItems then
  34. FCollection.Update(Nil)
  35. else
  36. FCollection.Update(Self);
  37. end;
  38. end;
  39. function TCollectionItem.GetNamePath: string;
  40. begin
  41. If FCollection<>Nil then
  42. Result:=FCollection.GetNamePath+'['+IntToStr(Index)+']'
  43. else
  44. Result:=ClassName;
  45. end;
  46. function TCollectionItem.GetOwner: TPersistent;
  47. begin
  48. Result:=FCollection;
  49. end;
  50. function TCollectionItem.GetDisplayName: string;
  51. begin
  52. Result:=ClassName;
  53. end;
  54. procedure TCollectionItem.SetIndex(Value: Integer);
  55. Var Temp : Longint;
  56. begin
  57. Temp:=GetIndex;
  58. If (Temp>-1) and (Temp<>Value) then
  59. begin
  60. FCollection.FItems.Move(Temp,Value);
  61. Changed(True);
  62. end;
  63. end;
  64. procedure TCollectionItem.SetDisplayName(const Value: string);
  65. begin
  66. Changed(False);
  67. end;
  68. constructor TCollectionItem.Create(ACollection: TCollection);
  69. begin
  70. Inherited Create;
  71. SetCollection(ACollection);
  72. end;
  73. destructor TCollectionItem.Destroy;
  74. begin
  75. SetCollection(Nil);
  76. Inherited Destroy;
  77. end;
  78. {****************************************************************************}
  79. {* TCollection *}
  80. {****************************************************************************}
  81. function TCollection.Owner: TPersistent;
  82. begin
  83. result:=getowner;
  84. end;
  85. function TCollection.GetCount: Integer;
  86. begin
  87. If Assigned(FItems) Then
  88. Result:=FItems.Count
  89. else
  90. Result:=0;
  91. end;
  92. Procedure TCollection.SetPropName;
  93. begin
  94. //!! Should be replaced by the proper routines.
  95. FPropName:='';
  96. end;
  97. function TCollection.GetPropName: string;
  98. Var TheOWner : TPersistent;
  99. begin
  100. Result:=FPropNAme;
  101. TheOWner:=GetOwner;
  102. If (Result<>'') or (TheOwner=Nil) Or (TheOwner.Classinfo=Nil) then exit;
  103. SetPropName;
  104. Result:=FPropName;
  105. end;
  106. procedure TCollection.InsertItem(Item: TCollectionItem);
  107. begin
  108. If Not(Item Is FitemClass) then
  109. exit;
  110. FItems.add(Pointer(Item));
  111. Item.FID:=FNextID;
  112. inc(FNextID);
  113. SetItemName(Item);
  114. Notify(Item,cnAdded);
  115. Changed;
  116. end;
  117. procedure TCollection.RemoveItem(Item: TCollectionItem);
  118. begin
  119. Notify(Item,cnExtracting);
  120. FItems.Remove(Pointer(Item));
  121. Item.FCollection:=Nil;
  122. Changed;
  123. end;
  124. function TCollection.GetAttrCount: Integer;
  125. begin
  126. Result:=0;
  127. end;
  128. function TCollection.GetAttr(Index: Integer): string;
  129. begin
  130. Result:='';
  131. end;
  132. function TCollection.GetItemAttr(Index, ItemIndex: Integer): string;
  133. begin
  134. Result:=TCollectionItem(FItems.Items[ItemIndex]).DisplayName;
  135. end;
  136. function TCollection.GetNamePath: string;
  137. var o : TObject;
  138. begin
  139. o:=getowner;
  140. if assigned(o) and (propname<>'') and (o IS TPersistent) then
  141. result:=TPersistent(o).getnamepath+'.'+propname
  142. else
  143. result:=classname;
  144. end;
  145. procedure TCollection.Changed;
  146. begin
  147. if FUpdateCount=0 then
  148. Update(Nil);
  149. end;
  150. function TCollection.GetItem(Index: Integer): TCollectionItem;
  151. begin
  152. Result:=TCollectionItem(FItems.Items[Index]);
  153. end;
  154. procedure TCollection.SetItem(Index: Integer; Value: TCollectionItem);
  155. begin
  156. TCollectionItem(FItems.items[Index]).Assign(Value);
  157. end;
  158. procedure TCollection.SetItemName(Item: TCollectionItem);
  159. begin
  160. end;
  161. procedure TCollection.Update(Item: TCollectionItem);
  162. begin
  163. end;
  164. constructor TCollection.Create(AItemClass: TCollectionItemClass);
  165. begin
  166. inherited create;
  167. FItemClass:=AItemClass;
  168. FItems:=TList.Create;
  169. end;
  170. destructor TCollection.Destroy;
  171. begin
  172. If Assigned(FItems) Then Clear;
  173. FItems.Free;
  174. Inherited Destroy;
  175. end;
  176. function TCollection.Add: TCollectionItem;
  177. begin
  178. Result:=FItemClass.Create(Self);
  179. end;
  180. procedure TCollection.Assign(Source: TPersistent);
  181. Var I : Longint;
  182. begin
  183. If Source is TCollection then
  184. begin
  185. Clear;
  186. For I:=0 To TCollection(Source).Count-1 do
  187. Add.Assign(TCollection(Source).Items[I]);
  188. exit;
  189. end
  190. else
  191. Inherited Assign(Source);
  192. end;
  193. procedure TCollection.BeginUpdate;
  194. begin
  195. inc(FUpdateCount);
  196. end;
  197. procedure TCollection.Clear;
  198. begin
  199. If Assigned(FItems) then
  200. While FItems.Count>0 do TCollectionItem(FItems.Last).Free;
  201. end;
  202. procedure TCollection.EndUpdate;
  203. begin
  204. dec(FUpdateCount);
  205. if FUpdateCount=0 then
  206. Changed;
  207. end;
  208. function TCollection.FindItemID(ID: Integer): TCollectionItem;
  209. Var
  210. I : Longint;
  211. begin
  212. For I:=0 to Fitems.Count-1 do
  213. begin
  214. Result:=TCollectionItem(FItems.items[I]);
  215. If Result.Id=Id then
  216. exit;
  217. end;
  218. Result:=Nil;
  219. end;
  220. procedure TCollection.Delete(Index: Integer);
  221. begin
  222. Notify(TCollectionItem(FItems[Index]),cnDeleting);
  223. TCollectionItem(FItems[Index]).Free;
  224. end;
  225. function TCollection.Insert(Index: Integer): TCollectionItem;
  226. begin
  227. Result:=Add;
  228. Result.Index:=Index;
  229. end;
  230. procedure TCollection.Notify(Item: TCollectionItem;Action: TCollectionNotification);
  231. begin
  232. end;
  233. procedure TCollection.Sort(Const Compare : TCollectionSortCompare);
  234. begin
  235. BeginUpdate;
  236. try
  237. FItems.Sort(TListSortCompare(Compare));
  238. Finally
  239. EndUpdate;
  240. end;
  241. end;
  242. {****************************************************************************}
  243. {* TOwnedCollection *}
  244. {****************************************************************************}
  245. Constructor TOwnedCollection.Create(AOwner: TPersistent; AItemClass: TCollectionItemClass);
  246. Begin
  247. FOwner := AOwner;
  248. inherited Create(AItemClass);
  249. end;
  250. Function TOwnedCollection.GetOwner: TPersistent;
  251. begin
  252. Result:=FOwner;
  253. end;