ide/Global Settings: More room for color scheme drop box
[sdk] / ide / src / dialogs / GlobalSettingsDialog.ec
index 620bb2c..370a770 100644 (file)
@@ -19,8 +19,6 @@ class GlobalSettingsDialog : Window
    minClientSize = { 560, 542 };
    nativeDecorations = true;
 
-   IDESettings ideSettings;
-   IDESettingsContainer settingsContainer;
    String workspaceActiveCompiler;
 
    TabControl tabControl { this, background = formColor, anchor = { left = 8, top = 8, right = 8, bottom = 40 } };
@@ -71,15 +69,36 @@ class GlobalSettingsDialog : Window
             bool editorSettingsChanged = false;
             bool compilerSettingsChanged = false;
             bool projectOptionsChanged = false;
+            AVLTree<String> cfgsToWrite = null;
             if(editorTab.modifiedDocument)
             {
                if(editorTab.useFreeCaret.checked != ideSettings.useFreeCaret ||
                      editorTab.showLineNumbers.checked != ideSettings.showLineNumbers ||
-                     editorTab.caretFollowsScrolling.checked != ideSettings.caretFollowsScrolling)
+                     editorTab.caretFollowsScrolling.checked != ideSettings.caretFollowsScrolling ||
+                     editorTab.fontPicker.fontSize != ideSettings.codeEditorFontSize ||
+                     editorTab.fontPicker.faceName.OnCompare(ideSettings.codeEditorFont) ||
+                     editorTab.dbColorSchemes.currentRow.string.OnCompare(ideSettings.activeColorScheme)
+                     )
                {
+                  DataRow csRow = editorTab.dbColorSchemes.currentRow;
                   ideSettings.useFreeCaret = editorTab.useFreeCaret.checked;
                   ideSettings.showLineNumbers = editorTab.showLineNumbers.checked;
                   ideSettings.caretFollowsScrolling = editorTab.caretFollowsScrolling.checked;
+                  ideSettings.codeEditorFont = editorTab.fontPicker.faceName;
+                  ideSettings.codeEditorFontSize = editorTab.fontPicker.fontSize;
+                  if(csRow && csRow.string)
+                  {
+                     ideSettings.activeColorScheme = csRow.string;
+                     for(cs : ideSettings.colorSchemes; cs.name && !strcmp(cs.name, csRow.string))
+                     {
+                        colorScheme = cs;
+                        ide.ApplyColorScheme(colorScheme);
+                        break;
+                     }
+                  }
+
+                  ide.ApplyFont(ideSettings.codeEditorFont, ideSettings.codeEditorFontSize);
+
                   editorSettingsChanged = true;
                }
             }
@@ -88,13 +107,16 @@ class GlobalSettingsDialog : Window
             {
                if(strcmp(compilersTab.compilerConfigsDir.path, ideSettings.compilerConfigsDir))
                   ideSettings.compilerConfigsDir = compilersTab.compilerConfigsDir.path;
-               ideSettings.compilerConfigs.Free();
-               for(compiler : compilersTab.compilerConfigs)
+               if(compilersTab.compilerConfigs.OnCompare(ideConfig.compilers))
                {
-                  ideSettings.compilerConfigs.Add(compiler.Copy());
+                  cfgsToWrite = compilersTab.compilerConfigs.getWriteRequiredList(ideConfig.compilers);
+                  ideConfig.compilers.Free();
+                  for(compiler : compilersTab.compilerConfigs)
+                  {
+                     ideConfig.compilers.Add(compiler.Copy());
+                  }
+                  compilerSettingsChanged = true;
                }
-
-               compilerSettingsChanged = true;
             }
 
             if(projectOptionsTab.modifiedDocument)
@@ -120,10 +142,16 @@ class GlobalSettingsDialog : Window
                }
             }
 
-            settingsContainer.Save();
+            if(editorSettingsChanged || projectOptionsChanged)
+               settingsContainer.Save();
 
             if(compilerSettingsChanged)
+            {
+               ideConfig.compilers.write(settingsContainer, cfgsToWrite);
                OnGlobalSettingChange(GlobalSettingsChange::compilerSettings);
+               cfgsToWrite.Free();
+               delete cfgsToWrite;
+            }
             if(editorSettingsChanged)
                OnGlobalSettingChange(GlobalSettingsChange::editorSettings);
             if(projectOptionsChanged)
@@ -175,7 +203,7 @@ class GlobalSettingsDialog : Window
       // CompilersTab
       if(workspaceActiveCompiler)
       {
-         for(compiler : ideSettings.compilerConfigs)
+         for(compiler : ideConfig.compilers)
          {
             if(!activateCompiler && !strcmp(workspaceActiveCompiler, compiler.name))
                activateCompiler = compiler;
@@ -187,10 +215,10 @@ class GlobalSettingsDialog : Window
       }
       if(!activateCompiler && readonlyCompiler)
          activateCompiler = readonlyCompiler;
-      if(!activateCompiler && ideSettings.compilerConfigs.count)
-         activateCompiler = ideSettings.compilerConfigs[0];
+      if(!activateCompiler && ideConfig.compilers.count)
+         activateCompiler = ideConfig.compilers[0];
 
-      for(compiler : ideSettings.compilerConfigs)
+      for(compiler : ideConfig.compilers)
          compilersTab.AddCompiler(compiler.Copy(), compiler == activateCompiler);
       compilersTab.compilerConfigsDir.path = ideSettings.compilerConfigsDir;
 
@@ -218,26 +246,63 @@ class GlobalSettingsDialog : Window
    virtual void OnGlobalSettingChange(GlobalSettingsChange globalSettingsChange);
 }
 
+import "FontPicker"
+
 class EditorTab : GlobalSettingsSubTab
 {
    background = formColor;
    text = $"Editor";
 
+   bool OnCreate()
+   {
+      dbColorSchemes.Clear();
+
+      for(s : ideSettings.colorSchemes)
+      {
+         DataRow row = dbColorSchemes.AddString(s.name);
+         if(!strcmp(s.name, ideSettings.activeColorScheme))
+            dbColorSchemes.currentRow = row;
+      }
+      return true;
+   }
+
+   Label lblColorSchemes { this, anchor = { top = 70, right = 16 }, labeledWindow = dbColorSchemes };
+   DropBox dbColorSchemes
+   {
+      this, text = $"Color Scheme: ", anchor = { top = 92, right = 16 }, size = { 200, 22 };
+
+      bool NotifySelect(DropBox dropBox, DataRow row, Modifiers mods)
+      {
+         if(row)
+         {
+            IDEColorScheme colorScheme = null;
+            for(cs : ideSettings.colorSchemes; cs.name && !strcmp(cs.name, row.string))
+            {
+               colorScheme = cs;
+               break;
+            }
+            fontPicker.SelectColorScheme(colorScheme);
+            modifiedDocument = true;
+         }
+         return true;
+      }
+   };
+
    Button useFreeCaret
    {
-      this, text = $"Move code editor caret freely past end of line", position = { 16, 68 }, isCheckbox = true;
+      this, text = $"Move code editor caret freely past end of line", position = { 16, 58 }, isCheckbox = true;
       NotifyClicked = NotifyClickedModifiedDocument;
    };
 
    Button caretFollowsScrolling
    {
-      this, text = $"Keep caret visible (move along) when scrolling", position = { 16, 88 }, isCheckbox = true;
+      this, text = $"Keep caret visible (move along) when scrolling", position = { 16, 78 }, isCheckbox = true;
       NotifyClicked = NotifyClickedModifiedDocument;
    };
 
    Button showLineNumbers
    {
-      this, text = $"Show line numbers in code editor", position = { 16, 108 }, isCheckbox = true;
+      this, text = $"Show line numbers in code editor", position = { 16, 98 }, isCheckbox = true;
       NotifyClicked = NotifyClickedModifiedDocument;
    };
 
@@ -246,6 +311,17 @@ class EditorTab : GlobalSettingsSubTab
       modifiedDocument = true;
       return true;
    }
+
+   FontPicker fontPicker
+   {
+      this, anchor = { left = 8, right = 8, top = 120, bottom = 8 };
+
+      bool NotifyChanged()
+      {
+         modifiedDocument = true;
+         return true;
+      }
+   };
 }
 
 static void DrawStipple(Surface surface, Size clientSize)
@@ -278,7 +354,10 @@ class CompilersTab : GlobalSettingsSubTab
    {
       this, text = $"Compiler Configurations:", anchor = { left = 148, top = 38, right = 99 }; size = { 0, 26 };
       opacity = 0;
-      direction = horizontal, scrollable = true;
+      direction = horizontal;
+      scrollable = true;
+      endButtons = false;
+      hoverScroll = true;
 
       bool OnKeyDown(Key key, unichar ch)
       {
@@ -324,7 +403,7 @@ class CompilersTab : GlobalSettingsSubTab
    CompilerEnvironmentTab environmentTab { this, tabControl = tabControl };
    CompilerOptionsTab optionsTab { this, tabControl = tabControl };
 
-   List<CompilerConfig> compilerConfigs { };
+   CompilerConfigs compilerConfigs { };
    CompilerConfig activeCompiler;
 
    Label labelCompilers
@@ -851,7 +930,8 @@ class CompilerToolchainTab : CompilersSubTab
          cppLabel.disabled = cpp.disabled = isVC || disabled;
          cxxLabel.disabled = cxx.disabled = isVC || disabled;
          ccLabel.disabled = cc.disabled = isVC || disabled;
-         ldLabel.disabled = cxx.disabled = isVC || disabled;
+         ldLabel.disabled = ld.disabled = isVC || disabled;
+         arLabel.disabled = ar.disabled = isVC || disabled;
          makeLabel.disabled = make.disabled = disabled;
          executableLauncherLabel.disabled = executableLauncher.disabled = disabled;
          gnuToolchainPrefixLabel.disabled = gnuToolchainPrefix.disabled = disabled;
@@ -985,7 +1065,7 @@ class CompilerOptionsTab : CompilersSubTab
 
    Button distccEnabled
    {
-      this, text = $"Use distcc", hotKey = altD, position = { 158, 68 };
+      this, text = $"Use distcc", position = { 158, 68 };
       isCheckbox = true;
 
       bool NotifyClicked(Button button, int x, int y, Modifiers mods)
@@ -993,7 +1073,7 @@ class CompilerOptionsTab : CompilersSubTab
          CompilerConfig compiler = loadedCompiler;
          if(compiler)
          {
-            distccHosts.disabled = !button.checked;
+            distccHostsLabel.disabled = distccHosts.disabled = !button.checked;
             compiler.distccEnabled = button.checked;
             modifiedDocument = true;
             compilersTab.modifiedDocument = true;
@@ -1002,11 +1082,11 @@ class CompilerOptionsTab : CompilersSubTab
       }
    };
 
-   Label distccHostsLabel { this, position = { 8, 96 }, labeledWindow = distccHosts };
+   Label distccHostsLabel { this, position = { 240, 68 }, labeledWindow = distccHosts };
    EditBox distccHosts
    {
       this, text = $"distcc hosts", hotKey = altH;
-      position = { 88, 92 }, size = { 300, 22 };
+      position = { 320, 64 }, size = { 160, 22 };
 
       bool NotifyModified(EditBox editBox)
       {
@@ -1021,11 +1101,11 @@ class CompilerOptionsTab : CompilersSubTab
       }
    };
 
-   Label lblPrepDefs { this, position = { 8, 126 }, labeledWindow = prepDefs };
+   Label lblPrepDefs { this, position = { 8, 96 }, labeledWindow = prepDefs };
    StringListBox prepDefs
    {
       this, text = $"Preprocessor directives", hotKey = altP;
-      position = { 168, 124 }, size = { 280, 22 }, anchor = { left = 168, top = 124, right = 8 };
+      position = { 168, 94 }, size = { 280, 22 }, anchor = { left = 168, top = 94, right = 8 };
 
       bool NotifyModified(EditBox editBox)
       {
@@ -1040,11 +1120,11 @@ class CompilerOptionsTab : CompilersSubTab
       }
    };
 
-   Label leCcompilerFlags { this, position = { 8, 156 }, labeledWindow = eCcompilerFlags };
+   Label leCcompilerFlags { this, position = { 8, 126 }, labeledWindow = eCcompilerFlags };
    StringListBox eCcompilerFlags
    {
       this, text = $"Additional eC compiler flags", hotKey = altG;
-      position = { 168, 154 }, size = { 280, 22 }, anchor = { left = 168, top = 154, right = 8 };
+      position = { 168, 124 }, size = { 280, 22 }, anchor = { left = 168, top = 124, right = 8 };
 
       bool NotifyModified(EditBox editBox)
       {
@@ -1059,11 +1139,11 @@ class CompilerOptionsTab : CompilersSubTab
       }
    };
 
-   Label lblCompilerFlags { this, position = { 8, 186 }, labeledWindow = compilerFlags };
+   Label lblCompilerFlags { this, position = { 8, 156 }, labeledWindow = compilerFlags };
    StringListBox compilerFlags
    {
-      this, text = $"Additional compiler flags", hotKey = altR;
-      position = { 168, 184 }, size = { 280, 22 }, anchor = { left = 168, top = 184, right = 8 };
+      this, text = $"Additional compiler flags", hotKey = altR;
+      position = { 168, 154 }, size = { 280, 22 }, anchor = { left = 168, top = 154, right = 8 };
 
       bool NotifyModified(EditBox editBox)
       {
@@ -1078,6 +1158,25 @@ class CompilerOptionsTab : CompilersSubTab
       }
    };
 
+   Label lblcxxFlags { this, position = { 8, 186 }, labeledWindow = cxxFlags };
+   StringListBox cxxFlags
+   {
+      this, text = $"Additional C++ compiler flags", hotKey = altD;
+      position = { 168, 184 }, size = { 280, 22 }, anchor = { left = 168, top = 184, right = 8 };
+
+      bool NotifyModified(EditBox editBox)
+      {
+         if(loadedCompiler)
+         {
+            CompilerConfig compiler = loadedCompiler;
+            compiler.cxxFlags = ((StringListBox)editBox).strings;
+            modifiedDocument = true;
+            compilersTab.modifiedDocument = true;
+         }
+         return true;
+      }
+   };
+
    Label lblLinkerFlags { this, position = { 8, 216 }, labeledWindow = linkerFlags };
    StringListBox linkerFlags
    {
@@ -1135,10 +1234,10 @@ class CompilerOptionsTab : CompilersSubTab
       }
    };
 
-   Label outputFileExtLabel { this, position = { 8, 306 }, labeledWindow = outputFileExt };
-   EditBox outputFileExt
+   Label staticLibFileExtLabel { this, position = { 8, 306 }, labeledWindow = staticLibFileExt };
+   EditBox staticLibFileExt
    {
-      this, text = $"Output file extension";//, hotKey = altH;
+      this, text = $"Target extensions (a, so, exe)";//, hotKey = altH;
       position = { 168, 304 }, size = { 80, 22 };
 
       bool NotifyModified(EditBox editBox)
@@ -1146,7 +1245,77 @@ class CompilerOptionsTab : CompilersSubTab
          CompilerConfig compiler = loadedCompiler;
          if(compiler)
          {
-            compiler.outputFileExt = editBox.contents;
+            compiler.staticLibFileExt = editBox.contents;
+            modifiedDocument = true;
+            compilersTab.modifiedDocument = true;
+         }
+         return true;
+      }
+   };
+   EditBox sharedLibFileExt
+   {
+      this;
+      position = { 256, 304 }, size = { 80, 22 };
+
+      bool NotifyModified(EditBox editBox)
+      {
+         CompilerConfig compiler = loadedCompiler;
+         if(compiler)
+         {
+            compiler.sharedLibFileExt = editBox.contents;
+            modifiedDocument = true;
+            compilersTab.modifiedDocument = true;
+         }
+         return true;
+      }
+   };
+   EditBox executableFileExt
+   {
+      this;
+      position = { 344, 304 }, size = { 80, 22 };
+
+      bool NotifyModified(EditBox editBox)
+      {
+         CompilerConfig compiler = loadedCompiler;
+         if(compiler)
+         {
+            compiler.executableFileExt = editBox.contents;
+            modifiedDocument = true;
+            compilersTab.modifiedDocument = true;
+         }
+         return true;
+      }
+   };
+
+   Button stripTarget
+   {
+      this, text = $"Strip target", hotKey = altC, position = { 168, 332 };
+      isCheckbox = true;
+
+      bool NotifyClicked(Button button, int x, int y, Modifiers mods)
+      {
+         CompilerConfig compiler = loadedCompiler;
+         if(compiler)
+         {
+            compiler.noStripTarget = !button.checked;
+            modifiedDocument = true;
+            compilersTab.modifiedDocument = true;
+         }
+         return true;
+      }
+   };
+
+   Button resourcesDotEar
+   {
+      this, text = $"Use resources.ear", position = { 308, 332 };
+      isCheckbox = true;
+
+      bool NotifyClicked(Button button, int x, int y, Modifiers mods)
+      {
+         CompilerConfig compiler = loadedCompiler;
+         if(compiler)
+         {
+            compiler.resourcesDotEar = button.checked;
             modifiedDocument = true;
             compilersTab.modifiedDocument = true;
          }
@@ -1177,15 +1346,20 @@ class CompilerOptionsTab : CompilersSubTab
          numJobsBox.Refresh();
          ccacheEnabled.checked = compiler.ccacheEnabled;
          distccEnabled.checked = compiler.distccEnabled;
-         distccHosts.disabled = !compiler.distccEnabled;
+         distccHostsLabel.disabled = distccHosts.disabled = !compiler.distccEnabled;
          distccHosts.contents = compiler.distccHosts;
          prepDefs.strings = compiler.prepDirectives;
          excludedLibraries.strings = compiler.excludeLibs;
          eCcompilerFlags.strings = compiler.eCcompilerFlags;
          compilerFlags.strings = compiler.compilerFlags;
+         cxxFlags.strings = compiler.cxxFlags;
          linkerFlags.strings = compiler.linkerFlags;
          objectFileExt.contents = compiler.objectFileExt;
-         outputFileExt.contents = compiler.outputFileExt;
+         staticLibFileExt.contents = compiler.staticLibFileExt;
+         sharedLibFileExt.contents = compiler.sharedLibFileExt;
+         executableFileExt.contents = compiler.executableFileExt;
+         stripTarget.checked = !compiler.noStripTarget;
+         resourcesDotEar.checked = compiler.resourcesDotEar;
 
          labelTargetPlatform.disabled = disabled;
          targetPlatform.disabled = disabled;
@@ -1289,14 +1463,14 @@ class WorkspaceOptionsTab : GlobalSettingsSubTab
    bool OnCreate()
    {
       GlobalSettingsDialog dialog = this.dialog;
-      if(dialog && dialog.compilersTab.compilerConfigs && dialog.ideSettings)
+      if(dialog && dialog.compilersTab.compilerConfigs && ideSettings)
       {
          DataRow row;
-         for(compiler : dialog.ideSettings.compilerConfigs)
+         for(compiler : ideConfig.compilers)
          {
             row = defaultCompilerDropBox.AddString(compiler.name);
-            if(dialog.ideSettings.defaultCompiler && dialog.ideSettings.defaultCompiler[0] &&
-                  !strcmp(compiler.name, dialog.ideSettings.defaultCompiler))
+            if(ideSettings.defaultCompiler && ideSettings.defaultCompiler[0] &&
+                  !strcmp(compiler.name, ideSettings.defaultCompiler))
                defaultCompilerDropBox.currentRow = row;
          }
          if(!defaultCompilerDropBox.currentRow && defaultCompilerDropBox)