source: oup/current/Tool_Extractor.pas @ 45

Last change on this file since 45 was 45, checked in by alloc, 16 years ago
File size: 6.1 KB
Line 
1unit Tool_Extractor;
2interface
3uses
4  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
5  Dialogs, Tool_Template, StdCtrls, ExtCtrls, ComCtrls, Menus;
6
7type
8  TForm_Extractor = class(TForm_ToolTemplate)
9    group_extract: TGroupBox;
10    group_singlefiles: TGroupBox;
11    btn_sel_dat: TButton;
12    btn_sel_datraw: TButton;
13    btn_sel_datraw_convert: TButton;
14    btn_all_dat: TButton;
15    btn_all_datraw: TButton;
16    btn_all_datraw_convert: TButton;
17    btn_sel_files_toone: TButton;
18    btn_all_files_toone: TButton;
19    group_onefile: TGroupBox;
20    group_progress: TGroupBox;
21    lbl_progress: TLabel;
22    lbl_estimated: TLabel;
23    progress: TProgressBar;
24    btn_abort: TButton;
25    saved: TSaveDialog;
26    procedure FormCreate(Sender: TObject);
27    procedure Extract(Sender: TObject);
28    procedure btn_abortClick(Sender: TObject);
29  private
30  public
31  end;
32
33var
34  Form_Extractor: TForm_Extractor;
35
36implementation
37{$R *.dfm}
38uses Main, Code_Functions, Data, Code_OniDataClass;
39
40procedure TForm_Extractor.FormCreate(Sender: TObject);
41begin
42  inherited;
43  Self.AllowMultiSelect := True;
44
45  btn_sel_dat.Caption    := 'Selected files' + CrLf + '(dat contents only)';
46  btn_sel_datraw.Caption := 'Selected files' + CrLf + '(dat+raw contents)';
47  btn_sel_datraw_convert.Caption :=
48    'Selected files' + CrLf + '(dat+raw contents)' + CrLf + '(with convert if possible)';
49  btn_all_dat.Caption    := 'All files in list' + CrLf + '(dat contents only)';
50  btn_all_datraw.Caption := 'All files in list' + CrLf + '(dat+raw contents)';
51  btn_all_datraw_convert.Caption :=
52    'All files in list' + CrLf + '(dat+raw contents)' + CrLf + '(with convert if possible)';
53  btn_sel_files_toone.Caption := 'Selected files' + CrLf + '(dat contents only)';
54  btn_all_files_toone.Caption := 'All files in list' + CrLf + '(dat contents only)';
55end;
56
57procedure TForm_Extractor.btn_abortClick(Sender: TObject);
58begin
59  ShowMessage('X');
60end;
61
62procedure TForm_Extractor.Extract(Sender: TObject);
63var
64  sel_only:  Boolean;
65  dat_only:  Boolean;
66  convert:   Boolean;
67  one_file:  Boolean;
68  settings:  TExportSet;
69  files:     LongWord;
70  i, done:   LongWord;
71  begintime: Double;
72begin
73  sel_only := Pos('sel', TButton(Sender).Name) > 0;
74  dat_only := not (Pos('datraw', TButton(Sender).Name) > 0);
75  convert  := Pos('convert', TButton(Sender).Name) > 0;
76  one_file := Pos('toone', TButton(Sender).Name) > 0;
77  if dat_only then
78    settings := [DO_dat]
79  else
80    settings := [DO_dat, DO_raw];
81  if convert then
82    settings := settings + [DO_convert];
83  if one_file then
84    settings := settings + [DO_toone];
85  progress.Position := 0;
86
87  if saved.Execute then
88  begin
89    begintime := Time;
90    group_progress.Visible := True;
91    panel_files.Enabled := False;
92    group_singlefiles.Enabled := False;
93    group_onefile.Enabled := False;
94    lbl_estimated.Caption := 'Estimated finishing time: unknown';
95    if one_file then
96    begin
97      if FileExists(saved.FileName) then
98      begin
99        if MessageBox(Self.Handle, PChar(
100          'File already exists. Do you want to overwrite it?'), PChar('Warning!'), MB_YESNO) =
101          ID_YES then
102        begin
103          DeleteFile(saved.FileName);
104        end
105        else
106        begin
107          group_progress.Visible    := False;
108          panel_files.Enabled      := True;
109          group_singlefiles.Enabled := True;
110          group_onefile.Enabled     := True;
111          Exit;
112        end;
113      end;
114      i := FileCreate(saved.FileName);
115      FileClose(i);
116      i := 0;
117    end;
118    if sel_only then
119    begin
120      files := filelist.SelCount;
121      lbl_progress.Caption := 'Files done: 0/' + IntToStr(files);
122      progress.Max := files;
123      done  := 0;
124      for i := 0 to filelist.Count - 1 do
125      begin
126        if filelist.Selected[i] then
127        begin
128          if one_file then
129          begin
130            ExportFile(OniDataConnection.ExtractFileID(
131              filelist.Items.Strings[filelist.ItemIndex]), ExtractFileName(saved.FileName),
132              settings, ExtractFileDir(saved.FileName));
133          end
134          else
135          begin
136            ExportFile(OniDataConnection.ExtractFileID(
137              filelist.Items.Strings[filelist.ItemIndex]), filelist.Items.Strings[i], settings, 'D:');
138          end;
139          Inc(done);
140        end;
141        if ((done mod 10) = 0) and (done >= 50) then
142          lbl_estimated.Caption := 'Estimated finishing time: ' + TimeToStr(
143            (Time - begintime) / done * files + begintime);
144        if (i mod 10) = 0 then
145        begin
146          progress.Position    := done;
147          lbl_progress.Caption := 'Files done: ' + IntToStr(done) + '/' + IntToStr(files);
148          Application.ProcessMessages;
149        end;
150      end;
151    end
152    else
153    begin
154      files := filelist.Count;
155      lbl_progress.Caption := 'Files done: 0/' + IntToStr(files);
156      progress.Max := files;
157      for i := 0 to filelist.Count - 1 do
158      begin
159        if one_file then
160        begin
161          ExportFile(OniDataConnection.ExtractFileID(
162            filelist.Items.Strings[filelist.ItemIndex]), ExtractFileName(saved.FileName),
163            settings, ExtractFileDir(saved.FileName));
164        end
165        else
166        begin
167          ExportFile(OniDataConnection.ExtractFileID(
168            filelist.Items.Strings[filelist.ItemIndex]), filelist.Items.Strings[i], settings, 'D:');
169        end;
170        if ((i mod 10) = 0) and (i >= 50) then
171          lbl_estimated.Caption := 'Estimated finishing time: ' + TimeToStr(
172            (Time - begintime) / i * files + begintime);
173        if (i mod 5) = 0 then
174        begin
175          progress.Position    := i;
176          lbl_progress.Caption := 'Files done: ' + IntToStr(i) + '/' + IntToStr(files);
177          Application.ProcessMessages;
178        end;
179      end;
180    end;
181    group_progress.Visible    := False;
182    panel_files.Enabled      := True;
183    group_singlefiles.Enabled := True;
184    group_onefile.Enabled     := True;
185  end;
186end;
187
188begin
189  AddToolListEntry('extractor', 'Extractor', '');
190end.
Note: See TracBrowser for help on using the repository browser.