source: oup/current/Main.pas @ 46

Last change on this file since 46 was 46, checked in by alloc, 16 years ago
File size: 16.1 KB
Line 
1unit Main;
2
3interface
4
5uses
6  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7  Dialogs, StdCtrls, StrUtils, Clipbrd, ExtCtrls, ComCtrls, Menus, Grids,
8  MPHexEditor, ToolWin, ImgList, Tabs,
9  MDITab, TB2Item, TB2Dock, TB2Toolbar, TB2MDI,
10  Data, Functions, DataStructures, OniDataClass, Exporters,
11  Helper_LevelDB, Settings, Template,
12  BinEdit, Extractor, Preview, RawEdit, TxmpReplace;
13
14type
15  TForm_Main = class(TForm)
16    saved:      TSaveDialog;
17    opend:      TOpenDialog;
18    statbar:    TStatusBar;
19    MenuImages: TImageList;
20    DockTop:    TTBDock;
21    MainMenu:   TTBToolbar;
22    menu_main:  TTBSubmenuItem;
23    menu_loadfile: TTBItem;
24    menu_sep1:  TTBSeparatorItem;
25    menu_settings: TTBItem;
26    menu_sep4:  TTBSeparatorItem;
27    menu_exit:  TTBItem;
28    menu_convert: TTBSubmenuItem;
29    menu_createdb: TTBItem;
30    menu_createlvl: TTBItem;
31    menu_tools: TTBSubmenuItem;
32    menu_preview: TTBItem;
33    menu_binedit: TTBItem;
34    menu_rawedit: TTBItem;
35    menu_txmpreplace: TTBItem;
36    menu_extractor: TTBItem;
37    menu_filecompare: TTBItem;
38    menu_levelstructedit: TTBItem;
39    menu_windows: TTBSubmenuItem;
40    menu_windows_cascade: TTBItem;
41    menu_windows_tile: TTBItem;
42    menu_windows_closeall: TTBItem;
43    menu_sep3:  TTBSeparatorItem;
44    menu_windows_next: TTBItem;
45    menu_windows_previous: TTBItem;
46    menu_sep2:  TTBSeparatorItem;
47    menu_About: TTBItem;
48    Toolbar:    TTBToolbar;
49    tbOpen:     TTBItem;
50    DockLeft:   TTBDock;
51    DockRight:  TTBDock;
52    DockBottom: TTBDock;
53    MDIToolbar: TTBToolbar;
54    TBControlItem1: TTBControlItem;
55    MDITab:     TMDITab;
56    menu_view:  TTBSubmenuItem;
57    menu_view_mdibar: TTBItem;
58    menu_view_statusbar: TTBItem;
59    menu_view_toolbar: TTBItem;
60    tb_separator1: TTBSeparatorItem;
61    tb_preview: TTBItem;
62    tb_structure: TTBItem;
63    tb_compare: TTBItem;
64    tb_extractor: TTBItem;
65    tb_txmpreplacer: TTBItem;
66    tb_rawedit: TTBItem;
67    tb_datedit: TTBItem;
68    menu_windows_tilevert: TTBItem;
69    function TryCloseAll: Boolean;
70    procedure menu_AboutClick(Sender: TObject);
71    procedure menu_settingsClick(Sender: TObject);
72    procedure menu_filecompareClick(Sender: TObject);
73    procedure menu_raweditClick(Sender: TObject);
74    procedure menu_createlvlClick(Sender: TObject);
75    procedure menu_extractorClick(Sender: TObject);
76    procedure menu_createdbClick(Sender: TObject);
77    procedure menu_windows_previousClick(Sender: TObject);
78    procedure menu_windows_nextClick(Sender: TObject);
79    procedure menu_windows_tileClick(Sender: TObject);
80    function open_child(window_context: String; fileid: Integer): TForm_ToolTemplate;
81    procedure menu_windows_closeallClick(Sender: TObject);
82    procedure menu_windows_cascadeClick(Sender: TObject);
83    procedure menu_bineditClick(Sender: TObject);
84    procedure menu_loadfileClick(Sender: TObject);
85    procedure menu_txmpreplaceClick(Sender: TObject);
86    procedure menu_exitClick(Sender: TObject);
87    procedure menu_previewClick(Sender: TObject);
88    procedure FormClose(Sender: TObject; var Action: TCloseAction);
89    procedure FormResize(Sender: TObject);
90    procedure FormCreate(Sender: TObject);
91    procedure UpdateStatBar;
92    procedure menu_view_mdibarClick(Sender: TObject);
93    procedure menu_view_statusbarClick(Sender: TObject);
94    procedure menu_view_toolbarClick(Sender: TObject);
95    procedure MDITabDrawTab(Control: TCustomTabControl; TabIndex: Integer;
96      const Rect: TRect; Active: Boolean);
97    procedure ActivateTools(active: Boolean);
98    procedure MDITabMouseUp(Sender: TObject; Button: TMouseButton;
99      Shift: TShiftState; X, Y: Integer);
100    procedure menu_windows_tilevertClick(Sender: TObject);
101  private
102  public
103  end;
104
105var
106  Form_Main: TForm_Main;
107
108implementation
109
110{$R *.dfm}
111
112
113
114procedure TForm_Main.FormCreate(Sender: TObject);
115begin
116  Self.Caption := 'Oni Un/Packer ' + version;
117  Self.FormResize(Self);
118
119  if FileExists(ExtractFilepath(Application.EXEname) + '\oniunpacker.ini') then
120  begin
121    AssignFile(AppSettingsFile, ExtractFilepath(Application.EXEname) +
122      '\oniunpacker.ini');
123    Reset(AppSettingsFile);
124    Read(AppSettingsFile, AppSettings);
125    CloseFile(AppSettingsFile);
126  end
127  else
128  begin
129    AppSettings.DatPath     := 'D:\Spiele\Oni\GameDataFolder';
130    AppSettings.ExtractPath := 'C:\Dokumente und Einstellungen\Administrator\Desktop';
131    AppSettings.FilenumbersAsHex := False;
132    AppSettings.CharSet     := DEFAULT_CHARSET;
133    AppSettings.HideUnusedData := False;
134  end;
135
136  if MidStr(ParamStr(1), 1, 3) = 'opf' then
137  begin
138    ShowMessage('Load OPF-File: ' + ParamStr(2));
139  end
140  else if MidStr(ParamStr(1), 1, 4) = 'oldb' then
141  begin
142    if not CreateDataConnection(ParamStr(2), ODB_ADB) then
143      ShowMessage('Error while loading the file:' + CrLf + ParamStr(
144        2) + CrLf + 'Perhaps not an OniUnPacker-LevelDatabase-file?');
145  end
146  else if MidStr(ParamStr(1), 1, 3) = 'dat' then
147  begin
148    if not CreateDataConnection(ParamStr(2), ODB_Dat) then
149      ShowMessage('Error while loading the file:' + CrLf + ParamStr(
150        2) + CrLf + 'Perhaps not an Oni-.dat-file?');
151  end;
152  UpdateStatBar;
153end;
154
155
156
157
158procedure TForm_Main.FormResize(Sender: TObject);
159const
160  MinWidth: Integer  = 750;
161  MinHeight: Integer = 500;
162begin
163  if Self.Width < MinWidth then
164    Self.Width := MinWidth;
165  if Self.Height < MinHeight then
166    Self.Height := MinHeight;
167  statbar.Panels.Items[0].Width := Self.Width - 200;
168  MDITab.Width := Self.Width - 20;
169end;
170
171
172
173
174procedure TForm_Main.MDITabDrawTab(Control: TCustomTabControl;
175  TabIndex: Integer; const Rect: TRect; Active: Boolean);
176var
177  x, y: Integer;
178  iconindex: Integer;
179  caption: String;
180begin
181  iconindex := TMDITab(Control).Glyphs[TabIndex];
182  caption := TMDITab(Control).Captions[TabIndex];
183  if active then
184  begin
185    Control.Canvas.Font.Style := Control.Canvas.Font.Style + [fsItalic];
186    y := Rect.Top + 1;
187  end else
188    y := Rect.Top;
189  if iconindex >= 0 then
190  begin
191    TMDITab(Control).Images.Draw(Control.Canvas, Rect.Left + 4, y, iconindex);
192    x := Rect.Left + 26;
193  end else
194    x := Rect.Left + 4;
195  Control.Canvas.TextOut(x, y + 2, caption);
196end;
197
198
199
200
201
202
203procedure TForm_Main.MDITabMouseUp(Sender: TObject; Button: TMouseButton;
204  Shift: TShiftState; X, Y: Integer);
205var
206  pt: TPoint;
207  index: Integer;
208begin
209  pt.X := X;
210  pt.Y := Y;
211  index := MDITab.GetTabAtPos(pt);
212  if (Button = mbRight) and (index >= 0) then
213    MDITab.MDIChildren[index].Close;
214end;
215
216procedure TForm_Main.FormClose(Sender: TObject; var Action: TCloseAction);
217begin
218  AssignFile(AppSettingsFile, ExtractFilepath(Application.EXEname) + '\oniunpacker.ini');
219  if FileExists(ExtractFilepath(Application.EXEname) + '\oniunpacker.ini') then
220    Reset(AppSettingsFile)
221  else
222    Rewrite(AppSettingsFile);
223  Write(AppSettingsFile, AppSettings);
224  CloseFile(AppSettingsFile);
225  Action := caFree;
226end;
227
228
229
230procedure TForm_Main.ActivateTools(active: Boolean);
231begin
232  menu_tools.Enabled := active;
233  tb_preview.Enabled := active;
234  tb_datedit.Enabled := active;
235  tb_rawedit.Enabled := active;
236  tb_txmpreplacer.Enabled := active;
237  tb_extractor.Enabled := active;
238//  tb_compare.Enabled := active;
239//  tb_structure.Enabled := active;
240end;
241
242procedure TForm_Main.UpdateStatBar;
243begin
244  if Assigned(OniDataConnection) then
245  begin
246    Self.Caption      := 'Oni Un/Packer ' + version + ' (' + ExtractFileName(
247      OniDataConnection.FileName) + ')';
248    ActivateTools(True);
249    statbar.Panels.Items[1].Text := 'Files: ' + IntToStr(OniDataConnection.GetFilesCount);
250    statbar.Panels.Items[2].Text :=
251      'Extensions: ' + IntToStr(Length(OniDataConnection.GetExtensionsList));
252    case OniDataConnection.Backend of
253      ODB_Dat:
254        begin
255          statbar.Panels.Items[0].Text := '.dat loaded: ' + OniDataConnection.FileName;
256        end;
257      ODB_ADB:
258        begin
259          statbar.Panels.Items[0].Text := 'OLDB loaded: ' + OniDataConnection.FileName;
260        end;
261    else
262      Self.Caption      := 'Oni Un/Packer ' + version;
263      statbar.Panels.Items[0].Text := 'Nothing loaded';
264      statbar.Panels.Items[1].Text := 'Files: -';
265      statbar.Panels.Items[2].Text := 'Extensions: -';
266      ActivateTools(False);
267    end;
268  end
269  else
270  begin
271    Self.Caption      := 'Oni Un/Packer ' + version;
272    statbar.Panels.Items[0].Text := 'Nothing loaded';
273    statbar.Panels.Items[1].Text := 'Files: -';
274    statbar.Panels.Items[2].Text := 'Extensions: -';
275    ActivateTools(False);
276  end;
277end;
278
279
280
281
282function TForm_Main.TryCloseAll: Boolean;
283begin
284  menu_windows_closeallClick(Self);
285  Application.ProcessMessages;
286  if MDITab.MDIChildCount = 0 then
287    Result := True
288  else
289    Result := False;
290end;
291
292
293 {#################################}
294 {##### Main-Menu-Handlers    #####}
295 {#################################}
296procedure TForm_Main.menu_loadfileClick(Sender: TObject);
297var
298  ext: String;
299begin
300  if TryCloseAll then
301  begin
302    CloseDataConnection;
303    opend.InitialDir := AppSettings.DatPath;
304    opend.Filter     := 'Compatible level files|*.dat;*.oldb|Oni level (*.dat)|*.dat|OUP level database (*.oldb)|*.oldb|Any (*.*)|*';
305    if opend.Execute then
306    begin
307      ext := ExtractFileExt(opend.FileName);
308      if ext = '.dat' then
309      begin
310        if not CreateDataConnection(opend.FileName, ODB_Dat) then
311          ShowMessage('Error while loading the file:' + CrLf + opend.FileName +
312            CrLf + 'Perhaps not an Oni-.dat-file?');
313      end else if ext = '.oldb' then
314      begin
315        if not CreateDataConnection(opend.FileName, ODB_ADB) then
316          ShowMessage('Error while loading the file:' + CrLf + opend.FileName +
317            CrLf + 'Perhaps not an OniUnPacker-LevelDatabase-file?');
318      end else
319        ShowMessage('Incompatible file');
320      AppSettings.DatPath := ExtractFilepath(opend.FileName);
321    end;
322  end;
323  UpdateStatBar;
324end;
325
326
327
328
329procedure TForm_Main.menu_settingsClick(Sender: TObject);
330begin
331  Form_Settings.Visible := True;
332  Self.Enabled   := False;
333end;
334
335
336
337
338procedure TForm_Main.menu_exitClick(Sender: TObject);
339begin
340  Self.Close;
341end;
342
343 {####################################}
344 {##### Converters-Menu-Handlers #####}
345 {####################################}
346procedure TForm_Main.menu_createdbClick(Sender: TObject);
347begin
348  if Assigned(OniDataConnection) then
349    if MessageBox(Self.Handle, PChar('You have currently opened a level-file. ' +
350          'Do you want to close it to continue?'), PChar('Close file?'),
351          MB_YESNO + MB_ICONQUESTION) = ID_NO then
352      Exit
353    else begin
354      if TryCloseAll then
355      begin
356        CloseDataConnection;
357        UpdateStatBar;
358      end else
359        Exit;
360    end;
361  opend.Filter     := 'Oni-Dat-Files|*.dat';
362  saved.Filter     := 'OUP-Level-DB (*.oldb)|*.oldb';
363  saved.DefaultExt := 'oldb';
364  if opend.Execute then
365    if saved.Execute then
366      Form_LevelDB.CreateDatabase(opend.FileName, saved.FileName);
367end;
368
369
370
371
372procedure TForm_Main.menu_createlvlClick(Sender: TObject);
373begin
374  if Assigned(OniDataConnection) then
375    if MessageBox(Self.Handle, PChar('You have currently opened a level-file. ' +
376          'Do you want to close it to continue?'), PChar('Close file?'),
377          MB_YESNO + MB_ICONQUESTION) = ID_NO then
378      Exit
379    else begin
380      if TryCloseAll then
381      begin
382        CloseDataConnection;
383        UpdateStatBar;
384      end else
385        Exit;
386    end;
387  opend.Filter     := 'OUP-Level-DB (*.oldb)|*.oldb';
388  saved.Filter     := 'Oni-Dat-Files|*.dat';
389  saved.DefaultExt := 'dat';
390  if opend.Execute then
391    if saved.Execute then
392      Form_LevelDB.CreateLevel(opend.FileName, saved.FileName);
393end;
394
395 {#################################}
396 {##### Tools-Menu-Handlers   #####}
397 {#################################}
398procedure TForm_Main.menu_previewClick(Sender: TObject);
399begin
400  open_child('preview', -1);
401end;
402
403
404procedure TForm_Main.menu_txmpreplaceClick(Sender: TObject);
405begin
406  open_child('txmpreplace', -1);
407end;
408
409
410procedure TForm_Main.menu_bineditClick(Sender: TObject);
411begin
412  open_child('binedit', -1);
413end;
414
415
416procedure TForm_Main.menu_raweditClick(Sender: TObject);
417begin
418  open_child('rawedit', -1);
419end;
420
421
422procedure TForm_Main.menu_extractorClick(Sender: TObject);
423begin
424  open_child('extractor', -1);
425end;
426
427
428procedure TForm_Main.menu_filecompareClick(Sender: TObject);
429begin
430  open_child('compare', -1);
431end;
432
433
434 {#################################}
435 {#####   View-Menu-Handlers  #####}
436 {#################################}
437procedure TForm_Main.menu_view_mdibarClick(Sender: TObject);
438begin
439  menu_view_mdibar.Checked := not menu_view_mdibar.Checked;
440  mditoolbar.Visible := menu_view_mdibar.Checked;
441end;
442
443
444
445
446procedure TForm_Main.menu_view_statusbarClick(Sender: TObject);
447begin
448  menu_view_statusbar.Checked := not menu_view_statusbar.Checked;
449  statbar.Visible := menu_view_statusbar.Checked;
450end;
451
452
453
454
455procedure TForm_Main.menu_view_toolbarClick(Sender: TObject);
456begin
457  menu_view_toolbar.Checked := not menu_view_toolbar.Checked;
458  Toolbar.Visible := menu_view_toolbar.Checked;
459end;
460
461
462
463 {#################################}
464 {#####  Window-Menu-Handlers #####}
465 {#################################}
466procedure TForm_Main.menu_windows_cascadeClick(Sender: TObject);
467begin
468  Self.Cascade;
469end;
470
471
472
473procedure TForm_Main.menu_windows_tileClick(Sender: TObject);
474begin
475  Self.TileMode := tbHorizontal;
476  Self.Tile;
477end;
478
479procedure TForm_Main.menu_windows_tilevertClick(Sender: TObject);
480begin
481  Self.TileMode := tbVertical;
482  Self.Tile;
483end;
484
485
486procedure TForm_Main.menu_windows_closeallClick(Sender: TObject);
487begin
488  MDITab.CloseAll;
489end;
490
491
492
493procedure TForm_Main.menu_windows_nextClick(Sender: TObject);
494begin
495  if MDIChildCount > 1 then
496    if MDITab.TabIndex = MDITab.MDIChildCount - 1 then
497      MDITab.MDIChildren[0].BringToFront
498    else
499      MDITab.MDIChildren[MDITab.TabIndex + 1].BringToFront;
500end;
501
502
503
504procedure TForm_Main.menu_windows_previousClick(Sender: TObject);
505begin
506  if MDIChildCount > 1 then
507    if MDITab.TabIndex = 0 then
508      MDITab.MDIChildren[MDITab.MDIChildCount - 1].BringToFront
509    else
510      MDITab.MDIChildren[MDITab.TabIndex - 1].BringToFront;
511end;
512
513
514
515
516
517
518procedure TForm_Main.menu_AboutClick(Sender: TObject);
519begin
520  ShowMessage('Will be implemented later ;)');
521end;
522
523
524
525
526function TForm_Main.open_child(window_context: String; fileid: Integer): TForm_ToolTemplate;
527var
528  toolform: TForm_ToolTemplate;
529  i:       Integer;
530  tag:     Integer;
531  iconindex: Integer;
532begin
533  Result := nil;
534
535  tag := 1;
536  if MDIChildCount > 0 then
537    for i := 0 to MDIChildCount - 1 do
538      if MDIChildren[i].Tag >= tag then
539        tag := MDIChildren[i].Tag + 1;
540
541  iconindex := -1;
542
543  if window_context = 'binedit' then
544  begin
545    toolform         := TForm_BinEdit.Create(Self);
546    toolform.Caption := 'Binary .dat-Editor ' + IntToStr(tag);
547    iconindex        := 4;
548  end;
549  if window_context = 'extractor' then
550  begin
551    toolform         := TForm_Extractor.Create(Self);
552    toolform.Caption := 'Extractor ' + IntToStr(tag);
553    iconindex        := 7;
554  end;
555  if window_context = 'preview' then
556  begin
557    toolform         := TForm_Preview.Create(Self);
558    toolform.Caption := 'Preview-Window ' + IntToStr(tag);
559    iconindex        := 3;
560  end;
561  if window_context = 'rawedit' then
562  begin
563    toolform         := TForm_RawEdit.Create(Self);
564    toolform.Caption := 'Binary .raw-Editor ' + IntToStr(tag);
565    iconindex        := 5;
566  end;
567  if window_context = 'txmpreplace' then
568  begin
569    toolform         := TForm_TxmpReplace.Create(Application);
570    toolform.Caption := 'TXMP Replacer ' + IntToStr(tag);
571    iconindex        := 6;
572  end;
573
574  if Assigned(toolform) then
575  begin
576    toolform.Name    := window_context + IntToStr(tag);
577    toolform.Tag     := tag;
578    MDITab.AddTab(TForm(toolform), iconindex);
579    if fileid > -1 then
580      toolform.SelectFileID(fileid);
581    Result := toolform;
582  end;
583end;
584
585end.
Note: See TracBrowser for help on using the repository browser.