collect.inc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  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. Var
  112. TheOwner : TPersistent;
  113. PropList : PPropList;
  114. I, PropCount : Integer;
  115. begin
  116. FPropName:='';
  117. TheOwner:=GetOwner;
  118. if (TheOwner=Nil) Or (TheOwner.Classinfo=Nil) Then Exit;
  119. // get information from the owner RTTI
  120. PropCount:=GetPropList(TheOwner, PropList);
  121. Try
  122. For I:=0 To PropCount-1 Do
  123. If (PropList^[i]^.PropType^.Kind=tkClass) And
  124. (GetObjectProp(TheOwner, PropList^[i], ClassType)=Self) Then
  125. Begin
  126. FPropName:=PropList^[i]^.Name;
  127. Exit;
  128. End;
  129. Finally
  130. FreeMem(PropList);
  131. End;
  132. end;
  133. function TCollection.GetPropName: string;
  134. Var
  135. TheOwner : TPersistent;
  136. begin
  137. Result:=FPropNAme;
  138. TheOwner:=GetOwner;
  139. If (Result<>'') or (TheOwner=Nil) Or (TheOwner.Classinfo=Nil) then exit;
  140. SetPropName;
  141. Result:=FPropName;
  142. end;
  143. procedure TCollection.InsertItem(Item: TCollectionItem);
  144. begin
  145. If Not(Item Is FitemClass) then
  146. exit;
  147. FItems.add(Pointer(Item));
  148. Item.FID:=FNextID;
  149. inc(FNextID);
  150. SetItemName(Item);
  151. Notify(Item,cnAdded);
  152. Changed;
  153. end;
  154. procedure TCollection.RemoveItem(Item: TCollectionItem);
  155. Var
  156. I : Integer;
  157. begin
  158. Notify(Item,cnExtracting);
  159. I:=FItems.IndexOfItem(Item,fromEnd);
  160. If (I<>-1) then
  161. FItems.Delete(I);
  162. Item.FCollection:=Nil;
  163. Changed;
  164. end;
  165. function TCollection.GetAttrCount: Integer;
  166. begin
  167. Result:=0;
  168. end;
  169. function TCollection.GetAttr(Index: Integer): string;
  170. begin
  171. Result:='';
  172. end;
  173. function TCollection.GetItemAttr(Index, ItemIndex: Integer): string;
  174. begin
  175. Result:=TCollectionItem(FItems.Items[ItemIndex]).DisplayName;
  176. end;
  177. function TCollection.GetEnumerator: TCollectionEnumerator;
  178. begin
  179. Result := TCollectionEnumerator.Create(Self);
  180. end;
  181. function TCollection.GetNamePath: string;
  182. var o : TObject;
  183. begin
  184. o:=getowner;
  185. if assigned(o) and (propname<>'') and (o IS TPersistent) then
  186. result:=TPersistent(o).getnamepath+'.'+propname
  187. else
  188. result:=classname;
  189. end;
  190. procedure TCollection.Changed;
  191. begin
  192. if FUpdateCount=0 then
  193. Update(Nil);
  194. end;
  195. function TCollection.GetItem(Index: Integer): TCollectionItem;
  196. begin
  197. Result:=TCollectionItem(FItems.Items[Index]);
  198. end;
  199. procedure TCollection.SetItem(Index: Integer; Value: TCollectionItem);
  200. begin
  201. TCollectionItem(FItems.items[Index]).Assign(Value);
  202. end;
  203. procedure TCollection.SetItemName(Item: TCollectionItem);
  204. begin
  205. end;
  206. procedure TCollection.Update(Item: TCollectionItem);
  207. begin
  208. end;
  209. constructor TCollection.Create(AItemClass: TCollectionItemClass);
  210. begin
  211. inherited create;
  212. FItemClass:=AItemClass;
  213. FItems:=TFpList.Create;
  214. end;
  215. destructor TCollection.Destroy;
  216. begin
  217. If Assigned(FItems) Then Clear;
  218. FItems.Free;
  219. Inherited Destroy;
  220. end;
  221. function TCollection.Add: TCollectionItem;
  222. begin
  223. Result:=FItemClass.Create(Self);
  224. end;
  225. procedure TCollection.Assign(Source: TPersistent);
  226. Var I : Longint;
  227. begin
  228. If Source is TCollection then
  229. begin
  230. Clear;
  231. For I:=0 To TCollection(Source).Count-1 do
  232. Add.Assign(TCollection(Source).Items[I]);
  233. exit;
  234. end
  235. else
  236. Inherited Assign(Source);
  237. end;
  238. procedure TCollection.BeginUpdate;
  239. begin
  240. inc(FUpdateCount);
  241. end;
  242. procedure TCollection.Clear;
  243. begin
  244. If Assigned(FItems) then
  245. While FItems.Count>0 do TCollectionItem(FItems.Last).Free;
  246. end;
  247. procedure TCollection.EndUpdate;
  248. begin
  249. dec(FUpdateCount);
  250. if FUpdateCount=0 then
  251. Changed;
  252. end;
  253. function TCollection.FindItemID(ID: Integer): TCollectionItem;
  254. Var
  255. I : Longint;
  256. begin
  257. For I:=0 to Fitems.Count-1 do
  258. begin
  259. Result:=TCollectionItem(FItems.items[I]);
  260. If Result.Id=Id then
  261. exit;
  262. end;
  263. Result:=Nil;
  264. end;
  265. procedure TCollection.Delete(Index: Integer);
  266. begin
  267. Notify(TCollectionItem(FItems[Index]),cnDeleting);
  268. TCollectionItem(FItems[Index]).Free;
  269. end;
  270. function TCollection.Insert(Index: Integer): TCollectionItem;
  271. begin
  272. Result:=Add;
  273. Result.Index:=Index;
  274. end;
  275. procedure TCollection.Notify(Item: TCollectionItem;Action: TCollectionNotification);
  276. begin
  277. end;
  278. procedure TCollection.Sort(Const Compare : TCollectionSortCompare);
  279. begin
  280. BeginUpdate;
  281. try
  282. FItems.Sort(TListSortCompare(Compare));
  283. Finally
  284. EndUpdate;
  285. end;
  286. end;
  287. procedure TCollection.Exchange(Const Index1, index2: integer);
  288. begin
  289. FItems.Exchange(Index1,Index2);
  290. end;
  291. {****************************************************************************}
  292. {* TOwnedCollection *}
  293. {****************************************************************************}
  294. Constructor TOwnedCollection.Create(AOwner: TPersistent; AItemClass: TCollectionItemClass);
  295. Begin
  296. FOwner := AOwner;
  297. inherited Create(AItemClass);
  298. end;
  299. Function TOwnedCollection.GetOwner: TPersistent;
  300. begin
  301. Result:=FOwner;
  302. end;