{
      Author: BARKO, OPINFOS d.o.o., SLOVENIA http://www.opinfos.com
 ***************************************************************************
 *                                                                         *
 *   This source is free software; you can redistribute it and/or modify   *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This code 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.  See the GNU     *
 *   General Public License for more details.                              *
 *                                                                         *
 *   A copy of the GNU General Public License is available on the World    *
 *   Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also      *
 *   obtain it by writing to the Free Software Foundation,                 *
 *   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA.   *
 *                                                                         *
 ***************************************************************************
}
unit mainunit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, Menus, FileCtrl,
  LazFileUtils, LazUTF8, DefaultTranslator;

type

  { TLazConverterForm }

  TLazConverterForm = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Edit1: TEdit;
    FileListBox1: TFileListBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label6: TLabel;
    MenuItem1: TMenuItem;
    Panel1: TPanel;
    PopupMenu1: TPopupMenu;
    ProgressBar1: TProgressBar;
    SelectDirectoryDialog1: TSelectDirectoryDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Form1Show(Sender: TObject);
    procedure MenuItem1Click(Sender: TObject);
  private

  public
    procedure CountFiles;
  end; 

var
  LazConverterForm: TLazConverterForm;
  
const msgdone = 'Searching done... press CONVERT button! Files: ';

implementation

{$R *.lfm}

function replace (source: string; src, rep: string):string;
begin
  result:=StringReplace(source,src,rep,[rfReplaceAll]);
end;

function origpath:string;
var tmp:string;
begin
  tmp:=StrPas(argv[0]);
  tmp:=ExpandFileNameUTF8(tmp);
  tmp:=ExtractFileDir(tmp);
  tmp:=IncludeTrailingPathDelimiter(tmp);
  result:=tmp;
end;

procedure TLazConverterForm.CountFiles;
begin
  if FileListBox1.Items.Count-1<>-1 then
  begin
    label6.caption:=msgdone+inttostr(FileListBox1.Items.Count-1);
  end else label6.caption:=msgdone+'0';
end;

procedure TLazConverterForm.Button1Click(Sender: TObject);
begin
  if SelectDirectoryDialog1.Execute then
  begin
    edit1.text:=IncludeTrailingPathDelimiter(SelectDirectoryDialog1.FileName);
  end;
end;

procedure TLazConverterForm.Button2Click(Sender: TObject);
begin
  if trim(edit1.text)='' then
  begin
    button1click(sender);abort;
  end;
  FileListBox1.Mask:='';
  FileListBox1.Directory:='';
  FileListBox1.Clear;
  FileListBox1.Directory:=Edit1.text;
  FileListBox1.Mask:='*.pas;*.lfm;*.lrs;*.inc;*.lrt';
  CountFiles;
end;

procedure TLazConverterForm.Button3Click(Sender: TObject);
var tmp:tstringlist;
    i:integer;
    ok:boolean;

   function ConvertMe(var tmp:tstringlist):boolean;
   var cpin,cpout:tstringlist;
       ok:boolean;
       i:integer;
   begin
     ok:=true;result:=true;
     if trim(tmp.text)='' then result:=false else
     begin
       cpin:=tstringlist.create;
       cpout:=tstringlist.create;
       try
         try
           cpin.LoadFromFile(UTF8ToSys(origpath+combobox1.text));
         except
           ok:=false;
         end;
         try
           cpout.LoadFromFile(UTF8ToSys(origpath+combobox2.text));
         except
           ok:=false;
         end;
         if ok then
         begin
           if cpin.Count=cpout.Count then
           begin
             for i:=0 to cpin.Count-1 do
             begin
               cpin[i]:=trim(cpin[i]);
               cpout[i]:=trim(cpout[i]);
               if (cpin[i]<>'') and (cpout[i]<>'') then
               begin
                 tmp.text:=Replace(tmp.text,char(strtoint(cpin[i])),char(strtoint(cpout[i])));
               end;
             end;
           end else result:=false;
         end else result:=false;
       finally
         cpin.free;
         cpout.free;
       end;
     end;
   end;

   function ConvertMeLRS(var tmp:tstringlist):boolean;
   var cpin,cpout:tstringlist;
       ok:boolean;
       i:integer;
   begin
     result:=true;
     ok:=true;
     if trim(tmp.text)='' then result:=false else
     begin
       cpin:=tstringlist.create;
       cpout:=tstringlist.create;
       try
         try
           cpin.LoadFromFile(UTF8ToSys(origpath+combobox1.text));
         except
          ok:=false;
         end;
         try
           cpout.LoadFromFile(UTF8ToSys(origpath+combobox2.text));
         except
           ok:=false;
         end;
         if ok then
         begin
           if cpin.Count=cpout.Count then
           begin
             for i:=0 to cpin.Count-1 do
             begin
               cpin[i]:=trim(cpin[i]);
               cpout[i]:=trim(cpout[i]);
               if (cpin[i]<>'') and (cpout[i]<>'') then
               begin
                 tmp.text:=Replace(tmp.text,'#'+cpin[i],'#'+cpout[i]);
               end;
             end;
           end else result:=false;
         end else result:=false;
       finally
         cpin.free;
         cpout.free;
       end;
     end;
   end;

begin
  if FileListBox1.Items.count-1=-1 then abort;
  if trim(combobox1.text)='' then abort;
  if trim(combobox2.text)='' then abort;
  tmp:=tstringlist.create;
  try
    ProgressBar1.Min:=0;
    ProgressBar1.Max:=FileListBox1.Items.count;
    ProgressBar1.StepBy(1);
    for i:=0 to FileListBox1.Items.count-1 do
    begin
      ok:=true;
      try
        tmp.LoadFromFile(UTF8ToSys(FileListBox1.Directory+FileListBox1.Items[i]));
      except
        ok:=false;
      end;
      if ok then
      begin
        if FilenameExtIs(FileListBox1.Items[i], 'lrs') then
        begin
          if ConvertMeLRS(tmp) then
          begin
            ok:=true;
            try
              tmp.SaveToFile(UTF8ToSys(FileListBox1.Directory+FileListBox1.Items[i]));
            except ok:=false; end;
          end;
        end else
        begin
          if ConvertMe(tmp) then
          begin
            ok:=true;
            try
              tmp.SaveToFile(UTF8ToSys(FileListBox1.Directory+FileListBox1.Items[i]));
            except ok:=false; end;
          end;
        end;
      end;
      ProgressBar1.StepIt;
    end;
  finally
    ProgressBar1.Position:=0;
    tmp.free;
    label6.caption:='Done!';
    FileListBox1.Mask:='';
    FileListBox1.Directory:='';
    FileListBox1.Clear;
  end;
end;

procedure TLazConverterForm.Form1Show(Sender: TObject);
begin
  if paramcount<>0 then edit1.text:=ParamStrUTF8(1) else edit1.text:='';
  try
    ComboBox1.items.LoadFromFile(UTF8ToSys(origpath+'codepages.ini'));
  except end;
  try
    ComboBox2.items.LoadFromFile(UTF8ToSys(origpath+'codepages.ini'));
  except end;
  ComboBox1.text:='';
  ComboBox2.text:='';
  Edit1.SetFocus;
  FileListBox1.Mask:='';
  FileListBox1.Directory:='';
  FileListBox1.Clear;
end;

procedure TLazConverterForm.MenuItem1Click(Sender: TObject);
begin
 if FileListBox1.Items.count-1=-1 then abort;
 try
  FileListBox1.Items.Delete(FileListBox1.ItemIndex);
 except end;
 CountFiles;
end;

end.

