collect.inc 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  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) and (FCollection.UpdateCount=0) 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. {* TCollectionEnumerator *}
  80. {****************************************************************************}
  81. constructor TCollectionEnumerator.Create(ACollection: TCollection);
  82. begin
  83. inherited Create;
  84. FCollection := ACollection;
  85. FPosition := -1;
  86. end;
  87. function TCollectionEnumerator.GetCurrent: TCollectionItem;
  88. begin
  89. Result := FCollection.Items[FPosition];
  90. end;
  91. function TCollectionEnumerator.MoveNext: Boolean;
  92. begin
  93. Inc(FPosition);
  94. Result := FPosition < FCollection.Count;
  95. end;
  96. {****************************************************************************}
  97. {* TCollection *}
  98. {****************************************************************************}
  99. function TCollection.Owner: TPersistent;
  100. begin
  101. result:=getowner;
  102. end;
  103. function TCollection.GetCount: Integer;
  104. begin
  105. If Assigned(FItems) Then
  106. Result:=FItems.Count
  107. else
  108. Result:=0;
  109. end;
  110. Procedure TCollection.SetPropName;
  111. begin
  112. //!! Should be replaced by the proper routines.
  113. FPropName:='';
  114. end;
  115. function TCollection.GetPropName: string;
  116. Var TheOWner : TPersistent;
  117. begin
  118. Result:=FPropNAme;
  119. TheOWner:=GetOwner;
  120. If (Result<>'') or (TheOwner=Nil) Or (TheOwner.Classinfo=Nil) then exit;
  121. SetPropName;
  122. Result:=FPropName;
  123. end;
  124. procedure TCollection.InsertItem(Item: TCollectionItem);
  125. begin
  126. If Not(Item Is FitemClass) then
  127. exit;
  128. FItems.add(Pointer(Item));
  129. Item.FID:=FNextID;
  130. inc(FNextID);
  131. SetItemName(Item);
  132. Notify(Item,cnAdded);
  133. Changed;
  134. end;
  135. procedure TCollection.RemoveItem(Item: TCollectionItem);
  136. begin
  137. Notify(Item,cnExtracting);
  138. FItems.Remove(Pointer(Item));
  139. Item.FCollection:=Nil;
  140. Changed;
  141. end;
  142. function TCollection.GetAttrCount: Integer;
  143. begin
  144. Result:=0;
  145. end;
  146. function TCollection.GetAttr(Index: Integer): string;
  147. begin
  148. Result:='';
  149. end;
  150. function TCollection.GetItemAttr(Index, ItemIndex: Integer): string;
  151. begin
  152. Result:=TCollectionItem(FItems.Items[ItemIndex]).DisplayName;
  153. end;
  154. function TCollection.GetEnumerator: TCollectionEnumerator;
  155. begin
  156. Result := TCollectionEnumerator.Create(Self);
  157. end;
  158. function TCollection.GetNamePath: string;
  159. var o : TObject;
  160. begin
  161. o:=getowner;
  162. if assigned(o) and (propname<>'') and (o IS TPersistent) then
  163. result:=TPersistent(o).getnamepath+'.'+propname
  164. else
  165. result:=classname;
  166. end;
  167. procedure TCollection.Changed;
  168. begin
  169. if FUpdateCount=0 then
  170. Update(Nil);
  171. end;
  172. function TCollection.GetItem(Index: Integer): TCollectionItem;
  173. begin
  174. Result:=TCollectionItem(FItems.Items[Index]);
  175. end;
  176. procedure TCollection.SetItem(Index: Integer; Value: TCollectionItem);
  177. begin
  178. TCollectionItem(FItems.items[Index]).Assign(Value);
  179. end;
  180. procedure TCollection.SetItemName(Item: TCollectionItem);
  181. begin
  182. end;
  183. procedure TCollection.Update(Item: TCollectionItem);
  184. begin
  185. end;
  186. constructor TCollection.Create(AItemClass: TCollectionItemClass);
  187. begin
  188. inherited create;
  189. FItemClass:=AItemClass;
  190. FItems:=TList.Create;
  191. end;
  192. destructor TCollection.Destroy;
  193. begin
  194. If Assigned(FItems) Then Clear;
  195. FItems.Free;
  196. Inherited Destroy;
  197. end;
  198. function TCollection.Add: TCollectionItem;
  199. begin
  200. Result:=FItemClass.Create(Self);
  201. end;
  202. procedure TCollection.Assign(Source: TPersistent);
  203. Var I : Longint;
  204. begin
  205. If Source is TCollection then
  206. begin
  207. Clear;
  208. For I:=0 To TCollection(Source).Count-1 do
  209. Add.Assign(TCollection(Source).Items[I]);
  210. exit;
  211. end
  212. else
  213. Inherited Assign(Source);
  214. end;
  215. procedure TCollection.BeginUpdate;
  216. begin
  217. inc(FUpdateCount);
  218. end;
  219. procedure TCollection.Clear;
  220. begin
  221. If Assigned(FItems) then
  222. While FItems.Count>0 do TCollectionItem(FItems.Last).Free;
  223. end;
  224. procedure TCollection.EndUpdate;
  225. begin
  226. dec(FUpdateCount);
  227. if FUpdateCount=0 then
  228. Changed;
  229. end;
  230. function TCollection.FindItemID(ID: Integer): TCollectionItem;
  231. Var
  232. I : Longint;
  233. begin
  234. For I:=0 to Fitems.Count-1 do
  235. begin
  236. Result:=TCollectionItem(FItems.items[I]);
  237. If Result.Id=Id then
  238. exit;
  239. end;
  240. Result:=Nil;
  241. end;
  242. procedure TCollection.Delete(Index: Integer);
  243. begin
  244. Notify(TCollectionItem(FItems[Index]),cnDeleting);
  245. TCollectionItem(FItems[Index]).Free;
  246. end;
  247. function TCollection.Insert(Index: Integer): TCollectionItem;
  248. begin
  249. Result:=Add;
  250. Result.Index:=Index;
  251. end;
  252. procedure TCollection.Notify(Item: TCollectionItem;Action: TCollectionNotification);
  253. begin
  254. end;
  255. procedure TCollection.Sort(Const Compare : TCollectionSortCompare);
  256. begin
  257. BeginUpdate;
  258. try
  259. FItems.Sort(TListSortCompare(Compare));
  260. Finally
  261. EndUpdate;
  262. end;
  263. end;
  264. {****************************************************************************}
  265. {* TOwnedCollection *}
  266. {****************************************************************************}
  267. Constructor TOwnedCollection.Create(AOwner: TPersistent; AItemClass: TCollectionItemClass);
  268. Begin
  269. FOwner := AOwner;
  270. inherited Create(AItemClass);
  271. end;
  272. Function TOwnedCollection.GetOwner: TPersistent;
  273. begin
  274. Result:=FOwner;
  275. end;