191 lines
4.1 KiB
ObjectPascal
191 lines
4.1 KiB
ObjectPascal
|
{: Implements the base visitable list objects.
|
||
|
|
||
|
Last changed: $Date$
|
||
|
Revision: $Rev$
|
||
|
Author: $Author$
|
||
|
}
|
||
|
unit BaseSwObjects;
|
||
|
|
||
|
{$I BaseSwDefines.inc}
|
||
|
|
||
|
interface
|
||
|
uses
|
||
|
Classes,
|
||
|
Contnrs;
|
||
|
|
||
|
type
|
||
|
// Forward declarations
|
||
|
TBaseSwItem = class;
|
||
|
|
||
|
|
||
|
IBaseSwVisitor = interface
|
||
|
['{B081D76E-0CC7-4160-B01D-6136AE1D6711}']
|
||
|
procedure VisitItem(const AItem: TBaseSwItem);
|
||
|
end;
|
||
|
|
||
|
|
||
|
IBaseSwVisited = interface
|
||
|
['{9540671E-184B-4DB6-A015-27B457C74C6C}']
|
||
|
procedure AcceptVisitor(const AVisitor: IBaseSwVisitor);
|
||
|
end;
|
||
|
|
||
|
|
||
|
TBaseSwItem = class(TInterfacedPersistent, IBaseSwVisited)
|
||
|
protected
|
||
|
function GetName(): String; virtual; abstract;
|
||
|
public
|
||
|
// IBaseSwVisited
|
||
|
procedure AcceptVisitor(const AVisitor: IBaseSwVisitor); virtual;
|
||
|
|
||
|
property Name: String read GetName;
|
||
|
end;
|
||
|
|
||
|
|
||
|
TBaseSwItemList = class(TInterfacedPersistent, IBaseSwVisited)
|
||
|
private
|
||
|
FItems: TObjectList;
|
||
|
protected
|
||
|
function GetOwnsObjects(): Boolean;
|
||
|
procedure SetOwnsObjects(const Value: Boolean);
|
||
|
|
||
|
function GetCount(): Integer;
|
||
|
function GetItem(Index: Integer): TBaseSwItem;
|
||
|
procedure SetItem(Index: Integer; Value: TBaseSwItem);
|
||
|
public
|
||
|
constructor Create();
|
||
|
destructor Destroy(); override;
|
||
|
|
||
|
function Add(const AItem: TBaseSwItem): Integer; virtual;
|
||
|
function IndexOf(const AItem: TBaseSwItem): Integer;
|
||
|
procedure Delete(const AIndex: Integer);
|
||
|
function Remove(const AItem: TBaseSwItem): Integer;
|
||
|
|
||
|
procedure Sort(Compare: TListSortCompare);
|
||
|
procedure Clone(const ASource: TBaseSwItemList); virtual;
|
||
|
|
||
|
procedure AcceptVisitor(const AVisitor: IBaseSwVisitor);
|
||
|
|
||
|
property Count: Integer read GetCount;
|
||
|
property Items[Index: Integer]: TBaseSwItem read GetItem
|
||
|
write SetItem; default;
|
||
|
property OwnsObjects: Boolean read GetOwnsObjects
|
||
|
write SetOwnsObjects;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
uses
|
||
|
{$IFDEF DELPHI7ORLOWER}
|
||
|
ActnList,
|
||
|
{$ENDIF}
|
||
|
SysUtils;
|
||
|
|
||
|
|
||
|
|
||
|
{ TBaseSwItem }
|
||
|
procedure TBaseSwItem.AcceptVisitor(const AVisitor: IBaseSwVisitor);
|
||
|
begin
|
||
|
AVisitor.VisitItem(Self);
|
||
|
end;
|
||
|
|
||
|
|
||
|
{ TBaseSwItemList}
|
||
|
constructor TBaseSwItemList.Create();
|
||
|
begin
|
||
|
inherited Create();
|
||
|
|
||
|
FItems := TObjectList.Create(True);
|
||
|
end;
|
||
|
|
||
|
|
||
|
destructor TBaseSwItemList.Destroy();
|
||
|
begin
|
||
|
FreeAndNil(FItems);
|
||
|
|
||
|
inherited;
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TBaseSwItemList.AcceptVisitor(const AVisitor: IBaseSwVisitor);
|
||
|
var
|
||
|
itemIndex: Integer;
|
||
|
|
||
|
begin
|
||
|
for itemIndex := Pred(Count) downto 0 do
|
||
|
Items[itemIndex].AcceptVisitor(AVisitor);
|
||
|
end;
|
||
|
|
||
|
|
||
|
function TBaseSwItemList.Add(const AItem: TBaseSwItem): Integer;
|
||
|
begin
|
||
|
Result := FItems.Add(AItem);
|
||
|
end;
|
||
|
|
||
|
|
||
|
function TBaseSwItemList.IndexOf(const AItem: TBaseSwItem): Integer;
|
||
|
begin
|
||
|
Result := FItems.IndexOf(AItem);
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TBaseSwItemList.Delete(const AIndex: Integer);
|
||
|
begin
|
||
|
FItems.Delete(AIndex);
|
||
|
end;
|
||
|
|
||
|
|
||
|
function TBaseSwItemList.Remove(const AItem: TBaseSwItem): Integer;
|
||
|
begin
|
||
|
Result := FItems.Remove(AItem);
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TBaseSwItemList.Sort(Compare: TListSortCompare);
|
||
|
begin
|
||
|
FItems.Sort(Compare);
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TBaseSwItemList.Clone(const ASource: TBaseSwItemList);
|
||
|
var
|
||
|
itemIndex: Integer;
|
||
|
|
||
|
begin
|
||
|
FItems.Clear();
|
||
|
FItems.OwnsObjects := False;
|
||
|
|
||
|
for itemIndex := 0 to Pred(ASource.Count) do
|
||
|
FItems.Add(ASource[itemIndex]);
|
||
|
end;
|
||
|
|
||
|
|
||
|
function TBaseSwItemList.GetCount(): Integer;
|
||
|
begin
|
||
|
Result := FItems.Count;
|
||
|
end;
|
||
|
|
||
|
|
||
|
function TBaseSwItemList.GetItem(Index: Integer): TBaseSwItem;
|
||
|
begin
|
||
|
Result := TBaseSwItem(FItems[Index]);
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TBaseSwItemList.SetItem(Index: Integer; Value: TBaseSwItem);
|
||
|
begin
|
||
|
FItems[Index] := Value;
|
||
|
end;
|
||
|
|
||
|
|
||
|
function TBaseSwItemList.GetOwnsObjects(): Boolean;
|
||
|
begin
|
||
|
Result := FItems.OwnsObjects;
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TBaseSwItemList.SetOwnsObjects(const Value: Boolean);
|
||
|
begin
|
||
|
FItems.OwnsObjects := Value;
|
||
|
end;
|
||
|
|
||
|
end.
|