|
|
@@ -35,6 +35,9 @@ type |
|
|
protected |
|
|
protected |
|
|
procedure InsertIntern(const aIndex: Integer; const aItem: T); override; |
|
|
procedure InsertIntern(const aIndex: Integer; const aItem: T); override; |
|
|
procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override; |
|
|
procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override; |
|
|
|
|
|
|
|
|
|
|
|
procedure DoAddItem(const aIndex: Integer; const aItem: T); virtual; |
|
|
|
|
|
procedure DoRemoveItem(const aIndex: Integer; const aItem: T); virtual; |
|
|
public |
|
|
public |
|
|
property OnAddItem: TEventList read fOnAddItem; |
|
|
property OnAddItem: TEventList read fOnAddItem; |
|
|
property OnRemoveItem: TEventList read fOnRemoveItem; |
|
|
property OnRemoveItem: TEventList read fOnRemoveItem; |
|
|
@@ -61,6 +64,9 @@ type |
|
|
protected |
|
|
protected |
|
|
procedure InsertIntern(const aIndex: Integer; const aItem: T); override; |
|
|
procedure InsertIntern(const aIndex: Integer; const aItem: T); override; |
|
|
procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override; |
|
|
procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override; |
|
|
|
|
|
|
|
|
|
|
|
procedure DoAddItem(const aItem: T); virtual; |
|
|
|
|
|
procedure DoRemoveItem(const aItem: T); virtual; |
|
|
public |
|
|
public |
|
|
property OnAddItem: TEventList read fOnAddItem; |
|
|
property OnAddItem: TEventList read fOnAddItem; |
|
|
property OnRemoveItem: TEventList read fOnRemoveItem; |
|
|
property OnRemoveItem: TEventList read fOnRemoveItem; |
|
|
@@ -83,22 +89,21 @@ type |
|
|
TEventList = specialize TutlEventList<TKeyValuePairEvent>; |
|
|
TEventList = specialize TutlEventList<TKeyValuePairEvent>; |
|
|
TObservableHashSet = class(THashSet) |
|
|
TObservableHashSet = class(THashSet) |
|
|
private |
|
|
private |
|
|
fOwner: TObject; |
|
|
|
|
|
fOnAddItem: TEventList; |
|
|
|
|
|
fOnRemoveItem: TEventList; |
|
|
|
|
|
|
|
|
fOwner: TutlObservableCustomMap; |
|
|
protected |
|
|
protected |
|
|
procedure InsertIntern(const aIndex: Integer; const aItem: TKeyValuePair); override; |
|
|
procedure InsertIntern(const aIndex: Integer; const aItem: TKeyValuePair); override; |
|
|
procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override; |
|
|
procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override; |
|
|
public |
|
|
public |
|
|
property OnAddItem: TEventList read fOnAddItem write fOnAddItem; |
|
|
|
|
|
property OnRemoveItem: TEventList read fOnRemoveItem write fOnRemoveItem; |
|
|
|
|
|
constructor Create(const aOwner: TObject; const aComparer: IComparer; const aOwnsObjects: Boolean = true); |
|
|
|
|
|
|
|
|
constructor Create(const aOwner: TutlObservableCustomMap; const aComparer: IComparer; const aOwnsObjects: Boolean = true); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
private |
|
|
private |
|
|
fHashSetImpl: TObservableHashSet; |
|
|
fHashSetImpl: TObservableHashSet; |
|
|
fOnAddItem: TEventList; |
|
|
fOnAddItem: TEventList; |
|
|
fOnRemoveItem: TEventList; |
|
|
fOnRemoveItem: TEventList; |
|
|
|
|
|
protected |
|
|
|
|
|
procedure DoAddItem(const aKey: TKey; const aValue: TValue); virtual; |
|
|
|
|
|
procedure DoRemoveItem(const aKey: TKey; const aValue: TValue); virtual; |
|
|
public |
|
|
public |
|
|
property OnAddItem: TEventList read fOnAddItem; |
|
|
property OnAddItem: TEventList read fOnAddItem; |
|
|
property OnRemoveItem: TEventList read fOnRemoveItem; |
|
|
property OnRemoveItem: TEventList read fOnRemoveItem; |
|
|
@@ -169,24 +174,36 @@ end; |
|
|
//TutlObservableCustomList////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//TutlObservableCustomList////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure TutlObservableCustomList.InsertIntern(const aIndex: Integer; const aItem: T); |
|
|
procedure TutlObservableCustomList.InsertIntern(const aIndex: Integer; const aItem: T); |
|
|
|
|
|
begin |
|
|
|
|
|
inherited InsertIntern(aIndex, aItem); |
|
|
|
|
|
DoAddItem(aIndex, aItem); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
procedure TutlObservableCustomList.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean); |
|
|
|
|
|
begin |
|
|
|
|
|
DoRemoveItem(aIndex, aIndex); |
|
|
|
|
|
inherited DeleteIntern(aIndex, aFreeItem); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
procedure TutlObservableCustomList.DoAddItem(const aIndex: Integer; const aItem: T); |
|
|
var |
|
|
var |
|
|
e: TItemEvent; |
|
|
e: TItemEvent; |
|
|
begin |
|
|
begin |
|
|
inherited InsertIntern(aIndex, aItem); |
|
|
|
|
|
if Assigned(fOnAddItem) then |
|
|
if Assigned(fOnAddItem) then |
|
|
for e in fOnAddItem do |
|
|
for e in fOnAddItem do |
|
|
e(self, aIndex, aItem); |
|
|
e(self, aIndex, aItem); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure TutlObservableCustomList.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean); |
|
|
|
|
|
|
|
|
procedure TutlObservableCustomList.DoRemoveItem(const aIndex: Integer; const aItem: T); |
|
|
var |
|
|
var |
|
|
e: TItemEvent; |
|
|
e: TItemEvent; |
|
|
begin |
|
|
begin |
|
|
if Assigned(fOnRemoveItem) then |
|
|
if Assigned(fOnRemoveItem) then |
|
|
for e in fOnRemoveItem do |
|
|
for e in fOnRemoveItem do |
|
|
e(self, aIndex, GetItem(aIndex)); |
|
|
e(self, aIndex, GetItem(aIndex)); |
|
|
inherited DeleteIntern(aIndex, aFreeItem); |
|
|
|
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
@@ -217,24 +234,36 @@ end; |
|
|
//TutlObservableCustomHashSet/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//TutlObservableCustomHashSet/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure TutlObservableCustomHashSet.InsertIntern(const aIndex: Integer; const aItem: T); |
|
|
procedure TutlObservableCustomHashSet.InsertIntern(const aIndex: Integer; const aItem: T); |
|
|
|
|
|
begin |
|
|
|
|
|
inherited InsertIntern(aIndex, aItem); |
|
|
|
|
|
DoAddItem(aItem); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
procedure TutlObservableCustomHashSet.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean); |
|
|
|
|
|
begin |
|
|
|
|
|
DoRemoveItem(GetItem(aIndex)); |
|
|
|
|
|
inherited DeleteIntern(aIndex, aFreeItem); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
procedure TutlObservableCustomHashSet.DoAddItem(const aItem: T); |
|
|
var |
|
|
var |
|
|
e: THashItemEvent; |
|
|
e: THashItemEvent; |
|
|
begin |
|
|
begin |
|
|
inherited InsertIntern(aIndex, aItem); |
|
|
|
|
|
if Assigned(fOnAddItem) then |
|
|
if Assigned(fOnAddItem) then |
|
|
for e in fOnAddItem do |
|
|
for e in fOnAddItem do |
|
|
e(self, aItem); |
|
|
e(self, aItem); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure TutlObservableCustomHashSet.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean); |
|
|
|
|
|
|
|
|
procedure TutlObservableCustomHashSet.DoRemoveItem(const aItem: T); |
|
|
var |
|
|
var |
|
|
e: THashItemEvent; |
|
|
e: THashItemEvent; |
|
|
begin |
|
|
begin |
|
|
if Assigned(fOnRemoveItem) then |
|
|
if Assigned(fOnRemoveItem) then |
|
|
for e in fOnRemoveItem do |
|
|
for e in fOnRemoveItem do |
|
|
e(self, GetItem(aIndex)); |
|
|
|
|
|
inherited DeleteIntern(aIndex, aFreeItem); |
|
|
|
|
|
|
|
|
e(self, aItem); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
@@ -265,45 +294,57 @@ end; |
|
|
//TutlObservableCustomMap/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//TutlObservableCustomMap/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure TutlObservableCustomMap.TObservableHashSet.InsertIntern(const aIndex: Integer; const aItem: TKeyValuePair); |
|
|
procedure TutlObservableCustomMap.TObservableHashSet.InsertIntern(const aIndex: Integer; const aItem: TKeyValuePair); |
|
|
var |
|
|
|
|
|
e: TKeyValuePairEvent; |
|
|
|
|
|
begin |
|
|
begin |
|
|
inherited InsertIntern(aIndex, aItem); |
|
|
inherited InsertIntern(aIndex, aItem); |
|
|
if Assigned(fOnAddItem) then begin |
|
|
|
|
|
for e in fOnAddItem do |
|
|
|
|
|
e(fOwner, aItem.Key, aItem.Value); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
fOwner.DoAddItem(aItem.Key, aItem.Value); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure TutlObservableCustomMap.TObservableHashSet.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean); |
|
|
procedure TutlObservableCustomMap.TObservableHashSet.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean); |
|
|
var |
|
|
var |
|
|
e: TKeyValuePairEvent; |
|
|
|
|
|
tmp: TKeyValuePair; |
|
|
|
|
|
|
|
|
kvp: TKeyValuePair; |
|
|
begin |
|
|
begin |
|
|
if Assigned(fOnRemoveItem) then begin |
|
|
|
|
|
tmp := GetItem(aIndex); |
|
|
|
|
|
for e in fOnRemoveItem do |
|
|
|
|
|
e(fOwner, tmp.Key, tmp.Value); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
kvp := GetItem(aIndex); |
|
|
|
|
|
fOwner.DoRemoveItem(kvp.Key, kvp.Value); |
|
|
inherited DeleteIntern(aIndex, aFreeItem); |
|
|
inherited DeleteIntern(aIndex, aFreeItem); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
constructor TutlObservableCustomMap.TObservableHashSet.Create(const aOwner: TObject; const aComparer: IComparer; const aOwnsObjects: Boolean); |
|
|
|
|
|
|
|
|
constructor TutlObservableCustomMap.TObservableHashSet.Create( |
|
|
|
|
|
const aOwner: TutlObservableCustomMap; const aComparer: IComparer; const aOwnsObjects: Boolean); |
|
|
begin |
|
|
begin |
|
|
inherited Create(aComparer, aOwnsObjects); |
|
|
inherited Create(aComparer, aOwnsObjects); |
|
|
fOwner := aOwner; |
|
|
fOwner := aOwner; |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
procedure TutlObservableCustomMap.DoAddItem(const aKey: TKey; const aValue: TValue); |
|
|
|
|
|
var |
|
|
|
|
|
e: TKeyValuePairEvent; |
|
|
|
|
|
begin |
|
|
|
|
|
if not Assigned(fOnAddItem) then |
|
|
|
|
|
exit; |
|
|
|
|
|
for e in fOnAddItem do |
|
|
|
|
|
e(self, aKey, aValue); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
procedure TutlObservableCustomMap.DoRemoveItem(const aKey: TKey; const aValue: TValue); |
|
|
|
|
|
var |
|
|
|
|
|
e: TKeyValuePairEvent; |
|
|
|
|
|
begin |
|
|
|
|
|
if not Assigned(fOnRemoveItem) then |
|
|
|
|
|
exit; |
|
|
|
|
|
for e in fOnRemoveItem do |
|
|
|
|
|
e(self, aKey, aValue); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
constructor TutlObservableCustomMap.Create(const aComparer: IComparer; const aOwnsObjects: Boolean); |
|
|
constructor TutlObservableCustomMap.Create(const aComparer: IComparer; const aOwnsObjects: Boolean); |
|
|
begin |
|
|
begin |
|
|
fOnAddItem := TEventList.Create; |
|
|
fOnAddItem := TEventList.Create; |
|
|
fOnRemoveItem := TEventList.Create; |
|
|
fOnRemoveItem := TEventList.Create; |
|
|
fHashSetImpl := TObservableHashSet.Create(self, TKeyValuePairComparer.Create(aComparer), aOwnsObjects); |
|
|
fHashSetImpl := TObservableHashSet.Create(self, TKeyValuePairComparer.Create(aComparer), aOwnsObjects); |
|
|
fHashSetImpl.OnAddItem := fOnAddItem; |
|
|
|
|
|
fHashSetImpl.OnRemoveItem := fOnRemoveItem; |
|
|
|
|
|
inherited Create(fHashSetImpl); |
|
|
inherited Create(fHashSetImpl); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
|