{
 Copyright (c) 2007 by Michael Van Canneyt.

 *****************************************************************************
 *  See the file COPYING.modifiedLGPL.txt, included in this distribution,
 *  for details about the license.
 *****************************************************************************
}
unit ddfiles;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, inifiles, inicol;
  
Type
  { TRecentItem }

  TRecentItem = Class(TNamedIniCollectionItem)
  private
    FLastUse: TDateTime;
    FUseCount: Integer;
  Public
    Procedure SaveToIni(Ini: TCustomInifile; ASection : String); override;
    Procedure LoadFromIni(Ini: TCustomInifile; ASection : String); override;
    Procedure Use;
  Published
    Property LastUse : TDateTime Read FLastUse;
    Property UseCount : Integer Read FUseCount;
  end;

  { TRecentDataDict }
  
  TRecentDataDict = Class(TRecentItem)
  private
    FFileName: String;
  Public
    Procedure SaveToIni(Ini: TCustomInifile; ASection : String); override;
    Procedure LoadFromIni(Ini: TCustomInifile; ASection : String); override;
  Published
    Property FileName : String Read FFileName Write FFileName;
  end;

  { TRecentDataDicts }

  TRecentDataDicts = Class(TNamedIniCollection)
  private
    function GetDD(Index: Integer): TRecentDataDict;
    procedure SetDD(Index: Integer; const AValue: TRecentDataDict);
  Public
    Constructor Create(AItemClass: TCollectionItemClass);
    Function IndexOfFileName(AFileName : String) : Integer;
    Function FindFromUserData(UserData : TObject) : TRecentDataDict;
    Function FindFromFileName(AFileName : String) : TRecentDataDict;
    Function FindFromName(AName : String) : TRecentDataDict;
    Function AddDataDict(AFileName : String) : TRecentDataDict;
    Property DataDicts [Index: Integer] : TRecentDataDict Read GetDD Write SetDD; default;
  end;

  { TRecentConnection }

  TRecentConnection = Class(TRecentItem)
  private
    FConnectionString: String;
    FEngineName: String;
  Public
    Procedure SaveToIni(Ini: TCustomInifile; ASection : String); override;
    Procedure LoadFromIni(Ini: TCustomInifile; ASection : String); override;
  Published
    Property EngineName : String Read FEngineName Write FEngineName;
    Property ConnectionString : String Read FConnectionString Write FConnectionString;
  end;
  
  { TRecentConnections }

  TRecentConnections = Class(TNamedIniCollection)
  private
    function GetConnection(Index: Integer): TRecentConnection;
    procedure SetConnection(Index: Integer; const AValue: TRecentConnection);
  Public
    Constructor Create(AItemClass : TCollectionItemClass);
    Function IndexOfConnectionString(Const AConnectionString : String) : Integer;
    Function FindFromUserData(UserData : TObject) : TRecentConnection;
    Function FindFromConnection(Const AConnectionString : String) : TRecentConnection;
    Function FindFromName(Const AName : String) : TRecentConnection;
    Function AddConnection(Const AName: String) : TRecentConnection;
    Property Connections [Index: Integer] : TRecentConnection Read GetConnection Write SetConnection; default;
  end;

implementation

{ ---------------------------------------------------------------------
  TRecentDataDict
  ---------------------------------------------------------------------}

Const
  KeyFileName   = 'FileName';
  KeyLastUsed   = 'LastUsed';
  KeyUseCount   = 'UseCount';
  KeyConnection = 'Connection';
  KeyEngineName = 'EngineName';
  
procedure TRecentDataDict.SaveToIni(Ini: TCustomInifile; ASection: String);
begin
  Inherited;
  With Ini do
    begin
    WriteString(ASection,KeyFileName,self.FFileName);
    end;
end;

procedure TRecentDataDict.LoadFromIni(Ini: TCustomInifile; ASection: String);
begin
  Inherited;
  With Ini do
    begin
    Self.FFileName:=ReadString(ASection,KeyFileName,Self.FFileName);
    end;
end;

{ ---------------------------------------------------------------------
  TRecentDataDicts
  ---------------------------------------------------------------------}

function TRecentDataDicts.GetDD(Index: Integer): TRecentDataDict;
begin
  Result:=TRecentDataDict(Items[Index]);
end;

procedure TRecentDataDicts.SetDD(Index: Integer; const AValue: TRecentDataDict);
begin
  Items[Index]:=AValue;
end;

constructor TRecentDataDicts.Create(AItemClass: TCollectionItemClass);
begin
  inherited Create(AItemClass);
  FPrefix:='DataDict';
  FSectionPrefix:='DD';
end;

function TRecentDataDicts.IndexOfFileName(AFileName: String): Integer;
begin
  Result:=Count-1;
  While (Result>=0) and (Not SameFileName(GetDD(Result).FileName,AFileName)) do
    Dec(Result);
end;

function TRecentDataDicts.AddDataDict(AFileName: String): TRecentDataDict;
begin
  Result:=Add as TRecentDataDict;
  Result.FileName:=AFileName;
end;

function TRecentDataDicts.FindFromUserData(UserData: TObject): TRecentDataDict;

begin
  Result:=TRecentDataDict(FindByUserData(UserData));
end;

function TRecentDataDicts.FindFromFileName(AFileName: String): TRecentDataDict;

Var
  I : integer;

begin
  I:=IndexOfFileName(AFileName);
  If (I=-1) then
    Result:=Nil
  else
    Result:=GetDD(I);
end;

function TRecentDataDicts.FindFromName(AName: String): TRecentDataDict;

begin
  Result:=TRecentDataDict(FindByName(AName));
end;

{ ---------------------------------------------------------------------
  TRecentConnection
  ---------------------------------------------------------------------}


procedure TRecentConnection.SaveToIni(Ini: TCustomInifile; ASection: String);
begin
  Inherited;
  With Ini do
   begin
   WriteString(ASection,KeyConnection,FConnectionString);
   WriteString(ASection,KeyEngineName,FEngineName);
   end;
end;

procedure TRecentConnection.LoadFromIni(Ini: TCustomInifile; ASection: String);
begin
  Inherited;
  With Ini do
    begin
    FConnectionString:=ReadString(ASection,KeyConnection,FConnectionString);
    FEngineName:=ReadString(ASection,KeyEngineName,FEngineName);
    end;
end;

{ ---------------------------------------------------------------------
  TRecentConnections
  ---------------------------------------------------------------------}

function TRecentConnections.GetConnection(Index: Integer): TRecentConnection;
begin
  Result:=TRecentConnection(Items[Index]);
end;

procedure TRecentConnections.SetConnection(Index: Integer;
  const AValue: TRecentConnection);
begin
  Items[Index]:=AValue;
end;

constructor TRecentConnections.Create(AItemClass: TCollectionItemClass);
begin
  inherited Create(AItemClass);
  FPrefix:='Connection';
  FSectionPrefix:='CONN';
end;

function TRecentConnections.IndexOfConnectionString(const AConnectionString: String
  ): Integer;
begin
  Result:=Count-1;
  While (Result>=0) and (CompareText(GetConnection(Result).ConnectionString,AConnectionString)<>0) do
    Dec(Result);
end;

function TRecentConnections.AddConnection(Const AName: String): TRecentConnection;
begin
  Result:=Add as TRecentConnection;
  Result.Name:=AName;
end;

function TRecentConnections.FindFromUserData(UserData: TObject): TRecentConnection;
Var
  I : Integer;

begin
  I:=IndexOfUserData(UserData);
  If (I=-1) then
    Result:=Nil
  Else
    Result:=GetConnection(I);
end;

function TRecentConnections.FindFromConnection(Const AConnectionString: String): TRecentConnection;
Var
  I : Integer;

begin
  I:=IndexOfConnectionString(AConnectionString);
  If (I=-1) then
    Result:=Nil
  Else
    Result:=GetConnection(I);
end;

function TRecentConnections.FindFromName(Const AName: String): TRecentConnection;

begin
  Result:=TRecentConnection(FindByName(AName));
end;


{ TRecentItem }

procedure TRecentItem.SaveToIni(Ini: TCustomInifile; ASection: String);
begin
  With Ini do
    begin
    WriteInteger(ASection,KeyUseCount,FUseCount);
    WriteDateTime(ASection,KeyLastUsed,FLastUse);
    end;
end;

procedure TRecentItem.LoadFromIni(Ini: TCustomInifile; ASection: String);
begin
  With Ini do
    begin
    FUseCount:=ReadInteger(ASection,KeyUseCount,0);
    FLastUse:=ReadDateTime(ASection,KeyLastUsed,0);
    end;
end;

procedure TRecentItem.Use;
begin
  FLastUse:=Now;
  inc(FUseCount);
end;

end.

