source: oup/current/Tool_Template.pas @ 45

Last change on this file since 45 was 45, checked in by alloc, 17 years ago
File size: 10.0 KB
Line 
1unit Tool_Template;
2
3interface
4
5uses
6  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7  Dialogs, ExtCtrls, StdCtrls, StrUtils,
8  Code_OniDataClass, Code_Functions, Data, Menus;
9
10type
11  TNewFileSelectedEvent = procedure(fileinfo: TFileInfo) of object;
12
13  TForm_ToolTemplate = class(TForm)
14    panel_files: TPanel;
15    filelist: TListBox;
16    panel_extension: TPanel;
17    label_ext: TLabel;
18    combo_extension: TComboBox;
19    check_zerobyte: TCheckBox;
20    edit_filtername: TEdit;
21    check_filtername: TCheckBox;
22    Splitter1: TSplitter;
23    content: TPanel;
24    filepopup: TPopupMenu;
25    popup_import: TMenuItem;
26    popup_export: TMenuItem;
27    popup_separator: TMenuItem;
28    importd: TOpenDialog;
29    exportd: TSaveDialog;
30    procedure RecreateList;
31    procedure LoadFileNames;
32    procedure SelectFileName(filename: String);
33    procedure SelectFileID(id: Integer);
34    procedure check_filternameClick(Sender: TObject);
35    procedure check_zerobyteClick(Sender: TObject);
36    procedure combo_extensionClick(Sender: TObject);
37    procedure listClick(Sender: TObject);
38    procedure listMouseDown(Sender: TObject; Button: TMouseButton;
39      Shift: TShiftState; X, Y: Integer);
40
41    procedure FormResize(Sender: TObject);
42    procedure FormCreate(Sender: TObject);
43    procedure FormClose(Sender: TObject; var Action: TCloseAction);
44    procedure popup_importClick(Sender: TObject);
45    procedure popup_exportClick(Sender: TObject);
46    procedure popup_opentool(Sender: TObject);
47    procedure filepopupPopup(Sender: TObject);
48  private
49    FOnNewFileSelected: TNewFileSelectedEvent;
50    FAllowedExts: String;
51    FAllowMultiSelect: Boolean;
52    procedure SetAllowedExts(exts: String);
53    procedure SetMultiSelect(allow: Boolean);
54  public
55    constructor Create(AOwner: TComponent); override;
56  published
57    property OnNewFileSelected: TNewFileSelectedEvent read FOnNewFileSelected write FOnNewFileSelected;
58    property AllowedExts: String read FAllowedExts write SetAllowedExts;
59    property AllowMultiSelect: Boolean read FAllowMultiSelect write SetMultiSelect;
60  end;
61
62var
63  ToolList: TToolList;
64procedure AddToolListEntry(context, name, exts: String);
65
66implementation
67{$R *.dfm}
68uses Main, Code_Exporters;
69
70
71procedure TForm_ToolTemplate.RecreateList;
72var
73  i:    LongWord;
74  exts: TStringArray;
75begin
76  combo_extension.Items.Clear;
77  combo_extension.Items.Add('_All files_ (' +
78    IntToStr(OniDataConnection.GetFilesCount) + ')');
79  exts := OniDataConnection.GetExtensionsList;
80  for i := 0 to High(exts) do
81    if Length(FAllowedExts) > 0 then
82    begin
83      if Pos(MidStr(exts[i],1,4), FAllowedExts) > 0 then
84      begin
85        combo_extension.Items.Add(exts[i]);
86      end;
87    end else
88      combo_extension.Items.Add(exts[i]);
89  combo_extension.ItemIndex := 0;
90  combo_extensionClick(Self);
91end;
92
93
94
95
96procedure TForm_ToolTemplate.LoadFileNames;
97var
98  Extension: String;
99  no_zero_bytes: Boolean;
100  pattern: String;
101  files: TStringArray;
102  i: LongWord;
103begin
104  Extension := MidStr(combo_extension.Items.Strings[combo_extension.ItemIndex], 1, 4);
105  no_zero_bytes := not check_zerobyte.Checked;
106  pattern := '';
107  if check_filtername.Checked then
108    pattern := edit_filtername.Text;
109  if Extension = '_All' then
110    if Length(FAllowedExts) > 0 then
111      Extension := FAllowedExts
112    else
113      Extension := '';
114
115  files := OniDataConnection.GetFilesList(extension, pattern, no_zero_bytes);
116
117  filelist.Visible := False;
118  filelist.Items.Clear;
119  if Length(files) > 0 then
120    for i := 0 to High(files) do
121      filelist.Items.Add(files[i]);
122  filelist.Visible := True;
123end;
124
125
126procedure TForm_ToolTemplate.popup_exportClick(Sender: TObject);
127var
128  id: Integer;
129  ext: String;
130begin
131  id := OniDataConnection.ExtractFileID(filelist.Items.Strings[filelist.ItemIndex]);
132  ext := RightStr(filelist.Items.Strings[filelist.ItemIndex], 4);
133  exportd.Filter := 'Files of matching extension (*.' + ext + ')|*.' + ext + '|All files|*.*';
134  exportd.DefaultExt := ext;
135  if exportd.Execute then
136    ExportDatFile(id, exportd.FileName);
137end;
138
139procedure TForm_ToolTemplate.popup_importClick(Sender: TObject);
140var
141  id: Integer;
142  finfo: TFileInfo;
143  fs: TFileStream;
144  data: TData;
145begin
146  id := OniDataConnection.ExtractFileID(filelist.Items.Strings[filelist.ItemIndex]);
147  finfo := OniDataConnection.GetFileInfo(id);
148
149  importd.Filter := 'Files of matching extension (*.' + finfo.Extension + ')|*.' +
150        finfo.Extension + '|All files|*.*';
151  if importd.Execute then
152  begin
153    fs := TFileStream.Create(importd.FileName, fmOpenRead);
154    if fs.Size <> finfo.Size then
155      ShowMessage('Can''t import ' + ExtractFilename(importd.FileName) +
156        ', file has to have same size as file in .dat.' + CrLf +
157        'Size of file in .dat: ' + FormatFileSize(finfo.Size) + CrLf +
158        'Size of chosen file: ' + FormatFileSize(fs.Size))
159    else begin
160      SetLength(data, fs.Size);
161      fs.Read(data[0], fs.Size);
162      OniDataConnection.UpdateDatFile(id, data);
163      Self.listClick(Self);
164    end;
165    fs.Free;
166  end;
167end;
168
169procedure TForm_ToolTemplate.popup_opentool(Sender: TObject);
170var
171  sender_name, context: String;
172  id: Integer;
173begin
174  sender_name := TComponent(Sender).Name;
175  id := OniDataConnection.ExtractFileID(filelist.Items.Strings[filelist.ItemIndex]);
176  context := MidStr(sender_name, Pos('_', sender_name) + 1, Length(sender_name) - Pos('_', sender_name));
177  Form_Main.open_child(context, id);
178end;
179
180procedure TForm_ToolTemplate.combo_extensionClick(Sender: TObject);
181begin
182  LoadFileNames;
183end;
184
185
186constructor TForm_ToolTemplate.Create(AOwner: TComponent);
187var
188  i: Integer;
189  item: TMenuItem;
190begin
191  inherited;
192  RecreateList;
193  if Length(ToolList) > 0 then
194  begin
195    for i := 0 to High(ToolList) do
196    begin
197      item := TMenuItem.Create(filepopup);
198      item.Name := 'popup_' + ToolList[i].context;
199      item.Caption := 'Open with ' + ToolList[i].name;
200      item.OnClick := Self.popup_opentool;
201      filepopup.Items.Insert(i, item);
202    end;
203  end;
204end;
205
206procedure TForm_ToolTemplate.filepopupPopup(Sender: TObject);
207var
208  ext: String;
209  i: Integer;
210begin
211  ext := RightStr(filelist.Items.Strings[filelist.ItemIndex], 4);
212  for i := 0 to High(ToolList) do
213  begin
214    filepopup.Items.Items[i].Enabled := True;
215    if Length(ToolList[i].exts) > 0 then
216      if Pos(ext, ToolList[i].exts) = 0 then
217        filepopup.Items.Items[i].Enabled := False;
218  end;
219end;
220
221procedure TForm_ToolTemplate.check_zerobyteClick(Sender: TObject);
222begin
223  LoadFileNames;
224end;
225
226procedure TForm_ToolTemplate.check_filternameClick(Sender: TObject);
227begin
228  edit_filtername.Enabled := not check_filtername.Checked;
229  LoadFileNames;
230end;
231
232procedure TForm_ToolTemplate.listClick(Sender: TObject);
233var
234  fileid: Integer;
235begin
236  if filelist.ItemIndex > -1 then
237  begin
238    fileid := OniDataConnection.ExtractFileID(
239          filelist.Items.Strings[filelist.ItemIndex]);
240    if Assigned(FOnNewFileSelected) then
241      FOnNewFileSelected(OniDataConnection.GetFileInfo(fileid));
242  end;
243end;
244
245procedure TForm_ToolTemplate.listMouseDown(Sender: TObject; Button: TMouseButton;
246  Shift: TShiftState; X, Y: Integer);
247var
248  pt: TPoint;
249begin
250  pt.X := x;
251  pt.Y := y;
252  filelist.ItemIndex := filelist.ItemAtPos(pt, true);
253  Self.listClick(Self);
254end;
255
256
257
258procedure TForm_ToolTemplate.SelectFileID(id: Integer);
259var
260  i: Integer;
261begin
262  filelist.ItemIndex := -1;
263  if filelist.Items.Count > 0 then
264    for i := 0 to filelist.Items.Count - 1 do
265      if OniDataConnection.ExtractFileID(filelist.Items.Strings[i]) = id then
266      begin
267        filelist.ItemIndex := i;
268        Break;
269      end;
270  Self.listClick(Self);
271end;
272
273procedure TForm_ToolTemplate.SelectFileName(filename: String);
274var
275  i: Integer;
276begin
277  filelist.ItemIndex := -1;
278  if filelist.Items.Count > 0 then
279    for i := 0 to filelist.Items.Count - 1 do
280      if filelist.Items.Strings[i] = filename then
281        filelist.ItemIndex := i;
282  Self.listClick(Self);
283end;
284
285procedure TForm_ToolTemplate.SetAllowedExts(exts: String);
286begin
287  FAllowedExts := exts;
288  RecreateList;
289end;
290
291procedure TForm_ToolTemplate.SetMultiSelect(allow: Boolean);
292begin
293  FAllowMultiSelect := allow;
294  filelist.MultiSelect := allow;
295end;
296
297
298procedure TForm_ToolTemplate.FormResize(Sender: TObject);
299begin
300  if Self.Width < 300 then
301    Self.Width := 300;
302  if Self.Height < 200 then
303    Self.Height := 200;
304end;
305
306
307
308procedure TForm_ToolTemplate.FormCreate(Sender: TObject);
309begin
310  Self.Width  := 260;
311  Self.Height := 300;
312  FOnNewFileSelected := nil;
313  FAllowedExts := '';
314  FAllowMultiSelect := False;
315end;
316
317procedure TForm_ToolTemplate.FormClose(Sender: TObject; var Action: TCloseAction);
318begin
319  Action := caFree;
320end;
321
322
323procedure AddToolListEntryExt(context, ext: String);
324var
325  i: Integer;
326begin
327  for i := 0 to High(ToolList) do
328    if ToolList[i].context = context then
329    begin
330      if Pos(ext, ToolList[i].exts) = 0 then
331      begin
332        if Length(ToolList[i].exts) = 0 then
333          ToolList[i].exts := ext
334        else
335          ToolList[i].exts := ToolList[i].exts + ',' + ext;
336      end;
337      Exit;
338    end;
339end;
340
341procedure AddToolListEntry(context, name, exts: String);
342var
343  i: Integer;
344begin
345  if Length(ToolList) > 0 then
346  begin
347    for i := 0 to High(ToolList) do
348      if ToolList[i].context = context then
349      begin
350        if (Length(ToolList[i].name) = 0) and (Length(name) > 0) then
351          ToolList[i].name := name;
352        if Length(exts) > 0 then
353          AddToolListEntryExt(context, exts);
354        Exit;
355      end;
356  end;
357  SetLength(ToolList, Length(ToolList) + 1);
358  for i := High(ToolList) downto 1 do
359    if ToolList[i - 1].name > name then
360      ToolList[i] := ToolList[i - 1]
361    else
362      Break;
363  ToolList[i].context := context;
364  ToolList[i].name := name;
365  ToolList[i].exts := exts;
366end;
367
368end.
Note: See TracBrowser for help on using the repository browser.