unit Extractor;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Template, StdCtrls, ExtCtrls, ComCtrls, Menus, Buttons, StrUtils;

type
  TForm_Extractor = class(TForm_ToolTemplate)
    group_extract: TGroupBox;
    check_dat: TCheckBox;
    check_raw: TCheckBox;
    check_convert: TCheckBox;
    radio_selected: TRadioButton;
    label_export_sel: TLabel;
    radio_all: TRadioButton;
    label_path: TLabel;
    edit_path: TEdit;
    btn_path: TButton;
    btn_export: TButton;
    group_progress: TGroupBox;
    lbl_progress: TLabel;
    lbl_estimated: TLabel;
    progress: TProgressBar;
    btn_abort: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn_abortClick(Sender: TObject);
    procedure btn_pathClick(Sender: TObject);
    procedure btn_exportClick(Sender: TObject);
  private
  public
  end;

var
  Form_Extractor: TForm_Extractor;

implementation
{$R *.dfm}
uses Main, Functions, Data, OniDataClass, FolderBrowser, Exporters;


procedure TForm_Extractor.FormCreate(Sender: TObject);
begin
  inherited;
  Self.AllowMultiSelect := True;
  edit_path.Text := AppSettings.ExtractPath;
end;

procedure TForm_Extractor.btn_abortClick(Sender: TObject);
begin
  ShowMessage('X');
end;

procedure TForm_Extractor.btn_pathClick(Sender: TObject);
var
  fb: TFolderBrowser;
begin
  inherited;

  fb := TFolderBrowser.Create(Handle, 'Please select a folder where you want ' +
        'the files to be stored...', edit_path.Text, False, True);
  if fb.Execute then
  begin
    edit_path.Text := fb.SelectedItem;
    AppSettings.ExtractPath := edit_path.Text;
  end;
  fb.Free;
end;

procedure TForm_Extractor.btn_exportClick(Sender: TObject);
var
  begintime: Double;
  files:     LongWord;
  i, done:   LongWord;
  selonly:   Boolean;
  fileid:    LongWord;
  filename:  String;
  path:      String;
begin
  inherited;
  panel_files.Enabled := False;
  group_extract.Enabled := False;
  group_progress.Visible := True;

  path := edit_path.Text;
  if not EndsText('\', path) then
    path := path + '\';

  begintime := Time;
  lbl_estimated.Caption := 'Estimated finishing time: unknown';
  progress.Position := 0;

  selonly := radio_selected.Checked;

  if selonly then
    files := filelist.SelCount
  else
    files := filelist.Count;

  lbl_progress.Caption := 'Files done: 0/' + IntToStr(files);
  progress.Max := files;
  done  := 0;

  for i := 0 to filelist.Count - 1 do
  begin
    if (selonly and filelist.Selected[i]) or not selonly then
    begin
      fileid := Connection.ExtractFileID(filelist.Items.Strings[i]);
      filename := GetWinFilename(filelist.Items.Strings[i]);
      if check_dat.Checked then
        ExportDatFile(Connection, fileid, path + filename);
      if check_raw.Checked then
        ExportRawFiles(Connection, fileid, path + filename);
      if check_convert.Checked then
        ExportConverted(Connection, fileid, path + filename);
      Inc(done);
    end;
    if ((done mod 10) = 0) and (done >= 50) then
      lbl_estimated.Caption := 'Estimated finishing time: ' + TimeToStr(
            (Time - begintime) / done * files + begintime);

    progress.Position    := done;
    lbl_progress.Caption := 'Files done: ' + IntToStr(done) + '/' + IntToStr(files);
    Application.ProcessMessages;
  end;

  panel_files.Enabled := True;
  group_extract.Enabled := True;
  group_progress.Visible := False;
end;


begin
  AddToolListEntry('extractor', 'Extractor', '');
end.