Source file: /~heha/hsn/WdxInfoPacker64.zip/IniFile_Class.pas

{$D-,O+,Q-,R-,S-}
unit IniFile_Class;

interface
uses Inifiles,Windows,Classes,SysUtils,Controls,FileCtrl,someStuff,dialogs;
{Structure use to store info from the different kind of ini}
type MainInfo=packed record// Main Ini
 PathToIni:array[0..259] of char;
 LastScheme:array[0..259]of char;
 TCIni:array[0..259]of char;
 WdxFolder,SchemeFile,UnloadingFile:array[0..259] of char;
 language:array[0..259] of char;
 Wdx_lng:array[0..4] of char;
 KnownPlugin,RememberLast,CheckBeforeSave,
 Run,Assoc,VerifyWdx,MaskEditBox,DisableEditBoxCompletly:boolean;
end;
PMainInfo=^MainInfo;

type InfoToWrite=packed record //for Scheme
 PathToSchemeFile:array[0..260] of char;
 Use,Extension,divider,StrReplaceValue:array[0..20] of char;
 Name,Header,before,between,
 wdxinfo,after,footer,ListExtension,AdditionnalText,DirectoryText:array[0..1024] of char;
 Counter,DoNotWrite,SaveLog,ExtendedScheme,StrReplace:boolean;
 MaxRight,CounterLength,IntervalNbr,CounterPos,recursionDepth:integer;
 DisplayComment:array[0..260] of char;
end;
PInfToWri=^InfoToWrite;

{Definition of the classes I use and relatives procedure & function}
type TMyIni=Class
 private
 //To Retrieve the list of *.wdx in wdxFolder
  procedure ScruteDossier(Dossier:string;filtre:string;attributs:integer;recursif:boolean;List:array of TstringList);
  procedure ScruteFichier(Dossier:string;filtre:string;attributs:integer;List:array of TstringList);
 public
  MyIni:MainInfo;
 //To set new value to each element AFTER they have been loaded
  procedure SetLastScheme(NewValue:pchar);
  procedure SetWdxFolder;
  procedure SetLanguage(NewValue:pchar);
  procedure SetTCIni(NewValue:pchar);
  procedure LoadIniValue; //Load All Value
  procedure SaveIniValue; //Save All Value
  procedure FindPlugin; //Open a dialog to search for the wdx folder
  Procedure CheckPluginFolder; //Scan the KNOWN wdx folder to update the plugin list
  function UseAnotherFileForScheme:pchar;// to use a different file than Scheme.ini
  function CountknownPlugin():integer;
  procedure ListPlugin(MyList1,MyList2:TstringList);
end;

procedure Split(const Delimiter: Char;Input: string;const Strings: TStrings);

Type TSchema=Class
 public
  Scheme:InfoToWrite;

 //To set each element AFTER loading...
  procedure SetUse(value:pchar);
  procedure SetExtension(value:pchar);
  procedure Setname(value:pchar);
  procedure SetHeader(value:pchar);
  procedure SetBefore(value:pchar);
  procedure SetDisplayComment(value:pchar);
  procedure SetBetween(value:pchar);
  procedure SetWdxInfo(value:pchar);
  procedure SetAfter(value:pchar);
  procedure SetFooter(value:pchar);
  procedure SetDirectoryText(value:pchar);
  procedure SetDivider(value:pchar);
  procedure SetAdditionalText(value:pchar);
  procedure SetListExtension(value:pchar);
  procedure SetCounter(value:boolean);
  procedure SetDoNotWrite(value:boolean);
  procedure SetSaveLog(value:boolean);
  procedure SetCounterLength(value:integer);
  procedure SetIntervalNbr(value:integer);
  procedure SetCounterPos(value:integer);
  procedure SetRecursionDepth(value:integer);
  procedure SetStrReplace(useStr:boolean;value1,value2:pchar);
  procedure ListAvailableScheme(List:TstringList); //Retrieve the list of available plugin from [PLUGINLIST] in the ini file
  procedure ListAvailableSchemeComment(List2:TStrings);
  procedure ListAvailableExtension(List:array of Tstringlist);//Retrieve the list of all extension used in the Scheme file
  procedure LoadScheme(SchemeName:pchar);//Load the wanted scheme in the structure - Read the file
  procedure SaveScheme(SchemeName:Pchar);//Save the scheme in the Scheme file - Write the file
  procedure SaveSpecialScheme(OrigScheme,SchemeTmp:Pchar);
  procedure DeleteScheme(SchemeToDelete:Pchar);//Delete a scheme in the Scheme file-Write the file
  function SchemeExist(SchemeName:Pchar):boolean; //Search for a scheme with a corresponding name - read the file
  procedure ClearMe();
end;
type Tc_Column=record
 List:TStringList;
 ColumnDetail:array[0..30] of TStringList;
end;

type TC_Custom=Class
 public
  Column_Info:Tc_Column;
  procedure Init(TC_Ini:pchar);
  function GetValue(Column:integer):TStringList;
end;

implementation
{==============================FOR THE INI FILE======================}
procedure TMyIni.SetLastScheme(NewValue:pchar); begin
 FillChar(MyIni.LastScheme,sizeof(MyIni.LastScheme),#0);
 strlcat(MyIni.LastScheme,NewValue,sizeof(MyIni.LastScheme)-1);
end;
procedure TMyIni.SetLanguage(NewValue:pchar); begin
 FillChar(MyIni.Language,sizeof(MyIni.Language),#0);
 strlcat(MyIni.Language,NewValue,sizeof(MyIni.Language)-1);
end;
procedure TMyIni.SetTCIni(NewValue:pchar); begin
 FillChar(MyIni.TCIni,sizeof(MyIni.TCIni),#0);
 strlcat(MyIni.TCIni,NewValue,sizeof(MyIni.TCIni)-1);
end;
procedure TMyIni.SetWdxFolder;
var ChoixRepertoire:string; begin
 FillChar(MyIni.WdxFolder,sizeof(MyIni.WdxFolder),#0);
 if SelectDirectory('Choose Your Wdx Folder', '', ChoixRepertoire) then
  strlcat(MyIni.WdxFolder,pchar(ChoixRepertoire),sizeof(MyIni.WdxFolder)-1)
 else
  strlcat(MyIni.WdxFolder,pchar('%COMMANDER_PATH%\plugins\wdx'),sizeof(MyIni.WdxFolder)-1);
end;
procedure TMyIni.LoadIniValue; //Load All Value
var tmpIni:TIniFile; s:string; begin
FillChar(MyIni.LastScheme,sizeof(MyIni.LastScheme),#0);
FillChar(MyIni.Language,sizeof(MyIni.Language),#0);
FillChar(MyIni.WdxFolder,sizeof(MyIni.WdxFolder),#0);
FillChar(MyIni.SchemeFile,sizeof(MyIni.SchemeFile),#0);
FillChar(MyIni.TCIni,sizeof(MyIni.TCIni),#0);
FillChar(MyIni.UnloadingFile,sizeof(MyIni.UnloadingFile),#0);
FillChar(MyIni.Wdx_lng,sizeof(MyIni.Wdx_lng),#0);
tmpIni:=TIniFile.create(MyIni.PathToIni);
MyIni.RememberLast:=tmpIni.ReadBool('Main','RememberLast',true);
MyIni.CheckBeforeSave:=tmpIni.ReadBool('Main','CheckBeforeSave',true);
MyIni.Run:=tmpIni.ReadBool('Main','Run',false);
MyIni.Assoc:=tmpIni.ReadBool('Main','AssocSchemExt',false);
MyIni.KnownPlugin:=tmpIni.ReadBool('Main','KnownPlugin',false);
MyIni.VerifyWdx:=tmpIni.ReadBool('Main','VerifyWdx',false);
MyIni.MaskEditBox:=tmpIni.ReadBool('Main','MaskEditBox',false);
MyIni.DisableEditBoxCompletly:=tmpIni.ReadBool('Main','DisableEditBoxCompletly',false);

s:=tmpIni.ReadString('Main','Wdx_lng','');
strlcat(MyIni.Wdx_lng,pchar(s),sizeof(MyIni.Wdx_lng)-1);
s:=tmpIni.ReadString('Main','WdxFolder','');
strlcat(MyIni.WdxFolder,pchar(s),sizeof(MyIni.WdxFolder)-1);
s:=tmpIni.ReadString('Main','LastScheme','');
strlcat(MyIni.LastScheme,pchar(s),sizeof(MyIni.LastScheme)-1);
s:=tmpIni.ReadString('Main','Language','English.lng');
strlcat(MyIni.Language,pchar(s),sizeof(MyIni.Language)-1);
s:=tmpIni.ReadString('Main','SchemeFile','');
strlcat(MyIni.SchemeFile,pchar(s),sizeof(MyIni.SchemeFile)-1);
s:=tmpIni.ReadString('Main','TCIni','');
strlcat(MyIni.TCIni,pchar(s),sizeof(MyIni.TCIni)-1);
s:=tmpIni.ReadString('Main','UnloadingFile','');
strlcat(MyIni.UnloadingFile,pchar(s),sizeof(MyIni.UnloadingFile)-1);
tmpIni.Free;
end;
procedure TMyIni.ScruteDossier(Dossier:string;filtre:string;attributs:integer;recursif:boolean;List:array of TstringList);
var DossierTrouve:string; Resultat:integer; SearchRec:TSearchRec; begin
if Dossier[length(Dossier)]='\' then Dossier:=copy(Dossier,1,length(Dossier)-1);
ScruteFichier(Dossier,filtre,attributs,List);
if recursif then begin
 Resultat:=FindFirst(Dossier+'\'+'*.*',FaDirectory,SearchRec);
 while Resultat=0 do begin
  if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') and ((SearchRec.Attr and faDirectory)>0)then begin//Dossier seulement
   DossierTrouve:=Dossier+'\'+SearchRec.Name; // pour avoir le nom du dossier avec le chemin complet
   if recursif then ScruteDossier(DossierTrouve,filtre,attributs,recursif,List);
  end;
  Resultat:=FindNext(SearchRec);
 end;
end;//fin de if récursif
FindClose(SearchRec);// libération de la mémoire
end;
procedure TMyIni.ScruteFichier(Dossier:string;filtre:string;attributs:integer;List:array of TstringList);
var FichierTrouve:string; Resultat:integer; SearchRec:TSearchRec;
begin
 if Dossier[length(Dossier)]='\' then Dossier:=copy(Dossier,1,length(Dossier)-1);
 Resultat:=FindFirst(Dossier+'\'+filtre,Attributs,SearchRec);
 while Resultat=0 do begin
  if ((SearchRec.Attr and faDirectory<=0) and (SearchRec.Size>0)) then begin // On a trouvé un Fichier (et non un dossier)
   FichierTrouve:=Dossier+'\'+SearchRec.Name;
   List[0].Add(ExtractFileName(FichierTrouve));
   List[1].Add(FichierTrouve);
  end;
  Resultat:=FindNext(SearchRec);
 end;
 FindClose(SearchRec);// libération de la mémoire
end;
procedure TMyIni.FindPlugin;
var tmpIni:TIniFile; List:array[0..2] of TstringList; i:integer; begin
SetWdxFolder;
List[0]:=TStringList.create;
List[1]:=TStringList.create;

ScruteDossier(MyIni.WdxFolder,'*.wdx',0,true,List);
tmpIni:=TIniFile.Create(MyIni.PathToIni);
for i:=0 to List[0].count-1 do begin
tmpIni.WriteString('PluginList',List[0][i],List[1][i]);
end;
tmpIni.Free;
end;
Procedure TMyIni.CheckPluginFolder;
var tmpIni:TIniFile;List,PlugPathList:array[0..2] of TstringList; i,j:integer; folder:string; isComplex:boolean; begin
List[0]:=TStringList.create;
List[1]:=TStringList.create;
isComplex:=false;
if MyIni.WdxFolder='' then strlcat(MyIni.WdxFolder,pchar('%COMMANDER_PATH%'),sizeof(MyIni.WdxFolder)-1)
else if MyIni.WdxFolder='List_Of_Path_In_Ini_File' then isComplex:=true;
tmpIni:=TIniFile.create(MyIni.PathToIni);
PlugPathList[0]:=TStringList.create;
PlugPathList[1]:=TStringList.create;

if isComplex=true then begin
tmpIni.ReadSection('PluginPathlist',PlugPathList[0]);
for i:=0 to PlugPathList[0].count -1 do begin
PlugPathList[1].add( tmpini.ReadString('PluginPathList',PlugPathList[0][i],'%COMMANDER_PATH%'));
end;
end else if isComplex=false then PlugPathList[1].add(MyIni.WdxFolder);
tmpIni.EraseSection('PluginList');
for j:=0 to PlugPathList[1].count -1 do begin
Folder:=getExtendedPath(PlugPathList[1][j]);
ScruteDossier(Folder,'*.wdx',0,true,List);
for i:=0 to List[0].count-1 do begin
tmpIni.WriteString('PluginList',List[0][i],List[1][i]);
end;
List[0].Clear;
List[1].Clear;
end;
tmpIni.Free;
end;

function TMyIni.UseAnotherFileForScheme:pchar;
begin
 if MyIni.SchemeFile<>'' then result:=MyIni.SchemeFile
 else result:='-1';
end;
procedure TMyIni.SaveIniValue;
var tmpIni:TIniFile; begin
tmpIni:=TIniFile.create(MyIni.PathToIni);
tmpIni.Writestring('Main','LastScheme',MyIni.LastScheme);
tmpIni.Writestring('Main','Language',MyIni.Language);
tmpIni.Writestring('Main','WdxFolder',MyIni.WdxFolder);
tmpIni.Writestring('Main','TCIni',MyIni.TCIni);
tmpIni.WriteBool('Main','KnownPlugin',MyIni.KnownPlugin);
tmpIni.WriteBool('Main','AssocSchemExt',MyIni.Assoc);
tmpIni.WriteBool('Main','CheckBeforeSave',MyIni.CheckBeforeSave);
tmpIni.WriteBool('Main','RememberLast',MyIni.RememberLast);
tmpIni.WriteBool('Main','VerifyWdx',MyIni.VerifyWdx);
tmpIni.WriteBool('Main','Run',MyIni.Run);
tmpIni.WriteBool('Main','MaskEditBox',MyIni.MaskEditBox);

tmpIni.free;
end;


function TMyIni.CountknownPlugin():integer;
var tmpIni:TIniFile;
myList:TStringlist;
test:boolean;
begin
 myList:=TStringList.create;
 tmpIni:=TIniFile.create(MyIni.PathToIni);
 test:=tmpIni.SectionExists('PluginList');
 if not test then result :=0
 else begin
  myList.Clear;
  tmpIni.ReadSection('PluginList',myList);
  result:=myList.Count;
 end;
end;

procedure TMyIni.ListPlugin(MyList1,MyList2:TstringList);
var tmpIni:TIniFile;
i:integer;
s:string;
begin
tmpIni:=TIniFile.create(MyIni.PathToIni);
tmpIni.ReadSection('PluginList',MyList1);
MyList1.Sort;
For i:=0 to MyList1.Count-1 do begin
s:=tmpIni.ReadString('PluginList',MyList1[i],'');
MyList2.Add(getExtendedPath(s));
end;
end;
{======================FOR THE SCHEMA======================}
procedure TSchema.SetUse(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.Use,sizeof(Scheme.Use),#0);
strlcat(Scheme.Use,pchar(s),sizeof(Scheme.Use)-1);
end;
procedure TSchema.SetCounter(value:boolean); begin
Scheme.Counter:=value;
end;
procedure TSchema.SetCounterPos(value:integer); begin
Scheme.CounterPos:=value;
end;
procedure TSchema.SetDoNotWrite(value:boolean); begin
Scheme.DoNotWrite:=value;
end;
procedure TSchema.SetSaveLog(value:boolean); begin
Scheme.SaveLog:=value;
end;
procedure TSchema.SetExtension(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.Extension,sizeof(Scheme.Extension),#0);
strlcat(Scheme.Extension,pchar(s),sizeof(Scheme.Extension)-1);
end;
procedure TSchema.Setname(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.Name,sizeof(Scheme.Name),#0);
strlcat(Scheme.Name,pchar(s),sizeof(Scheme.Name)-1);
end;
procedure TSchema.SetDisplayComment(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.DisplayComment,sizeof(Scheme.DisplayComment),#0);
strlcat(Scheme.DisplayComment,pchar(s),sizeof(Scheme.DisplayComment)-1);
end;


procedure TSchema.SetHeader(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.Header,sizeof(Scheme.Header),#0);
strlcat(Scheme.Header,pchar(s),sizeof(Scheme.Header)-1);
end;
procedure TSchema.SetBefore(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.before,sizeof(Scheme.before),#0);
strlcat(Scheme.before,pchar(s),sizeof(Scheme.before)-1);
end;
procedure TSchema.SetBetween(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.between,sizeof(Scheme.between),#0);
strlcat(Scheme.between,pchar(s),sizeof(Scheme.between)-1);
end;
procedure TSchema.SetWdxInfo(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.wdxinfo,sizeof(Scheme.wdxinfo),#0);
strlcat(Scheme.wdxinfo,pchar(s),sizeof(Scheme.wdxinfo)-1);
end;
procedure TSchema.SetAfter(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.after,sizeof(Scheme.after),#0);
strlcat(Scheme.after,pchar(s),sizeof(Scheme.after)-1);
end;
procedure TSchema.SetFooter(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.footer,sizeof(Scheme.footer),#0);
strlcat(Scheme.footer,pchar(s),sizeof(Scheme.footer)-1);
end;
procedure TSchema.SetDirectoryText(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.DirectoryText,sizeof(Scheme.DirectoryText),#0);
strlcat(Scheme.DirectoryText,pchar(s),sizeof(Scheme.DirectoryText)-1);
end;


procedure TSchema.SetDivider(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.divider,sizeof(Scheme.divider),#0);
strlcat(Scheme.divider,pchar(s),sizeof(Scheme.divider)-1);
end;
procedure TSchema.SetListExtension(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.ListExtension,sizeof(Scheme.ListExtension),#0);
strlcat(Scheme.ListExtension,pchar(s),sizeof(Scheme.ListExtension)-1);
end;
procedure TSchema.SetAdditionalText(value:pchar);
var s:string; begin
s:='"'+value+'"';
fillchar(Scheme.AdditionnalText,sizeof(Scheme.AdditionnalText),#0);
strlcat(Scheme.AdditionnalText,pchar(s),sizeof(Scheme.AdditionnalText)-1);
end;
procedure TSchema.SetStrReplace(useStr:boolean;value1,value2:pchar);
var s:string; begin
s:='"'+value1+'|'+value2+'"';
Scheme.StrReplace:=useStr;
fillchar(Scheme.StrReplaceValue,sizeof(Scheme.StrReplaceValue),#0);
strlcat(Scheme.StrReplaceValue,pchar(s),sizeof(Scheme.StrReplaceValue)-1);
end;
procedure TSchema.SetCounterLength(value:integer);
begin
Scheme.CounterLength:=value;
end;
procedure TSchema.SetIntervalNbr(value:integer);
begin
Scheme.IntervalNbr:=value;
end;

procedure TSchema.ClearMe();
begin
 SetUse(pchar(''));
 SetExtension(pchar(''));
 Setname(pchar(''));
 SetHeader(pchar(''));
 SetBefore(pchar(''));
 SetBetween(pchar(''));
 SetWdxInfo(pchar(''));
 SetAfter(pchar(''));
 SetFooter(pchar(''));
 SetDirectoryText(pchar(''));
 SetDisplayComment(pchar(''));
 SetDivider(pchar(''));
 SetAdditionalText(pchar(''));
 SetListExtension(pchar(''));
 SetCounter(false);
 SetDoNotWrite(false);
 SetSaveLog(true);
 SetCounterLength(0);
 SetIntervalNbr(0);
 SetCounterPos(0);
 SetDoNotWrite(true);

end;

procedure TSchema.LoadScheme(SchemeName:pchar);
var extend:boolean;i:integer;tmpIni:Tinifile; tmpscheme:PInfToWri; s:AnsiString; List: TStringList; begin
 tmpscheme:=@Scheme;
 extend:=false;
 List:=TStringList.Create;
 fillchar(tmpscheme^.Use,sizeof(tmpscheme^.Use),#0);
 fillchar(tmpscheme^.Extension,sizeof(tmpscheme^.Extension),#0);
 fillchar(tmpscheme^.Name,sizeof(tmpscheme^.Name),#0);
 fillchar(tmpscheme^.Header,sizeof(tmpscheme^.Header),#0);
 fillchar(tmpscheme^.before,sizeof(tmpscheme^.before),#0);
 fillchar(tmpscheme^.between,sizeof(tmpscheme^.between),#0);
 fillchar(tmpscheme^.wdxinfo,sizeof(tmpscheme^.wdxinfo),#0);
 fillchar(tmpscheme^.ListExtension,sizeof(tmpscheme^.ListExtension),#0);
 fillchar(tmpscheme^.after,sizeof(tmpscheme^.after),#0);
 fillchar(tmpscheme^.footer,sizeof(tmpscheme^.footer),#0);
 fillchar(tmpscheme^.DirectoryText,sizeof(tmpscheme^.DirectoryText),#0);
 fillchar(tmpscheme^.divider,sizeof(tmpscheme^.divider),#0);
 fillchar(tmpscheme^.AdditionnalText,sizeof(tmpscheme^.AdditionnalText),#0);
 fillchar(tmpscheme^.StrReplaceValue,sizeof(tmpscheme^.StrReplaceValue),#0);
 fillchar(tmpscheme^.DisplayComment,sizeof(tmpscheme^.DisplayComment),#0);

 tmpIni:=TIniFile.create(Scheme.PathToSchemeFile);

 s:= tmpIni.ReadString(SchemeName,'Use','');
 strlcat(tmpscheme^.Use,pchar(s),sizeof(tmpscheme^.Use)-1);

 s:=tmpIni.ReadString(SchemeName,'Extension','');
 strlcat(tmpscheme^.Extension,pchar(s),sizeof(tmpscheme^.Extension)-1);

 s:=tmpIni.ReadString(SchemeName,'Name','');
 strlcat(tmpscheme^.Name,pchar(s),sizeof(tmpscheme^.Name)-1);
 s:=tmpIni.ReadString(SchemeName,'DisplayComment','');
 strlcat(tmpscheme^.DisplayComment,pchar(s),sizeof(tmpscheme^.DisplayComment)-1);

 s:=tmpIni.ReadString(SchemeName,'Header','');
 strlcat(tmpscheme^.Header,pchar(s),sizeof(tmpscheme^.Header)-1);
 if (pos('%extended%|',tmpscheme^.Header)<>0) then begin
extend:=true;
s:=Stringreplace(tmpscheme^.Header,pchar('%extended%|'),'',[rfReplaceAll, rfIgnoreCase]);
fillchar(tmpscheme^.Header,sizeof(tmpscheme^.Header),#0);
split('|',s,List);
for i:=0 to List.count-1 do begin
 s:=tmpIni.ReadString(SchemeName,List[i],'');
 strlcat(tmpscheme^.Header,pchar(s),sizeof(tmpscheme^.Header)-1);
end;
 end;
 s:=tmpIni.ReadString(SchemeName,'before','');
 strlcat(tmpscheme^.before,pchar(s),sizeof(tmpscheme^.before)-1);
 if (pos('%extended%|',tmpscheme^.before)<>0) then begin
extend:=true;
s:=Stringreplace(tmpscheme^.before,pchar('%extended%|'),'',[rfReplaceAll, rfIgnoreCase]);
fillchar(tmpscheme^.Header,sizeof(tmpscheme^.before),#0);
split('|',s,List);
for i:=0 to List.count-1 do begin
 s:=tmpIni.ReadString(SchemeName,List[i],'');
 strlcat(tmpscheme^.before,pchar(s),sizeof(tmpscheme^.before)-1);
end;
 end;
 s:=tmpIni.ReadString(SchemeName,'between','');
 strlcat(tmpscheme^.between,pchar(s),sizeof(tmpscheme^.between)-1);
 if (pos('%extended%|',tmpscheme^.between)<>0) then begin
extend:=true;
s:=Stringreplace(tmpscheme^.between,pchar('%extended%|'),'',[rfReplaceAll, rfIgnoreCase]);
fillchar(tmpscheme^.between,sizeof(tmpscheme^.between),#0);
split('|',s,List);
for i:=0 to List.count-1 do begin
 s:=tmpIni.ReadString(SchemeName,List[i],'');
 strlcat(tmpscheme^.between,pchar(s),sizeof(tmpscheme^.between)-1);
end;
 end;
 s:=tmpIni.ReadString(SchemeName,'wdxinfo','');
 strlcat(tmpscheme^.wdxinfo,pchar(s),sizeof(tmpscheme^.wdxinfo)-1);
 if (pos('%extended%|',tmpscheme^.wdxinfo)<>0) then begin
extend:=true;
s:=Stringreplace(tmpscheme^.wdxinfo,pchar('%extended%|'),'',[rfReplaceAll, rfIgnoreCase]);
fillchar(tmpscheme^.wdxinfo,sizeof(tmpscheme^.wdxinfo),#0);
split('|',s,List);
for i:=0 to List.count-1 do begin
s:=tmpIni.ReadString(SchemeName,List[i],'');
strlcat(tmpscheme^.wdxinfo,pchar(s),sizeof(tmpscheme^.wdxinfo)-1);
end;
 end;
 s:=tmpIni.ReadString(SchemeName,'after','');
 strlcat(tmpscheme^.after,pchar(s),sizeof(tmpscheme^.after)-1);
 if (pos('%extended%|',tmpscheme^.after)<>0) then begin
extend:=true;
s:=Stringreplace(tmpscheme^.after,pchar('%extended%|'),'',[rfReplaceAll, rfIgnoreCase]);
fillchar(tmpscheme^.after,sizeof(tmpscheme^.after),#0);
split('|',s,List);
for i:=0 to List.count-1 do begin
 s:=tmpIni.ReadString(SchemeName,List[i],'');
 strlcat(tmpscheme^.after,pchar(s),sizeof(tmpscheme^.after)-1);
end;
 end;
 s:=tmpIni.ReadString(SchemeName,'footer','');
 strlcat(tmpscheme^.footer,pchar(s),sizeof(tmpscheme^.footer)-1);
 if (pos('%extended%|',tmpscheme^.footer)<>0) then begin
extend:=true;
s:=Stringreplace(tmpscheme^.footer,pchar('%extended%|'),'',[rfReplaceAll, rfIgnoreCase]);
fillchar(tmpscheme^.footer,sizeof(tmpscheme^.footer),#0);
split('|',s,List);
for i:=0 to List.count-1 do begin
s:=tmpIni.ReadString(SchemeName,List[i],'');
strlcat(tmpscheme^.footer,pchar(s),sizeof(tmpscheme^.footer)-1);
end;
 end;

s:=tmpIni.ReadString(SchemeName,'DirectoryText','');
 strlcat(tmpscheme^.DirectoryText,pchar(s),sizeof(tmpscheme^.DirectoryText)-1);
 if (pos('%extended%|',tmpscheme^.DirectoryText)<>0) then begin
extend:=true;
s:=Stringreplace(tmpscheme^.DirectoryText,pchar('%extended%|'),'',[rfReplaceAll, rfIgnoreCase]);
fillchar(tmpscheme^.DirectoryText,sizeof(tmpscheme^.DirectoryText),#0);
split('|',s,List);
for i:=0 to List.count-1 do begin
s:=tmpIni.ReadString(SchemeName,List[i],'');
strlcat(tmpscheme^.DirectoryText,pchar(s),sizeof(tmpscheme^.DirectoryText)-1);
end;
 end;


 s:=tmpIni.ReadString(SchemeName,'divider','');
 strlcat(tmpscheme^.divider,pchar(s),sizeof(tmpscheme^.divider)-1);
 s:=tmpIni.ReadString(SchemeName,'ExtensionList','');
 strlcat(tmpscheme^.ListExtension,pchar(s),sizeof(tmpscheme^.ListExtension)-1);
 s:=tmpIni.ReadString(SchemeName,'AdditionalText','');
 strlcat(tmpscheme^.AdditionnalText,pchar(s),sizeof(tmpscheme^.AdditionnalText)-1);

 tmpscheme^.Counter:=tmpIni.ReadBool(SchemeName,'AddCounter',false);
 tmpscheme^.DoNotWrite:=tmpIni.ReadBool(SchemeName,'DoNotWriteEmpty',false);
 tmpscheme^.SaveLog:=tmpIni.ReadBool(SchemeName,'SaveErrorLog',false);
 tmpscheme^.StrReplace:=tmpIni.ReadBool(SchemeName,'StrReplace',false);
 tmpscheme^.MaxRight:=tmpIni.ReadInteger(SchemeName,'MaxRight',12);
 tmpscheme^.CounterLength:=tmpIni.ReadInteger(SchemeName,'CounterLength',0);
 tmpscheme^.IntervalNbr:=tmpini.ReadInteger(SchemeName,'IntervalNbr',0);
 tmpscheme^.CounterPos:=tmpini.ReadInteger(SchemeName,'CounterPos',0);
 s:=tmpIni.ReadString(SchemeName,'StrReplaceValue','');
 strlcat(tmpscheme^.StrReplaceValue,pchar(s),sizeof(tmpscheme^.StrReplaceValue)-1);
 tmpscheme^.recursionDepth:=tmpIni.ReadInteger(SchemeName,'RecursionDepth',1);

 tmpIni.free;
 if extend then tmpscheme^.ExtendedScheme:=true
 else tmpscheme^.ExtendedScheme:=false;
 //MessageBox(GetActiveWindow,Scheme.Extension,'Ext Fichier',MB_OK);
end;

procedure TSchema.SetRecursionDepth(value:integer);
begin
Scheme.RecursionDepth:=value;
end;
procedure TSchema.SaveScheme(SchemeName:Pchar);
var tmIni:Tinifile; PScheme:PInfToWri; begin
PScheme:=@Scheme;
 tmIni:=TIniFile.create(Scheme.PathToSchemeFile);
 tmIni.WriteString(SchemeName,'use',PScheme^.Use);
 tmIni.WriteString(SchemeName,'Extension',PScheme^.Extension);
 tmIni.WriteString(SchemeName,'Divider',PScheme^.Divider);
 tmIni.WriteString(SchemeName,'header',PScheme^.header);
 tmIni.WriteString(SchemeName,'before',PScheme^.before);
 tmIni.WriteString(SchemeName,'name',PScheme^.name);
 tmIni.WriteString(SchemeName,'between',PScheme^.between);
 tmIni.WriteString(SchemeName,'wdxinfo',PScheme^.wdxinfo);
 tmIni.WriteString(SchemeName,'after',PScheme^.after);
 tmIni.WriteString(SchemeName,'footer',PScheme^.footer);
 tmIni.WriteString(SchemeName,'DirectoryText',PScheme^.DirectoryText);
 tmIni.WriteString(SchemeName,'ExtensionList',PScheme^.ListExtension);
 tmIni.WriteString(SchemeName,'AdditionalText',PScheme^.AdditionnalText);
 tmIni.WriteString(SchemeName,'DisplayComment',PScheme^.DisplayComment);
 tmIni.WriteBool(SchemeName,'AddCounter',PScheme^.Counter);
 tmIni.WriteBool(SchemeName,'DoNotWriteEmpty',PScheme^.DoNotWrite);
 tmIni.WriteBool(SchemeName,'SaveErrorLog',PScheme^.SaveLog);
 tmIni.WriteInteger(SchemeName,'MaxRight',PScheme^.MaxRight);
 tmIni.WriteInteger(SchemeName,'IntervalNbr',PScheme^.IntervalNbr);
 tmIni.WriteInteger(SchemeName,'CounterLength',PScheme^.CounterLength);
 tmIni.WriteInteger(SchemeName,'CounterPos',PScheme^.CounterPos);
 tmIni.WriteInteger(SchemeName,'RecursionDepth',PScheme^.recursionDepth);

 tmIni.WriteString(SchemeName,'strReplaceValue',PScheme^.StrReplaceValue);
 tmIni.WriteBool(SchemeName,'strReplace',PScheme^.StrReplace);
 tmIni.free;
end;

procedure TSchema.SaveSpecialScheme(OrigScheme,SchemeTmp:Pchar);
var i:integer;s:string;tmIni:Tinifile;List:TStringList; begin
List:=TStringList.Create;
 tmIni:=TIniFile.create(Scheme.PathToSchemeFile);
 tmIni.ReadSection(OrigScheme,List);
 for i:=0 to List.count-1 do begin
s:='"'+ tmIni.ReadString(OrigScheme,List[i],'')+'"';
tmini.WriteString(Schemetmp,List[i],s);
end;
 tmIni.free;
end;


procedure TSchema.DeleteScheme(SchemeToDelete:Pchar);
var tmIni:Tinifile; begin
 tmIni:=TIniFile.create(Scheme.PathToSchemeFile);
 tmIni.EraseSection(SchemeToDelete);
 tmIni.free;
end;
procedure TSchema.ListAvailableScheme(List:TstringList);
var tmp:TInifile; temp:TStringList; i:integer;begin
temp:=TStringList.create;
tmp:=TIniFile.create(Scheme.PathToSchemeFile);
tmp.ReadSections(temp);
For i:=0 to Temp.Count-1 do begin
if (Temp[i]<>'RunTemp') then List.Add(Temp[i]);
end;
List.Sort;
temp.free;
tmp.Free;
end;


procedure TSchema.ListAvailableSchemeComment(List2:TStrings);
var tmp:TInifile; temp:TStringList; i:integer; s:string;begin
temp:=TStringList.create;
tmp:=TIniFile.create(Scheme.PathToSchemeFile);
tmp.ReadSections(temp);
For i:=0 to Temp.Count-1 do begin
if (Temp[i]<>'RunTemp') then begin
 s:=tmp.ReadString(Temp[i],'DisplayComment','');
 List2.Add(Format('%s=%s', [Temp[i], s]));
end;
end;
temp.free;
tmp.Free;
end;


procedure TSchema.ListAvailableExtension(List:array of Tstringlist);
var tmp:TInifile; i:integer; s:string; begin
 tmp:=TIniFile.create(Scheme.PathToSchemeFile);
 tmp.ReadSections(List[0]);
 For i:=0 to List[0].Count-1 do begin
 s:=tmp.ReadString(List[0][i],'Extension','');
 List[1].Add(s);
 end;
 tmp.Free;
end;
function TSchema.SchemeExist(SchemeName:Pchar):boolean;
var exist,findone:boolean; List:TStringList; i:integer; begin
 exist:=false;
 findone:=false;
 List:=TStringList.create;
 ListAvailableScheme(List);
 for i:=0 to List.count-1 do begin
 if ((List[i]=SchemeName) and (findone=false)) then begin
 exist:=true;
 findone:=true;
 end;
 end;
 result:=exist;
end;


{======================FOR TC CUSTOM COLUMN======================}
procedure TC_Custom.Init(TC_Ini:pchar);
var tmp:TIniFile;
Temp:string;
i,j:integer;
s:string;
begin
Column_Info.List:=TStringList.Create;
tmp:=TIniFile.Create(TC_Ini);
Temp:=tmp.ReadString('CustomFields','Titles','');
Temp:=StringReplace(Temp,' ', '_',[rfReplaceAll, rfIgnoreCase]);
Split('|',Temp,Column_Info.List);
for i:=0 to Column_Info.List.Count-1 do begin
Column_Info.ColumnDetail[i]:=TStringList.Create;
Column_Info.List[i]:=StringReplace(Column_Info.List[i],'_', ' ',[rfReplaceAll, rfIgnoreCase]);
s:='Contents'+inttostr(i+1);
Temp:=tmp.ReadString('CustomFields',s,'');
Temp:=StringReplace(Temp,'\n', '@',[rfReplaceAll, rfIgnoreCase]);
Temp:=StringReplace(Temp,' ', '_',[rfReplaceAll, rfIgnoreCase]);

Split('@',Temp,Column_Info.ColumnDetail[i]);
for j:=0 to Column_Info.ColumnDetail[i].Count-1 do begin
 Column_Info.ColumnDetail[i][j]:=StringReplace(Column_Info.ColumnDetail[i][j],'_', ' ',[rfReplaceAll, rfIgnoreCase]);
end;
end;
tmp.Free;
end;
function TC_Custom.GetValue(Column:integer):TStringList;
var List1:TStringList;
List2:TStringList;
List3:TStringList;
Temp:TStringList;
s,s1,s2:string;
i,j,k:integer;
begin
List1:=TStringList.Create;
List2:=TStringList.Create;
List3:=TStringList.Create;
Temp:=TStringList.Create;
for i:=0 to Column_Info.ColumnDetail[Column].Count-1 do begin
s2:='';

s:=Column_Info.ColumnDetail[Column][i];
	s:=StringReplace(s,'][', '@',[rfReplaceAll, rfIgnoreCase]);
s:=StringReplace(s,'=', '',[rfReplaceAll, rfIgnoreCase]);
s:=StringReplace(s,'[', '',[rfReplaceAll, rfIgnoreCase]);
s:=StringReplace(s,']', '',[rfReplaceAll, rfIgnoreCase]);
s:=StringReplace(s,'"', '!',[rfReplaceAll, rfIgnoreCase]);

if pos('@',s) <>0 then begin
List2.Clear;
s:=StringReplace(s,' ', '_',[rfReplaceAll, rfIgnoreCase]);
Split('@',s,List2);
for j:=0 to List2.count-1 do begin
if pos('.',List2[j])<>0 then begin //plugin
Split('.',List2[j],List3);
for k:=0 to List3.count-1 do begin
List3[k]:=StringReplace(List3[k],'_', ' ',[rfReplaceAll, rfIgnoreCase]);
end;
Case List3.Count of
1:begin{error} end;
2:begin
s1:='@Mod='+List3[1]+'@'+List3[0]+'.wdx';
end;
3:begin
s1:='@Mod='+List3[2]+'.'+List3[1]+'@'+List3[0]+'wdx';
end;
end;
end;
if s2<>'' then s2:=s2+';'+s1
else s2:=s1;
end;
end else begin
if pos('.',s)<>0 then begin //plugin
List2.clear;
Split('.',s,List2);
for k:=0 to List2.count-1 do begin
List2[k]:=StringReplace(List2[k],'_', ' ',[rfReplaceAll, rfIgnoreCase]);
end;
Case List2.Count of
1:begin{error} end;
2:begin
s1:='@Mod='+List2[1]+'@'+List2[0]+'.wdx';
end;
3:begin
s1:='@Mod='+List2[2]+'.'+List2[1]+'@'+List2[0]+'.wdx';
end;
end;
end;
if s2<>'' then s2:=s2+';'+s1
else s2:=s1;
end;
Temp.add(s2);
end;
if Temp.count<5 then begin
 for i:=0 to Temp.Count-1 do begin
 List1.Add(Temp[i]);
 end;
 for i:=Temp.Count to 5 do begin
 List1.Add('');
 end;
end;
if Temp.Count=5 then begin
 for i:=0 to Temp.Count-1 do begin
 List1.Add(Temp[i]);
 end;
end;
if Temp.Count>5 then begin
 for i:=0 to 3 do begin
 List1.Add(Temp[i]);
 end;
 s:='';
 for i:=4 to Temp.Count-1 do begin
 s:=s+';'+Temp[i];
 end;
 List1.Add(s);
end;
result:=List1;
end;
{======================GENERIC FUNCTION======================}
procedure Split(const Delimiter: Char;Input: string;const Strings: TStrings);
begin
Assert(Assigned(Strings));
Strings.Clear;
Strings.Delimiter := Delimiter;
Strings.DelimitedText := Input;
end;
{======================END OF FILE======================}
end.
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded