source: oup/current/Main.pas @ 45

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