static ProjectNode currentNode;
static Project project;
-static String MakeString(char * s, int len)
+static String MakeString(char * s, int len, char * switchToKeep, int lenSwitchToKeep)
{
String string = new char[len+1];
- memcpy(string, s, len);
- string[len] = 0;
+ if(s[0] == '-' && switchToKeep && switchToKeep[0])
+ {
+ if(strstr(s+1, switchToKeep) == s+1)
+ {
+ memcpy(string, s+lenSwitchToKeep+1, len-lenSwitchToKeep-1);
+ string[len-lenSwitchToKeep-1] = '\0';
+ }
+ else
+ delete string;
+ }
+ else
+ {
+ memcpy(string, s, len);
+ string[len] = '\0';
+ }
return string;
}
class StringListBox : EditBox
{
+ char * switchToKeep;
+ int lenSwitchToKeep;
+
textHorzScroll = true;
property Array<String> strings
bool first = true;
for(item : value)
{
- bool quoted = strchr(item, ' ') != null;
- if(!first)
- AddS(" ");
- if(quoted)
- AddS("\"");
- AddS(item);
- if(quoted)
- AddS("\"");
- first = false;
+ if(item)
+ {
+ if(!first)
+ AddS(" ");
+ AddS(item);
+ first = false;
+ }
}
}
}
Array<String> array { };
int c, start = 0;
char * contents = property::contents;
+ char * s;
char ch;
bool quoted = false;
if(ch == ' ' && !quoted)
{
if(c - start)
- array.Add(MakeString(contents + start, c - start));
+ {
+ if((s = MakeString(contents + start, c - start, switchToKeep, lenSwitchToKeep)))
+ array.Add(s);
+ }
start = c + 1;
}
else if(ch == '\"')
{
if(quoted)
- {
- if(c - start)
- array.Add(MakeString(contents + start, c - start));
quoted = false;
- start = c + 1;
- }
else
- {
quoted = true;
- start = c + 1;
- }
}
}
if(c - start)
- array.Add(MakeString(contents + start, c - start));
+ {
+ if((s = MakeString(contents + start, c - start, switchToKeep, lenSwitchToKeep)))
+ array.Add(s);
+ }
return array;
}
}
text = dialogTitle;
background = formColor;
borderStyle = sizable;
- minClientSize = { 650, 490 };
+ minClientSize = { 650, 520 };
hasClose = true;
tabCycle = true;
- size = { 650, 490 };
+ size = { 650, 520 };
property Project project
{
{
UpdateDialogTitle();
prjTabControl.curTab = buildTab;
+
+ ((DirectoriesBox)buildTab.compilerTab.includeDirs.editor).baseBrowsePath = project.topNode.path;
+ ((DirectoriesBox)buildTab.linkerTab.libraryDirs.editor).baseBrowsePath = project.topNode.path;
+
return true;
}
}
bool NotifyModified(PathBox pathBox)
{
+ FixPathOnPathBoxNotifyModified(pathBox);
((OptionBox)pathBox.id).Retrieve();
return true;
}
{
String s = it.data;
bool found = false;
- for(i : tempStrings; !(caseSensitive ? strcmp : strcmpi)(i, s)) { found = true; break; }
+ for(i : tempStrings; i && s && !(caseSensitive ? strcmp : strcmpi)(i, s)) { found = true; break; }
if(found && (!configReplaces || platform)) // ADDED || platform here...
{
delete s;
for(s : strings)
{
bool found = false;
- for(i : tempStrings; !(caseSensitive ? strcmp : strcmpi)(i, s)) { found = true; break; }
+ for(i : tempStrings; i && s && !(caseSensitive ? strcmp : strcmpi)(i, s)) { found = true; break; }
if(!found) tempStrings.Add(s);
}
}
// NO VIRTUAL PROPERTIES YET...
Array<String> GetStrings() { return ((StringListBox)editor).strings; }
void SetStrings(Array<String> value) { ((StringListBox)editor).strings = value; }
+
+ property char * switchToKeep { set { ((StringListBox)editor).switchToKeep = value; ((StringListBox)editor).lenSwitchToKeep = strlen(value); } };
}
class StringsArrayOptionBox : MultiStringOptionBox
void SetStrings(Array<String> value) { ((StringsBox)editor).strings = value; }
}
-class DirsArrayOptionBox : MultiStringOptionBox
+bool eString_IsPathRelatedTo(char * path, char * to)
{
- editor = DirectoriesBox
+ if(path[0] && to[0])
{
- bool NotifyModified(DirectoriesBox dirsBox)
- {
- ((OptionBox)dirsBox.id).Retrieve();
- return true;
- }
-
- bool OnChangedDir(char * * directory)
+ char rest[MAX_FILENAME];
+ char pathPart[MAX_FILENAME], pathRest[MAX_LOCATION] = "";
+ char toPart[MAX_FILENAME], toRest[MAX_LOCATION] = "";
+ SplitDirectory(path, pathPart, pathRest);
+ SplitDirectory(to, toPart, toRest);
+ if(!fstrcmp(pathPart, toPart))
{
- char fixedDirectory[MAX_LOCATION] = "";
- if(PathCat(fixedDirectory, *directory))
+ if(pathRest[0] && toRest[0])
{
- char cwdBackup[MAX_LOCATION];
- if(project)
- {
- GetWorkingDir(cwdBackup, sizeof(cwdBackup));
- ChangeWorkingDir(project.topNode.path);
- }
- FileFixCase(fixedDirectory);
- if(project)
- ChangeWorkingDir(cwdBackup);
- delete *directory;
- *directory = CopyString(fixedDirectory);
- return true;
+ SplitDirectory(pathRest, pathPart, pathRest);
+ SplitDirectory(toRest, toPart, toRest);
+ if(!fstrcmp(pathPart, toPart))
+ return true;
}
- return false;
}
+ }
+ return false;
+}
+
+static void FixPathOnPathBoxNotifyModified(PathBox pathBox)
+{
+ int len;
+ char path[MAX_LOCATION];
+ ValidPathBufCopy(path, pathBox.path);
+ len = strlen(path);
+ if(len && !(path[0] == '.' && (len == 1 || (len == 2 && path[1] == DIR_SEP) || (len > 1 && path[1] == '.'))))
+ {
+ char cwdBackup[MAX_LOCATION];
+ if(project)
+ {
+ GetWorkingDir(cwdBackup, sizeof(cwdBackup));
+ ChangeWorkingDir(project.topNode.path);
+ }
+ FileFixCase(path);
+ if(project)
+ ChangeWorkingDir(cwdBackup);
+ if(eString_IsPathRelatedTo(path, project.topNode.path))
+ MakePathRelative(path, project.topNode.path, path);
+ if(!path[0])
+ strcpy(path, ".");
+ len = strlen(path);
+ }
+ if(len>1 && path[len-1] == DIR_SEP)
+ path[--len] = '\0';
+ pathBox.path = path;
+}
+
+class DirsArrayOptionBox : MultiStringOptionBox
+{
+public:
+ property char * switchToKeep { set { switchToKeep = value; lenSwitchToKeep = strlen(value); } };
+private:
+ char * switchToKeep;
+ int lenSwitchToKeep;
- bool OnPrepareBrowseDir(char * * directory)
+ editor = DirectoriesBox
+ {
+ browseDialog = { };
+ bool NotifyModified(DirectoriesBox dirsBox)
{
- char dir[MAX_LOCATION];
- if(project)
+ char * switchToKeep = ((DirsArrayOptionBox)dirsBox.id).switchToKeep;
+ if(switchToKeep && switchToKeep[0])
{
- GetSystemPathBuffer(dir, project.topNode.path);
- if(*directory)
- PathCat(dir, *directory);
+ bool change = false;
+ int lenSwitchToKeep = ((DirsArrayOptionBox)dirsBox.id).lenSwitchToKeep;
+ Array<String> dirs { };
+ Array<String> previousDirs = dirsBox.strings;
+ for(d : previousDirs)
+ {
+ int c;
+ char * buffer = new char[strlen(d)+64];
+ char * tokens[1024];
+ uint count;
+ strcpy(buffer, d);
+ count = Tokenize(buffer, sizeof(tokens)/sizeof(tokens[0]), tokens, (BackSlashEscaping)false);
+ for(c=0; c<count; c++)
+ {
+ if(tokens[c][0] == '-')
+ {
+ if(strstr(tokens[c]+1, switchToKeep) == tokens[c]+1)
+ tokens[c] += lenSwitchToKeep+1;
+ else
+ tokens[c][0] = '\0';
+ change = true;
+ }
+ dirs.Add(CopyString(tokens[c]));
+ }
+ delete buffer;
+ }
+ if(change)
+ dirsBox.strings = dirs;
+ dirs.Free();
+ delete dirs;
+ previousDirs.Free();
+ delete previousDirs;
}
- else if(*directory)
- strcpy(dir, *directory);
- else
- dir[0] = '\0';
-
- delete *directory;
- *directory = CopyString(dir);
-
- // GCC 4.4 bug: ----- path becomes *directory
- //strcpy(dir, path ? path : "");
+ ((OptionBox)dirsBox.id).Retrieve();
return true;
}
- bool OnBrowsedDir(char * * directory)
+ bool NotifyPathBoxModified(DirectoriesBox dirsBox, PathBox pathBox)
{
- if(project)
- {
- char path[MAX_LOCATION];
- MakePathRelative(*directory, project.topNode.path, path);
- delete *directory;
- *directory = CopyString(path);
- }
+ FixPathOnPathBoxNotifyModified(pathBox);
return true;
}
};
}
}
}
- if(!project.config && project.topNode.configurations.count)
- project.config = project.topNode.configurations[0];
+ if(!project.config)
+ {
+ List<ProjectConfig> configs = project.topNode.configurations;
+ if(configs && configs.count)
+ project.config = configs[0];
+ }
ide.UpdateToolBarActiveConfigs(false);
}
text = $"No Line Numbers", hotKey = altN, option = OPTION(noLineNumbers);
};
+ Label labelCompilerOptions { rightPane, this, position = { 8, 208 }, labeledWindow = compilerOptions };
+ StringArrayOptionBox compilerOptions
+ {
+ rightPane, this, size = { 290, 22 }, anchor = { left = 8, top = 224, right = 8 };
+ text = $"Compiler Options", hotKey = altO, option = OPTION(compilerOptions);
+ configReplaces = true;
+ };
+
Label labelIncludeDirs { includeDirs.editor, labeledWindow = includeDirs, position = { 0, 6 }; };
DirsArrayOptionBox includeDirs
{
- rightPane, this, size = { 290, 22 }, anchor = { left = 8, top = 208, right = 8, bottom = 8 };
- text = $"Additional Include Directories", hotKey = altI, option = OPTION(includeDirs);
+ rightPane, this, size = { 290, 22 }, anchor = { left = 8, top = 250, right = 8, bottom = 8 };
+ text = $"Additional Include Directories", hotKey = altI, option = OPTION(includeDirs), switchToKeep = "I";
};
CompilerTab()
StringArrayOptionBox libraries
{
this, size = { 290, 22 }, anchor = { left = 8, top = 66, right = 8 };
- text = $"Additional Libraries", hotKey = altL, option = OPTION(libraries);
+ text = $"Additional Libraries", hotKey = altL, option = OPTION(libraries), switchToKeep = "l";
configReplaces = true;
};
DirsArrayOptionBox libraryDirs
{
this, size = { 290, 22 }, anchor = { left = 8, top = 182, right = 8, bottom = 8 };
- text = $"Additional Library Directories", hotKey = altY, option = OPTION(libraryDirs);
+ text = $"Additional Library Directories", hotKey = altY, option = OPTION(libraryDirs), switchToKeep = "L";
};
bool OnCreate()
Label labelPrebuildCommands { prebuildCommands.editor, labeledWindow = prebuildCommands, position = { 0, 6 }; };
StringsArrayOptionBox prebuildCommands
{
- this, size = { 290, 100 }, anchor = { left = 8, top = 8, right = 8, bottom = 0.5 };
+ this, size = { 290, 100 }, anchor = { left = 8, top = 8, right = 8, bottom = 0.66 };
text = $"Pre-build Commands", hotKey = altE, option = OPTION(prebuildCommands);
};
Label labelPostbuildCommands { postbuildCommands.editor, labeledWindow = postbuildCommands, position = { 0, 6 }; };
StringsArrayOptionBox postbuildCommands
{
- this, size = { 290 }, anchor = { left = 8, top = 0.5, right = 8, bottom = 8 };
+ this, size = { 290 }, anchor = { left = 8, top = 0.33, right = 8, bottom = 0.33 };
text = $"Post-build Commands", hotKey = altT, option = OPTION(postbuildCommands);
};
+ Label labelInstallCommands { installCommands.editor, labeledWindow = installCommands, position = { 0, 6 }; };
+ StringsArrayOptionBox installCommands
+ {
+ this, size = { 290 }, anchor = { left = 8, top = 0.66, right = 8, bottom = 8 };
+ text = $"Install Commands", hotKey = altT, option = OPTION(installCommands);
+ };
+
void LoadSettings()
{
bool disabled = strlen(((BuildTab)master).selectedPlatformName) > 0;