
unit utraductor;


interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Grids, uauxiliares, upofile, ubtree;

type

  { TForm1 }

  TForm1 = class(TForm)
    btNinguno: TButton;
    btAceptoPO: TButton;
    btCargarDicc: TButton;
    btAceptoDicc: TButton;
    btProcesarPO_Editor: TButton;
    btProcesarPO_Simulador: TButton;
    btProcesarPO_SimRes3: TButton;
    btProcesarPO3_AnalisisSerial: TButton;
    btProcesarPO_OddFace_prepare: TButton;
    cbFuzzy: TCheckBox;
    eInicializaDicc: TEdit;
    eInicializaPO: TEdit;
    eCorrijoPO: TEdit;
    eCorrijoDicc: TEdit;
    eNueva: TEdit;
    eCoincidencias: TEdit;
    gbDiccionario: TGroupBox;
    gbArchivoPO: TGroupBox;
    gbContadoresPO: TGroupBox;
    lbl_msgID: TLabel;
    lblInicializaDicc: TLabel;
    lblInicializaPO: TLabel;
    lblCorrijoPO: TLabel;
    lblCorrijoDicc: TLabel;
    lblNueva: TLabel;
    lblCoincidencias: TLabel;
    eDiccMsgStr: TMemo;
    ePOMsgStr: TMemo;
    OpenDialog1: TOpenDialog;
    panelSuperior: TPanel;
    Splitter1: TSplitter;
    procedure btAceptoDiccClick(Sender: TObject);
    procedure btAceptoPOClick(Sender: TObject);
    procedure btNingunoClick(Sender: TObject);
    procedure btProcesarPO3_AnalisisSerialClick(Sender: TObject);
    procedure btProcesarPO_EditorClick(Sender: TObject);
    procedure btCargarDiccClick(Sender: TObject);
    procedure btProcesarPO_OddFace_prepareClick(Sender: TObject);
    procedure btProcesarPO_SimRes3Click(Sender: TObject);
    procedure btProcesarPO_SimuladorClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  private

  public
    archi_Dicc, archi_aPOF, archi_aPOF_nombre: string;

    Dicc_PO: TPO_File;
    Dicc_btree: TBasePO;

    aPOF: TPO_File;

    aRecDicc: TPO_Rec;
    aRecPO: TPO_Rec;

    cnt_InicializaDicc: integer;
    cnt_InicializaPO: integer;
    cnt_CorrijoPO: integer;
    cnt_CorrijoDicc: integer;
    cnt_Nuevas: integer;
    cnt_Coincidencias: integer;
    flg_EsperandoAceptacion: boolean;

    procedure actualizarVisorContadores;
    procedure ClearContadores;

    procedure ArmonizarRecs;
    procedure procesarPO( archiPO: string );
    procedure GuardarArchivos;
  end;

var
  Form1: TForm1;


implementation


function Carpeta_trunk: string;
var
   res: string;
begin
  res:= '..'+DirectorySeparator+'SimSEE_src'+DirectorySeparator+'src'+DirectorySeparator+'trunk';

  if not DirectoryExists( res ) then
    res:= '..'+DirectorySeparator+'SimSEE_src'+DirectorySeparator+'trunk';
  result:= res;
end;

{$R *.lfm}
{ TForm1 }

procedure TForm1.ArmonizarRecs;
begin
  if aRecDicc.msgstr.Text = aRecPO.msgstr.Text then
  begin
    aRecPO.unfuzz;
    Inc(cnt_Coincidencias);
    exit;
  end;

  cbFuzzy.Checked:= aRecPO.flg_fuzzy;

  if ( not aRecPO.flg_fuzzy ) and (trim(aRecDicc.msgstr.Text) = '' ) then
  begin
    CopyStrLst(aRecDicc.msgstr, aRecPO.msgstr);
    Inc(cnt_InicializaDicc);
    writeln('IniDicc<-: ', aRecDicc.msgid.Text, ' -> ', aRecDicc.msgstr.Text);
  end
  else if trim(aRecPO.msgstr.Text) = '' then
  begin
    CopyStrLst(aRecPO.msgstr, aRecDicc.msgstr);
    Inc(cnt_InicializaPO);
    writeln('IniPO<-: ', aRecDicc.msgid.Text, ' -> ', aRecDicc.msgstr.Text);
    aRecPO.unfuzz;
  end
  else
  begin
    lbl_msgID.Caption := aRecDicc.msgid.Text;
    eDiccMsgStr.Text := aRecDicc.msgstr.Text;
    ePOMsgStr.Text := aRecPO.msgstr.Text;
    flg_EsperandoAceptacion := True;
    while flg_EsperandoAceptacion do
      Application.ProcessMessages;
  end;
  actualizarVisorContadores;
end;


procedure TForm1.btCargarDiccClick(Sender: TObject);
var
  f: textfile;
  k: integer;
  resCod: integer;
  aNodo: TNodoBtree;
  sAlmacenado, sNuevo: string;
  cnt_Insertados, cnt_Duplicados: integer;
  aRecAlmacenado: TPO_Rec;
begin
  //if OpenDialog1.Execute then
  begin
    Dicc_btree := TBasePO.Create(False);
//    archi_Dicc := OpenDialog1.FileName;
 // writeln(GetCurrentDir);

 archi_Dicc := Carpeta_trunk+DirectorySeparator+'DiccionarioSimSEE.po';

 writeln(archi_Dicc);

    Dicc_PO := TPO_File.CreateFromArchi(archi_Dicc);

    cnt_Insertados := 0;
    cnt_Duplicados := 0;

    k := 0;
    while k < Dicc_PO.recs.Count do
    begin
      aRecDicc := TPO_Rec(Dicc_PO.recs[k]);

      aNodo := Dicc_btree.insert(aRecDicc, resCod);
      if resCod = 2 then
      begin
        // estaba duplicado, me quedo con el más VERBOSO.
        sNuevo := aRecDicc.msgstr.Text;
        aRecAlmacenado := TPO_Rec(aNodo.item);
        sAlmacenado := aRecAlmacenado.msgstr.Text;
        if length(sNuevo) > length(sAlmacenado) then
          CopyStrLst(aRecAlmacenado.msgstr, aRecDicc.msgstr);
        aRecDicc.Free;
        Dicc_PO.recs.Delete(k);
        writeln('resolviendo duplicados: ');
        writeln('Almacenado: ', sAlmacenado);
        writeln('Nuevo: ', sNuevo);
        Inc(cnt_Duplicados);
      end
      else
      begin
        Inc(cnt_Insertados);
        Inc(k);
      end;
    end;
    writeln('cnt_Insertados: ', cnt_Insertados);
    writeln('cnt_Duplicados: ', cnt_Duplicados);
  end;
end;

procedure TForm1.btProcesarPO_OddFace_prepareClick(Sender: TObject);
begin
  procesarPO( 'oddface/prepare/languages/oddface_prepare.en.po' );
end;

procedure TForm1.btProcesarPO_SimRes3Click(Sender: TObject);
begin
  procesarPO( 'ap/SimRes3/languages/SimRes3.en.po' );
end;

procedure TForm1.btProcesarPO_SimuladorClick(Sender: TObject);
begin
  procesarPO( 'ap/optsim/languages/SimSEESimulador.en.po' );
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  if Dicc_PO <> nil then
    Dicc_PO.Free;
  if aPOF <> nil then
    aPOF.Free;
  if Dicc_btree <> nil then
    Dicc_btree.Free;
end;

procedure TForm1.btAceptoDiccClick(Sender: TObject);
begin
  CopyStrLst(aRecPO.msgstr, aRecDicc.msgstr);
  Inc(cnt_CorrijoPO);
  flg_EsperandoAceptacion := False;
  actualizarVisorContadores;
  aRecPO.unfuzz;
end;

procedure TForm1.btAceptoPOClick(Sender: TObject);
begin
  CopyStrLst(aRecDicc.msgstr, aRecPO.msgstr);
  Inc(cnt_CorrijoDicc);
  actualizarVisorContadores;
  flg_EsperandoAceptacion := False;
  aRecPO.unfuzz;
end;

procedure TForm1.btNingunoClick(Sender: TObject);
begin
  flg_EsperandoAceptacion := False;
end;

procedure TForm1.btProcesarPO3_AnalisisSerialClick(Sender: TObject);
begin
  procesarPO( 'ax/analisisserial/languages/analisisserial.en.po' );
end;

procedure TForm1.btProcesarPO_EditorClick(Sender: TObject);
begin
  procesarPO( 'ap'+DirectorySeparator+'editor'+DirectorySeparator+
  'languages'+DirectorySeparator+'SimSEEEdit.en.po' );
end;

procedure TForm1.procesarPO( archiPO: string );

var
  k: integer;
  aNodo: TNodoBtree;
  rescod: integer;

begin
  ClearContadores;


  archi_aPOF := Carpeta_trunk+DirectorySeparator+archiPO;

  archi_aPOF_nombre := ExtractFileName( archi_aPOF );

  if aPOF <> nil then aPOF.Free;

  aPOF := TPO_File.CreateFromArchi(archi_aPOF);

  flg_EsperandoAceptacion := False;

  for k := 0 to aPOF.recs.Count - 1 do
  begin
    aRecPO := TPO_Rec(aPOF.recs[k]);
    aNodo := Dicc_btree.locate_key(aRecPO);
    if aNodo <> nil then
    begin
      aRecDicc := TPO_Rec(aNodo.item);
      ArmonizarRecs;
    end
    else
    begin
      Inc(cnt_Nuevas);
      writeln('Nueva: $', aRecPO.msgid.Text, '$ -> $', aRecPO.msgstr.Text, '$');
      aRecDicc := aRecPO.Clone;
      Dicc_PO.recs.Add(aRecDicc);
      Dicc_btree.insert(aRecDicc, rescod);
    end;
  end;

  writeln('cnt_InicializaDicc: ', cnt_InicializaDicc);
  writeln('cnt_InicializaPO: ', cnt_InicializaPO);
  writeln('cnt_CorrijoPO: ', cnt_CorrijoPO);
  writeln('cnt_CorrijoDicc: ', cnt_CorrijoDicc);
  writeln('cnt_Nuevas: ', cnt_Nuevas);
  writeln('cnt_Coincidencias: ', cnt_Coincidencias);

  guardarArchivos;


  showmessage('Fin de proceso PO');
end;

procedure TForm1.GuardarArchivos;
begin
 Dicc_PO.WriteToArchi(archi_Dicc);

 // actualizamos el archivo del repositorio
 aPOF.WriteToArchi(archi_aPOF);

 // guardamos el archivo en el directorio de corrida para que quede activo
 aPOF.WriteToArchi(archi_aPOF_nombre);

end;


procedure TForm1.actualizarVisorContadores;
begin
  eInicializaDicc.Text := IntToStr(cnt_InicializaDicc);
  eInicializaPO.Text := IntToStr(cnt_InicializaPO);
  eCorrijoPO.Text := IntToStr(cnt_CorrijoPO);
  eCorrijoDicc.Text := IntToStr(cnt_CorrijoDicc);
  eNueva.Text := IntToStr(cnt_Nuevas);
  eCoincidencias.Text := IntToStr(cnt_Coincidencias);
end;

procedure TForm1.ClearContadores;
begin
  cnt_InicializaDicc := 0;
  cnt_InicializaPO := 0;
  cnt_CorrijoPO := 0;
  cnt_CorrijoDicc := 0;
  cnt_Nuevas := 0;
  cnt_Coincidencias := 0;
  actualizarVisorContadores;
end;



end.
