collect.inc 7.0 KB

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