Procházet zdrojové kódy

Now possible to set primary module file

Arthur Yefimov před 1 rokem
rodič
revize
4ed7542bc9
4 změnil soubory, kde provedl 99 přidání a 52 odebrání
  1. 12 8
      Data/Texts/en.dat
  2. 5 1
      Data/Texts/ru.dat
  3. 9 6
      src/Editor.Mod
  4. 73 37
      src/FreeOberon.Mod

+ 12 - 8
Data/Texts/en.dat

@@ -208,11 +208,11 @@ menuRedo "&Redo"
 menuCut "Cu&t"
 menuCopy "&Copy"
 menuPaste "&Paste"
-menuCutInternal "Cut &Internally"
-menuCopyInternal "Copy I&nternally"
-menuPasteInternal "Pas&te Internally"
+menuCutInternal "Cut &internally"
+menuCopyInternal "Copy i&nternally"
+menuPasteInternal "Pas&te internally"
 menuClear "C&lear"
-menuSelectAll "Select &All"
+menuSelectAll "Select &all"
 menuUnselect "U&nselect"
 menuSearch "&Search"
 menuFind "&Find..."
@@ -222,12 +222,14 @@ menuGoToLineNumber "&Go to line number..."
 menuFindProcedure "&Find procedure..."
 menuRun "&Run"
 menuRunRun "&Run"
-menuRunDirectory "Run &Directory..."
+menuRunDirectory "Run &directory..."
 menuParameters "P&arameters..."
 menuCompile "&Compile"
 menuMake "&Make"
-menuMakeAndRun "Make && &Run"
+menuMakeAndRun "Make && &run"
 menuBuild "&Build"
+menuPrimaryModule "&Primary module..."
+menuClearPrimaryModule "C&lear primary module"
 menuDebug "&Debug"
 menuOutput "&Output"
 menuTools "&Tools"
@@ -277,7 +279,7 @@ menuAbout "&About..."
 btnHelp "Help"
 btnSave "Save"
 btnOpen "Open"
-btnCompileAndRun "Compile & Run"
+btnCompileAndRun "Compile & run"
 btnLocalMenu "Local menu"
 
 titleAbout "About"
@@ -292,9 +294,11 @@ btnOk "O&K"
 btnOpen "&Open"
 btnCancel "Cancel"
 
-titleSaveFileAs "Save File As"
+titlePrimaryModule "Primary Module"
 titleOpenAFile "Open a File"
+titleSaveFileAs "Save File As"
 
+labelPrimaryModuleFile "&Primary module file"
 labelSaveFileAs "&Save file as"
 labelName "&Name"
 labelFiles "&Files"

+ 5 - 1
Data/Texts/ru.dat

@@ -228,6 +228,8 @@ menuCompile "&Компиляция"
 menuMake "&Смастерить"
 menuMakeAndRun "Смастерить и &запустить"
 menuBuild "Со&брать"
+menuPrimaryModule "&Первичный модуль..."
+menuClearPrimaryModule "&Сбросить первичный модуль"
 menuDebug "О&тладка"
 menuOutput "&Вывод"
 menuTools "С&ервис"
@@ -292,9 +294,11 @@ btnOk "О&К"
 btnOpen "&Открыть"
 btnCancel "Отмена"
 
-titleSaveFileAs "Сохранить файл как"
+titlePrimaryModule "Первичный модуль"
 titleOpenAFile "Открыть файл"
+titleSaveFileAs "Сохранить файл как"
 
+labelPrimaryModuleFile "&Файл первичного модуля"
 labelSaveFileAs "&Сохранить файл как"
 labelName "&Имя"
 labelFiles "&Файлы"

+ 9 - 6
src/Editor.Mod

@@ -44,13 +44,14 @@ CONST
   tokenComment = 4;
 
   (** FileDialog type **)
-  open* = 1;
-  save* = 2;
+  primaryModule* = 1;
+  open* = 2;
+  save* = 3;
 
 TYPE
   FileDialog* = POINTER TO FileDialogDesc;
   FileDialogDesc* = RECORD(OV.WindowDesc)
-    type*: INTEGER; (** open or save *)
+    type*: INTEGER; (** See constants above: primaryModule, open and save *)
     edtFilename*: OV.Edit;
     btnOk*, btnCancel*: OV.Button;
     path*: ARRAY 1024 OF CHAR; (** full path to current chosen dir *)
@@ -270,7 +271,8 @@ END SetHome;
 PROCEDURE InitFileDialog*(c: FileDialog; type: INTEGER; IN dir: ARRAY OF CHAR);
 VAR s: FoStrings.String;
 BEGIN OV.InitWindow(c); c.do := fileDialogMethod; c.type := type;
-  IF type = open THEN FoStrings.Get('titleOpenAFile', c.caption)
+  IF type = primaryModule THEN FoStrings.Get('titlePrimaryModule', c.caption)
+  ELSIF type = open THEN FoStrings.Get('titleOpenAFile', c.caption)
   ELSE FoStrings.Get('titleSaveFileAs', c.caption)
   END;
   c.modal := TRUE; c.w := 70; c.h := 20; OV.CenterWindow(c);
@@ -280,7 +282,7 @@ BEGIN OV.InitWindow(c); c.do := fileDialogMethod; c.type := type;
   c.edtFilename.do.resize(c.edtFilename, 3, 3, c.w - 18, 1);
   OV.Add(c, c.edtFilename);
 
-  (* Open/Save (Ok) button *)
+  (* Open/Ok button (Ok for save and primaryModule types) *)
   IF type = open THEN FoStrings.Get('btnOpen', s)
   ELSE FoStrings.Get('btnOk', s)
   END;
@@ -326,7 +328,8 @@ VAR f: FileDialog;
   s: FoStrings.String;
 BEGIN f := c(FileDialog);
   OV.WindowDraw(c, x, y); INC(x, c.x); INC(y, c.y);
-  IF f.type = open THEN FoStrings.Get('labelName', s)
+  IF f.type = primaryModule THEN FoStrings.Get('labelPrimaryModuleFile', s)
+  ELSIF f.type = open THEN FoStrings.Get('labelName', s)
   ELSE FoStrings.Get('labelSaveFileAs', s)
   END;
   OV.PutMarkedString(x + 3, y + 2, s, 15, 14, 7, 0);

+ 73 - 37
src/FreeOberon.Mod

@@ -20,17 +20,17 @@ IMPORT T := TermBox, Files, Args, Utf8, Builder, Env, Debug, Graph,
        OV, Editor, Term, FoStrings, Config, Strings, Int, Out, Dir, Kernel;
 (** Free Oberon IDE and Compiler. Part of Free Oberon IDE internal code *)
 CONST
-  (* Direction of Selection *)
+  (** Direction of Selection **)
   dirLeft  = 0;
   dirRight = 1;
   dirUp    = 2;
   dirDown  = 3;
 
-  (* States *)
+  (** States **)
   stateEditor   = 0;
   stateTerminal = 1;
 
-  (* Character Classes *)
+  (** Character Classes **)
   charOther       = 0; (*!FIXME Remove these constants *)
   charAlpha       = 1;
   charDigit       = 2;
@@ -38,14 +38,14 @@ CONST
   charQuote       = 4;
   charOpenBracket = 5;
 
-  (* Token Classes *)
+  (** Token Classes **)
   tokenOther   = 0;
   tokenKeyword = 1;
   tokenNumber  = 2;
   tokenString  = 3;
   tokenComment = 4;
 
-  (* Defaults *)
+  (** Defaults **)
   defW = 106;
   defH = 25;
   defLang = 'en';
@@ -59,21 +59,22 @@ TYPE
   END;
 
 VAR
-  progBuf: ARRAY 16300 OF SHORTCHAR; (* For interaction with running program *)
-  inputBuf: ARRAY 16300 OF CHAR; (* Holds entered chars before Enter pressed *)
+  progBuf: ARRAY 16300 OF SHORTCHAR; (** For interaction with running program *)
+  inputBuf: ARRAY 16300 OF CHAR; (** Holds entered chars before Enter pressed *)
   inputBufLen: INTEGER;
   programFinished: BOOLEAN;
-  lastFileDialogDir: ARRAY 256 OF CHAR; (* Directory path for file dialog *)
+  lastFileDialogDir: ARRAY 256 OF CHAR; (** Directory path for file dialog *)
+  primaryFname: ARRAY 256 OF CHAR; (***)
   app: OV.App;
 
-  curX, curY: INTEGER; (* Text cursor position *)
-  curFg, curBg: INTEGER; (* Current foreground and background of proc. Write *)
-  terminalNeedRedraw: BOOLEAN; (* Used when a compiled program is running *)
-  terminalMouseShown: BOOLEAN; (* Same *)
+  curX, curY: INTEGER; (** Text cursor position *)
+  curFg, curBg: INTEGER; (** Current foreground and background of proc. Write *)
+  terminalNeedRedraw: BOOLEAN; (** Used when a compiled program is running *)
+  terminalMouseShown: BOOLEAN; (** Used when a compiled program is running *)
 
-  lastW, lastH: INTEGER; (* Last screen size *)
+  lastW, lastH: INTEGER; (** Last screen size *)
 
-(* Language Dialog *)
+(** Language Dialog **)
 
 PROCEDURE LanguageButtonClick*(c: OV.Control);
 VAR lang: ARRAY 10 OF CHAR;
@@ -113,7 +114,7 @@ VAR c: LanguageDialog;
 BEGIN NEW(c); InitLanguageDialog(c) ;
 RETURN c END NewLanguageDialog;
 
-(* General *)
+(** General **)
 
 PROCEDURE CountLines(s: ARRAY OF CHAR; width: INTEGER): INTEGER;
 VAR i, x, lines: INTEGER;
@@ -412,6 +413,16 @@ BEGIN
   DoOpenFile(fname)
 END OpenFileOkClick;
 
+PROCEDURE SetPrimaryModule(IN fname: ARRAY OF CHAR);
+BEGIN primaryFname := fname$
+END SetPrimaryModule;
+
+PROCEDURE PrimaryModuleDialogOkClick(c: OV.Control; fname: ARRAY OF CHAR);
+BEGIN
+  DirName(fname, lastFileDialogDir);
+  SetPrimaryModule(fname)
+END PrimaryModuleDialogOkClick;
+
 PROCEDURE DoSaveFile(c: OV.Control; fname: ARRAY OF CHAR);
 VAR w: OV.Window; e: Editor.Editor;
 BEGIN
@@ -517,34 +528,53 @@ VAR w: OV.Window;
   modules: Builder.Module;
   e: Editor.Editor;
 BEGIN w := c.app.windows;
+  (* Automatically save the current file before compilation *)
   IF (w # NIL) & (w IS Editor.Editor) THEN
-    IF Editor.TextChanged(w(Editor.Editor)) THEN FileSave(c) END;
-    IF w(Editor.Editor).fname[0] # 0X THEN
-      mainFname := w(Editor.Editor).fname$;
-      Debug.StrVal('File name of main module: ', mainFname);
-      Builder.SetWorkDir(mainFname);
-      Debug.StrVal('Work directory: ', Builder.workDir);
-      Builder.GetModuleName(mainFname, modname);
-      Debug.StrVal('Module name: ', modname);
-      modules := Builder.UsedModuleList(modname, mainFname,
-        errFname, errLine, errCol, foreign, res);
-      IF foreign THEN res := 402 END;
-      Debug.IntVal('Result of UserModuleList: ', res);
-      IF res = 0 THEN
-        IF Builder.CompileAll(modules, exename, FALSE, BuildErrorCallback)
-        THEN RunProgram(exename)
-        END
-      ELSE
-        FocusOrOpenFile(errFname);
-        e := app.windows(Editor.Editor);
-        e.text.MoveToLineCol(errLine, errCol, e.h - 2);
-        FoStrings.MakeErrorStr(res, s);
-        ShowError(s)
+    IF Editor.TextChanged(w(Editor.Editor)) THEN FileSave(c) END
+  END;
+
+  mainFname := primaryFname$;
+  IF (mainFname[0] = 0X) & (w # NIL) & (w IS Editor.Editor) &
+     (w(Editor.Editor).fname[0] # 0X)
+  THEN mainFname := w(Editor.Editor).fname$
+  END;
+
+  IF mainFname[0] # 0X THEN
+    Debug.StrVal('File name of main module: ', mainFname);
+    Builder.SetWorkDir(mainFname);
+    Debug.StrVal('Work directory: ', Builder.workDir);
+    Builder.GetModuleName(mainFname, modname);
+    Debug.StrVal('Module name: ', modname);
+    modules := Builder.UsedModuleList(modname, mainFname,
+      errFname, errLine, errCol, foreign, res);
+    IF foreign THEN res := 402 END;
+    Debug.IntVal('Result of UserModuleList: ', res);
+    IF res = 0 THEN
+      IF Builder.CompileAll(modules, exename, FALSE, BuildErrorCallback)
+      THEN RunProgram(exename)
       END
+    ELSE
+      FocusOrOpenFile(errFname);
+      e := app.windows(Editor.Editor);
+      e.text.MoveToLineCol(errLine, errCol, e.h - 2);
+      FoStrings.MakeErrorStr(res, s);
+      ShowError(s)
     END
   END
 END OnBuild;
 
+PROCEDURE OnPrimaryModule(c: OV.Control);
+VAR w: Editor.FileDialog;
+BEGIN
+  w := Editor.NewFileDialog(Editor.primaryModule, lastFileDialogDir);
+  w.onFileOk := PrimaryModuleDialogOkClick;
+  OV.AddWindow(app, w)
+END OnPrimaryModule;
+
+PROCEDURE OnClearPrimaryModule(c: OV.Control);
+BEGIN primaryFname[0] := 0X
+END OnClearPrimaryModule;
+
 PROCEDURE HelpAbout(c: OV.Control);
 CONST W = 37; H = 13;
 VAR w: OV.Window; L: OV.Label; b: OV.Button;
@@ -806,6 +836,11 @@ BEGIN
   OV.Add(m, OV.NewMenu(s, 'F9', OV.hF9, OnBuild));
   FoStrings.Get('menuBuild', s);
   OV.Add(m, OV.NewMenu(s, '', 0, OnBuild));
+  OV.Add(m, OV.NewMenu('-', '', 0, NIL));
+  FoStrings.Get('menuPrimaryModule', s);
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+Shift+F2', OV.hCtrlShiftF2, OnPrimaryModule));
+  FoStrings.Get('menuClearPrimaryModule', s);
+  OV.Add(m, OV.NewMenu(s, '', 0, OnClearPrimaryModule));
   OV.AddMenu(app, m);
   FoStrings.Get('menuDebug', s);
   m := OV.NewMenu(s, '', 0, NIL);
@@ -1046,6 +1081,7 @@ VAR success, fs, sw, mx: BOOLEAN;
 BEGIN
   success := FALSE;
   lastFileDialogDir[0] := 0X;
+  primaryFname[0] := 0X;
   ParseArgs(fs, sw, mx, w, h, lang, fnames);
   opt := {T.resizable, T.center};
   IF fs THEN INCL(opt, T.fullscreen) ELSE INCL(opt, T.window) END;