unit mainfrm;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  Grids, StdCtrls, ExtCtrls, CsvDocument;

type
  TfmCSVTest = class(TForm)
    btnSave: TButton;
    cbbDelimiter: TComboBox;
    Delimiter: TLabel;
    SaveDialog: TSaveDialog;
    sgView: TStringGrid;
    mmSource: TMemo;
    splTop: TSplitter;
    mmResult: TMemo;
    splBottom1: TSplitter;
    mmCellValue: TMemo;
    splBottom2: TSplitter;
    UpdateTimer: TIdleTimer;
    lblSource: TLabel;
    lblOutput: TLabel;
    lblCSVDoc: TLabel;
    lblCellContent: TLabel;
    pnButtons: TPanel;
    btnLoad: TButton;
    OpenDialog: TOpenDialog;
    procedure btnSaveClick(Sender: TObject);
    procedure cbbDelimiterChange(Sender: TObject);
    procedure mmSourceChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure sgViewSelectCell(Sender: TObject; aCol, aRow: Integer;
      var CanSelect: Boolean);
    procedure mmCellValueChange(Sender: TObject);
    procedure UpdateTimerTimer(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
  private
    FDoc: TCSVDocument;
    procedure UpdateView;
  public
    { public declarations }
  end; 

var
  fmCSVTest: TfmCSVTest;

implementation

{ TfmCSVTest }

procedure TfmCSVTest.mmSourceChange(Sender: TObject);
begin
  FDoc.CSVText := mmSource.Text;
  UpdateTimer.Enabled := True;
end;

procedure TfmCSVTest.btnSaveClick(Sender: TObject);
begin
  if SaveDialog.Execute then
    FDoc.SaveToFile(SaveDialog.FileName);
end;

procedure TfmCSVTest.cbbDelimiterChange(Sender: TObject);
begin
  FDoc.Delimiter := cbbDelimiter.Text[1];
  FDoc.CSVText := mmSource.Text;
  UpdateTimer.Enabled := True;
end;

procedure TfmCSVTest.FormCreate(Sender: TObject);
begin
  FDoc := TCSVDocument.Create;
  FDoc.Delimiter := ';';
end;

procedure TfmCSVTest.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FDoc);
end;

procedure TfmCSVTest.sgViewSelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
begin
  mmCellValue.OnChange := nil;
  mmCellValue.Text := FDoc.Cells[aCol, aRow];
  mmCellValue.OnChange := @mmCellValueChange;
end;

procedure TfmCSVTest.mmCellValueChange(Sender: TObject);
begin
  if not Assigned(FDoc) then Exit; // qt workaround
  FDoc.Cells[sgView.Col, sgView.Row] := mmCellValue.Text;
  UpdateTimer.Enabled := True;
end;

procedure TfmCSVTest.UpdateTimerTimer(Sender: TObject);
begin
  UpdateView;
  mmResult.Text := FDoc.CSVText;
  UpdateTimer.Enabled := False;
end;

procedure TfmCSVTest.btnLoadClick(Sender: TObject);
begin
  if OpenDialog.Execute then
    FDoc.LoadFromFile(OpenDialog.FileName);
  UpdateView;
end;

procedure TfmCSVTest.UpdateView;
var
  i, j: Integer;
begin
  sgView.BeginUpdate;
  try
    i := FDoc.RowCount;
    if sgView.RowCount <> i then
      sgView.RowCount := i;

    i := FDoc.MaxColCount;
    if sgView.ColCount <> i then
      sgView.ColCount := i;

    for i := 0 to FDoc.RowCount - 1 do
      for j := 0 to sgView.ColCount - 1 do
        sgView.Cells[j, i] := FDoc.Cells[j, i];
  finally
    sgView.EndUpdate;
  end;
end;

initialization
  {$I mainfrm.lrs}

end.