source: oup/releases/0.31a/Unit1_main.pas @ 34

Last change on this file since 34 was 34, checked in by alloc, 16 years ago
File size: 16.4 KB
Line 
1UNIT Unit1_main;
2INTERFACE
3USES
4  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
5  Dialogs, StdCtrls, StrUtils, Clipbrd, ExtCtrls, ComCtrls, Menus, Grids,
6  MPHexEditor, ToolWin, ImgList, Tabs,
7  Unit2_functions, Unit3_data, Unit9_data_structures,
8  Unit10_leveldb, Unit4_exporters, Unit14_settings,
9  Unit5_preview, Unit7_txmpreplace, Unit8_binedit, Unit11_extractor, Unit13_rawedit,
10  Unit15_Classes;
11
12TYPE
13  TForm1 = Class(TForm)
14    tabs: TTabSet;
15    saved: TSaveDialog;
16    opend: TOpenDialog;
17    statbar: TStatusBar;
18    menu: TMainMenu;
19    menu_main: TMenuItem;
20    menu_loaddat: TMenuItem;
21    menu_lvldb: TMenuItem;
22    menu_exit: TMenuItem;
23    menu_convert: TMenuItem;
24    menu_createdb: TMenuItem;
25    menu_createlvl: TMenuItem;
26    menu_tools: TMenuItem;
27    menu_preview: TMenuItem;
28    menu_txmpreplace: TMenuItem;
29    menu_binedit: TMenuItem;
30    menu_extractor: TMenuItem;
31    menu_windows: TMenuItem;
32    menu_windows_cascade: TMenuItem;
33    menu_windows_tile: TMenuItem;
34    menu_windows_closeall: TMenuItem;
35    menu_windows_next: TMenuItem;
36    menu_windows_previous: TMenuItem;
37    menu_sep1: TMenuItem;
38    menu_sep2: TMenuItem;
39    menu_sep3: TMenuItem;
40    menu_levelstructedit: TMenuItem;
41    menu_rawedit: TMenuItem;
42    menu_filecompare: TMenuItem;
43    menu_CloseFileDB: TMenuItem;
44    menu_sep4: TMenuItem;
45    menu_settings: TMenuItem;
46    menu_About: TMenuItem;
47    FUNCTION TryCloseAll:Boolean;
48    procedure menu_AboutClick(Sender: TObject);
49    PROCEDURE menu_settingsClick(Sender: TObject);
50    PROCEDURE menu_CloseFileDBClick(Sender: TObject);
51    PROCEDURE menu_filecompareClick(Sender: TObject);
52    PROCEDURE menu_raweditClick(Sender: TObject);
53    PROCEDURE menu_createlvlClick(Sender: TObject);
54    PROCEDURE menu_extractorClick(Sender: TObject);
55    PROCEDURE menu_lvldbClick(Sender: TObject);
56    PROCEDURE menu_createdbClick(Sender: TObject);
57    PROCEDURE SetActiveWindow(window_name:String);
58    PROCEDURE tabsChange(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);
59    PROCEDURE close_window(window_name:String);
60    PROCEDURE menu_windows_previousClick(Sender: TObject);
61    PROCEDURE menu_windows_nextClick(Sender: TObject);
62    PROCEDURE menu_windows_tileClick(Sender: TObject);
63    FUNCTION open_child(window_context:String):Boolean;
64    PROCEDURE menu_windows_closeallClick(Sender: TObject);
65    PROCEDURE menu_windows_cascadeClick(Sender: TObject);
66    PROCEDURE menu_window_entryClick(Sender: TObject);
67    PROCEDURE menu_bineditClick(Sender: TObject);
68    PROCEDURE menu_loaddatClick(Sender: TObject);
69    PROCEDURE menu_txmpreplaceClick(Sender: TObject);
70    PROCEDURE menu_exitClick(Sender: TObject);
71    PROCEDURE menu_previewClick(Sender: TObject);
72    PROCEDURE FormClose(Sender: TObject; var Action: TCloseAction);
73    PROCEDURE FormResize(Sender: TObject);
74    PROCEDURE FormCreate(Sender: TObject);
75    PROCEDURE UpdateStatBar;
76  PRIVATE
77  PUBLIC
78  END;
79
80VAR
81  Form1: TForm1;
82
83IMPLEMENTATION
84{$R *.dfm}
85VAR
86  tablist:Array OF String;
87
88PROCEDURE TForm1.FormCreate(Sender: TObject);
89  BEGIN
90    Form1.Caption:='Oni Un/Packer '+version;
91    Form1.FormResize(Form1);
92
93    IF FileExists(ExtractFilepath(Application.EXEname)+'\oniunpacker.ini') THEN BEGIN
94      AssignFile(AppSettingsFile,ExtractFilepath(Application.EXEname)+'\oniunpacker.ini');
95      Reset(AppSettingsFile);
96      Read(AppSettingsFile,AppSettings);
97      CloseFile(AppSettingsFile);
98    END ELSE BEGIN
99      AppSettings.DatPath:='D:\Spiele\Oni\GameDataFolder';
100      AppSettings.ExtractPath:='C:\Dokumente und Einstellungen\Administrator\Desktop';
101    END;
102
103    IF MidStr(ParamStr(1),1,3)='opf' THEN BEGIN
104      ShowMessage('Load OPF-File: '+ParamStr(2));
105    END ELSE IF MidStr(ParamStr(1),1,4)='oldb' THEN BEGIN
106      IF NOT CreateDataConnection(ParamStr(2), ODB_ADB) THEN
107        ShowMessage('Error while loading the file:'+CrLf+ParamStr(2)+CrLf+'Perhaps not an OniUnPacker-LevelDatabase-file?');
108    END ELSE IF MidStr(ParamStr(1),1,3)='dat' THEN BEGIN
109      IF NOT CreateDataConnection(ParamStr(2), ODB_Dat) THEN
110        ShowMessage('Error while loading the file:'+CrLf+ParamStr(2)+CrLf+'Perhaps not an Oni-.dat-file?');
111    END;
112    UpdateStatBar;
113  END;
114
115PROCEDURE TForm1.FormResize(Sender: TObject);
116  CONST
117    MinWidth:Integer=750;
118    MinHeight:Integer=500;
119  BEGIN
120    IF Form1.Width<MinWidth THEN Form1.Width:=MinWidth;
121    IF Form1.Height<MinHeight THEN Form1.Height:=MinHeight;
122    Form1.statbar.Panels.Items[0].Width:=Form1.Width-200;
123  END;
124
125PROCEDURE TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
126  BEGIN
127    AssignFile(AppSettingsFile,ExtractFilepath(Application.EXEname)+'\oniunpacker.ini');
128    IF FileExists(ExtractFilepath(Application.EXEname)+'\oniunpacker.ini') THEN
129      Reset(AppSettingsFile)
130    ELSE
131      Rewrite(AppSettingsFile);
132    Write(AppSettingsFile,AppSettings);
133    CloseFile(AppSettingsFile);
134    Action:=caFree;
135  END;
136
137
138PROCEDURE TForm1.UpdateStatBar;
139  BEGIN
140    IF Assigned(OniDataConnection) THEN BEGIN
141      Form1.Caption:='Oni Un/Packer '+version+' ('+ExtractFileName(OniDataConnection.FileName)+')';
142      menu_tools.Enabled:=True;
143      menu_convert.Enabled:=False;
144      statbar.Panels.Items[1].Text:='Files: '+IntToStr(OniDataConnection.GetFilesCount);
145      statbar.Panels.Items[2].Text:='Extensions: '+IntToStr(Length(OniDataConnection.GetExtensionsList));
146      CASE OniDataConnection.Backend OF
147        ODB_Dat:
148          BEGIN
149            statbar.Panels.Items[0].Text:='.dat loaded: '+OniDataConnection.FileName;
150          END;
151        ODB_ADB:
152          BEGIN
153            statbar.Panels.Items[0].Text:='OLDB loaded: '+OniDataConnection.FileName;
154          END;
155      ELSE
156        Form1.Caption:='Oni Un/Packer '+version;
157        statbar.Panels.Items[0].Text:='Nothing loaded';
158        statbar.Panels.Items[1].Text:='Files: -';
159        statbar.Panels.Items[2].Text:='Extensions: -';
160        menu_tools.Enabled:=False;
161        menu_convert.Enabled:=True;
162      END;
163    END ELSE BEGIN
164      Form1.Caption:='Oni Un/Packer '+version;
165      statbar.Panels.Items[0].Text:='Nothing loaded';
166      statbar.Panels.Items[1].Text:='Files: -';
167      statbar.Panels.Items[2].Text:='Extensions: -';
168      menu_tools.Enabled:=False;
169      menu_convert.Enabled:=True;
170    END;
171  END;
172
173
174FUNCTION TForm1.TryCloseAll:Boolean;
175  BEGIN
176    menu_windows_closeallClick(Self);
177    IF Length(tablist)=0 THEN
178      Result:=True
179    ELSE
180      Result:=False;
181  END;
182
183
184{#################################}
185{##### Main-Menu-Handlers    #####}
186{#################################}
187PROCEDURE TForm1.menu_loaddatClick(Sender: TObject);
188  VAR i:LongWord;
189    answer:Boolean;
190  BEGIN
191    IF TryCloseAll THEN BEGIN
192      CloseDataConnection;
193      opend.InitialDir:=AppSettings.DatPath;
194      opend.Filter:='Oni-Dat-Files|*.dat';
195      IF opend.Execute THEN BEGIN
196        IF NOT CreateDataConnection(opend.FileName, ODB_Dat) THEN
197          ShowMessage('Error while loading the file:'+CrLf+opend.FileName+CrLf+'Perhaps not an Oni-.dat-file?');
198        AppSettings.DatPath:=ExtractFilepath(opend.FileName);
199      END;
200    END;
201    UpdateStatBar;
202  END;
203PROCEDURE TForm1.menu_lvldbClick(Sender: TObject);
204  VAR answer:Boolean;
205  BEGIN
206    IF TryCloseAll THEN BEGIN
207      CloseDataConnection;
208      opend.InitialDir:=AppSettings.DatPath;
209      opend.Filter:='OUP-Level-DB (*.oldb)|*.oldb';
210      IF opend.Execute THEN BEGIN
211        IF NOT CreateDataConnection(opend.FileName, ODB_ADB) THEN
212          ShowMessage('Error while loading the file:'+CrLf+opend.FileName+CrLf+'Perhaps not an OniUnPacker-LevelDatabase-file?');
213        AppSettings.DatPath:=ExtractFilepath(opend.FileName);
214      END;
215    END;
216    UpdateStatBar;
217  END;
218PROCEDURE TForm1.menu_CloseFileDBClick(Sender: TObject);
219  BEGIN
220    IF TryCloseAll THEN BEGIN
221      CloseDataConnection;
222      UpdateStatBar;
223    END;
224  END;
225PROCEDURE TForm1.menu_settingsClick(Sender: TObject);
226  BEGIN
227    Form14.Visible:=True;
228    Self.Enabled:=False;
229  END;
230PROCEDURE TForm1.menu_exitClick(Sender: TObject);
231  BEGIN
232    Form1.Close;
233  END;
234
235{####################################}
236{##### Converters-Menu-Handlers #####}
237{####################################}
238PROCEDURE TForm1.menu_createdbClick(Sender: TObject);
239  BEGIN
240    opend.Filter:='Oni-Dat-Files|*.dat';
241    saved.Filter:='OUP-Level-DB (*.oldb)|*.oldb';
242    saved.DefaultExt:='oldb';
243    IF opend.Execute THEN BEGIN
244      IF saved.Execute THEN BEGIN
245        Form10.CreateDatabase(opend.FileName,saved.FileName);
246      END;
247    END;
248  END;
249PROCEDURE TForm1.menu_createlvlClick(Sender: TObject);
250  BEGIN
251    opend.Filter:='OUP-Level-DB (*.oldb)|*.oldb';
252    saved.Filter:='Oni-Dat-Files|*.dat';
253    saved.DefaultExt:='dat';
254    IF opend.Execute THEN BEGIN
255      IF saved.Execute THEN BEGIN
256        Form10.CreateLevel(opend.FileName,saved.FileName);
257      END;
258    END;
259  END;
260
261{#################################}
262{##### Tools-Menu-Handlers   #####}
263{#################################}
264PROCEDURE TForm1.menu_previewClick(Sender: TObject);
265  BEGIN
266    open_child('preview');
267  END;
268PROCEDURE TForm1.menu_txmpreplaceClick(Sender: TObject);
269  BEGIN
270    open_child('txmpreplace');
271  END;
272PROCEDURE TForm1.menu_bineditClick(Sender: TObject);
273  BEGIN
274    open_child('binedit');
275  END;
276PROCEDURE TForm1.menu_raweditClick(Sender: TObject);
277  BEGIN
278    open_child('rawedit');
279  END;
280
281PROCEDURE TForm1.menu_extractorClick(Sender: TObject);
282  BEGIN
283    open_child('extractor');
284  END;
285PROCEDURE TForm1.menu_filecompareClick(Sender: TObject);
286  BEGIN
287    open_child('compare');
288  END;
289
290
291{#################################}
292{#####  Window-Menu-Handlers #####}
293{#################################}
294PROCEDURE TForm1.menu_windows_cascadeClick(Sender: TObject);
295  BEGIN
296    Form1.Cascade;
297  END;
298PROCEDURE TForm1.menu_windows_tileClick(Sender: TObject);
299  BEGIN
300    Form1.TileMode:=tbHorizontal;
301    Form1.Tile;
302  END;
303PROCEDURE TForm1.menu_windows_closeallClick(Sender: TObject);
304  VAR
305    i:Byte;
306  BEGIN
307    IF MDIChildCount>0 THEN BEGIN
308      FOR i:=0 TO MDIChildCount-1 DO BEGIN
309        MDIChildren[i].Close;
310      END;
311    END;
312    tabs.Tabs.Clear;
313  END;
314PROCEDURE TForm1.menu_windows_nextClick(Sender: TObject);
315  VAR i:Byte;
316    first_window:Byte;
317    current_focus:String;
318  BEGIN
319    IF MDIChildCount>1 THEN BEGIN
320      FOR i:=0 TO menu_windows.Count-1 DO BEGIN
321        IF Pos('menu_window_',menu_windows.Items[i].Name)=1 THEN BEGIN
322          first_window:=i;
323          Break;
324        END;
325      END;
326      current_focus:=ActiveMDIChild.Name;
327      FOR i:=first_window TO menu_windows.Count-1 DO
328        IF Pos(current_focus,menu_windows.Items[i].Name)>0 THEN
329          Break;
330      IF i=menu_windows.Count-1 THEN
331        menu_windows.Items[first_window].Click
332      ELSE
333        menu_windows.Items[i+1].Click;
334      FOR i:=0 TO High(tablist) DO BEGIN
335        IF tablist[i]=ActiveMDIChild.Name THEN BEGIN
336          tabs.TabIndex:=i;
337        END;
338      END;
339    END;
340  END;
341PROCEDURE TForm1.menu_windows_previousClick(Sender: TObject);
342  VAR i:Byte;
343    first_window:Byte;
344    current_focus:String;
345  BEGIN
346    IF MDIChildCount>1 THEN BEGIN
347      FOR i:=0 TO menu_windows.Count-1 DO BEGIN
348        IF Pos('menu_window_',menu_windows.Items[i].Name)=1 THEN BEGIN
349          first_window:=i;
350          Break;
351        END;
352      END;
353      current_focus:=ActiveMDIChild.Name;
354      FOR i:=first_window TO menu_windows.Count-1 DO
355        IF Pos(current_focus,menu_windows.Items[i].Name)>0 THEN
356          Break;
357      IF i=first_window THEN
358        menu_windows.Items[menu_windows.Count-1].Click
359      ELSE
360        menu_windows.Items[i-1].Click;
361      FOR i:=0 TO High(tablist) DO BEGIN
362        IF tablist[i]=ActiveMDIChild.Name THEN BEGIN
363          tabs.TabIndex:=i;
364        END;
365      END;
366    END;
367  END;
368
369PROCEDURE TForm1.menu_window_entryClick(Sender: TObject);
370  VAR
371    i:Byte;
372    window_name:String;
373  BEGIN
374    window_name:=MidStr(TComponent(Sender).Name,Pos('window_',TComponent(Sender).Name)+7,Length(TComponent(Sender).Name)-Pos('window_',TComponent(Sender).Name)+7+1);
375    FOR i:=0 TO MDIChildCount-1 DO BEGIN
376      IF MDIChildren[i].Name=window_name THEN BEGIN
377        MDIChildren[i].BringToFront;
378      END;
379    END;
380    FOR i:=0 TO High(tablist) DO BEGIN
381      IF tablist[i]=ActiveMDIChild.Name THEN BEGIN
382        tabs.TabIndex:=i;
383      END;
384    END;
385  END;
386
387procedure TForm1.menu_AboutClick(Sender: TObject);
388  begin
389    ShowMessage('Will be implemented later ;)');
390  end;
391
392
393
394
395FUNCTION TForm1.open_child(window_context:String):Boolean;
396  VAR
397    rawEdit:TForm13;
398    binEdit:TForm8;
399    preview:TForm5;
400    txmpreplacer:TForm7;
401    extractor:TForm11;
402    menu_button:TMenuItem;
403    used:Array[1..9] OF Boolean;
404    i:Byte;
405    caption:String;
406    name:String;
407  BEGIN
408    Result:=True;
409    FOR i:=1 TO 9 DO used[i]:=False;
410    IF MDIChildCount>0 THEN
411      FOR i:=0 TO MDIChildCount-1 DO
412        IF Pos(window_context,Form1.MDIChildren[i].Name)=1 THEN
413          used[StrToInt(RightStr(Form1.MDIChildren[i].Caption,1))]:=True;
414    FOR i:=1 TO 10 DO
415      IF i=10 THEN
416        Break
417      ELSE
418        IF NOT used[i] THEN Break;
419
420    IF i<10 THEN BEGIN
421      name:=window_context+IntToStr(i);
422      IF window_context='binedit' THEN
423        caption:='Binary .dat-Editor '+IntToStr(i);
424      IF window_context='rawedit' THEN
425        caption:='Binary .raw-Editor '+IntToStr(i);
426      IF window_context='preview' THEN
427        caption:='Preview-Window '+IntToStr(i);
428      IF window_context='txmpreplace' THEN
429        caption:='TXMP Replacer '+IntToStr(i);
430      IF window_context='extractor' THEN
431        caption:='Extractor '+IntToStr(i);
432
433      menu_button:=TMenuItem.Create(menu_windows);
434      menu_button.Caption:=caption;
435      menu_button.Name:='menu_window_'+name;
436      menu_button.OnClick:=Form1.menu_window_entryClick;
437      menu_windows.Add(menu_button);
438
439      SetLength(tablist,Length(tablist)+1);
440      tablist[High(tablist)]:=name;
441      tabs.Tabs.Add(caption);
442
443      IF window_context='binedit' THEN BEGIN
444        binEdit:=TForm8.Create(Application);
445        binEdit.Name:=name;
446        binEdit.Caption:=caption;
447        binEdit.Recreatelist;
448      END;
449      IF window_context='rawedit' THEN BEGIN
450        rawEdit:=TForm13.Create(Application);
451        rawEdit.Name:=name;
452        rawEdit.Caption:=caption;
453        rawEdit.Recreatelist;
454      END;
455      IF window_context='preview' THEN BEGIN
456        preview:=TForm5.Create(Application);
457        preview.Name:=name;
458        preview.Caption:=caption;
459        preview.Recreatelist;
460      END;
461      IF window_context='txmpreplace' THEN BEGIN
462        txmpreplacer:=TForm7.Create(Application);
463        txmpreplacer.Name:=name;
464        txmpreplacer.Caption:=caption;
465        txmpreplacer.Recreatelist;
466      END;
467      IF window_context='extractor' THEN BEGIN
468        extractor:=TForm11.Create(Application);
469        extractor.Name:=name;
470        extractor.Caption:=caption;
471        extractor.Recreatelist;
472      END;
473
474      tabs.TabIndex:=High(tablist);
475      IF MDIChildCount=9 THEN menu_tools.Enabled:=False;
476    END ELSE BEGIN
477      Result:=False;
478    END;
479  END;
480
481
482PROCEDURE TForm1.close_window(window_name:String);
483  VAR
484    i,j:Byte;
485  BEGIN
486    FOR i:=0 TO menu_windows.Count-1 DO BEGIN
487      IF menu_windows.Items[i].Name='menu_window_'+window_name THEN BEGIN
488        menu_windows.Items[i].Free;
489        Break;
490      END;
491    END;
492    FOR i:=0 TO High(tablist) DO BEGIN
493      IF tablist[i]=window_name THEN BEGIN
494        tabs.Tabs.Delete(i);
495        IF High(tablist)>0 THEN
496          FOR j:=i TO High(tablist)-1 DO
497            tablist[j]:=tablist[j+1];
498        SetLength(tablist,Length(tablist)-1);
499        Break;
500      END;
501    END;
502    menu_tools.Enabled:=True;
503  END;
504
505
506PROCEDURE TForm1.tabsChange(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);
507  VAR
508    i:Byte;
509  BEGIN
510    FOR i:=0 TO MDIChildCount-1 DO BEGIN
511      IF MDIChildren[i].Name=tablist[NewTab] THEN
512        MDIChildren[i].BringToFront;
513    END;
514  END;
515
516PROCEDURE TForm1.SetActiveWindow(window_name:String);
517  VAR
518    i:Byte;
519  BEGIN
520    IF Length(tablist)>0 THEN
521      FOR i:=0 TO High(tablist) DO
522        IF tablist[i]=window_name THEN
523          tabs.TabIndex:=i;
524  END;
525
526
527END.
Note: See TracBrowser for help on using the repository browser.