import "FileSystemIterator"
-AVLTree<String> binaryDocExt
+AVLTree<const String> binaryDocExt
{ [
"wav", "mp3", "flac", "ogg",
"mid",
this, toolTip = $"Active Compiler", size = { 160 }, disabled = true;
bool NotifySelect(DropBox dropBox, DataRow row, Modifiers mods)
{
- if(ide.workspace && ide.projectView && row && strcmp(row.string, ide.workspace.compiler))
+ if(ide.workspace && ide.projectView && row && strcmp(row.string, ide.workspace.activeCompiler))
{
bool silent = ide.projectView.buildInProgress == none ? false : true;
CompilerConfig compiler = ideSettings.GetCompilerConfig(row.string);
- ide.workspace.compiler = row.string;
+ ide.workspace.activeCompiler = row.string;
ide.projectView.ShowOutputBuildLog(!silent);
if(!silent)
ide.projectView.DisplayCompiler(compiler, false);
if(ide.workspace && ide.projectView && row)
{
bool silent = ide.projectView.buildInProgress == none ? false : true;
- CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler);
+ CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.activeCompiler);
ide.workspace.bitDepth = (int)row.tag;
ide.projectView.ShowOutputBuildLog(!silent);
if(!silent)
BitmapResource bmpTopFrameHalf { ":codeMarks/topFrameHalf.png", window = this };
BitmapResource bmpTopFrameHalfError { ":codeMarks/topFrameHalfError.png", window = this };
+ BuildOutputMode rightClickMenuBuildOutputMode;
+
Debugger debugger { };
ProjectView projectView;
{
parent = this;
- void OnGotoError(char * line, bool noParsing)
+ void OnGotoError(const char * line, bool noParsing)
{
- ide.GoToError(line, noParsing);
+ CompilerConfig compiler = ide.workspace ? ideSettings.GetCompilerConfig(ide.workspace.activeCompiler) : null;
+ const char * objectFileExt = compiler ? compiler.objectFileExt : objectDefaultFileExt;
+ ide.GoToError(line, noParsing, objectFileExt);
+ delete compiler;
}
- void OnCodeLocationParseAndGoTo(char * line)
+ void OnCodeLocationParseAndGoTo(const char * line)
{
- ide.CodeLocationParseAndGoTo(line, ide.findInFilesDialog.findProject, ide.findInFilesDialog.findDir);
+ CompilerConfig compiler = ide.workspace ? ideSettings.GetCompilerConfig(ide.workspace.activeCompiler) : null;
+ const char * objectFileExt = compiler ? compiler.objectFileExt : objectDefaultFileExt;
+ ide.CodeLocationParseAndGoTo(line, ide.findInFilesDialog.findProject, ide.findInFilesDialog.findDir, objectFileExt);
+ delete compiler;
}
bool OnKeyDown(Key key, unichar ch)
CallStackView callStackView
{
- parent = this, font = { panelFont.faceName, panelFont.size };
+ parent = this, font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic };
void OnSelectFrame(int frameIndex)
{
if(activeFrame)
{
bool error;
- int lineCursor, lineTopFrame, activeThread, hitThread;
+ int lineCursor, lineTopFrame;
int lineH, scrollY, boxH;
BitmapResource bmp;
Breakpoint bp = null;
boxH = clientSize.h;
scrollY = editBox.scroll.y;
displaySystem.FontExtent(editBox.font.font, " ", 1, null, &lineH);
- activeThread = debugger.activeThread;
- hitThread = debugger.hitThread;
+ //activeThread = debugger.activeThread;
+ //hitThread = debugger.hitThread;
debugger.GetCallStackCursorLine(&error, &lineCursor, &lineTopFrame);
// TODO: improve bp drawing... it should be visible even if it's not on the activeFrame
WatchesView watchesView { parent = this };
ThreadsView threadsView
{
- parent = this, font = { panelFont.faceName, panelFont.size };
+ parent = this, font = { panelFont.faceName, panelFont.size, panelFont.bold, panelFont.italic };
bool OnKeyDown(Key key, unichar ch)
{
bool gotWhatWeWant = false;
int c;
int numSelections = ideFileDialog.numSelections;
- char ** multiFilePaths = ideFileDialog.multiFilePaths;
+ const char * const * multiFilePaths = ideFileDialog.multiFilePaths;
for(c = 0; c < numSelections; c++)
{
bool NotifySelect(MenuItem selection, Modifiers mods)
{
globalSettingsDialog.master = this;
- if(ide.workspace && ide.workspace.compiler)
- globalSettingsDialog.workspaceActiveCompiler = ide.workspace.compiler;
+ if(ide.workspace && ide.workspace.activeCompiler)
+ globalSettingsDialog.workspaceActiveCompiler = ide.workspace.activeCompiler;
else if(ideSettings.defaultCompiler)
globalSettingsDialog.workspaceActiveCompiler = ideSettings.defaultCompiler;
globalSettingsDialog.Modal();
}
};
MenuDivider { fileMenu };
- Menu recentFiles { fileMenu, $"Recent Files", r };
- Menu recentProjects { fileMenu, $"Recent Projects", p };
+ Menu recentFilesMenu { fileMenu, $"Recent Files", r };
+ Menu recentProjectsMenu { fileMenu, $"Recent Projects", p };
MenuDivider { fileMenu };
MenuItem exitItem
{
bool FileRecentFile(MenuItem selection, Modifiers mods)
{
int id = 0;
- for(file : ideSettings.recentFiles)
+ RecentPaths recentFiles = workspace ? workspace.recentFiles : ideSettings.recentFiles;
+ for(file : recentFiles)
{
if(id == selection.id)
{
char extension[MAX_EXTENSION] = "";
GetExtension(file, extension);
isProjectFile = (!strcmpi(extension, "epj") || !strcmpi(extension, "ews"));
- if(mods.ctrl)
+ if(mods.ctrl && !mods.shift)
{
- char * command = PrintString("ide ", isProjectFile ? "-t " : "", file);
+ char * command = PrintString("ecere-ide ", isProjectFile ? "-t " : "", file);
Execute(command);
delete command;
}
{
if(id == selection.id)
{
- if(mods.ctrl)
+ if(mods.ctrl && !mods.shift)
{
- char * command = PrintString("ide ", file);
+ char * command = PrintString("ecere-ide ", file);
Execute(command);
delete command;
}
else
- OpenFile(file, false, true, null, no, normal, mods.ctrl && mods.shift);
+ OpenFile(file, false, true, (mods.ctrl && mods.shift) ? "txt" : null, no, normal, mods.ctrl && mods.shift);
break;
}
id++;
newProjectDialog.CreateNewProject();
if(projectView)
{
- ideSettings.AddRecentProject(projectView.fileName);
- ide.UpdateRecentMenus();
- settingsContainer.Save();
+ ideSettings.recentProjects.addRecent(CopyString(projectView.fileName));
+ ide.updateRecentProjectsMenu();
}
}
}
};
bool noParsing;
+ bool debugStart;
#ifdef GDB_DEBUG_GUI
GDBDialog gdbDialog
master = this, parent = this;
//anchor = { left = 100, top = 100, right = 100, bottom = 100 };
- void OnCommand(char * string)
+ void OnCommand(const char * string)
{
if(ide)
ide.debugger.SendGDBCommand(string);
}
}
- ProjectView CreateProjectView(Workspace workspace, char * fileName)
+ ProjectView CreateProjectView(Workspace workspace, const char * fileName)
{
Project project = workspace.projects.firstIterator.data;
projectView = ProjectView
ideMainFrame.SetText("%s - %s", project.topNode.name, titleECEREIDE);
AdjustMenus();
+ updateRecentMenus();
ide.breakpointsView.LoadFromWorkspace();
ide.watchesView.LoadFromWorkspace();
outputView.visible = false;
ideMainFrame.text = titleECEREIDE;
ide.AdjustMenus();
+ ide.updateRecentMenus();
return true;
}
return false;
if(this)
{
Window child;
- bool inDebugMode = debugger.isActive;
bool callStackVisible = expand ? false : callStackView.visible;
bool threadsVisible = expand ? false : threadsView.visible;
bool watchesVisible = expand ? false : watchesView.visible;
anchor.left = (sheet.visible || (projectView && projectView.visible)) ? 300 : 0;
anchor.right = toolBoxVisible ? 150 : 0;
}
- child.anchor = anchor;
+ if(ide.projectView)
+ child.anchor = anchor;
}
else if(expand)
{
}
// If this is not here, the IDE is not updated when doing Debug/Break then Alt-4 to show call stack (IDE not updated)
Update(null);
+ if(duck.visible) duck.Update(null); // TOFIX: If this is not here, the duck disappears -- Why?
}
}
return false;
}
- void DocumentSaved(Window document, char * fileName)
+ void DocumentSaved(Window document, const char * fileName)
{
- ideSettings.AddRecentFile(fileName);
- ide.UpdateRecentMenus();
+ ideSettings.recentFiles.addRecent(CopyString(fileName));
+ ide.updateRecentFilesMenu();
ide.AdjustFileMenus();
- settingsContainer.Save();
}
- bool Window::OnFileModified(FileChange fileChange, char * param)
+ bool Window::OnFileModified(FileChange fileChange, const char * param)
{
char temp[4096];
sprintf(temp, $"The document %s was modified by another application.\n"
"Would you like to reload it and lose your changes?", this.fileName);
- if(MessageBox { type = yesNo, master = this/*.parent*/,
+ if(MessageBox { creationActivation = flash, type = yesNo, master = this/*.parent*/,
text = $"Document has been modified", contents = temp }.Modal() == yes)
{
bool noParsing = (this._class == class(CodeEditor) && ((CodeEditor)this).noParsing) ? true : false;
{
if(workspace)
{
- CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.compiler);
+ CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.activeCompiler);
for(prj : workspace.projects)
projectView.ProjectUpdateMakefileForAllConfigs(prj);
delete compiler;
if(workspace)
{
bool silent = mute || (ide.projectView.buildInProgress == none ? false : true);
- CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.compiler);
+ CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.activeCompiler);
if(!silent)
{
projectView.ShowOutputBuildLog(true);
for(compiler : ideSettings.compilerConfigs)
{
DataRow row = toolBar.activeCompiler.AddString(compiler.name);
- if(workspace && workspace.compiler && !strcmp(compiler.name, workspace.compiler))
+ if(workspace && workspace.activeCompiler && !strcmp(compiler.name, workspace.activeCompiler))
toolBar.activeCompiler.currentRow = row;
}
if(!toolBar.activeCompiler.currentRow && toolBar.activeCompiler.firstRow)
toolBar.activeCompiler.SelectRow(toolBar.activeCompiler.firstRow);
+ toolBar.activeBitDepth.SelectRow(toolBar.activeBitDepth.FindRow(workspace ? workspace.bitDepth : 0));
}
void UpdateToolBarActiveConfigs(bool selectionOnly)
{
bool unavailable = project && projectView.buildInProgress;
bool naForRun = unavailable || !project || project.GetTargetType(project.config) != executable;
+ BuildOutputMode mode = ide.rightClickMenuBuildOutputMode;
projectNewItem.disabled = unavailable;
toolBar.buttonNewProject.disabled = unavailable;
toolBar.buttonRun.disabled = naForRun;
projectBuildItem.disabled = false;
- projectBuildItem.text = unavailable ? $"Stop Build" : $"Build";
+ projectBuildItem.text = unavailable ? $"Stop Build" : bldMnuStrBuild[mode];
projectBuildItem.accelerator = unavailable ? Key { pauseBreak, ctrl = true } : f7;
projectLinkItem.disabled = unavailable;
if(projectView && projectView.popupMenu && projectView.popupMenu.menu && projectView.popupMenu.created)
{
MenuItem menu;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectBuild, 0);
+ BuildOutputMode mode = ide.rightClickMenuBuildOutputMode;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectBuild, mode);
if(menu)
{
menu.disabled = false;
- menu.text = unavailable ? $"Stop Build" : $"Build";
+ menu.text = unavailable ? $"Stop Build" : bldMnuStrBuild[mode];
menu.accelerator = unavailable ? Key { pauseBreak, ctrl = true } : f7;
}
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectLink, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRebuild, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectCleanTarget, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectClean, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRealClean, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRegenerate, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectInstall, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRemove, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::FileClean, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::FileCompile, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugPrecompile, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugCompile, 0); if(menu) menu.disabled = unavailable;
- menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugGenerateSymbols, 0); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectLink, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRebuild, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectCleanTarget, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectClean, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRealClean, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRegenerate, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectInstall, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::ProjectRemove, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::FileClean, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::FileCompile, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugPrecompile, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugCompile, mode); if(menu) menu.disabled = unavailable;
+ menu = projectView.popupMenu.menu.FindItem(ProjectView::FileDebugGenerateSymbols, mode); if(menu) menu.disabled = unavailable;
projectView.popupMenu.Update(null);
}
}
bool running = isDebuggerRunning;
bool stopped = isDebuggerStopped;
bool active = debugger.isActive;
- bool noBreakpointToggle = !project;
bool isNotRunning = unavailable || !running;
bool isNotNotRunning = unavailable || running;
}
}
- void ChangeFileDialogsDirectory(char * directory, bool saveSettings)
+ void ChangeFileDialogsDirectory(const char * directory, bool saveSettings)
{
char tempString[MAX_LOCATION];
strcpy(tempString, directory);
settingsContainer.Save();
}
- Window FindWindow(char * filePath)
+ Window FindWindow(const char * filePath)
{
Window document = null;
// TOCHECK: Do we need to change slashes here?
for(document = firstChild; document; document = document.next)
{
- char * fileName = document.fileName;
+ const char * fileName = document.fileName;
if(document.isDocument && fileName && !fstrcmp(fileName, filePath))
{
document.visible = true;
return null;
}
- bool DontTerminateDebugSession(char * title)
+ bool DontTerminateDebugSession(const char * title)
{
if(debugger.isActive)
{
return false;
}
- Window OpenFile(char * origFilePath, bool dontMaximize, bool visible, char * type, OpenCreateIfFails createIfFails, OpenMethod openMethod, bool noParsing)
+ Window OpenFile(const char * origFilePath, bool dontMaximize, bool visible, const char * type, OpenCreateIfFails createIfFails, OpenMethod openMethod, bool noParsing)
{
char extension[MAX_EXTENSION] = "";
Window document = null;
bool isProject = false;
bool needFileModified = true;
char winFilePath[MAX_LOCATION];
- char * filePath = strstr(origFilePath, "http://") == origFilePath ? strcpy(winFilePath, origFilePath) : GetSystemPathBuffer(winFilePath, origFilePath);
+ const char * filePath = strstr(origFilePath, "http://") == origFilePath ? strcpy(winFilePath, origFilePath) : GetSystemPathBuffer(winFilePath, origFilePath);
Window currentDoc = activeClient;
bool maximizeDoc = !dontMaximize && ((currentDoc && currentDoc.state == maximized) || (!currentDoc && !projectView));
if(!type)
{
for(document = firstChild; document; document = document.next)
{
- char * fileName = document.fileName;
+ const char * fileName = document.fileName;
if(document.isDocument && fileName && !fstrcmp(fileName, filePath) && document.created)
{
document.visible = true;
{
for(;;)
{
- Project project;
Workspace workspace = null;
if(FileExists(filePath))
workspace = LoadWorkspace(filePath, null);
else
return null;
- //project = LoadProject(filePath, null);
}
if(workspace)
{
- char absolutePath[MAX_LOCATION];
CreateProjectView(workspace, filePath);
document = projectView;
ide.projectView.ShowOutputBuildLog(true);
{
- CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler);
+ CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.activeCompiler);
ide.projectView.DisplayCompiler(compiler, false);
delete compiler;
}
// this crashes on starting ide with epj file, solution please?
// app.UpdateDisplay();
+ workspace.OpenPreviouslyOpenedFiles(noParsing);
workspace.holdTracking = true;
- for(ofi : workspace.openedFiles)
- {
- if(ofi.state != closed)
- {
- Window file = OpenFile(ofi.path, false, true, null, no, normal, noParsing);
- if(file)
- {
- char fileName[MAX_LOCATION];
- ProjectNode node;
- GetLastDirectory(ofi.path, fileName);
- node = projectView.project.topNode.Find(fileName, true);
- if(node)
- node.EnsureVisible();
- }
- }
- }
ide.RepositionWindows(false);
workspace.holdTracking = false;
prj = LoadProject(filePath, null);
if(prj)
{
- char * activeConfigName = null;
- CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.compiler);
+ const char * activeConfigName = null;
+ CompilerConfig compiler = ideSettings.GetCompilerConfig(workspace.activeCompiler);
prj.StartMonitoring();
- workspace.projects.Add(prj);
+ workspace.AddProject(prj, null);
if(toolBar.activeConfig.currentRow && toolBar.activeConfig.currentRow != toolBar.activeConfig.firstRow &&
toolBar.activeConfig.currentRow.string && toolBar.activeConfig.currentRow.string[0])
activeConfigName = toolBar.activeConfig.currentRow.string;
{
document.fileName = filePath;
if(workspace && !workspace.holdTracking)
- workspace.UpdateOpenedFileInfo(filePath, opened);
+ workspace.UpdateOpenedFileInfo(filePath, opened, true);
}
}
if(document)
{
if(projectView && document._class == class(CodeEditor) && workspace)
- {
- int lineNumber, position;
- Point scroll;
- CodeEditor editor = (CodeEditor)document;
- editor.openedFileInfo = workspace.UpdateOpenedFileInfo(filePath, opened);
- editor.openedFileInfo.holdTracking = true;
- lineNumber = Max(editor.openedFileInfo.lineNumber - 1, 0);
- position = Max(editor.openedFileInfo.position - 1, 0);
- if(editor.editBox.GoToLineNum(lineNumber))
- editor.editBox.GoToPosition(editor.editBox.line, lineNumber, position);
- scroll.x = Max(editor.openedFileInfo.scroll.x, 0);
- scroll.y = Max(editor.openedFileInfo.scroll.y, 0);
- editor.editBox.scroll = scroll;
- editor.openedFileInfo.holdTracking = false;
- }
+ workspace.RestorePreviouslyOpenedFileState((CodeEditor)document);
if(needFileModified)
document.OnFileModified = OnFileModified;
document.state = maximized;
if(isProject)
- ideSettings.AddRecentProject(document.fileName);
- else
- ideSettings.AddRecentFile(document.fileName);
- ide.UpdateRecentMenus();
+ ideSettings.recentProjects.addRecent(CopyString(document.fileName));
+ else if(!workspace)
+ ideSettings.recentFiles.addRecent(CopyString(document.fileName));
ide.AdjustFileMenus();
- settingsContainer.Save();
+ ide.updateRecentFilesMenu();
return document;
}
/*bool Window::GenericDocumentOnClose(bool parentClosing)
{
if(!parentClosing && ide.workspace)
- ide.workspace.UpdateOpenedFileInfo(fileName, unknown);
+ ide.workspace.UpdateOpenedFileInfo(fileName, unknown, false);
return true;
}*/
bool ModelView::ModelViewOnClose(bool parentClosing)
{
if(!parentClosing && ide.workspace)
- ide.workspace.UpdateOpenedFileInfo(fileName, unknown);
+ ide.workspace.UpdateOpenedFileInfo(fileName, unknown, false);
return true;
}
bool PictureEdit::PictureEditOnClose(bool parentClosing)
{
if(!parentClosing && ide.workspace)
- ide.workspace.UpdateOpenedFileInfo(fileName, unknown);
+ ide.workspace.UpdateOpenedFileInfo(fileName, unknown, false);
return true;
}
return true;
}
- void GoToError(const char * line, bool noParsing)
+ void GoToError(const char * line, bool noParsing, const char * objectFileExt)
{
if(projectView)
- projectView.GoToError(line, noParsing);
+ projectView.GoToError(line, noParsing, objectFileExt);
}
- void CodeLocationParseAndGoTo(const char * text, Project project, const char * dir)
+ FileAttribs GoToCodeSelectFile(const char * filePath, const char * dir, Project prj, ProjectNode * node, char * selectedPath, const char * objectFileExt)
+ {
+ FileAttribs result { };
+ FileAttribs fileAttribs;
+ if(filePath[0])
+ {
+ if(prj)
+ strcpy(selectedPath, prj.topNode.path);
+ else if(dir && dir[0])
+ strcpy(selectedPath, dir);
+ else
+ selectedPath[0] = '\0';
+ PathCat(selectedPath, filePath);
+
+ if((fileAttribs = FileExists(selectedPath)).isFile)
+ result = fileAttribs;
+ else if(workspace)
+ {
+ bool done = false;
+ for(p : workspace.projects)
+ {
+ strcpy(selectedPath, p.topNode.path);
+ PathCat(selectedPath, filePath);
+ if((fileAttribs = FileExists(selectedPath)).isFile)
+ {
+ done = true;
+ result = fileAttribs;
+ break;
+ }
+ }
+ if(!done)
+ {
+ Project project;
+ ProjectNode n = null;
+ for(p : workspace.projects)
+ {
+ if((n = p.topNode.Find(filePath, false)))
+ {
+ n.GetFullFilePath(selectedPath, true);
+ if((fileAttribs = FileExists(selectedPath)).isFile)
+ {
+ if(node) *node = n;
+ result = fileAttribs;
+ break;
+ }
+ }
+ }
+ if(!n && (n = workspace.GetObjectFileNode(filePath, &project, selectedPath, objectFileExt)) && project &&
+ (fileAttribs = FileExists(selectedPath)).isFile)
+ {
+ if(node) *node = n;
+ result = fileAttribs;
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ void CodeLocationParseAndGoTo(const char * text, Project project, const char * dir, const char * objectFileExt)
{
char *s = null;
- char *path = text;
+ const char *path = text;
char *colon = strchr(text, ':');
char filePath[MAX_LOCATION] = "";
char completePath[MAX_LOCATION];
FileAttribs fileAttribs;
// support for valgrind output
- if((s = strstr(text, "==")) && (s = strstr(s+2, "==")) && (s = strstr(s+2, ":")) && (s = strstr(s+1, ":")))
+ if((s = strstr(text, "==")) && s == text && (s = strstr(s+2, "==")) && (s = strstr(s+2, ":")) && (s = strstr(s+1, ":")))
{
colon = s;
for(; s>text; s--)
strcpy(filePath, path);
}
- if(filePath[0])
- {
- if(prj)
- strcpy(completePath, prj.topNode.path);
- else if(dir && dir[0])
- strcpy(completePath, dir);
- else
- completePath[0] = '\0';
- PathCat(completePath, filePath);
-
- if((fileAttribs = FileExists(completePath)))
- CodeLocationGoTo(completePath, fileAttribs, line, col);
- else if(ide.workspace)
- {
- bool done = false;
- for(p : ide.workspace.projects)
- {
- strcpy(completePath, p.topNode.path);
- PathCat(completePath, filePath);
- if((fileAttribs = FileExists(completePath)).isFile)
- {
- CodeLocationGoTo(completePath, fileAttribs, line, col);
- done = true;
- break;
- }
- }
- if(!done)
- {
- for(p : ide.workspace.projects)
- {
- ProjectNode node = p.topNode.Find(filePath, false);
- if(node)
- {
- node.GetFullFilePath(completePath);
- if((fileAttribs = FileExists(completePath)).isFile)
- {
- CodeLocationGoTo(completePath, fileAttribs, line, col);
- break;
- }
- }
- }
- }
- }
- }
+ if((fileAttribs = GoToCodeSelectFile(filePath, dir, prj, null, completePath, objectFileExt)))
+ CodeLocationGoTo(completePath, fileAttribs, line, col);
}
void CodeLocationGoTo(const char * path, const FileAttribs fileAttribs, int line, int col)
strlwr(ext);
if(binaryDocExt.Find(ext))
ShellOpen(path);
- else if(!strcmp(ext, "a") || !strcmp(ext, "o") || !strcmp(ext, "lib") || !strcmp(ext, "dll") || !strcmp(ext, "exe"))
+ else if(!strcmp(ext, "a") || !strcmp(ext, "o") || !strcmp(ext, "bc") ||
+ !strcmp(ext, "lib") || !strcmp(ext, "dll") || !strcmp(ext, "exe"))
{
char dirPath[MAX_LOCATION];
StripLastDirectory(path, dirPath);
}
else
{
- CodeEditor codeEditor = (CodeEditor)OpenFile(path, false, true, ext, no, normal, false);
- if(codeEditor && line)
+ CodeEditor codeEditor = (CodeEditor)OpenFile(path, false, true, !strcmpi(ext, "epj") ? "txt" : ext, no, normal, false);
+ if(codeEditor && codeEditor._class == class(CodeEditor) && line)
{
EditBox editBox = codeEditor.editBox;
editBox.GoToLineNum(line - 1);
{
List<ProjectNode> nodes { };
nodes.Add(node);
- projectView.Compile(node.project, nodes, mods.ctrl && mods.shift, isCObject ? cObject : normal);
+ projectView.Compile(node.project, nodes, normal, isCObject ? cObject : normal);
delete nodes;
}
}
{
int c;
bool passThrough = false;
- bool debugStart = false;
bool debugWorkDir = false;
char * passDebugWorkDir = null;
bool openAsText = false;
{
if(passThrough)
{
- char * arg = app.argv[c];
+ const char * arg = app.argv[c];
char * buf = new char[strlen(arg)*2+1];
if(ptArg++ > 0)
passArgs.concat(" ");
else if(!strcmp(app.argv[c], "-no-parsing"))
ide.noParsing = true;
else if(!strcmp(app.argv[c], "-debug-start"))
- debugStart = true;
+ ide.debugStart = true;
else if(!strcmp(app.argv[c], "-debug-work-dir"))
debugWorkDir = true;
else if(!strcmp(app.argv[c], "-@"))
GetExtension(app.argv[c], ext);
isProject = !openAsText && !strcmpi(ext, "epj");
- if(isProject && c > (debugStart ? 2 : 1)) continue;
+ if(isProject && c > 1 + (ide.debugStart ? 1 : 0)) continue;
// Create directory for projects (only)
if(((dirAttribs = FileExists(parentPath)) && dirAttribs.isDirectory) || isProject)
newProjectDialog.Modal();
if(projectView)
{
- ideSettings.AddRecentProject(projectView.fileName);
- ide.UpdateRecentMenus();
- settingsContainer.Save();
+ ideSettings.recentProjects.addRecent(CopyString(projectView.fileName));
+ ide.updateRecentMenus();
}
delete newProjectDialog;
// Open only one project
workspace.debugDir = passDebugWorkDir;
delete passDebugWorkDir;
}
- if(debugStart)
- ;//MenuDebugStart(debugStartResumeItem, 0); // <-- how TODO this without getting into the app.Wait lock
UpdateToolBarActiveConfigs(false);
UpdateToolBarActiveCompilers();
for(item : compiler.executableDirs)
{
+ DirExpression dirExpr { };
+ dirExpr.Evaluate(item, null, compiler, null, 0);
found = false;
+
for(p : newExePaths)
{
- if(!fstrcmp(p, item))
+ if(!fstrcmp(p, dirExpr.dir))
{
found = true;
break;
}
}
if(!found)
- newExePaths.Add(CopySystemPath(item));
+ newExePaths.Add(CopySystemPath(dirExpr.dir));
+ delete dirExpr;
}
GetEnvironment("PATH", oldList, maxPathLen);
IDEWorkSpace()
{
// Graphics Driver Menu
- int c;
/*
app.currentSkin.selectionColor = selectionColor;
return true;
}
- void UpdateRecentMenus()
+ void updateRecentMenus()
{
- int c;
- Menu fileMenu = menu.FindMenu($"File");
- Menu recentFiles = fileMenu.FindMenu($"Recent Files");
- Menu recentProjects = fileMenu.FindMenu($"Recent Projects");
+ updateRecentFilesMenu();
+ updateRecentProjectsMenu();
+ }
+
+ void updateRecentFilesMenu()
+ {
+ int c = 0;
char * itemPath = new char[MAX_LOCATION];
char * itemName = new char[MAX_LOCATION+4];
- MenuItem item;
-
- recentFiles.Clear();
- c = 0;
-
- for(recent : ideSettings.recentFiles)
+ Workspace ws = workspace;
+ RecentPaths recentFiles = ws ? ws.recentFiles : ideSettings.recentFiles;
+ recentFilesMenu.Clear();
+ for(recent : recentFiles)
{
strncpy(itemPath, recent, MAX_LOCATION); itemPath[MAX_LOCATION-1] = '\0';
MakeSystemPath(itemPath);
snprintf(itemName, MAX_LOCATION+4, "%d %s", 1 + c, itemPath); itemName[MAX_LOCATION+4-1] = '\0';
- recentFiles.AddDynamic(MenuItem { copyText = true, text = itemName, (Key)k1 + c, id = c, NotifySelect = ide.FileRecentFile }, ide, true);
+ recentFilesMenu.AddDynamic(MenuItem { copyText = true, text = itemName, (Key)k1 + c, id = c, NotifySelect = ide.FileRecentFile }, ide, true);
c++;
}
+ delete itemPath;
+ delete itemName;
+ }
- recentProjects.Clear();
- c = 0;
+ void updateRecentProjectsMenu()
+ {
+ int c = 0;
+ char * itemPath = new char[MAX_LOCATION];
+ char * itemName = new char[MAX_LOCATION+4];
+ recentProjectsMenu.Clear();
for(recent : ideSettings.recentProjects)
{
strncpy(itemPath, recent, MAX_LOCATION); itemPath[MAX_LOCATION-1] = '\0';
MakeSystemPath(itemPath);
snprintf(itemName, MAX_LOCATION+4, "%d %s", 1 + c, itemPath); itemName[MAX_LOCATION+4-1] = '\0';
- recentProjects.AddDynamic(MenuItem { copyText = true, text = itemName, (Key)k1 + c, id = c, NotifySelect = ide.FileRecentProject }, ide, true);
+ recentProjectsMenu.AddDynamic(MenuItem { copyText = true, text = itemName, (Key)k1 + c, id = c, NotifySelect = ide.FileRecentProject }, ide, true);
c++;
}
-
delete itemPath;
delete itemName;
}
define sdkDirName = "ecere";
#endif
-bool GetInstalledFileOrFolder(char * subDir, char * name, char * path, FileAttribs attribs)
+bool GetInstalledFileOrFolder(const char * subDir, const char * name, char * path, FileAttribs attribs)
{
bool found = false;
char * v = new char[maxPathLen];
v[0] = '\0';
- if(found)
+ if(!found)
{
strncpy(path, settingsContainer.moduleLocation, MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
StripLastDirectory(path, path);
#if defined(__WIN32__)
if(!found)
{
- GetEnvironment("ECERE_SDK_SRC", v, maxPathLen);
- if(v[0])
- {
- strncpy(path, v, MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
- PathCat(path, subDir);
- if(name) PathCat(path, name);
- if(FileExists(path) & attribs) found = true;
- }
- }
- if(!found)
- {
- GetEnvironment("AppData", v, maxPathLen);
- if(v[0])
- {
- strncpy(path, v, MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
- PathCat(path, sdkDirName);
- PathCat(path, subDir);
- if(name) PathCat(path, name);
- if(FileExists(path) & attribs) found = true;
- }
- }
- if(!found)
- {
- GetEnvironment("ProgramData", v, maxPathLen);
- if(v[0])
- {
- strncpy(path, v, MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
- PathCat(path, sdkDirName);
- PathCat(path, subDir);
- if(name) PathCat(path, name);
- if(FileExists(path) & attribs) found = true;
- }
- }
- if(!found)
- {
- GetEnvironment("ProgramFiles", v, maxPathLen);
- if(v[0])
- {
- strncpy(path, v, MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
- PathCat(path, sdkDirName);
- PathCat(path, subDir);
- if(name) PathCat(path, name);
- if(FileExists(path) & attribs) found = true;
- }
- }
- if(!found)
- {
- GetEnvironment("ProgramFiles(x86)", v, maxPathLen);
- if(v[0])
+ for(s : [ "ECERE_SDK_SRC", "AppData", "ALLUSERSPROFILE", "USERPROFILE", "HOMEPATH", "ProgramData", "ProgramFiles", "ProgramFiles(x86)", "SystemDrive" ])
{
- strncpy(path, v, MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
- PathCat(path, sdkDirName);
- PathCat(path, subDir);
- if(name) PathCat(path, name);
- if(FileExists(path) & attribs) found = true;
- }
- }
- if(!found)
- {
- GetEnvironment("SystemDrive", v, maxPathLen);
- if(v[0])
- {
- strncpy(path, v, MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
- PathCat(path, "Program Files");
- PathCat(path, sdkDirName);
- PathCat(path, subDir);
- if(name) PathCat(path, name);
- if(FileExists(path) & attribs) found = true;
+ GetEnvironment(s, v, maxPathLen);
+ if(v[0])
+ {
+ strncpy(path, v, MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
+ if(!strcmp(s, "SystemDrive"))
+ PathCat(path, "Program Files");
+ if(strcmp(s, "ECERE_SDK_SRC"))
+ PathCat(path, sdkDirName);
+ PathCat(path, subDir);
+ if(name) PathCat(path, name);
+ if(FileExists(path) & attribs)
+ {
+ found = true;
+ break;
+ }
+ }
}
}
#else
if(!found)
{
- byte * tokens[256];
+ char * p = null;
+ char * tokens[256];
int c, numTokens;
GetEnvironment("XDG_DATA_DIRS", v, maxPathLen);
numTokens = TokenizeWith(v, sizeof(tokens) / sizeof(byte *), tokens, ":", false);
+ if(!numTokens)
+ {
+ p = new char[MAX_LOCATION];
+ p[0] = '\0';
+ strcat(p, "/usr/share");
+ tokens[0] = p;
+ numTokens = 1;
+ }
for(c=0; c<numTokens; c++)
{
strncpy(path, tokens[c], MAX_LOCATION); path[MAX_LOCATION-1] = '\0';
PathCat(path, sdkDirName);
PathCat(path, subDir);
- if(name) PathCat(path, name);
- if(FileExists(path) & attribs) found = true;
+ if(name)
+ PathCat(path, name);
+ if(FileExists(path) & attribs)
+ {
+ found = true;
+ break;
+ }
}
+ delete p;
}
#endif
delete v;
return found;
}
-void FindAndShellOpenInstalledFolder(char * name)
+void FindAndShellOpenInstalledFolder(const char * name)
{
char path[MAX_LOCATION];
if(GetInstalledFileOrFolder(name, null, path, { isDirectory = true }))
ShellOpen(path);
}
-void FindAndShellOpenInstalledFile(char * subdir, char * name)
+void FindAndShellOpenInstalledFile(const char * subdir, const char * name)
{
char path[MAX_LOCATION];
if(GetInstalledFileOrFolder(subdir, name, path, { isFile = true }))
{
bool preserveRootFolder;
- void OutFolder(char * folderPath, bool isRoot)
+ void OutFolder(const char * folderPath, bool isRoot)
{
if(!(preserveRootFolder && isRoot))
RemoveDir(folderPath);
}
- bool OnFile(char * filePath)
+ bool OnFile(const char * filePath)
{
DeleteFile(filePath);
return true;
if(ideSettings.language)
{
- String language = GetLanguageString();
+ const String language = GetLanguageString();
if(ideSettings.language.OnCompare(language))
{
LanguageRestart(ideSettings.language, app, null, null, null, null, true);
}
}
+ ideSettings.compilerConfigs.read();
+ ideSettings.recentFiles.read();
+ ideSettings.recentProjects.read();
+
// First count files arg to decide whether to maximize
{
bool passThrough = false, debugWorkDir = false;
}
*/
+ globalSettingsDialog.settingsContainer = settingsContainer;
+
// Default to language specified by environment if no language selected
if(!ideSettings.language)
{
}
if(!LoadIncludeFile())
- PrintLn("error: unable to load :crossplatform.mk file inside ide binary.");
+ PrintLn($"error: unable to load :crossplatform.mk file inside ide binary.");
// Create language menu
{
char genericLocale[256];
i = 0;
strncpy(genericLocale, language, sizeof(genericLocale));
- genericLocale[sizeof(genericLocale)] = 0;
+ genericLocale[sizeof(genericLocale)-1] = 0;
under = strchr(genericLocale, '_');
if(under)