*/
// The new nice dark scheme -- so peaceful on my brain
-
+/*
FontResource panelFont { $"Courier New", 10 };
FontResource codeFont { $"Courier New", 10 };
-/*
+*/
FontResource panelFont { $"Consolas", 12 };
FontResource codeFont { $"Consolas", 12 };
-*/
+
Color selectionColor = lightYellow;
Color selectionText = Color { 30, 40, 50 };
Color viewsBackground = Color { 30, 40, 50 };
extern int __ecereVMethodID_class_OnSaveEdit;
extern int __ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad;
+class RTCMenuBits
+{
+public:
+ bool ignoreBreakpoints:1;
+ bool atSameLevel:1;
+ bool oldImplementation:1;
+};
+
class EditFileDialog : FileDialog
{
bool OnCreate()
f.Printf("double");
break;
case classType:
- // ADD CODE TO DECIDE WHETHER TO OUTPUT FULLY QUAlIFIED OR NOT:
- f.Printf(type._class.shortName ? type._class.shortName : type._class.string);
+ {
+ if(type._class && !strcmp(type._class.string, "class"))
+ {
+ switch(type.classObjectType)
+ {
+ case anyObject:
+ f.Printf("any_object");
+ break;
+ default:
+ f.Printf("typed_object");
+ break;
+ }
+ if(type.byReference)
+ f.Printf(" &");
+ }
+ else
+ // ADD CODE TO DECIDE WHETHER TO OUTPUT FULLY QUAlIFIED OR NOT:
+ f.Printf(type._class.shortName ? type._class.shortName : type._class.string);
break;
+ }
case structType:
break;
case unionType:
Designer designer { codeEditor = this, visible = false, saveDialog = codeEditorFormFileDialog };
+ bool noParsing;
+
+ property bool parsing { get { return editBox.syntaxHighlighting && !noParsing && !ide.noParsing; } };
+
void ProcessCaretMove(EditBox editBox, int line, int charPos)
{
char temp[512];
ProjectView projectView = ide.projectView;
if(projectView)
{
- ProjectNode node = projectView.GetNodeFromWindow(this, null);
+ ProjectNode node = projectView.GetNodeFromWindow(this, null, true, false);
if(node)
{
node.modified = modifiedDocument;
textVertScroll = true, multiLine = true, /*lineNumbers = ideSettings.showLineNumbers,*/
freeCaret = ideSettings.useFreeCaret, caretFollowsScrolling = ideSettings.caretFollowsScrolling,
tabKey = true, smartHome = true;
- tabSelection = true, maxLineSize = 65536, parent = this, hasHorzScroll = true, hasVertScroll = true;
+ tabSelection = true, /*maxLineSize = 65536, */parent = this, hasHorzScroll = true, hasVertScroll = true;
selectionColor = selectionColor, selectionText = selectionText,
background = codeEditorBG, foreground = codeEditorFG, syntaxColorScheme = colorScheme,
font = font, borderStyle = none;
bool NotifyKeyDown(EditBox editBox, Key key, unichar ch)
{
- if(key == Key { space, ctrl = true })
+ if(key == ctrlSpace)
{
membersList.Destroy(0);
membersListShown = false;
{
if(ide.projectView)
{
- ProjectNode node = ide.projectView.GetNodeFromWindow(this, null);
+ ProjectNode node = ide.projectView.GetNodeFromWindow(this, null, true, false);
+ if(!node)
+ node = ide.projectView.GetNodeFromWindow(this, null, true, true);
if(!node)
{
char * s;
s = PrintString($"The ", fileName, $" file is not part of any project.\n",
$"It can't be compiled.");
- MessageBox { type = ok, parent = ide, master = ide, text = $"File not in project error", contents = s }.Modal();
+ MessageBox { type = ok, /*parent = ide, */master = ide, text = $"File not in project error", contents = s }.Modal();
delete s;
return false;
}
(key.ctrl && key.code != left && key.code != right &&
key.code != leftShift && key.code != rightShift && key.code != space))
{
+ bool result = true;
if(editor.paramsShown)
+ {
+ if(key == escape)
+ result = false;
editor.paramsList.Destroy(0);
+ editor.paramsShown = false;
+ }
if(editor.membersListShown)
+ {
+ if(key == escape)
+ result = false;
editor.membersList.Destroy(0);
+ editor.membersListShown = false;
+ }
- editor.paramsShown = false;
FreeType(editor.functionType);
- FreeType(editor.instanceType);
-
editor.functionType = null;
+
+ FreeType(editor.instanceType);
editor.instanceType = null;
+
editor.paramsID = -1;
- editor.membersListShown = false;
- return true;
+ return result;
}
else
return editor.editBox.OnKeyDown(key, ch);
return false;
}
- bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
+ /*bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
{
CodeEditor editor = (CodeEditor)master;
- if(!active)
+ Window rw = previous ? previous.rootWindow : null;
+ if(!active && rw != editor.paramsList)
{
Destroy(0);
editor.membersListShown = false;
}
return ListBox::OnActivate(active, previous, goOnWithActivation, direct);
- }
+ }*/
bool OnKeyHit(Key key, unichar ch)
{
OnKeyDown = membersList.OnKeyDown;
- bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
+ /*bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
{
CodeEditor editor = (CodeEditor)master;
- if(!active)
+ Window rw = previous ? previous.rootWindow : null;
+ if(!active && previous != editor.editBox && rw != editor.membersList)
{
Destroy(0);
- editor.membersListShown = false;
+ editor.paramsShown = false;
}
return Window::OnActivate(active, previous, goOnWithActivation, direct);
- }
+ }*/
bool OnKeyHit(Key key, unichar ch)
{
surface.WriteText(x, y, "(", 1);
x += parW;
- if(methodType && !methodType.staticMethod)
+ if(methodType && !methodType.staticMethod && methodType.methodClass)
{
int tw = 0, width;
id ++;
}
- if(!methodType || methodType.staticMethod || !type.params.first || ((Type)type.params.first).kind != voidType || type.params.count > 1)
+ if(!methodType || (methodType.staticMethod || !methodType.methodClass) || !type.params.first || ((Type)type.params.first).kind != voidType || type.params.count > 1)
{
for(param = type.params.first; param; param = param.next)
{
}
};
- Menu fileMenu { menu, $"File", f }; // MenuPlacement?
+ Menu fileMenu { menu, $"File", f };
MenuItem { fileMenu, $"Save", s, Key { s, ctrl = true }, NotifySelect = MenuFileSave };
MenuItem { fileMenu, $"Save As...", a, NotifySelect = MenuFileSaveAs };
- Menu debugMenu { menu, $"Debug", d }; // MenuPlacement?
- MenuItem debugRunToCursor
- {
- debugMenu, $"Run To Cursor", c, Key { f10, ctrl = true };
- bool NotifySelect(MenuItem selection, Modifiers mods)
- {
- ProjectView projectView = ide.projectView;
- if(!projectView.buildInProgress)
- {
- int line = editBox.lineNumber + 1;
- if(projectView)
- {
- CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler);
- ProjectConfig config = projectView.project.config;
- ide.debugger.RunToCursor(compiler, config, fileName, line, false);
- delete compiler;
- }
- }
- return true;
- }
- };
- MenuItem debugSkipRunToCursor
+ Menu debugMenu { menu, $"Debug", d };
+ MenuItem debugRunToCursor { debugMenu, $"Run To Cursor", c, ctrlF10, id = RTCMenuBits { false, false, false }, NotifySelect = RTCMenu_NotifySelect; };
+ MenuItem debugSkipRunToCursor { debugMenu, $"Run To Cursor Skipping Breakpoints", u, Key { f10, ctrl = true, shift = true }, id = RTCMenuBits { true, false, false }, NotifySelect = RTCMenu_NotifySelect; };
+ MenuItem debugRunToCursorAtSameLevel { debugMenu, $"Run To Cursor At Same Level", l, altF10, id = RTCMenuBits { false, true, false }, NotifySelect = RTCMenu_NotifySelect; };
+ MenuItem debugSkipRunToCursorAtSameLevel { debugMenu, $"Run To Cursor At Same Level Skipping Breakpoints", g, Key { f10, shift = true, alt = true }, id = RTCMenuBits { true, true, false }, NotifySelect = RTCMenu_NotifySelect; };
+#if 0
+ MenuItem debugBpRunToCursor { debugMenu, $"BP Run To Cursor"/*, c, ctrlF10*/, id = RTCMenuBits { false, false, true }, NotifySelect = RTCMenu_NotifySelect; };
+ MenuItem debugBpSkipRunToCursor { debugMenu, $"BP Run To Cursor Skipping Breakpoints"/*, u, Key { f10, ctrl = true, shift = true }*/, id = RTCMenuBits { true, false, true }, NotifySelect = RTCMenu_NotifySelect; };
+ MenuItem debugBpRunToCursorAtSameLevel { debugMenu, $"BP Run To Cursor At Same Level"/*, l, altF10*/, id = RTCMenuBits { false, true, true }, NotifySelect = RTCMenu_NotifySelect; };
+ MenuItem debugBpSkipRunToCursorAtSameLevel { debugMenu, $"BP Run To Cursor At Same Level Skipping Breakpoints"/*, g, Key { f10, shift = true, alt = true }*/, id = RTCMenuBits { true, true, true }, NotifySelect = RTCMenu_NotifySelect; };
+#endif
+ bool RTCMenu_NotifySelect(MenuItem selection, Modifiers mods)
{
- debugMenu, $"Run To Cursor Skipping Breakpoints", u, Key { f10, ctrl = true, shift = true };
- bool NotifySelect(MenuItem selection, Modifiers mods)
+ ProjectView projectView = ide.projectView;
+ if(!projectView.buildInProgress)
{
- ProjectView projectView = ide.projectView;
+ RTCMenuBits bits = (RTCMenuBits)selection.id;
int line = editBox.lineNumber + 1;
if(projectView)
{
CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler);
ProjectConfig config = projectView.project.config;
- ide.debugger.RunToCursor(compiler, config, fileName, line, true);
+ int bitDepth = ide.workspace.bitDepth;
+ bool useValgrind = ide.workspace.useValgrind;
+ ide.debugger.RunToCursor(compiler, config, bitDepth, useValgrind, fileName, line, bits.ignoreBreakpoints, bits.atSameLevel, bits.oldImplementation);
delete compiler;
}
- return true;
}
- };
+ return true;
+ }
MenuDivider { debugMenu };
MenuItem debugToggleBreakpoint
{
if(projectView && fileName)
{
int line = editBox.lineNumber + 1;
- char name[MAX_LOCATION];
- Project prj = null;
- // TOFIX: This only looks at the filename...
- GetLastDirectory(fileName, name);
- if(ide && ide.workspace)
- {
- for(p : ide.workspace.projects)
- {
- if(p.topNode.Find(name, false))
- {
- prj = p;
- break;
- }
- }
- if(!prj)
- {
- for(p : ide.workspace.projects)
- {
- if(IsPathInsideOf(fileName, p.topNode.path))
- {
- prj = p;
- break;
- }
- }
- }
- }
- ide.debugger.ToggleBreakpoint(fileName, line, prj);
+ ide.debugger.ToggleBreakpoint(fileName, line);
Update(null);
}
return true;
if(CloseConfirmation(false))
{
visible = false;
- OnFileModified({ modified = true }, null);
+ if(modifiedDocument)
+ OnFileModified({ modified = true }, null);
}
debugClosing = false;
return false;
ProjectView projectView = ide.projectView;
if(projectView)
{
- ProjectNode node = projectView.GetNodeFromWindow(this, null);
+ ProjectNode node = projectView.GetNodeFromWindow(this, null, false, false);
if(node && node.modified)
{
node.modified = false;
*/
if(active && directActivation)
{
+ AdjustDebugMenus();
if(openedFileInfo)
openedFileInfo.Activate();
if(designer)
ProcessCaretMove(editBox, line, charPos);
}
}
+ if(!active)
+ {
+ if(membersListShown)
+ {
+ membersList.Destroy(0);
+ membersListShown = false;
+ }
+ if(paramsShown)
+ {
+ paramsList.Destroy(0);
+ paramsShown = false;
+ FreeType(functionType);
+ FreeType(instanceType);
+
+ functionType = null;
+ instanceType = null;
+ paramsID = -1;
+ }
+ }
return true;
}
editBox.Save(f, false);
modifiedDocument = false;
- delete(f);
+ delete f;
return true;
}
return false;
{
bool reload = false;
if(visible == false && inUseDebug == true)
- reload = true;
+ ide.debugger.WatchesReleaseCodeEditor();
else
{
char message[2048];
}
modifiedDocument = false;
- delete(f);
+ delete f;
}
}
return true;
if(fileName)
{
GetExtension(fileName, ext);
- if(!strcmpi(ext, "ec"))
+
+ if(!strcmpi(ext, "ec") || !strcmpi(ext, "eh") || !strcmpi(ext, "c") || !strcmpi(ext, "h") || !strcmpi(ext, "cpp") ||
+ !strcmpi(ext, "hpp") || !strcmpi(ext, "cxx") || !strcmpi(ext, "hxx") || !strcmpi(ext, "cc") || !strcmpi(ext, "hh") ||
+ !strcmpi(ext, "m") || !strcmpi(ext, "mm") || !strcmpi(ext, "cs") || !strcmpi(ext, "java") || !strcmpi(ext, "y") || !strcmpi(ext, "l"))
+ editBox.syntaxHighlighting = true;
+ else
+ editBox.syntaxHighlighting = false;
+
+ if(parsing && !strcmpi(ext, "ec"))
{
codeModified = true;
EnsureUpToDate();
}
- if(!strcmpi(ext, "ec") || !strcmpi(ext, "c") || !strcmpi(ext, "cc") || !strcmpi(ext, "cpp") || !strcmpi(ext, "eh") || !strcmpi(ext, "hh") || !strcmpi(ext, "hpp") || !strcmpi(ext, "h") || !strcmpi(ext, "hxx") || !strcmpi(ext, "cxx"))
- editBox.syntaxHighlighting = true;
- else
- editBox.syntaxHighlighting = false;
{
int spaceW;
display.FontExtent(font.font, " ", 1, &spaceW, null);
loadingFile = false;
Create();
- delete(f);
+ delete f;
return true;
}
return false;
}
- void DebugMenusDisabled()
+ void AdjustDebugMenus()
{
- bool debugMenusDisabled = ide.GetDebugMenusDisabled();
- debugRunToCursor.disabled = debugMenusDisabled;
- debugSkipRunToCursor.disabled = debugMenusDisabled;
- debugToggleBreakpoint.disabled = debugMenusDisabled;
+ bool unavailable = ide.areDebugMenusUnavailable;
+ bool isNotNotRunning = unavailable || ide.isDebuggerRunning;
+ bool isNotStopped = unavailable || !ide.isDebuggerStopped;
+ bool noBreakpointToggle = ide.isBreakpointTogglingUnavailable;
+
+ debugRunToCursor.disabled = isNotNotRunning;
+ debugSkipRunToCursor.disabled = isNotNotRunning;
+ debugRunToCursorAtSameLevel.disabled = isNotStopped;
+ debugSkipRunToCursorAtSameLevel.disabled = isNotStopped;
+#if 0
+ debugBpRunToCursor.disabled = isNotNotRunning;
+ debugBpSkipRunToCursor.disabled = isNotNotRunning;
+ debugBpRunToCursorAtSameLevel.disabled = isNotStopped;
+ debugBpSkipRunToCursorAtSameLevel.disabled = isNotStopped;
+#endif
+ debugToggleBreakpoint.disabled = noBreakpointToggle;
}
CodeEditor()
designer.fileName = title;
}
- DebugMenusDisabled();
+ AdjustDebugMenus();
for(c = 0; c < CodeObjectType::enumSize; c++)
icons[c] = BitmapResource { iconNames[c], window = this };
****************************************************************************/
void FreeParser()
{
- this.defines.Free(FreeModuleDefine);
- this.imports.Free(FreeModuleImport);
-
if(ast != null)
{
FreeASTTree(ast);
ast = null;
}
+ this.defines.Free(FreeModuleDefine);
+ this.imports.Free(FreeModuleImport); // Moved this after FreeAST because Debug printing causes ModuleImports to be created
+
FreeExcludedSymbols(this.excludedSymbols);
FreeContext(this.globalContext);
FreeIncludeFiles();
FreeGlobalData(&this.globalData);
+ FindCtx_Terminate();
+ FindParams_Terminate();
if(GetGlobalContext() == globalContext)
{
char * fileName;
ImportedModule module;
char extension[MAX_EXTENSION];
+ PathBackup pathBackup { };
#ifdef _TIMINGS
Time parseCodeStart = GetTime();
Time startTime, startFindClass;
editBox.GetSelPos(&l1, &y1, &x1, &l2, &y2, &x2, false);
- defines.Free(FreeModuleDefine);
- imports.Free(FreeModuleImport);
+ FindCtx_Terminate();
+ FindParams_Terminate();
SetGlobalData(&globalData);
SetGlobalContext(globalContext);
// TOCHECK: COULDN'T WE CALL FreeParser here?
// Clear everything
+ FreeType(this.functionType);
+ FreeType(this.instanceType);
this.functionType = null;
this.instanceType = null;
ast = null;
//SetAST(null);
}
+ defines.Free(FreeModuleDefine);
+ imports.Free(FreeModuleImport);
FreeContext(this.globalContext);
FreeExcludedSymbols(this.excludedSymbols);
if(ide.workspace)
{
CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler);
- SetTargetBits(compiler.supportsBitDepth ? 32 : GetHostBits());
+ SetTargetBits(ide.workspace.bitDepth ? ide.workspace.bitDepth : GetHostBits());
delete compiler;
}
- this.privateModule = __ecere_COM_Initialize(false | (GetTargetBits() == 64 ? 2 : 8 /*4*/), 1, null);
+ this.privateModule = __ecere_COM_Initialize(false | ((GetTargetBits() == sizeof(uintptr) *8) ? 0 : GetTargetBits() == 64 ? 2 : 4), 1, null);
SetPrivateModule(privateModule);
{
CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler);
ProjectConfig config = project.config;
- DirExpression objDir = project.GetObjDir(compiler, config);
+ int bitDepth = ide.workspace.bitDepth;
+ DirExpression objDir = project.GetObjDir(compiler, config, bitDepth);
SetSymbolsDir(objDir.dir);
+ ide.SetPath(true, compiler, config, bitDepth);
+
delete objDir;
delete compiler;
// SetIncludeDirs(ide.projectView.project.config.includeDirs);
{
curMember = thisMember;
curClass = curMember._class;
- memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+ memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
subMemberStackPos = _subMemberStackPos;
found = true;
}
#endif
if(inUseDebug && ide.projectView)
ide.debugger.EvaluateWatches();
+
+ delete pathBackup;
}
void UpdateInstanceCodeClass(Class _class, ObjectInfo object, EditBoxStream f, Instance test, bool * prev, bool * lastIsMethod, DataMember * curMember, Class * curClass)
void UpdateFormCode()
{
if(!this) return;
-
+ if(!parsing) return;
+
updatingCode++;
if(codeModified)
{
void EnsureUpToDate()
{
- if(sheet && codeModified)
+ if(sheet && codeModified && parsing)
ParseCode();
}
}
}
- void ListClassPropertiesAndVirtual(Class whatClass)
+ void ListClassPropertiesAndVirtual(Class whatClass, String curString)
{
Class _class;
bool isPrivate = false;
- for(_class = whatClass; _class && _class.type != systemClass; _class = _class.base)
+ for(_class = whatClass; _class /*&& _class.type != systemClass*/; _class = _class.base)
{
Method method;
Property prop;
row.icon = icons[(member.memberAccess == publicAccess && !isPrivate) ? typeProperty : typePropertyPrivate];
}
}
- else if(member.name)
+ else if(member.name && (!curString || strcmp(curString, member.name)))
{
DataRow row = membersList.AddString(member.name);
for(link = (BTNamedLink)nameSpace.classes.first; link; link = (BTNamedLink)((BTNode)link).next)
{
Class _class = link.data;
- if(_class.type != systemClass)
+ if(_class.type != systemClass && !_class.templateClass) // Omit templatized classes
{
DataRow row = membersList.AddString(_class.name);
row.icon = (_class.type == unitClass || _class.type == enumClass) ? icons[typeDataType] : icons[typeClass];
for(link = (BTNamedLink)nameSpace.classes.first; link; link = (BTNamedLink)((BTNode)link).next)
{
Class _class = link.data;
- if(_class.type == enumClass && (dest.kind != classType || !dest._class || dest._class.registered != _class))
+ if(_class.type == enumClass && (dest.kind != classType || ((!dest._class || !dest._class.registered || (dest._class.registered != _class && strcmp(dest._class.registered.dataTypeString, "char *"))) && !dest.classObjectType)) &&
+ dest.kind != pointerType && dest.kind != ellipsisType)
{
OldList conversions { };
Type type { };
ListEnumValues(destType._class.registered);
if(insideClass)
- ListClassPropertiesAndVirtual(insideClass);
+ ListClassPropertiesAndVirtual(insideClass, null);
listedEnums = true;
}
}
if(insideClass)
- ListClassPropertiesAndVirtual(insideClass);
+ ListClassPropertiesAndVirtual(insideClass, null);
listedEnums = true;
}
else if(insideClass && !enumOnly)
{
- ListClassPropertiesAndVirtual(insideClass);
+ ListClassPropertiesAndVirtual(insideClass, string);
}
if(listedEnums && string && string[0])
Expression memberExp = null;
Identifier realIdentifier = null;
+ if(!parsing) return true;
if(!privateModule) return !didOverride;
insideFunction = null;
EditLine l1, l2;
int x1,y1, x2,y2;
+ if(!parsing) return;
+
charPos = editBox.charPos + 1;
EnsureUpToDate();