unit Unit2;

interface

{$I ..\..\..\Source\Compilers.inc}

uses
  SysUtils,
  Classes,
  Contnrs,
 {$IFDEF COMPILER_6_UP}
  Variants,
  {$ENDIF COMPILER_6_UP}
  EasyListview;

type
  TEmployee = class(TObject, // you could use any base class here
                    IInterface, // the list item can only be associated with an IInterface
                    IEasyCaptions, // implement only those interfaces you want to return data for
                    IEasyImages,
                    IEasyDetails)
  private
    FFirstname: WideString;
    FLastname: WideString;
    FImageIndex: Integer;
    // IUnknown: in this case we don't use reference counting (although we could)
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
  protected
    function GetCaption(Column: Integer): Variant; // IEasyCaptions
    function GetImageIndex(Column: Integer; ImageKind: TEasyImageKind): Integer; // IEasyImages
    function GetDetail(Line: Integer): Integer; // IEasyDetails (for the tile view)
    function GetDetailCount: Integer; // IEasyDetails (for the tile view)
  public
    constructor Create(Firstname, Lastname: WideString; ImageIndex: Integer);
    destructor Destroy; override;
    property Firstname: WideString read FFirstname;
    property Lastname: WideString read FLastname;
  end;

  TEmployees = class
  private
    FList: TObjectList;
    function GetCount: Integer;
    function GetEmployee(Index: Integer): TEmployee;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Load;
    property Count: Integer read GetCount;
    property Employees[Index: Integer]: TEmployee read GetEmployee; default;
  end;

implementation

{ TEmployee }

constructor TEmployee.Create(Firstname, Lastname: WideString;
  ImageIndex: Integer);
begin
  inherited Create;
  FFirstname := Firstname;
  FLastname := Lastname;
  FImageIndex := ImageIndex;
end;

destructor TEmployee.Destroy;
begin
  inherited Destroy;
end;

function TEmployee.GetCaption(Column: Integer): Variant;
begin
  case Column of
    0: Result := Firstname;
    1: Result := Lastname;
  else
    Result := Null;
  end;
end;

function TEmployee.GetDetail(Line: Integer): Integer;
begin
  Result := Line;
end;

function TEmployee.GetDetailCount: Integer;
begin
  Result := 2;
end;

function TEmployee.GetImageIndex(Column: Integer;
  ImageKind: TEasyImageKind): Integer;
begin
  if (Column = 0) and (ImageKind = eikNormal) then
    Result := FImageIndex
  else
    Result := -1;
end;

function TEmployee.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TEmployee._AddRef: Integer;
begin
  Result := -1;
end;

function TEmployee._Release: Integer;
begin
  Result := -1;
end;

{ TEmployees }

constructor TEmployees.Create;
begin
  inherited Create;
  FList := TObjectList.Create;
end;

destructor TEmployees.Destroy;
begin
  FList.Free;
  inherited;
end;

function TEmployees.GetCount: Integer;
begin
  Result := FList.Count;
end;

function TEmployees.GetEmployee(Index: Integer): TEmployee;
begin
  Result := TEmployee(FList[Index]);
end;

procedure TEmployees.Load;
begin
  // We could load data from disk but for this demo it may suffice to have
  // some static data.
  FList.Clear;
  FList.Add(TEmployee.Create('Aniston', 'Jennifer', 0));
  FList.Add(TEmployee.Create('Carrey', 'Jim', 1));
  FList.Add(TEmployee.Create('Knightley', 'Keira', 2));
  FList.Add(TEmployee.Create('Lester', 'Adrian', 3));
  FList.Add(TEmployee.Create('Marceau', 'Sophie', 4));
  FList.Add(TEmployee.Create('Reno', 'Jean', 5));
end;

end.

