DEADSOFTWARE

i10n: use resourcestring and gettext for localization
[d2df-editor.git] / src / editor / Editor.lpr
index e5d615625dc332d9094a59823bba66049db33924..1ca2d20f5378c543ada9d7d268f207fec2b88100 100644 (file)
@@ -3,6 +3,9 @@ program Editor;
 {$INCLUDE ../shared/a_modes.inc}
 
 uses
+  {$IFDEF DARWIN}
+    MacOSAll, CocoaAll,
+  {$ENDIF}
   Forms, Interfaces, Dialogs,
   GL, GLExt, SysUtils,
   e_graphics in '../engine/e_graphics.pas',
@@ -41,7 +44,6 @@ uses
   spectrum in 'spectrum.pas',
   f_saveminimap in 'f_saveminimap.pas' {SaveMiniMapForm},
   f_packmap in 'f_packmap.pas' {PackMapForm},
-  f_maptest in 'f_maptest.pas' {MapTestForm},
   f_choosetype in 'f_choosetype.pas' {ChooseTypeForm},
 {$IFNDEF NOSOUND}
   fmod,
@@ -52,8 +54,8 @@ uses
   ImagingTypes,
   Imaging,
   ImagingUtility,
-  g_language in 'g_language.pas',
-  f_selectlang in 'f_selectlang.pas' {SelectLanguageForm};
+  g_options in 'g_options.pas',
+  g_language in 'g_language.pas';
 
 {$IFDEF WINDOWS}
   {$R *.res}
@@ -65,7 +67,29 @@ uses
     end;
 
   var
-    H: THandlerObject;
+    LogFileName: AnsiString = '';
+    ParamFileIndex: Integer = 1;
+
+{$IFDEF DARWIN}
+  function NSStringToAnsiString (s: NSString): AnsiString;
+    var i: Integer;
+  begin
+    result := '';
+    for i := 0 to s.length - 1 do
+      result := result + AnsiChar(s.characterAtIndex(i));
+  end;
+
+  function GetBundlePath (): AnsiString;
+    var pathRef: CFURLRef; pathCFStr: CFStringRef; pathStr: ShortString;
+  begin
+    pathRef := CFBundleCopyBundleURL(CFBundleGetMainBundle());
+    pathCFStr := CFURLCopyFileSystemPath(pathRef, kCFURLPOSIXPathStyle);
+    CFStringGetPascalString(pathCFStr, @pathStr, 255, CFStringGetSystemEncoding());
+    CFRelease(pathRef);
+    CFRelease(pathCFStr);
+    Result := pathStr;
+  end;
+{$ENDIF}
 
   procedure THandlerObject.ExceptionHandler (Sender: TObject; e: Exception);
   begin
@@ -73,10 +97,146 @@ uses
     MessageDlg('Unhandled exception: ' + e.message + ' (see Editor.log for more information)', mtError, [mbOK], 0);
   end;
 
+  procedure CheckParamOptions;
+    var i: Integer; p: AnsiString;
+  begin
+    i := 1;
+    while (i <= ParamCount) and (Length(ParamStr(i)) > 0) and (ParamStr(i)[1] = '-') do
+    begin
+      p := ParamStr(i);
+      if p = '--log-file' then
+      begin
+        if i + 1 <= ParamCount then
+        begin
+          Inc(i);
+          LogFileName := ParamStr(i);
+        end;
+      end
+      else if p = '--config' then
+      begin
+        if i + 1 <= ParamCount then
+        begin
+          Inc(i);
+          CfgFileName := ParamStr(i);
+        end;
+      end
+      else if p = '--game-wad' then
+      begin
+        if i + 1 <= ParamCount then
+        begin
+          Inc(i);
+          GameWad := ParamStr(i);
+        end;
+      end
+      else if p = '--editor-wad' then
+      begin
+        if i + 1 <= ParamCount then
+        begin
+          Inc(i);
+          EditorWad := ParamStr(i);
+        end;
+      end
+      else if p = '--wads-dir' then
+      begin
+        if i + 1 <= ParamCount then
+        begin
+          Inc(i);
+          WadsDir := ParamStr(i);
+        end;
+      end;
+      Inc(i);
+    end;
+    ParamFileIndex := i;
+  end;
+
+  procedure CheckParamFiles;
+    var i: Integer;
+  begin
+    i := ParamFileIndex;
+    if i <= ParamCount then
+      StartMap := ParamStr(i);
+  end;
+
+  procedure InitPathes;
+    {$IFDEF DARWIN}
+      var BundlePath, DFPath, DocPath: AnsiString; ns: NSString;
+      var ApplicationSupportDirs, DocumentDirs: NSArray;
+      var count: Integer;
+    {$ELSE}
+      var EditorDir: AnsiString;
+    {$ENDIF}
+  begin
+    {$IFDEF DARWIN}
+      BundlePath := GetBundlePath();
+      ApplicationSupportDirs := NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, true);
+      count := ApplicationSupportDirs.count;
+      ns := ApplicationSupportDirs.objectAtIndex(count - 1);
+      DFPath := NSStringToAnsiString(ns) + DirectorySeparator + 'Doom 2D Forever';
+      DocumentDirs := NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true);
+      count := DocumentDirs.count;
+      ns := DocumentDirs.objectAtIndex(count - 1);
+      DocPath := NSStringToAnsiString(ns) + DirectorySeparator + 'Doom 2D Forever';
+      GameExeFile := 'Doom 2D Forever.app';
+      CfgFileName := DFPath + DirectorySeparator + 'Editor.cfg';
+      LogFileName := DFPath + DirectorySeparator + 'Editor.log';
+      MapsDir := DocPath + DirectorySeparator + 'Maps';
+      WadsDir := BundlePath + DirectorySeparator + 'Contents' + DirectorySeparator + 'Resources' + DirectorySeparator + 'wads';
+      LangDIr := BundlePath + DirectorySeparator + 'Contents' + DirectorySeparator + 'Resources' + DirectorySeparator + 'data' + DirectorySeparator + 'lang';
+      GameWad := BundlePath + DirectorySeparator + 'Contents' + DirectorySeparator + 'Resources' + DirectorySeparator + 'data' + DirectorySeparator + 'game.wad';
+      EditorWad := BundlePath + DirectorySeparator + 'Contents' + DirectorySeparator + 'Resources' + DirectorySeparator + 'data' + DirectorySeparator + 'editor.wad';
+    {$ELSE}
+      EditorDir := ExtractFilePath(Application.ExeName);
+      {$IFDEF WINDOWS}
+        GameExeFile := 'Doom2DF.exe';
+      {$ELSE}
+        GameExeFile := 'Doom2DF';
+      {$ENDIF}
+      CfgFileName := EditorDir + DirectorySeparator + 'Editor.cfg';
+      LogFileName := EditorDir + DirectorySeparator + 'Editor.log';
+      MapsDir := EditorDir + DirectorySeparator + 'maps';
+      WadsDir := EditorDir + DirectorySeparator + 'wads';
+      LangDir := EditorDir + DirectorySeparator + 'data' + DirectorySeparator + 'lang';
+      GameWad := EditorDir + DirectorySeparator + 'data' + DirectorySeparator + 'game.wad';
+      EditorWad := EditorDir + DirectorySeparator + 'data' + DirectorySeparator + 'editor.wad';
+    {$ENDIF}
+    ForceDirectories(MapsDir);
+    ForceDirectories(WadsDir);
+  end;
+
+  procedure InitLogs;
+  begin
+    e_InitLog(LogFileName, WM_NEWFILE);
+
+    {$IF DECLARED(UseHeapTrace)}
+      (* http://wiki.freepascal.org/heaptrc *)
+      GlobalSkipIfNoLeaks := True;
+      //SetHeapTraceOutput('EditorLeaks.log');
+      //HaltOnError := False;
+    {$ENDIF}
+
+    e_WriteLog('Used file pathes:', MSG_NOTIFY);
+    e_WriteLog('  GameExeFile = ' + GameExeFile, MSG_NOTIFY);
+    e_WriteLog('  CfgFileName = ' + CfgFileName, MSG_NOTIFY);
+    e_WriteLog('  LogFileName = ' + LogFileName, MSG_NOTIFY);
+    e_WriteLog('  MapsDir     = ' + MapsDir, MSG_NOTIFY);
+    e_WriteLog('  WadsDir     = ' + WadsDir, MSG_NOTIFY);
+    e_WriteLog('  LangDir     = ' + LangDir, MSG_NOTIFY);
+    e_WriteLog('  GameWad     = ' + GameWad, MSG_NOTIFY);
+    e_WriteLog('  EditorWad   = ' + EditorWad, MSG_NOTIFY);
+  end;
+
 begin
   Application.ExceptionDialog := aedOkMessageBox;
-  Application.AddOnExceptionHandler(H.ExceptionHandler, True);
+  Application.AddOnExceptionHandler(THandlerObject.ExceptionHandler, True);
   Application.Initialize();
+  {$IFDEF DARWIN}
+    // Disable icons in menu on OSX by default
+    Application.ShowMenuGlyphs := sbgNever;
+  {$ENDIF}
+
+  InitPathes;
+  CheckParamOptions;
+  InitLogs;
 
   Application.CreateForm(TMainForm, MainForm);
   Application.CreateForm(TOptionsForm, OptionsForm);
@@ -94,10 +254,11 @@ begin
   Application.CreateForm(TAddSoundForm, AddSoundForm);
   Application.CreateForm(TSaveMiniMapForm, SaveMiniMapForm);
   Application.CreateForm(TPackMapForm, PackMapForm);
-  Application.CreateForm(TMapTestForm, MapTestForm);
   Application.CreateForm(TChooseTypeForm, ChooseTypeForm);
-  Application.CreateForm(TSelectLanguageForm, SelectLanguageForm);
 
-  if ParamStr(1) <> '' then OpenMap(ParamStr(1), '');
+  g_Language_Set(gLanguage);
+
+  CheckParamFiles;
+
   Application.Run();
 end.