3 // import "SelectorBar"
4 import "CompilersDetectionDialog"
7 FileDialog settingsFileDialog { type = selectDir, text = $"Select directory" };
9 FileDialog toolchainFileDialog { type = open, text = $"Open"; mayNotExist = true; };
11 class GlobalSettingsDialog : Window
15 background = formColor;
17 borderStyle = sizable;
18 text = $"Global Settings";
19 minClientSize = { 560, 506 };
20 nativeDecorations = true;
22 IDESettings ideSettings;
23 IDESettingsContainer settingsContainer;
24 String workspaceActiveCompiler;
26 TabControl tabControl { this, background = formColor, anchor = { left = 8, top = 8, right = 8, bottom = 40 } };
28 EditorTab editorTab { this, tabControl = tabControl };
29 CompilersTab compilersTab { this, tabControl = tabControl };
30 ProjectOptionsTab projectOptionsTab { this, tabControl = tabControl };
31 WorkspaceOptionsTab workspaceOptionsTab { this, tabControl = tabControl };
33 property bool settingsModified
37 return editorTab.modifiedDocument || compilersTab.modifiedDocument ||
38 projectOptionsTab.modifiedDocument || workspaceOptionsTab.modifiedDocument;
42 bool OnClose(bool parentClosing)
44 if(!settingsModified || MessageBox {
45 type = okCancel, master = ide,
46 text = $"Lose Changes?",
47 contents = $"Are you sure you wish to discard changes?"
55 parent = this, hotKey = escape, text = $"Cancel", id = DialogResult::cancel;
56 position = { 290, 290 }, size = { 80 };
57 anchor = { right = 8, bottom = 8 };
58 NotifyClicked = ButtonCloseDialog;
63 parent = this, isDefault = true, text = $"OK";
64 position = { 200, 290 }, size = { 90 };
65 anchor = { right = 96, bottom = 8 };
67 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
71 bool editorSettingsChanged = false;
72 bool compilerSettingsChanged = false;
73 bool projectOptionsChanged = false;
74 bool workspaceOptionsChanged = false;
76 if(editorTab.modifiedDocument)
78 if(editorTab.useFreeCaret.checked != ideSettings.useFreeCaret ||
79 editorTab.showLineNumbers.checked != ideSettings.showLineNumbers ||
80 editorTab.caretFollowsScrolling.checked != ideSettings.caretFollowsScrolling)
82 ideSettings.useFreeCaret = editorTab.useFreeCaret.checked;
83 ideSettings.showLineNumbers = editorTab.showLineNumbers.checked;
84 ideSettings.caretFollowsScrolling = editorTab.caretFollowsScrolling.checked;
85 editorSettingsChanged = true;
89 if(compilersTab.modifiedDocument)
91 Workspace workspace = ide.workspace;
92 if(strcmp(compilersTab.compilerConfigsDir.path, ideSettings.compilerConfigsDir))
93 ideSettings.compilerConfigsDir = compilersTab.compilerConfigsDir.path;
94 ideSettings.compilerConfigs.Free();
95 for(compiler : compilersTab.compilerConfigs)
97 ideSettings.compilerConfigs.Add(compiler.Copy());
100 compilerSettingsChanged = true;
103 if(projectOptionsTab.modifiedDocument)
105 if(strcmp(projectOptionsTab.defaultTargetDir.path, ideSettings.projectDefaultTargetDir)
106 || strcmp(projectOptionsTab.defaultIntermediateObjDir.path, ideSettings.projectDefaultIntermediateObjDir))
108 ideSettings.projectDefaultTargetDir = projectOptionsTab.defaultTargetDir.path;
109 ideSettings.projectDefaultIntermediateObjDir = projectOptionsTab.defaultIntermediateObjDir.path;
110 projectOptionsChanged = true;
114 if(workspaceOptionsTab.modifiedDocument)
116 DataRow row = workspaceOptionsTab.defaultCompilerDropBox.currentRow;
117 if(row && row.string)
119 if(!ideSettings.defaultCompiler || strcmp(row.string, ideSettings.defaultCompiler))
121 ideSettings.defaultCompiler = row.string;
122 workspaceOptionsChanged = true;
127 settingsContainer.Save();
129 if(compilerSettingsChanged)
130 OnGlobalSettingChange(GlobalSettingsChange::compilerSettings);
131 if(editorSettingsChanged)
132 OnGlobalSettingChange(GlobalSettingsChange::editorSettings);
133 if(projectOptionsChanged)
134 OnGlobalSettingChange(GlobalSettingsChange::projectOptions);
136 editorTab.modifiedDocument = false;
137 compilersTab.modifiedDocument = false;
138 projectOptionsTab.modifiedDocument = false;
139 workspaceOptionsTab.modifiedDocument = false;
142 Destroy(DialogResult::ok);
151 for(c = 0; c < DirTypes::enumSize; c++)
153 CompilerDir compilerDir;
155 for(systemDir : ideSettings.systemDirs[c])
157 compilerDir = CompilerDir { type = c; compilerConfig = null; path = CopyString(systemDir) };
158 dirs.Add(compilerDir);
161 row = compilersTab.dirs[c].AddRow();
162 row.SetData(null, "");
163 compilersTab.dirs[c].currentRow = compilersTab.dirs[c].firstRow;
164 compilersTab.dirs[c].modifiedDocument = false;
171 CompilerConfig activateCompiler = null;
172 CompilerConfig readonlyCompiler = null;
175 editorTab.useFreeCaret.checked = ideSettings.useFreeCaret;
176 editorTab.showLineNumbers.checked = ideSettings.showLineNumbers;
177 editorTab.caretFollowsScrolling.checked = ideSettings.caretFollowsScrolling;
180 if(workspaceActiveCompiler)
182 for(compiler : ideSettings.compilerConfigs)
184 if(!activateCompiler && !strcmp(workspaceActiveCompiler, compiler.name))
185 activateCompiler = compiler;
186 if(!readonlyCompiler && compiler.readOnly)
187 readonlyCompiler = compiler;
188 if(activateCompiler && readonlyCompiler)
192 if(!activateCompiler && readonlyCompiler)
193 activateCompiler = readonlyCompiler;
194 if(!activateCompiler && ideSettings.compilerConfigs.count)
195 activateCompiler = ideSettings.compilerConfigs[0];
197 for(compiler : ideSettings.compilerConfigs)
198 compilersTab.AddCompiler(compiler.Copy(), compiler == activateCompiler);
199 compilersTab.compilerConfigsDir.path = ideSettings.compilerConfigsDir;
202 projectOptionsTab.defaultTargetDir.path = ideSettings.projectDefaultTargetDir;
203 projectOptionsTab.defaultIntermediateObjDir.path = ideSettings.projectDefaultIntermediateObjDir;
210 editorTab.modifiedDocument = false;
211 compilersTab.modifiedDocument = false;
212 compilersTab.dirsTab.modifiedDocument = false;
213 compilersTab.toolchainTab.modifiedDocument = false;
214 compilersTab.optionsTab.modifiedDocument = false;
215 compilersTab.activeCompiler = null;
216 compilersTab.compilerConfigs.Free();
217 compilersTab.compilerSelector.Clear();
218 projectOptionsTab.modifiedDocument = false;
219 workspaceOptionsTab.modifiedDocument = false;
222 virtual void OnGlobalSettingChange(GlobalSettingsChange globalSettingsChange);
225 class EditorTab : GlobalSettingsSubTab
227 background = formColor;
232 this, text = $"Move code editor caret freely past end of line", position = { 16, 68 }, isCheckbox = true;
233 NotifyClicked = NotifyClickedModifiedDocument;
236 Button caretFollowsScrolling
238 this, text = $"Keep caret visible (move along) when scrolling", position = { 16, 88 }, isCheckbox = true;
239 NotifyClicked = NotifyClickedModifiedDocument;
242 Button showLineNumbers
244 this, text = $"Show line numbers in code editor", position = { 16, 108 }, isCheckbox = true;
245 NotifyClicked = NotifyClickedModifiedDocument;
248 bool NotifyClickedModifiedDocument(Button button, int x, int y, Modifiers mods)
250 modifiedDocument = true;
255 static void DrawStipple(Surface surface, Size clientSize)
259 int x2 = clientSize.w - 1;
260 int y2 = clientSize.h - 1;
261 if((x2 - x1) & 1) x2--;
262 if((y2 - y1) & 1) y2--;
264 surface.LineStipple(0x5555);
265 surface.Rectangle(x1, y1, x2, y2);
266 surface.LineStipple(0);
269 class CompilersTab : GlobalSettingsSubTab
271 background = formColor;
274 Label compilerConfigsDirLabel { this, position = { 8, 12 }, labeledWindow = compilerConfigsDir, tabCycle = false, inactive = true };
275 PathBox compilerConfigsDir
277 this, anchor = { left = 230, top = 8, right = 8 };
278 text = $"Compiler Configurations Directory", browseDialog = settingsFileDialog, NotifyModified = NotifyModifiedDocument;
281 SelectorBar compilerSelector
283 this, text = $"Compiler Configurations:", anchor = { left = 148, top = 38, right = 99 }; size = { 0, 26 };
285 direction = horizontal, scrollable = true;
287 bool OnKeyDown(Key key, unichar ch)
291 ((CompilersTab)parent).createCompiler.NotifyClicked(parent, ((CompilersTab)parent).createCompiler, 0, 0, 0);
296 ((CompilersTab)parent).deleteCompiler.NotifyClicked(parent, ((CompilersTab)parent).deleteCompiler, 0, 0, 0);
299 return SelectorBar::OnKeyDown(key, ch);
302 bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
304 ((CompilersTab)master).labelCompilers.Update(null);
310 CompilersTab compilers = (CompilersTab)parent;
311 SelectorBar::OnPostCreate();
312 if(compilers.selectedButton)
314 Button sb = compilers.selectedButton;
317 // Why was this being set to null? On going back to compilers the 2nd time, the selectedButton was lost and so was not made visible...
318 // compilers.selectedButton = null;
324 TabControl tabControl { this, background = formColor, anchor = { left = 8, top = 68, right = 8, bottom = 8 } };
326 CompilerDirectoriesTab dirsTab { this, tabControl = tabControl };
327 CompilerToolchainTab toolchainTab { this, tabControl = tabControl };
328 CompilerEnvironmentTab environmentTab { this, tabControl = tabControl };
329 CompilerOptionsTab optionsTab { this, tabControl = tabControl };
331 List<CompilerConfig> compilerConfigs { };
332 CompilerConfig activeCompiler;
336 this, anchor = { left = 8, top = 44 }, labeledWindow = compilerSelector;
338 void OnRedraw(Surface surface)
340 Label::OnRedraw(surface);
341 if(labeledWindow.active)
342 DrawStipple(surface, clientSize);
346 void FindUniqueCompilerName(const char * baseName, CompilerConfig compiler/*, bool startWithNumber*/, char * output)
349 char tmp[MAX_F_STRING];
350 /*if(startWithNumber)
351 sprintf(tmp, "%s%d", baseName, num);
353 strcpy(tmp, baseName);
356 CompilerConfig matchingCompiler = null;
357 for(c : compilerConfigs)
358 { // TOFIX: Error when omitting these brackets, c not found
359 if((!compiler || c != compiler) && c.name && !strcmp(c.name, tmp))
361 matchingCompiler = c;
368 sprintf(tmp, "%s%d", baseName, num);
376 Button createCompiler
378 parent = this, bevelOver = true, inactive = true;
380 anchor = { top = 40, right = 77 };
381 hotKey = altC, bitmap = BitmapResource { fileName = ":actions/docNew.png", alphaBlend = true };
383 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
385 char compilerName[MAX_F_STRING];
386 CompilerConfig newCompiler;
387 FindUniqueCompilerName("New Compiler", null, compilerName);
388 newCompiler = MakeDefaultCompiler(compilerName, false);
389 AddCompiler(newCompiler, true);
390 modifiedDocument = true;
394 Button detectCompiler
396 parent = this, bevelOver = true, inactive = true;
398 anchor = { top = 40, right = 54 };
399 hotKey = altC, bitmap = BitmapResource { fileName = ":actions/attach.png", alphaBlend = true };
401 bool NotifyClicked(Button b, int x, int y, Modifiers mods)
403 CompilersDetectionDialog compilersDetectionDialog
408 if(compilersDetectionDialog.Modal())
410 if(compilersDetectionDialog.selectedCompilerType)
412 char uniqueName[MAX_F_STRING];
413 CompilerConfig newCompiler = compilersDetectionDialog.compilerConfig;
414 FindUniqueCompilerName(newCompiler.name, null, uniqueName);
415 newCompiler.name = uniqueName;
416 AddCompiler(newCompiler, true);
417 modifiedDocument = true;
423 Button duplicateCompiler
425 parent = this, bevelOver = true, inactive = true;
427 anchor = { top = 40, right = 31 };
428 hotKey = altU, bitmap = BitmapResource { fileName = ":actions/editCopy.png", alphaBlend = true };
430 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
432 char copyName[MAX_F_STRING];
433 CompilerConfig copyCompiler = activeCompiler.Copy();
434 FindUniqueCompilerName(copyCompiler.name, null, copyName);
435 copyCompiler.readOnly = false;
436 copyCompiler.name = copyName;
437 AddCompiler(copyCompiler, true);
438 modifiedDocument = true;
442 Button deleteCompiler
444 parent = this, bevelOver = true, inactive = true;
446 anchor = { top = 40, right = 8 };
447 hotKey = altD, bitmap = BitmapResource { fileName = ":actions/delete2.png", alphaBlend = true };
449 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
453 CompilerConfig compilerToDelete = activeCompiler;
454 String title = PrintString($"Delete ", compilerToDelete.name, $" Compiler Configuration");
455 String msg = PrintString($"Are you sure you wish to delete the ", compilerToDelete.name, $" compiler configuration?");
456 if(MessageBox { type = okCancel, text = title, contents = msg }.Modal() == ok)
458 SelectorButton button = compilerSelector.FindButtonByID((int64)compilerToDelete);
460 compilerSelector.RemoveButton(button);
461 //DeleteCompiler(compilerToDelete);
463 Iterator<CompilerConfig> it { compilerConfigs };
464 if(it.Find(compilerToDelete))
465 compilerConfigs.Delete(it.pointer);
467 modifiedDocument = true;
476 void AddCompiler(CompilerConfig compiler, bool load)
478 SelectorButton selectButton;
479 if(compiler.readOnly)
481 SelectorButton button
483 compilerSelector, master = this, text = compiler.name, id = (int64)compiler;
484 NotifyClicked = CompilerClicked;
486 selectButton = button;
490 EditableSelectorButton button
492 compilerSelector, master = this, renameable = true, text = compiler.name, id = (int64)compiler;
493 NotifyClicked = CompilerClicked;
495 bool OnRename(EditableSelectorButton button, char ** oldName, char ** newName)
497 if(*newName && (*newName)[0])
499 char compilerName[MAX_F_STRING];
500 FindUniqueCompilerName(*newName, activeCompiler, compilerName);
501 if(strcmp(*newName, compilerName))
504 *newName = CopyString(compilerName);
506 activeCompiler.name = compilerName;
507 modifiedDocument = true;
513 selectButton = (SelectorButton)button;
515 compilerConfigs.Add(compiler);
518 LoadCompiler(compiler);
519 selectedButton = selectButton;
520 compilerSelector.Select(selectedButton);
523 SelectorButton selectedButton;
525 void LoadCompiler(CompilerConfig compiler)
527 bool modified = modifiedDocument;
528 activeCompiler = compiler;
532 environmentTab.Load();
535 // Restore original modifiedDocument
536 modifiedDocument = modified;
538 deleteCompiler.disabled = compiler.readOnly;
541 bool CompilerClicked(Button clickedButton, int x, int y, Modifiers mods)
543 if(!eClass_IsDerived(clickedButton._class, class(EditableSelectorButton)) || !((EditableSelectorButton)clickedButton).editBox)
545 LoadCompiler((CompilerConfig)clickedButton.id);
546 selectedButton = (SelectorButton)clickedButton;
551 bool NotifyModifiedDocument(PathBox pathBox)
553 BasicValidatePathBoxPath(pathBox);
554 modifiedDocument = true;
559 Array<const String> displayDirectoryNames
566 class CompilerDirectoriesTab : CompilersSubTab
568 background = formColor;
569 text = $"Directories";
571 Button dirTypeTglBtn[DirTypes];
572 DirectoriesBox dirs[DirTypes], currentDirs;
574 ~CompilerDirectoriesTab()
577 for(c = 0; c < DirTypes::enumSize; c++)
580 delete dirTypeTglBtn[c];
583 CompilerDirectoriesTab()
587 for(c = 0; c < DirTypes::enumSize; c++)
589 dirs[c] = DirectoriesBox
591 this;//, alwaysHighLight = true
592 anchor = { left = 8, top = 8, right = 8, bottom = 8 };
595 /* MAKE SURE THINGS ARE DONE PROPERLY IN THE NEW DIRECTORIES BOX WHEN BROWSING FOR A DIR?
596 settingsFileDialog.filePath = directory;
597 if(settingsFileDialog.Modal())
598 row.SetData(null, (s = CopyUnixPath(settingsFileDialog.filePath)));
601 bool NotifyModified(DirectoriesBox dirsBox)
603 CompilerConfig compiler = loadedCompiler;
606 DirTypes dirType = (DirTypes)dirsBox.id;
607 if(dirType == includes)
608 compiler.includeDirs = dirsBox.strings;
609 else if(dirType == libraries)
610 compiler.libraryDirs = dirsBox.strings;
611 else if(dirType == executables)
612 compiler.executableDirs = dirsBox.strings;
614 compilersTab.modifiedDocument = true;
618 bool NotifyPathBoxModified(DirectoriesBox dirsBox, PathBox pathBox)
620 BasicValidatePathBoxPath(pathBox);
627 dirs[c].visible = false;
629 // (width) Should be 324 for text...
630 //field[c] = { dataType = class(char *), editable = true };
631 //dirs[c].AddField(field[c]);
633 dirTypeTglBtn[c] = Button
635 this, inactive = true, text = displayDirectoryNames[c], bevelOver = true, isRadio = true, bitmap = null;
638 minClientSize = { 99, 20 };
639 anchor = { left = v, top = 8 }; // ((int)c) * 100 + 8
641 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
643 DirTypes dirType = (DirTypes)button.id;
644 currentDirs.visible = false;
645 dirs[dirType].visible = true;
646 currentDirs = dirs[dirType];
650 v += dirTypeTglBtn[c].size.w + 1;
651 incref dirTypeTglBtn[c];
654 dirTypeTglBtn[c].hotKey = altI;
655 else if(c == libraries)
656 dirTypeTglBtn[c].hotKey = altL;
657 else if(c == executables)
658 dirTypeTglBtn[c].hotKey = altE;
660 currentDirs = dirs[includes];
661 dirTypeTglBtn[includes].checked = true;
665 bool OnLoadGraphics()
669 for(c = 0; c < DirTypes::enumSize; c++)
671 dirTypeTglBtn[c].anchor.left = v;
672 v += dirTypeTglBtn[c].size.w + 1;
674 return CompilersSubTab::OnLoadGraphics();
679 CompilerConfig compiler = loadedCompiler;
682 dirs[includes].strings = compiler.includeDirs;
683 dirs[libraries].strings = compiler.libraryDirs;
684 dirs[executables].strings = compiler.executableDirs;
685 dirs[includes].list.scroll = { 0, 0 };
686 dirs[libraries].list.scroll = { 0, 0 };
687 dirs[executables].list.scroll = { 0, 0 };
692 class CompilerToolchainTab : CompilersSubTab
694 background = formColor;
700 Label ecpLabel { this, position = { 8, 12 }, labeledWindow = ecp, tabCycle = false, inactive = true };
703 this, anchor = { left = margin, top = 8, right = 8 };
704 text = $"eC Precompiler", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
706 Label eccLabel { this, position = { 8, 38 }, labeledWindow = ecc, tabCycle = false, inactive = true };
709 this, anchor = { left = margin, top = 34, right = 8 };
710 text = $"eC Compiler", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
712 Label ecsLabel { this, position = { 8, 64 }, labeledWindow = ecs, tabCycle = false, inactive = true };
715 this, anchor = { left = margin, top = 60, right = 8 };
716 text = $"eC Symbol Loader", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
718 Label earLabel { this, position = { 8, 90 }, labeledWindow = ear, tabCycle = false, inactive = true };
721 this, anchor = { left = margin, top = 86, right = 8 };
722 text = $"Ecere Archiver", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
724 Label cppLabel { this, position = { 8, 116 }, labeledWindow = cpp, tabCycle = false, inactive = true };
727 this, anchor = { left = margin, top = 112, right = 8 };
728 text = $"C Preprocessor", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
730 Label ccLabel { this, position = { 8, 142 }, labeledWindow = cc, tabCycle = false, inactive = true };
733 this, anchor = { left = margin, top = 138, right = 8 };
734 text = $"C Compiler", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
736 Label cxxLabel { this, position = { 8, 168 }, labeledWindow = cxx, tabCycle = false, inactive = true };
739 this, anchor = { left = margin, top = 164, right = 8 };
740 text = $"C++ Compiler", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
742 Label makeLabel { this, position = { 8, 194 }, labeledWindow = make, tabCycle = false, inactive = true };
745 this, anchor = { left = margin, top = 190, right = 8 };
746 text = $"GNU Make", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
748 Label gnuToolchainPrefixLabel { this, position = { 8, 220 }, labeledWindow = gnuToolchainPrefix, tabCycle = false, inactive = true };
749 PathBox gnuToolchainPrefix
751 this, anchor = { left = margin, top = 216, right = 8 };
752 text = $"GNU Toolchain Prefix", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
754 Label sysrootLabel { this, position = { 8, 246 }, labeledWindow = sysroot, tabCycle = false, inactive = true };
757 this, anchor = { left = margin, top = 242, right = 8 };
758 text = $"SYSROOT", typeExpected = directory, browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
760 Label executableLauncherLabel { this, position = { 8, 272 }, labeledWindow = executableLauncher, tabCycle = false, inactive = true };
761 PathBox executableLauncher
763 this, anchor = { left = margin, top = 268, right = 8 };
764 text = $"Executable Launcher", browseDialog = toolchainFileDialog, NotifyModified = NotifyModifiedDocument;
767 bool NotifyModifiedDocument(PathBox pathBox)
769 CompilerConfig compiler = loadedCompiler;
772 BasicValidatePathBoxPath(pathBox);
774 compiler.ecpCommand = pathBox.slashPath;
775 else if(pathBox == ecc)
776 compiler.eccCommand = pathBox.slashPath;
777 else if(pathBox == ecs)
778 compiler.ecsCommand = pathBox.slashPath;
779 else if(pathBox == ear)
780 compiler.earCommand = pathBox.slashPath;
781 else if(pathBox == cpp)
782 compiler.cppCommand = pathBox.slashPath;
783 else if(pathBox == cc)
784 compiler.ccCommand = pathBox.slashPath;
785 else if(pathBox == cxx)
786 compiler.cxxCommand = pathBox.slashPath;
787 else if(pathBox == make)
788 compiler.makeCommand = pathBox.slashPath;
789 else if(pathBox == executableLauncher)
790 compiler.execPrefixCommand = pathBox.slashPath;
791 else if(pathBox == gnuToolchainPrefix)
792 compiler.gccPrefix = pathBox.slashPath;
793 else if(pathBox == sysroot)
794 compiler.sysroot = pathBox.slashPath;
795 modifiedDocument = true;
796 compilersTab.modifiedDocument = true;
803 CompilerConfig compiler = loadedCompiler;
806 bool disabled = compiler.readOnly;
807 bool isVC = compiler.type.isVC;
808 ecp.path = compiler.ecpCommand;
809 ecc.path = compiler.eccCommand;
810 ecs.path = compiler.ecsCommand;
811 ear.path = compiler.earCommand;
812 cpp.path = compiler.cppCommand;
813 cc.path = compiler.ccCommand;
814 cxx.path = compiler.cxxCommand;
815 make.path = compiler.makeCommand;
816 executableLauncher.path = compiler.executableLauncher;
817 gnuToolchainPrefix.path = compiler.gnuToolchainPrefix;
818 sysroot.path = compiler.sysroot;
820 ecpLabel.disabled = ecp.disabled = disabled;
821 eccLabel.disabled = ecc.disabled = disabled;
822 ecsLabel.disabled = ecs.disabled = disabled;
823 earLabel.disabled = ear.disabled = disabled;
824 cppLabel.disabled = cpp.disabled = isVC || disabled;
825 cxxLabel.disabled = cxx.disabled = isVC || disabled;
826 ccLabel.disabled = cc.disabled = isVC || disabled;
827 makeLabel.disabled = make.disabled = disabled;
828 executableLauncherLabel.disabled = executableLauncher.disabled = disabled;
829 gnuToolchainPrefixLabel.disabled = gnuToolchainPrefix.disabled = disabled;
830 sysrootLabel.disabled = sysroot.disabled = disabled;
832 modifiedDocument = false;
836 class CompilerEnvironmentTab : CompilersSubTab
838 background = formColor;
839 text = $"Environment";
841 Label labelEnvVars { envVars, labeledWindow = envVars, position = { 0, 6 }; };
842 NamedStringsBox envVars
844 this, size = { 290, 22 }, anchor = { left = 8, top = 8, right = 8, bottom = 8 };
845 text = $"Environment Variables", hotKey = altE; //, option = OPTION(postbuildCommands);
847 bool NotifyModified(NamedStringsBox stringsBox)
849 CompilerConfig compiler = loadedCompiler;
852 compiler.environmentVars = stringsBox.namedStrings;
853 modifiedDocument = true;
854 compilersTab.modifiedDocument = true;
860 CompilerEnvironmentTab()
866 CompilerConfig compiler = loadedCompiler;
869 envVars.namedStrings = compiler.environmentVars;
871 modifiedDocument = false;
876 class CompilerOptionsTab : CompilersSubTab
878 background = formColor;
881 Label labelTargetPlatform { this, position = { 8, 12 }, labeledWindow = targetPlatform }; // TOCHECK: nameless instances dissapear when selecting tabs?
882 DropBox targetPlatform
884 this, position = { 110, 8 }, size = { 160 };
885 text = $"Target Platform", hotKey = altT;
886 bool NotifySelect(DropBox dropBox, DataRow row, Modifiers mods)
888 CompilerConfig compiler = loadedCompiler;
891 compiler.targetPlatform = (Platform)row.tag;
892 modifiedDocument = true;
893 compilersTab.modifiedDocument = true;
900 Label numJobsLabel { this, position = { 8, 40 }, labeledWindow = numJobsBox };
903 this, text = $"Number of parallel build jobs", hotKey = altJ, borderStyle = deep;
904 position = { 244, 36 }, size = { 80, 20 }, type = class(int), data = &numJobs;
906 bool OnKeyDown(Key key, unichar ch)
908 if((SmartKey)key == enter)
910 DataBox::OnKeyDown(key, ch);
914 return DataBox::OnKeyDown(key, ch);
917 bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
927 bool NotifyChanged(DataBox dataBox, bool closingDropDown)
929 CompilerConfig compiler = loadedCompiler;
932 compiler.numJobs = numJobs;
933 modifiedDocument = true;
934 compilersTab.modifiedDocument = true;
942 this, text = $"Use ccache", hotKey = altC, position = { 8, 68 };
945 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
947 CompilerConfig compiler = loadedCompiler;
950 compiler.ccacheEnabled = button.checked;
951 modifiedDocument = true;
952 compilersTab.modifiedDocument = true;
960 this, text = $"Use distcc", hotKey = altD, position = { 158, 68 };
963 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
965 CompilerConfig compiler = loadedCompiler;
968 distccHosts.disabled = !button.checked;
969 compiler.distccEnabled = button.checked;
970 modifiedDocument = true;
971 compilersTab.modifiedDocument = true;
977 Label distccHostsLabel { this, position = { 8, 96 }, labeledWindow = distccHosts };
980 this, text = $"distcc hosts", hotKey = altH;
981 position = { 88, 92 }, size = { 300, 22 };
983 bool NotifyModified(EditBox editBox)
985 CompilerConfig compiler = loadedCompiler;
988 compiler.distccHosts = editBox.contents;
989 modifiedDocument = true;
990 compilersTab.modifiedDocument = true;
996 Label lblPrepDefs { this, position = { 8, 126 }, labeledWindow = prepDefs };
997 StringListBox prepDefs
999 this, text = $"Preprocessor directives", hotKey = altP;
1000 position = { 148, 124 }, size = { 300, 22 }, anchor = { left = 148, top = 124, right = 8 };
1002 bool NotifyModified(EditBox editBox)
1006 CompilerConfig compiler = loadedCompiler;
1007 compiler.prepDirectives = ((StringListBox)editBox).strings;
1008 modifiedDocument = true;
1009 compilersTab.modifiedDocument = true;
1015 Label leCcompilerFlags { this, position = { 8, 156 }, labeledWindow = eCcompilerFlags };
1016 StringListBox eCcompilerFlags
1018 this, text = $"Additional eC compiler flags", hotKey = altG;
1019 position = { 148, 154 }, size = { 300, 22 }, anchor = { left = 148, top = 154, right = 8 };
1021 bool NotifyModified(EditBox editBox)
1025 CompilerConfig compiler = loadedCompiler;
1026 compiler.eCcompilerFlags = ((StringListBox)editBox).strings;
1027 modifiedDocument = true;
1028 compilersTab.modifiedDocument = true;
1034 Label lblCompilerFlags { this, position = { 8, 186 }, labeledWindow = compilerFlags };
1035 StringListBox compilerFlags
1037 this, text = $"Additional compiler flags", hotKey = altR;
1038 position = { 148, 184 }, size = { 300, 22 }, anchor = { left = 148, top = 184, right = 8 };
1040 bool NotifyModified(EditBox editBox)
1044 CompilerConfig compiler = loadedCompiler;
1045 compiler.compilerFlags = ((StringListBox)editBox).strings;
1046 modifiedDocument = true;
1047 compilersTab.modifiedDocument = true;
1053 Label lblLinkerFlags { this, position = { 8, 216 }, labeledWindow = linkerFlags };
1054 StringListBox linkerFlags
1056 this, text = $"Additional linker flags", hotKey = altL;
1057 position = { 148, 214 }, size = { 300, 22 }, anchor = { left = 148, top = 214, right = 8 };
1059 bool NotifyModified(EditBox editBox)
1063 CompilerConfig compiler = loadedCompiler;
1064 compiler.linkerFlags = ((StringListBox)editBox).strings;
1065 modifiedDocument = true;
1066 compilersTab.modifiedDocument = true;
1072 Label lblExcludedLibraries { this, position = { 8, 246 }, labeledWindow = excludedLibraries };
1073 StringListBox excludedLibraries
1075 this, text = $"Libraries to exclude", hotKey = altX;
1076 position = { 148, 244 }, size = { 300, 22 }, anchor = { left = 148, top = 244, right = 8 };
1078 bool NotifyModified(EditBox editBox)
1082 CompilerConfig compiler = loadedCompiler;
1083 compiler.excludeLibs = ((StringListBox)editBox).strings;
1084 modifiedDocument = true;
1085 compilersTab.modifiedDocument = true;
1091 CompilerOptionsTab()
1095 for(p = (Platform)1; p < Platform::enumSize; p++)
1097 row = targetPlatform.AddRow();
1105 CompilerConfig compiler = loadedCompiler;
1108 bool disabled = compiler.readOnly;
1109 targetPlatform.currentRow = targetPlatform.FindRow(compiler.targetPlatform);
1110 numJobs = compiler.numJobs;
1111 numJobsBox.Refresh();
1112 ccacheEnabled.checked = compiler.ccacheEnabled;
1113 distccEnabled.checked = compiler.distccEnabled;
1114 distccHosts.disabled = !compiler.distccEnabled;
1115 distccHosts.contents = compiler.distccHosts;
1116 prepDefs.strings = compiler.prepDirectives;
1117 excludedLibraries.strings = compiler.excludeLibs;
1118 eCcompilerFlags.strings = compiler.eCcompilerFlags;
1119 compilerFlags.strings = compiler.compilerFlags;
1120 linkerFlags.strings = compiler.linkerFlags;
1122 labelTargetPlatform.disabled = disabled;
1123 targetPlatform.disabled = disabled;
1126 modifiedDocument = false;
1130 class CompilersSubTab : Tab
1132 property CompilersTab compilersTab
1136 CompilersTab tab = (CompilersTab)master;
1137 while(tab && tab._class != class(CompilersTab))
1138 tab = (CompilersTab)tab.master;
1143 property CompilerConfig loadedCompiler
1147 CompilersTab tab = compilersTab;
1148 return tab ? tab.activeCompiler : null;
1153 class ProjectOptionsTab : GlobalSettingsSubTab
1155 background = formColor;
1158 Label defaultTargetDirLabel { this, position = { 8, 34 }, labeledWindow = defaultTargetDir };
1159 PathBox defaultTargetDir
1161 this, size = { 160, 21 }, position = { 8, 52 }, anchor = { left = 8, top = 52, right = 8 };
1162 text = $"Default Target Directory", hotKey = altT;
1164 bool NotifyModified(PathBox pathBox)
1166 BasicValidatePathBoxPath(pathBox);
1167 modifiedDocument = true;
1172 Label defaultIntermediateObjDirLabel { this, position = { 8, 78 }, labeledWindow = defaultIntermediateObjDir };
1173 PathBox defaultIntermediateObjDir
1175 this, size = { 160, 21 }, position = { 8, 96 }, anchor = { left = 8, top = 96, right = 8 };
1176 text = $"Default Intermediate Objects Directory", hotKey = altI;
1178 bool NotifyModified(PathBox pathBox)
1180 BasicValidatePathBoxPath(pathBox);
1181 modifiedDocument = true;
1187 // COMPILER TOFIX: if class GlobalSettingsSubTab is after class WorkspaceOptionsTab the OnPostCreate
1188 // of WorkspaceOptionsTab will *not* be called!
1189 class GlobalSettingsSubTab : Tab
1191 property GlobalSettingsDialog dialog
1195 GlobalSettingsDialog dialog = (GlobalSettingsDialog)master;
1196 while(dialog && dialog._class != class(GlobalSettingsDialog))
1197 dialog = (GlobalSettingsDialog)dialog.master;
1203 class WorkspaceOptionsTab : GlobalSettingsSubTab
1205 background = formColor;
1206 text = $"Workspace";
1208 Label defaultCompilerLabel { this, position = { 8, 14 }, labeledWindow = defaultCompilerDropBox };
1209 DropBox defaultCompilerDropBox
1211 this, position = { 140, 8 }, size = { 220 };
1212 text = $"Default Compiler", hotKey = altA;
1214 bool NotifySelect(DropBox dropBox, DataRow row, Modifiers mods)
1216 modifiedDocument = true;
1223 GlobalSettingsDialog dialog = this.dialog;
1224 if(dialog && dialog.compilersTab.compilerConfigs && dialog.ideSettings)
1227 for(compiler : dialog.ideSettings.compilerConfigs)
1229 row = defaultCompilerDropBox.AddString(compiler.name);
1230 if(dialog.ideSettings.defaultCompiler && dialog.ideSettings.defaultCompiler[0] &&
1231 !strcmp(compiler.name, dialog.ideSettings.defaultCompiler))
1232 defaultCompilerDropBox.currentRow = row;
1234 if(!defaultCompilerDropBox.currentRow && defaultCompilerDropBox)
1235 defaultCompilerDropBox.currentRow = defaultCompilerDropBox.firstRow;
1242 // TOFIX: The selection will be lost upon changing tab...
1243 // Should either warn, or leave it modified and put in place
1244 // checks to save/find the compiler by name
1245 defaultCompilerDropBox.Clear();
1246 modifiedDocument = false;
1250 //static define app = ((GuiApplication)__thisModule);