Files
lazarus-ccr/wst/trunk/ide/lazarus/wstmodule/demo/std_cursors.pas
2015-01-02 17:48:42 +00:00

133 lines
2.8 KiB
ObjectPascal

{
This file is part of the Web Service Toolkit
Copyright (c) 2006, 2007, 2008 by Inoussa OUEDRAOGO
This file is provide under modified LGPL licence
( the files COPYING.modifiedLGPL and COPYING.LGPL).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}
{ $INCLUDE wst_global.inc}
unit std_cursors;
interface
uses
Classes, SysUtils, Contnrs,
cursor_intf;
{ $INCLUDE wst.inc}
{ $INCLUDE wst_delphi.inc}
type
{ TObjectListCursor }
TObjectListCursor = class(TInterfacedObject,ICursor,IObjectCursor)
private
FList : TObjectList;
FCurrentIndex : Integer;
protected
procedure Reset();
function MoveNext() : Boolean;virtual;
function Clone(): ICursor;
function GetCount() : Integer;
function GetCurrent() : TObject;
public
constructor Create(ADataList : TObjectList);
end;
{ TObjectListFilterableCursor }
TObjectListFilterableCursor = class(TObjectListCursor,IFilterableObjectCursor)
private
FFilter : IObjectFilter;
protected
function MoveNext() : Boolean;override;
function GetFilter() : IObjectFilter;
function SetFilter(const AFilter : IObjectFilter) : IObjectFilter;
public
destructor Destroy();override;
end;
implementation
{ TObjectListCursor }
procedure TObjectListCursor.Reset();
begin
FCurrentIndex := -1;
end;
function TObjectListCursor.MoveNext(): Boolean;
begin
Inc(FCurrentIndex);
Result := ( FCurrentIndex < FList.Count );
end;
function TObjectListCursor.Clone(): ICursor;
begin
Result := TObjectListCursor.Create(FList) as ICursor;
end;
function TObjectListCursor.GetCount() : Integer;
begin
Result := FList.Count;
end;
function TObjectListCursor.GetCurrent(): TObject;
begin
if ( FCurrentIndex < 0 ) or ( FCurrentIndex >= FList.Count ) then
raise ECursorException.Create('Invalid cursor state.');
Result := FList[FCurrentIndex];
end;
constructor TObjectListCursor.Create(ADataList: TObjectList);
begin
Assert(Assigned(ADataList));
FList := ADataList;
Reset();
end;
{ TObjectListFilterableCursor }
function TObjectListFilterableCursor.MoveNext(): Boolean;
begin
if ( FFilter = nil ) then begin
Result := inherited MoveNext();
end else begin
while ( inherited MoveNext() ) do begin
if FFilter.Evaluate(GetCurrent()) then begin
Result := True;
Exit;
end;
end;
Result := False;
end;
end;
function TObjectListFilterableCursor.GetFilter(): IObjectFilter;
begin
Result := FFilter;
end;
function TObjectListFilterableCursor.SetFilter(
const AFilter: IObjectFilter
): IObjectFilter;
begin
FFilter := AFilter;
Result := FFilter;
end;
destructor TObjectListFilterableCursor.Destroy();
begin
FFilter := nil;
inherited Destroy();
end;
end.