X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ide%2Fsrc%2Fdesigner%2FCodeEditor.ec;h=e7970baf6b8c97ac0d8a748b108b91376948dc88;hb=84e623c3cb902d941ac9967bcf91767bae8f128b;hp=524d8396d2fc9c8214ecc40dc43bad1129720db3;hpb=e55db6586ae7170694952a34211485b2f00b6488;p=sdk diff --git a/ide/src/designer/CodeEditor.ec b/ide/src/designer/CodeEditor.ec index 524d839..e7970ba 100644 --- a/ide/src/designer/CodeEditor.ec +++ b/ide/src/designer/CodeEditor.ec @@ -1,68 +1,5 @@ import "ide" -// *** Color Schemes *** - -// *** The Old Color Scheme that was causing me auras and ophtalmic migraines -- Uncomment at your own risk! *** -/* -FontResource panelFont { $"Courier New", 10 }; -FontResource codeFont { $"Courier New", 10 }; -Color selectionColor = Color { 10, 36, 106 }; -Color selectionText = white; -Color viewsBackground = white; -Color viewsText = black; -Color outputBackground = white; -Color outputText = black; -Color projectViewBackground = white; -Color projectViewText = black; -Color codeEditorBG = white; -Color codeEditorFG = black; -Color marginColor = Color {230, 230, 230}; -Color selectedMarginColor = Color {200, 200, 200}; -Color lineNumbersColor = Color {60, 60, 60}; -SyntaxColorScheme colorScheme -{ - keywordColors = [ blue, blue ]; - commentColor = dimGray; - charLiteralColor = crimson; - stringLiteralColor = crimson; - preprocessorColor = green; - numberColor = teal; -}; -*/ - -// 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 }; -Color viewsText = lightGray; -Color outputBackground = black; -Color outputText = lime; -Color projectViewBackground = Color { 30, 40, 50 }; -Color projectViewText = lightGray; -Color codeEditorBG = black; -Color codeEditorFG = ivory; -Color marginColor = Color {24, 24, 24}; -Color selectedMarginColor = Color {64, 64, 64}; -Color lineNumbersColor = Color {160, 160, 160}; -SyntaxColorScheme colorScheme -{ - keywordColors = [ skyBlue, skyBlue ]; - commentColor = Color { 125, 125, 125 }; - charLiteralColor = Color { 245, 50, 245 }; - stringLiteralColor = Color { 245, 50, 245 }; - preprocessorColor = { 120, 220, 140 }; - numberColor = Color { 0, 192, 192 }; -}; - -// ********************* - import "findCtx" import "findExp" import "findParams" @@ -91,7 +28,7 @@ static Array fileTypes { $"Text Files", "txt", never } ] }; -static char * iconNames[] = +static const char * iconNames[] = { "<:ecere>constructs/class.png", "<:ecere>constructs/data.png", @@ -168,8 +105,6 @@ File output; File fileInput; -bool parseError = false; - int returnCode; Class insideClass; @@ -178,7 +113,7 @@ Expression paramsInsideExp; ClassFunction insideFunction; ClassDef insideDef; Type instanceType; -char * instanceName; +const char * instanceName; Type functionType; int paramsID; bool insideInstance; @@ -187,7 +122,7 @@ bool insideInstance; GENERATING ****************************************************************************/ -static void OutputString(File f, char * string) +static void OutputString(File f, const char * string) { int c; for(c = 0; string[c]; c++) @@ -196,15 +131,24 @@ static void OutputString(File f, char * string) f.Puts("\\\""); else if(string[c] == '\\') f.Puts("\\\\"); + else if(string[c] == '\n') + { + f.Puts("\\n"); + if(c > 30) + f.Puts("\"\n \""); + } else f.Putc(string[c]); } } +// Consider merging with PrintType ? void OutputType(File f, Type type, bool outputName) { if(type) { + if(type.kind != pointerType && type.constant) + f.Printf("const "); switch(type.kind) { case voidType: @@ -269,6 +213,8 @@ void OutputType(File f, Type type, bool outputName) case pointerType: OutputType(f, type.type, false); f.Printf(" *"); + if(type.constant) + f.Printf(" const"); break; case ellipsisType: f.Printf("..."); @@ -378,6 +324,39 @@ void GetLocText(EditBox editBox, File f, int position, Location loc, char ** tex f.Printf(""); // Make the stream point to where the editbox is } +static int64 GetI64EnumValue(Class dataType, DataValue dataForm) +{ + int64 i64Value = 0; + switch(dataType.typeSize) + { + case 1: + if(!strcmp(dataType.dataTypeString, "byte")) + i64Value = dataForm.uc; + else + i64Value = dataForm.c; + break; + case 2: + if(!strcmp(dataType.dataTypeString, "uint16")) + i64Value = dataForm.us; + else + i64Value = dataForm.s; + break; + case 4: + if(!strcmp(dataType.dataTypeString, "uint")) + i64Value = dataForm.ui; + else + i64Value = dataForm.i; + break; + case 8: + if(!strcmp(dataType.dataTypeString, "uint64")) + i64Value = *(int64 *)&dataForm.ui64; + else + i64Value = dataForm.i64; + break; + } + return i64Value; +} + void Code_FixProperty(Property prop, Instance object) { Designer::FixProperty(prop, object); @@ -412,15 +391,47 @@ bool Code_IsPropertyModified(Instance test, ObjectInfo selected, Property prop) else if(dataType && dataType._vTbl && (dataType.type == normalClass || dataType.type == noHeadClass)) { void * dataForm, * dataTest; + bool isEditBoxContents = false; + bool freeDataForm = false, freeDataTest = false; - dataForm = ((void *(*)(void *))(void *)prop.Get)(selected.instance); - dataTest = ((void *(*)(void *))(void *)prop.Get)(test); + // Because contents property is broken for mutiline EditBox at the moment + if(!strcmp(prop.name, "contents") && !strcmp(prop._class.name, "EditBox")) + isEditBoxContents = true; + + if(isEditBoxContents && ((EditBox)selected.instance).multiLine) + { + dataForm = ((EditBox)selected.instance).multiLineContents; + freeDataForm = true; + } + else + dataForm = ((void *(*)(void *))(void *)prop.Get)(selected.instance); + if(isEditBoxContents && ((EditBox)test).multiLine) + { + dataTest = ((EditBox)test).multiLineContents; + freeDataTest = true; + } + else + dataTest = ((void *(*)(void *))(void *)prop.Get)(test); if((prop.IsSet && !prop.IsSet(test)) || ((int (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCompare])(dataType, dataForm, dataTest)) { ((void (*)(void *, void *))(void *)prop.Set)(test, dataForm); result = true; } + + // Temporary work around until we standardize how properties should manage memory + if(!strcmp(prop.name, "strings") && !strcmp(prop._class.name, "DirectoriesBox")) + freeDataForm = freeDataTest = true; + if(dataType.type == normalClass && dataType.structSize) + { + if(freeDataForm) eInstance_Delete(dataForm); + if(freeDataTest) eInstance_Delete(dataTest); + } + else + { + if(freeDataForm) delete dataForm; + if(freeDataTest) delete dataTest; + } } else if(dataType && dataType._vTbl) { @@ -447,7 +458,7 @@ bool Code_IsPropertyModified(Instance test, ObjectInfo selected, Property prop) return result; } -bool Code_IsPropertyDisabled(ObjectInfo selected, char * name) +bool Code_IsPropertyDisabled(ObjectInfo selected, const char * name) { bool disabled = false; if(selected.oClass == selected) @@ -519,7 +530,7 @@ static bool CheckCompatibleMethod(Method method, Type type, Class regClass, bool method.dataType.thisClass = selectedClass; } //result = MatchTypes(method.dataType, type, null, regClass, regClass, false); - result = MatchTypes(type, method.dataType, null, regClass, regClass, false, true, true, false); + result = MatchTypes(type, method.dataType, null, regClass, regClass, false, true, true, false, true); if(reset) method.dataType.thisClass = null; return result; @@ -532,7 +543,7 @@ bool Code_IsFunctionEmpty(ClassFunction function, Method method, ObjectInfo obje // Check if it contains any code if((!body.compound.declarations || !body.compound.declarations->count) && (!body.compound.statements || body.compound.statements->count <= 1)) { - Class moduleClass = eSystem_FindClass(object.instance._class.module, "Module"); + // Class moduleClass = eSystem_FindClass(object.instance._class.module, "Module"); Statement stmt = body.compound.statements ? body.compound.statements->first : null; Type dataType = method.dataType; Type returnType = dataType.returnType; @@ -544,7 +555,7 @@ bool Code_IsFunctionEmpty(ClassFunction function, Method method, ObjectInfo obje confirmation = false; // Check if default function should be calling base class: - if(object.instance._class._vTbl[method.vid] == moduleClass._vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad]) // Temp Check for DefaultFunction + if(object.instance._class._vTbl[method.vid] == null /*moduleClass._vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad]*/) // Temp Check for DefaultFunction { if(returnType.kind != voidType) { @@ -621,7 +632,7 @@ bool Code_IsFunctionEmpty(ClassFunction function, Method method, ObjectInfo obje class CodeEditor : Window { - background = marginColor; + background = colorScheme.marginColor; borderStyle = sizableDeep; hasMaximize = true; hasMinimize = true; @@ -640,7 +651,7 @@ class CodeEditor : Window OldList * ast; Context globalContext { }; - OldList excludedSymbols { offset = (uint)&((Symbol)0).left }; + OldList excludedSymbols { offset = (uint)(uintptr)&((Symbol)0).left }; OldList defines; OldList imports; @@ -686,7 +697,7 @@ class CodeEditor : Window bool inUseDebug; OpenedFileInfo openedFileInfo; - FontResource font { codeFont.faceName, codeFont.size }; + FontResource font { codeFont.faceName, codeFont.size, codeFont.bold, codeFont.italic }; saveDialog = codeEditorFileDialog; Designer designer { codeEditor = this, visible = false, saveDialog = codeEditorFormFileDialog }; @@ -755,14 +766,13 @@ class CodeEditor : Window hide = true; else { - char * buffer = membersLine.text; int c; if(charPos - 1 < membersLoc.start.charPos) hide = true; else if(charPos - 1 > membersLoc.end.charPos) { - char * buffer = membersLine.text; + const char * buffer = membersLine.text; //if(membersList.currentRow) // hide = true; //else @@ -819,8 +829,8 @@ class CodeEditor : Window freeCaret = ideSettings.useFreeCaret, caretFollowsScrolling = ideSettings.caretFollowsScrolling, tabKey = true, smartHome = true; tabSelection = true, /*maxLineSize = 65536, */parent = this, hasHorzScroll = true, hasVertScroll = true; - selectionColor = selectionColor, selectionText = selectionText, - background = codeEditorBG, foreground = codeEditorFG, syntaxColorScheme = colorScheme, + selectionColor = colorScheme.selectionColor, selectionText = colorScheme.selectionText, + background = colorScheme.codeEditorBG, foreground = colorScheme.codeEditorFG, syntaxColorScheme = colorScheme.syntaxColors, font = font, borderStyle = none; anchor = Anchor { left = 0, right = 0, top = 0, bottom = 0 }; @@ -839,11 +849,11 @@ class CodeEditor : Window int oldLine = lastLine; display.FontExtent(font.font, " ", 1, null, &spaceH); { - Box box { 0, (Min(oldLine,oldLine)-1) * spaceH - editBox.scroll.y, editBox.anchor.left.distance, (Max(oldLine, oldLine))*spaceH-1 - editBox.scroll.y }; + Box box { 0, (oldLine-1) * spaceH - editBox.scroll.y, editBox.anchor.left.distance, oldLine*spaceH-1 - editBox.scroll.y }; Update(box); } { - Box box { 0, (Min(line,line)-1) * spaceH - editBox.scroll.y, editBox.anchor.left.distance, (Max(line, line))*spaceH-1 - editBox.scroll.y }; + Box box { 0, (line-1) * spaceH - editBox.scroll.y, editBox.anchor.left.distance, line*spaceH-1 - editBox.scroll.y }; Update(box); } lastLine = line; @@ -887,8 +897,8 @@ class CodeEditor : Window { int c; // HOW WE MIGHT WANT TO DO IT: - char * text = before.line.text; - for(c = before.x-1; c>= 0; c--) + const char * text = before.line.text; + for(c = Min(before.line.count, before.x-1); c>= 0; c--) if(!isspace(text[c])) break; ide.debugger.MoveIcons(fileName, before.y + (((!pasteOperation && c > -1) || !after.line.count) ? 1 : 0), after.y - before.y, false); @@ -938,7 +948,7 @@ class CodeEditor : Window hide = true; else { - char * buffer = membersLine.text; + const char * buffer = membersLine.text; int c; bool firstChar = true; bool addedChar = false; @@ -1004,7 +1014,7 @@ class CodeEditor : Window // Accept current string if hiding typing char if(hide && row && row.selected) { - char * string = row.string; + const char * string = row.string; int len = strlen(string); membersLoc.end.charPos -= after.x - before.x; editBox.GoToPosition(membersLine, membersLoc.start.line, membersLoc.start.charPos); @@ -1026,7 +1036,7 @@ class CodeEditor : Window if(/*after.x - before.x == 1 && */after.y == before.y && !membersListShown) { EditLine line = editBox.line; - char * text = line.text; + const char * text = line.text; char ch = text[after.x-1]; if(ch == '.' || (ch == '>' && after.x-1 > 0 && text[after.x-1-1] == '-') || (ch == ':' && after.x-1 > 0 && text[after.x-1-1] == ':')) { @@ -1259,7 +1269,7 @@ class CodeEditor : Window hide = true; else { - char * buffer = membersLine.text; + const char * buffer = membersLine.text; int c; bool firstChar = true; char string[1024]; @@ -1362,9 +1372,11 @@ class CodeEditor : Window ObjectInfo object; ObjectInfo classObject; - //editBox.NotifyCaretMove(this, editBox, y, x); editBox.GoToLineNum(y); + x = Min(x, editBox.line.count); editBox.GoToPosition(editBox.line, y, x); + // Note: Uncommented this to drag objects after the member instance on which they are dropped + editBox.NotifyCaretMove(this, editBox, y+1, x+1); classObject = selected ? selected.oClass : null; @@ -1489,7 +1501,7 @@ class CodeEditor : Window DataRow row = listBox.currentRow; if(row) { - char * string = row.string; + const char * string = row.string; editBox.GoToPosition(membersLine, membersLoc.start.line, membersLoc.start.charPos); editBox.Delete( @@ -1564,7 +1576,7 @@ class CodeEditor : Window DataRow row = currentRow; if(row && row.selected) { - char * string = row.string; + const char * string = row.string; editor.editBox.GoToPosition(editor.membersLine, editor.membersLoc.start.line, editor.membersLoc.start.charPos); editor.editBox.Delete( @@ -1677,7 +1689,7 @@ class CodeEditor : Window display.FontExtent(font, ")", 1, &parW, null); string[0] = 0; - if(editor.functionType) + if(editor.functionType && type.kind == functionType) { PrintType(type.returnType, string, true, true); display.FontExtent(font, string, strlen(string), &functionW, null); @@ -1843,7 +1855,7 @@ class CodeEditor : Window display.FontExtent(font, ")", 1, &parW, null); string[0] = 0; - if(editor.functionType && type) + if(editor.functionType && type && type.kind == functionType) { PrintType(type.returnType, string, true, true); display.FontExtent(font, string, strlen(string), &functionW, null); @@ -1930,6 +1942,31 @@ class CodeEditor : Window MenuItem { fileMenu, $"Save", s, Key { s, ctrl = true }, NotifySelect = MenuFileSave }; MenuItem { fileMenu, $"Save As...", a, NotifySelect = MenuFileSaveAs }; + Menu editMenu { menu, $"Edit", e }; + MenuDivider { editMenu }; + MenuItem clearTrailingSpacesItem + { + editMenu, $"Clear trailing spaces", t, Key { t, ctrl = true, shift = true }; + + bool NotifySelect(MenuItem selection, Modifiers mods) + { + // Nuke trailing spaces + EditLine line; + int y = 0; + editBox.recordUndoEvent = true; + for(line = editBox.firstLine; line; line = line.next, y++) + { + const String buffer = line.text; + int count = line.count, i = count-1; + while(i >= 0 && isspace(buffer[i])) i--; + if(i < count - 1) + editBox.Delete(line, y, i + 1, line, y, count); + } + editBox.recordUndoEvent = false; + return true; + } + }; + 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; }; @@ -1950,7 +1987,7 @@ class CodeEditor : Window int line = editBox.lineNumber + 1; if(projectView) { - CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler); + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(ide.workspace.activeCompiler); ProjectConfig config = projectView.project.config; int bitDepth = ide.workspace.bitDepth; bool useValgrind = ide.workspace.useValgrind; @@ -2001,7 +2038,7 @@ class CodeEditor : Window if(!parentClosing) { if(ide.workspace && fileName) - ide.workspace.UpdateOpenedFileInfo(fileName, closed); + ide.workspace.UpdateOpenedFileInfo(fileName, closed, false); if(inUseDebug && !debugClosing) { debugClosing = true; @@ -2036,7 +2073,7 @@ class CodeEditor : Window void OnDestroy(void) { ObjectInfo oClass, next; - Class windowClass = eSystem_FindClass(this.privateModule, "ecere::gui::Window"); + // Class windowClass = eSystem_FindClass(this.privateModule, "ecere::gui::Window"); FreeType(this.functionType); FreeType(this.instanceType); @@ -2061,6 +2098,11 @@ class CodeEditor : Window Designer::DestroyObject(object.instance); delete object.instance; } + if(object.i18nStrings) + { + Map i18nStrings = object.i18nStrings; + delete i18nStrings; + } sheet.DeleteObject(object); delete object.name; oClass.instances.Delete(object); @@ -2070,14 +2112,16 @@ class CodeEditor : Window Designer::DestroyObject(oClass.instance); delete oClass.instance; } + if(oClass.i18nStrings) + { + Map i18nStrings = oClass.i18nStrings; + delete i18nStrings; + } sheet.DeleteObject(oClass); delete oClass.name; classes.Delete(oClass); } - if(windowClass && windowClass.data) - UnapplySkin(windowClass); - FreeParser(); if(sheet.codeEditor == this) @@ -2185,7 +2229,7 @@ class CodeEditor : Window return true; } - bool OnSaveFile(char * fileName) + bool OnSaveFile(const char * fileName) { File f; if(designer) @@ -2204,6 +2248,7 @@ class CodeEditor : Window designer.fileName = fileName; designer.modifiedDocument = false; } + editBox.Save(f, false); modifiedDocument = false; @@ -2213,7 +2258,7 @@ class CodeEditor : Window return false; } - bool OnFileModified(FileChange fileChange, char * param) + bool OnFileModified(FileChange fileChange, const char * param) { bool reload = false; if(visible == false && inUseDebug == true) @@ -2224,7 +2269,7 @@ class CodeEditor : Window sprintf(message, $"The document %s was modified by another application.\n" "Would you like to reload it and lose your changes?", fileName); - if(MessageBox { type = yesNo, master = /*parent = */parent, text = $"Document has been modified", + if(MessageBox { creationActivation = flash, type = yesNo, master = /*parent = */parent, text = $"Document has been modified", contents = message }.Modal() == yes) reload = true; } @@ -2269,7 +2314,7 @@ class CodeEditor : Window void OnRedraw(Surface surface) { // Line Numbers - surface.SetBackground(marginColor); + surface.SetBackground(colorScheme.marginColor); surface.Area(0, 0, editBox.anchor.left.distance, clientSize.h - 1); if(ideSettings.showLineNumbers) { @@ -2285,15 +2330,15 @@ class CodeEditor : Window currentLineNumber = editBox.scroll.y / spaceH + 1; sprintf(lineFormat, " %%%du", maxLineNumberLength); - surface.SetForeground(lineNumbersColor); + surface.SetForeground(colorScheme.lineNumbersColor); for(i = 0; i < editBox.clientSize.h - 4; i += spaceH) { // Highlight current line if(editBox.lineNumber == currentLineNumber - 1) { - surface.SetBackground(selectedMarginColor); + surface.SetBackground(colorScheme.selectedMarginColor); surface.Area(0, i, editBox.anchor.left.distance, i+spaceH-1); - surface.SetBackground(marginColor); + surface.SetBackground(colorScheme.marginColor); } sprintf(lineText, lineFormat, currentLineNumber); if(currentLineNumber <= editBox.numLines) @@ -2304,7 +2349,7 @@ class CodeEditor : Window if(editBox.syntaxHighlighting && fileName && ide.projectView) { - bool error, bpOnCursor, bpOnTopFrame, breakpointEnabled[128]; + bool error, bpOnTopFrame, breakpointEnabled[128]; int lineCursor, lineTopFrame, breakpointLines[128]; int count, i, lineH, boxH, scrollY; //, firstLine; firstLine = editBox.firstLine; Debugger debugger = ide.debugger; @@ -2314,7 +2359,7 @@ class CodeEditor : Window scrollY = editBox.scroll.y; displaySystem.FontExtent(editBox.font.font, " ", 1, null, &lineH); - bpOnCursor = bpOnTopFrame = false; + bpOnTopFrame = false; count = debugger.GetMarginIconsLineNumbers(fileName, breakpointLines, breakpointEnabled, 128, &error, &lineCursor, &lineTopFrame); if(count) { @@ -2323,8 +2368,6 @@ class CodeEditor : Window if(breakpointLines[i] == lineCursor || breakpointLines[i] == lineTopFrame) { bmpRes = breakpointEnabled[i] ? ide.bmpBpHalf : ide.bmpBpHalfDisabled; - if(breakpointLines[i] == lineCursor) - bpOnCursor = true; if(breakpointLines[i] == lineTopFrame) bpOnTopFrame = true; } @@ -2366,7 +2409,7 @@ class CodeEditor : Window watch(fileName) { char ext[MAX_EXTENSION]; - char * fileName = property::fileName; + const char * fileName = property::fileName; if(SearchString(fileName, 0, "Makefile", false, true)) editBox.useTab = true; @@ -2426,7 +2469,7 @@ class CodeEditor : Window return true; } - bool LoadFile(char * filePath) + bool LoadFile(const char * filePath) { File f = FileOpen(filePath, read); if(f) @@ -2469,7 +2512,11 @@ class CodeEditor : Window CodeEditor() { CodeObjectType c; - ProjectView projectView = ide.projectView; + + globalData.classes.CompareKey = (void *)BinaryTree::CompareString; + globalData.defines.CompareKey = (void *)BinaryTree::CompareString; + globalData.functions.CompareKey = (void *)BinaryTree::CompareString; + globalData.nameSpaces.CompareKey = (void *)BinaryTree::CompareString; /*if(fileName) designer.fileName = fileName; @@ -2500,6 +2547,7 @@ class CodeEditor : Window void ModifyCode() { + fixCaret = true; selected.modified = true; selected.oClass.modified = true; @@ -2513,18 +2561,25 @@ class CodeEditor : Window ****************************************************************************/ void FreeParser() { - if(ast != null) + { + Class windowClass = eSystem_FindClass(privateModule, "ecere::gui::Window"); + if(windowClass && windowClass.data) + UnapplySkin(windowClass); + } + + SetCurrentNameSpace(null); + if(ast) { FreeASTTree(ast); ast = null; } - this.defines.Free(FreeModuleDefine); - this.imports.Free(FreeModuleImport); // Moved this after FreeAST because Debug printing causes ModuleImports to be created + defines.Free(FreeModuleDefine); + imports.Free(FreeModuleImport); // Moved this after FreeAST because Debug printing causes ModuleImports to be created - FreeExcludedSymbols(this.excludedSymbols); - FreeContext(this.globalContext); + FreeExcludedSymbols(excludedSymbols); + FreeContext(globalContext); FreeIncludeFiles(); - FreeGlobalData(&this.globalData); + FreeGlobalData(&globalData); FindCtx_Terminate(); FindParams_Terminate(); @@ -2540,11 +2595,26 @@ class CodeEditor : Window SetPrivateModule(null); } + // Note: This code should probably be merged with FreeParser() + if(ast) + { + FreeASTTree(ast); + ast = null; + //SetAST(null); + } + defines.Free(FreeModuleDefine); + imports.Free(FreeModuleImport); + + FreeContext(this.globalContext); + FreeExcludedSymbols(this.excludedSymbols); + + FreeIncludeFiles(); + FreeGlobalData(&this.globalData); + if(this.privateModule) { FreeTypeData(this.privateModule); delete this.privateModule; - this.privateModule = null; } } @@ -2560,7 +2630,7 @@ class CodeEditor : Window Designer backDesigner; char oldWorkDir[MAX_LOCATION]; char mainModuleName[MAX_FILENAME] = ""; - char * fileName; + const char * fileName; ImportedModule module; char extension[MAX_EXTENSION]; PathBackup pathBackup { }; @@ -2577,7 +2647,7 @@ class CodeEditor : Window #endif Project project; - // This temporarily fixes issue with 2 overrides in release mode with VC6 (only happens with both ecere.dll and ide.exe compiled in release mode) + // This temporarily fixes issue with 2 overrides in release mode with VC6 (only happens with both ecere.dll and ecere-ide.exe compiled in release mode) if(reentrant) return; reentrant = true; @@ -2607,18 +2677,6 @@ class CodeEditor : Window editBox.GetSelPos(&l1, &y1, &x1, &l2, &y2, &x2, false); - FindCtx_Terminate(); - FindParams_Terminate(); - - SetGlobalData(&globalData); - SetGlobalContext(globalContext); - SetExcludedSymbols(&excludedSymbols); - SetTopContext(globalContext); - SetCurrentContext(globalContext); - SetDefines(&defines); - SetImports(&imports); - SetCurrentNameSpace(null); - /* sprintf(command, "C:\\Program Files\\Microsoft Visual Studio\\VC98\\Bin\\cl " "/nologo /D \"MSC\" /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" " @@ -2674,13 +2732,18 @@ class CodeEditor : Window next = _class.next; - for(;object = _class.instances.first;) + while((object = _class.instances.first)) { if(object.instance) { Designer::DestroyObject(object.instance); delete object.instance; } + if(object.i18nStrings) + { + Map i18nStrings = object.i18nStrings; + delete i18nStrings; + } sheet.DeleteObject(object); delete object.name; _class.instances.Delete(object); @@ -2690,6 +2753,11 @@ class CodeEditor : Window Designer::DestroyObject(_class.instance); delete _class.instance; } + if(_class.i18nStrings) + { + Map i18nStrings = _class.i18nStrings; + delete i18nStrings; + } sheet.DeleteObject(_class); delete _class.name; classes.Delete(_class); @@ -2697,38 +2765,21 @@ class CodeEditor : Window this.oClass = null; } - { - Class windowClass = eSystem_FindClass(this.privateModule, "ecere::gui::Window"); - if(windowClass && windowClass.data) - UnapplySkin(windowClass); - } - designer = backDesigner; SetEchoOn(true); fileInput = editFile = EditBoxStream { editBox = editBox }; SetFileInput(fileInput); - if(ast) - { - FreeASTTree(ast); - ast = null; - //SetAST(null); - } - defines.Free(FreeModuleDefine); - imports.Free(FreeModuleImport); - - FreeContext(this.globalContext); - FreeExcludedSymbols(this.excludedSymbols); - - FreeIncludeFiles(); - FreeGlobalData(&this.globalData); + FreeParser(); - if(this.privateModule) - { - FreeTypeData(this.privateModule); - delete this.privateModule; - } + SetGlobalData(&globalData); + SetGlobalContext(globalContext); + SetExcludedSymbols(&excludedSymbols); + SetTopContext(globalContext); + SetCurrentContext(globalContext); + SetDefines(&defines); + SetImports(&imports); #ifdef _TIMINGS startTime = GetTime(); @@ -2739,11 +2790,11 @@ class CodeEditor : Window if(ide.workspace) { - CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler); + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(ide.workspace.activeCompiler); SetTargetBits(ide.workspace.bitDepth ? ide.workspace.bitDepth : GetHostBits()); delete compiler; } - this.privateModule = __ecere_COM_Initialize(false | ((GetTargetBits() == sizeof(uintptr) *8) ? 0 : GetTargetBits() == 64 ? 2 : 4), 1, null); + this.privateModule = __ecere_COM_Initialize((bool)(false | ((GetTargetBits() == sizeof(uintptr) *8) ? 0 : GetTargetBits() == 64 ? 2 : 4)), 1, null); SetPrivateModule(privateModule); @@ -2792,11 +2843,12 @@ class CodeEditor : Window // TODO: Get symbolsDir from project settings instead... if(ide.projectView) { - CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler); + CompilerConfig compiler = ideConfig.compilers.GetCompilerConfig(ide.workspace.activeCompiler); ProjectConfig config = project.config; int bitDepth = ide.workspace.bitDepth; DirExpression objDir = project.GetObjDir(compiler, config, bitDepth); SetSymbolsDir(objDir.dir); + SetDefaultNameSpace(project.GetDefaultNameSpace(config)); ide.SetPath(true, compiler, config, bitDepth); delete objDir; @@ -2806,7 +2858,7 @@ class CodeEditor : Window } else { - switch(GetRuntimePlatform()) + switch(__runtimePlatform) { case win32: SetSymbolsDir("obj/debug.win32"); break; case tux: SetSymbolsDir("obj/debug.linux"); break; @@ -2814,6 +2866,7 @@ class CodeEditor : Window } SetIncludeDirs(null); SetSysIncludeDirs(null); + SetDefaultNameSpace(null); } { @@ -2997,7 +3050,6 @@ class CodeEditor : Window classDefinition = _class; oClass = classObject; }; - Symbol symbol; classes.Add(classObject); incref instance; @@ -3030,76 +3082,72 @@ class CodeEditor : Window propertyClass = prop.dataTypeClass = eSystem_FindClass(this.privateModule, prop.dataTypeString); if(prop.compiled && prop.Set && prop.Get && propertyClass && propDef.initializer && propDef.initializer.type == expInitializer && propDef.initializer.exp) { + Expression computed; + bool variable = true; + FreeType(propDef.initializer.exp.destType); propDef.initializer.exp.destType = MkClassType(propertyClass.name); ProcessExpressionType(propDef.initializer.exp); - if(propertyClass.type == structClass || propertyClass.type == noHeadClass || propertyClass.type == normalClass) + computed = CopyExpression(propDef.initializer.exp); + ComputeExpression(computed); + if(computed.isConstant) { - Expression computed = CopyExpression(propDef.initializer.exp); - ComputeExpression(computed); - - if(computed.isConstant && computed.type == instanceExp && !id.next) + switch(computed.type) { - if(prop.Set) - { - if(computed.instance._class && computed.instance._class.symbol && - computed.instance._class.symbol.registered && - eClass_IsDerived(computed.instance._class.symbol.registered, propertyClass)) + case stringExp: + if(propertyClass.dataTypeString && strstr(propertyClass.dataTypeString, "char *")) { - ((void (*)(void *, void *))(void *)prop.Set)(instance, computed.instance.data); + String temp = new char[strlen(computed.string)+1]; + ReadString(temp, computed.string); + ((void (*)(void *, void *))(void *)prop.Set)(instance, temp); + delete temp; - // This was saved in the control and shouldn't be freed by FreeExpression... - // (Not doing this anymore, incrementing refCount in pass15 instead) - /*if(propertyClass.type == normalClass) - computed.instance.data = null;*/ + if(!propDef.initializer.exp.intlString) + { + Map i18nStrings = classObject.i18nStrings; + if(!i18nStrings) + classObject.i18nStrings = i18nStrings = { }; + i18nStrings[prop.name] = false; + } + variable = false; } - } - } - // MOVED THIS UP NOW THAT char * IS A NORMAL CLASS - else if(computed.type == stringExp && propertyClass.dataTypeString && strstr(propertyClass.dataTypeString, "char *")) - { - String temp = new char[strlen(computed.string)+1]; - ReadString(temp, computed.string); - ((void (*)(void *, void *))(void *)prop.Set)(instance, temp); - delete temp; - } - else - propDef.variable = true; - - FreeExpression(computed); - } - else - { - Expression computed = CopyExpression(propDef.initializer.exp); - ComputeExpression(computed); - if(computed.isConstant) - { - //if(computed.type == memberExp) computed = computed.member.exp; + break; + case instanceExp: + if((propertyClass.type == structClass || propertyClass.type == noHeadClass || propertyClass.type == normalClass) && !id.next) + { + if(prop.Set) + { + if(computed.instance._class && computed.instance._class.symbol && + computed.instance._class.symbol.registered && + eClass_IsDerived(computed.instance._class.symbol.registered, propertyClass)) + { + ((void (*)(void *, void *))(void *)prop.Set)(instance, computed.instance.data); - if(computed.type == constantExp) + // This was saved in the control and shouldn't be freed by FreeExpression... + // (Not doing this anymore, incrementing refCount in pass15 instead) + /*if(propertyClass.type == normalClass) + computed.instance.data = null;*/ + } + } + variable = false; + } + break; + case constantExp: { Operand value = GetOperand(computed); DataValue valueData; valueData.i64 = value.i64; SetProperty(prop, instance, valueData); - } - else if(computed.type == stringExp && propertyClass.dataTypeString && strstr(propertyClass.dataTypeString, "char *")) - { - String temp = new char[strlen(computed.string)+1]; - ReadString(temp, computed.string); - ((void (*)(void *, void *))(void *)prop.Set)(instance, temp); - delete temp; + variable = false; + break; } } - else - propDef.variable = true; - - FreeExpression(computed); } + if(variable) + propDef.variable = true; + FreeExpression(computed); } - else - propDef.variable = true; } else { @@ -3235,6 +3283,7 @@ class CodeEditor : Window { Property prop = (Property) curMember; Class propertyClass = prop.dataTypeClass; + bool variable = true; if(!propertyClass) propertyClass = prop.dataTypeClass = eSystem_FindClass(this.privateModule, prop.dataTypeString); @@ -3244,75 +3293,53 @@ class CodeEditor : Window member.initializer.exp.destType = MkClassType(propertyClass.name); if(propertyClass) { + Expression computed; + ProcessExpressionType(member.initializer.exp); - if(propertyClass.type == structClass || propertyClass.type == normalClass || propertyClass.type == noHeadClass) + computed = CopyExpression(member.initializer.exp); + if(computed) { - Expression computed; + bool isClass = propertyClass.type == structClass || propertyClass.type == normalClass || propertyClass.type == noHeadClass; + { #ifdef _DEBUG - /*char debugExpString[4096]; - debugExpString[0] = '\0'; - PrintExpression(member.initializer.exp, debugExpString);*/ + /*char debugExpString[4096]; + debugExpString[0] = '\0'; + PrintExpression(member.initializer.exp, debugExpString);*/ #endif - computed = CopyExpression(member.initializer.exp); - if(computed) - { ComputeExpression(computed); - if(computed.type == instanceExp && computed.isConstant && computed.isConstant) + switch(computed.type) { - if(computed.instance.data) - { - if(computed.instance._class && computed.instance._class.symbol && - computed.instance._class.symbol.registered && - eClass_IsDerived(computed.instance._class.symbol.registered, propertyClass)) + case instanceExp: + if(isClass && computed.isConstant && computed.instance.data) { - ((void (*)(void *, void *))(void *)prop.Set)(control, computed.instance.data); - - // This was saved in the control and shouldn't be freed by FreeExpression... - // (Not doing this anymore, incrementing refCount in pass15 instead) - /*if(propertyClass.type == normalClass) - computed.instance.data = null;*/ - } - } - } - else if(computed.type == identifierExp) - { - member.variable = true; + if(computed.instance._class && computed.instance._class.symbol && + computed.instance._class.symbol.registered && + eClass_IsDerived(computed.instance._class.symbol.registered, propertyClass)) + { + ((void (*)(void *, void *))(void *)prop.Set)(control, computed.instance.data); - if(eClass_GetDesigner(propertyClass)) - //if(prop.Set) - { - char * name = computed.identifier.string; - if(!strcmp(name, "this")) - { - if(prop.Set) - ((void (*)(void *, void *))(void *)prop.Set)(control, instance); - member.variable = false; - } - else - { - ObjectInfo check; - for(check = classObject.instances.first; check; check = check.next) - if(check.name && !strcmp(name, check.name)) - { - if(prop.Set) - ((void (*)(void *, void *))(void *)prop.Set)(control, check.instance); - member.variable = false; - break; - } + // This was saved in the control and shouldn't be freed by FreeExpression... + // (Not doing this anymore, incrementing refCount in pass15 instead) + /*if(propertyClass.type == normalClass) + computed.instance.data = null;*/ + } + variable = false; } - } - } - else if(computed.type == memberExp) - { - member.variable = true; - if(computed.member.exp.type == identifierExp) - { - char * name = computed.member.exp.identifier.string; - if(!strcmp(name, "this")) + break; + case identifierExp: + if(isClass && eClass_GetDesigner(propertyClass)) + //if(prop.Set) { - char * name = computed.member.member.string; + char * name = computed.identifier.string; + if(!strcmp(name, "this")) + { + if(prop.Set) + ((void (*)(void *, void *))(void *)prop.Set)(control, instance); + variable = false; + } + else { ObjectInfo check; for(check = classObject.instances.first; check; check = check.next) @@ -3320,80 +3347,94 @@ class CodeEditor : Window { if(prop.Set) ((void (*)(void *, void *))(void *)prop.Set)(control, check.instance); - member.variable = false; + variable = false; break; } } } - else + break; + case memberExp: + if(isClass) { - ObjectInfo check; - for(check = classObject.instances.first; check; check = check.next) + if(computed.member.exp.type == identifierExp) { - if(check.name && !strcmp(name, check.name)) + char * name = computed.member.exp.identifier.string; + ObjectInfo check; + if(!strcmp(name, "this")) + { + if(computed.member.member) + { + char * name = computed.member.member.string; + ObjectInfo check; + for(check = classObject.instances.first; check; check = check.next) + if(check.name && !strcmp(name, check.name)) + { + if(prop.Set) + ((void (*)(void *, void *))(void *)prop.Set)(control, check.instance); + variable = false; + break; + } + } + } + else { - Property getProperty = eClass_FindProperty(check.instance._class, computed.member.member.string, this.privateModule); - if(getProperty) + for(check = classObject.instances.first; check; check = check.next) { - DataValue value { }; - GetProperty(getProperty, check.instance, &value); - SetProperty(prop, control, value); - member.variable = false; + if(check.name && !strcmp(name, check.name)) + { + Property getProperty = eClass_FindProperty(check.instance._class, computed.member.member.string, this.privateModule); + if(getProperty) + { + DataValue value { }; + GetProperty(getProperty, check.instance, &value); + SetProperty(prop, control, value); + variable = false; + } + break; + } } - break; } } } - } - } - // MOVED THIS UP NOW THAT char * IS A NORMAL CLASS - else if(computed.isConstant && computed.type == stringExp && propertyClass.dataTypeString && strstr(propertyClass.dataTypeString, "char *")) - { - String temp = new char[strlen(computed.string)+1]; - ReadString(temp, computed.string); - ((void (*)(void *, void *))(void *)prop.Set)(control, temp); - delete temp; - } - else - member.variable = true; + break; + case stringExp: + if(propertyClass.dataTypeString && strstr(propertyClass.dataTypeString, "char *")) + { + String temp = new char[strlen(computed.string)+1]; + ReadString(temp, computed.string); + ((void (*)(void *, void *))(void *)prop.Set)(control, temp); + delete temp; - FreeExpression(computed); - } - } - else - { - Expression computed = CopyExpression(member.initializer.exp); - if(computed) - { - ComputeExpression(computed); - if(computed.isConstant) - { - if(computed.type == constantExp && (!propertyClass.dataTypeString || strcmp(propertyClass.dataTypeString, "char *"))) //(strcmp(propertyClass.name, "char *") && (strcmp(propertyClass.name, "String")))) - { - if(!strcmp(propertyClass.dataTypeString, "float")) - ((void (*)(void *, float))(void *)prop.Set)(control, (float)strtod(computed.constant, null)); - else if(!strcmp(propertyClass.dataTypeString, "double")) - ((void (*)(void *, double))(void *)prop.Set)(control, strtod(computed.constant, null)); - else - ((void (*)(void *, int))(void *)prop.Set)(control, strtol(computed.constant, null, 0)); - } - else if(computed.type == stringExp && propertyClass.dataTypeString && strstr(propertyClass.dataTypeString, "char *")) - { - String temp = new char[strlen(computed.string)+1]; - ReadString(temp, computed.string); - ((void (*)(void *, void *))(void *)prop.Set)(control, temp); - delete temp; - } - } - else - member.variable = true; + if(!member.initializer.exp.intlString) + { + Map i18nStrings = object.i18nStrings; + if(!i18nStrings) + object.i18nStrings = i18nStrings = { }; + i18nStrings[prop.name] = false; + } - FreeExpression(computed); + variable = false; + } + break; + case constantExp: + if(!isClass && computed.isConstant) + { + if(!strcmp(propertyClass.dataTypeString, "float")) + ((void (*)(void *, float))(void *)prop.Set)(control, (float)strtod(computed.constant, null)); + else if(!strcmp(propertyClass.dataTypeString, "double")) + ((void (*)(void *, double))(void *)prop.Set)(control, strtod(computed.constant, null)); + else + ((void (*)(void *, int))(void *)prop.Set)(control, strtol(computed.constant, null, 0)); + variable = false; + } + break; + } } } + FreeExpression(computed); } } - else + if(variable) member.variable = true; } else if(ident && member.initializer && member.initializer.type == expInitializer && member.initializer.exp && @@ -3478,7 +3519,6 @@ class CodeEditor : Window if(selectedName) { ObjectInfo check; - int pos = 0; for(check = this.oClass.instances.first; check; check = check.next) { @@ -3592,7 +3632,7 @@ class CodeEditor : Window if((prop.IsSet && !prop.IsSet(test)) || ((int (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCompare])(dataType, dataForm, dataTest)) { char tempString[1024] = ""; - char * string = ""; + const char * string = ""; bool needClass = true; if(*prev) f.Printf(", "); @@ -3621,14 +3661,32 @@ class CodeEditor : Window else if(dataType.type == normalClass || dataType.type == noHeadClass) { void * dataForm, * dataTest; + bool isEditBoxContents = false; + bool freeDataForm = false, freeDataTest = false; - dataForm = ((void *(*)(void *))(void *)prop.Get)(control); - dataTest = ((void *(*)(void *))(void *)prop.Get)(test); + // Because contents property is broken for mutiline EditBox at the moment + if(!strcmp(prop.name, "contents") && !strcmp(prop._class.name, "EditBox")) + isEditBoxContents = true; + + if(isEditBoxContents && ((EditBox)control).multiLine) + { + dataForm = ((EditBox)control).multiLineContents; + freeDataForm = true; + } + else + dataForm = ((void *(*)(void *))(void *)prop.Get)(control); + if(isEditBoxContents && ((EditBox)test).multiLine) + { + dataTest = ((EditBox)test).multiLineContents; + freeDataTest = true; + } + else + dataTest = ((void *(*)(void *))(void *)prop.Get)(test); if((prop.IsSet && !prop.IsSet(test)) || ((int (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCompare])(dataType, dataForm, dataTest)) { char tempString[1024] = ""; - char * string = ""; + const char * string = ""; if(*prev) f.Printf(", "); @@ -3677,7 +3735,12 @@ class CodeEditor : Window if(!strcmp(dataType.dataTypeString, "char *")) { - f.Printf("\""); + Map i18nStrings = object.i18nStrings; + bool i18n = true; + if(i18nStrings && i18nStrings.GetAtPosition(prop.name, false, null)) + i18n = false; + + f.Printf("%s\"", i18n ? "$" : ""); OutputString(f, string); f.Puts("\""); } @@ -3689,6 +3752,9 @@ class CodeEditor : Window *prev = true; *lastIsMethod = false; } + + if(freeDataForm) delete dataForm; + if(freeDataTest) delete dataTest; } else { @@ -3699,7 +3765,7 @@ class CodeEditor : Window if((prop.IsSet && !prop.IsSet(test)) || ((int (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCompare])(dataType, &dataForm, &dataTest)) { - char * string; + char * string = null; char tempString[1024] = ""; SetProperty(prop, test, dataForm); @@ -3709,13 +3775,14 @@ class CodeEditor : Window if(dataType.type == enumClass) { - NamedLink value; + NamedLink64 value; Class enumClass = eSystem_FindClass(privateModule, "enum"); EnumClassData e = ACCESS_CLASSDATA(dataType, enumClass); + int64 i64Value = GetI64EnumValue(dataType, dataForm); for(value = e.values.first; value; value = value.next) { - if((int)value.data == dataForm.i) + if(value.data == i64Value) { string = value.name; break; @@ -3777,9 +3844,7 @@ class CodeEditor : Window Window control = (Window)object.instance; bool prev = false; bool methodPresent = false; - Class _class; bool lastIsMethod = true; - ObjectInfo classObject = object.oClass; if(inst) { @@ -3861,9 +3926,10 @@ class CodeEditor : Window { int count = 0; int toDelete = 0; - int toAdd = 0; + //int toAdd = 0; f.Seek(-1, current); + DeleteJunkBefore(f, position, &position); f.Puts("\n "); f.Seek(1, current); //f.Puts("\n"); @@ -3886,8 +3952,8 @@ class CodeEditor : Window toDelete += count - 6; count = 6; } - else - toAdd = 6 - count; + /*else + toAdd = 6 - count;*/ break; } } @@ -3897,20 +3963,25 @@ class CodeEditor : Window f.DeleteBytes(toDelete); f.Seek(count, current); } + + DeleteJunkBefore(f, position, &position); + + // Removed this here as it was adding trailing spaces when adding a method + /* if(toAdd) { int c; for(c = 0; clast) { @@ -4225,7 +4295,7 @@ class CodeEditor : Window } else { - Class moduleClass = eSystem_FindClass(this.privateModule, "Module"); + // Class moduleClass = eSystem_FindClass(this.privateModule, "Module"); // ADDING METHOD HERE f.Printf("\n "); @@ -4254,7 +4324,7 @@ class CodeEditor : Window f.Printf(")\n"); f.Printf(" %c\n\n", OpenBracket); - if(control._class._vTbl[method.vid] == moduleClass._vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad]) // Temp Check for DefaultFunction + if(control._class._vTbl[method.vid] == null /*moduleClass._vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad]*/) // Temp Check for DefaultFunction { if(returnType.kind == classType && !strcmp(returnType._class.string, "bool")) f.Printf(" return true;\n"); @@ -4282,12 +4352,7 @@ class CodeEditor : Window } if(!object.instCode) - { - if(methodPresent) - f.Printf(" %c;\n", CloseBracket); - else - f.Printf("%c;\n", CloseBracket); - } + f.Printf(methodPresent ? " %c;" : "%c;", CloseBracket); else if(!object.deleted) { // Turn this into a multiline instance when adding a method @@ -4318,7 +4383,7 @@ class CodeEditor : Window { Class dataType = prop.dataTypeClass; char tempString[1024] = ""; - char * string; + char * string = null; bool specify = false; DataMember member; @@ -4354,14 +4419,32 @@ class CodeEditor : Window else if(dataType && (dataType.type == normalClass || dataType.type == noHeadClass)) { void * dataForm, * dataTest; + bool isEditBoxContents = false; + bool freeDataForm = false, freeDataTest = false; - dataForm = ((void *(*)(void *))(void *)prop.Get)(classObject.instance); - dataTest = ((void *(*)(void *))(void *)prop.Get)(test); + // Because contents property is broken for mutiline EditBox at the moment + if(!strcmp(prop.name, "contents") && !strcmp(prop._class.name, "EditBox")) + isEditBoxContents = true; + + if(isEditBoxContents && ((EditBox)classObject.instance).multiLine) + { + dataForm = ((EditBox)classObject.instance).multiLineContents; + freeDataForm = true; + } + else + dataForm = ((void *(*)(void *))(void *)prop.Get)(classObject.instance); + if(isEditBoxContents && ((EditBox)test).multiLine) + { + dataTest = ((EditBox)test).multiLineContents; + freeDataTest = true; + } + else + dataTest = ((void *(*)(void *))(void *)prop.Get)(test); if(((int (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCompare])(dataType, dataForm, dataTest)) { char tempString[1024] = ""; - char * string; + char * string = null; ((void (*)(void *, void *))(void *)prop.Set)(test, dataForm); if(eClass_IsDerived(classObject.instance._class, dataType) && classObject.instance == dataForm) @@ -4377,7 +4460,12 @@ class CodeEditor : Window if(!strcmp(dataType.dataTypeString, "char *")) { - f.Printf("\n %s%s = \"", specify ? "property::" : "", prop.name); + Map i18nStrings = classObject.i18nStrings; + bool i18n = true; + if(i18nStrings && i18nStrings.GetAtPosition(prop.name, false, null)) + i18n = false; + + f.Printf("\n %s%s = %s\"", specify ? "property::" : "", prop.name, i18n ? "$" : ""); OutputString(f, string); f.Puts("\";"); } @@ -4387,6 +4475,8 @@ class CodeEditor : Window f.Printf("\n %s%s = %s;", specify ? "property::" : "", prop.name, string); } } + if(freeDataForm) delete dataForm; + if(freeDataTest) delete dataTest; } else if(dataType) { @@ -4412,13 +4502,14 @@ class CodeEditor : Window bool needClass = true; if(dataType.type == enumClass) { - NamedLink value; + NamedLink64 value; Class enumClass = eSystem_FindClass(privateModule, "enum"); EnumClassData e = ACCESS_CLASSDATA(dataType, enumClass); + int64 i64Value = GetI64EnumValue(dataType, dataForm); for(value = e.values.first; value; value = value.next) { - if((int)value.data == dataForm.i) + if(value.data == i64Value) { string = value.name; break; @@ -4461,6 +4552,8 @@ class CodeEditor : Window updatingCode++; + editBox.recordUndoEvent = true; + if(moveAttached) { movedFuncId = GetDeclId(function.declarator); @@ -4470,7 +4563,6 @@ class CodeEditor : Window for(classObject = classes.first; classObject; classObject = classObject.next) { - Class _class; ClassDefinition classDef = classObject.classDefinition; Class regClass = eSystem_FindClass(this.privateModule, ((Specifier)classDef.baseSpecs->first).name); Instance test; @@ -4540,7 +4632,9 @@ class CodeEditor : Window lastIsDecl = false; DeleteJunkBefore(f, def.loc.start.pos, &position); - f.Printf("\n "); + + // This was adding blank spaces between comment and properties -- What was it for? + // f.Printf("\n "); for(propDef = def.defProperties->first; propDef; propDef = propDef.next) { @@ -4587,7 +4681,6 @@ class CodeEditor : Window if(!keptMember) { char ch = 0; - int count = 0; f.Seek(def.loc.end.pos - position - 1, current); f.Getc(&ch); @@ -4815,7 +4908,7 @@ class CodeEditor : Window Type dataType = method.dataType; Type returnType = dataType.returnType; Type param; - Class moduleClass = eSystem_FindClass(this.privateModule, "Module"); + // Class moduleClass = eSystem_FindClass(this.privateModule, "Module"); f.Printf("\n\n"); f.Printf(" "); @@ -4841,7 +4934,7 @@ class CodeEditor : Window f.Printf(")\n"); f.Printf(" %c\n\n", OpenBracket); - if(test._class._vTbl[method.vid] == moduleClass._vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad]) // Temp Check for DefaultFunction + if(test._class._vTbl[method.vid] == null /*moduleClass._vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad]*/) // Temp Check for DefaultFunction { if(returnType && returnType.kind == classType && !strcmp(returnType._class.string, "bool")) f.Printf(" return true;\n"); @@ -4877,6 +4970,8 @@ class CodeEditor : Window delete test; } + editBox.recordUndoEvent = false; + updatingCode--; delete f; @@ -4896,7 +4991,7 @@ class CodeEditor : Window method = null; } - int FindMethod(char * methodName /*Method method*/, ClassFunction*functionPtr, Location propLoc) + int FindMethod(const char * methodName /*Method method*/, ClassFunction*functionPtr, Location propLoc) { int found = 0; ClassFunction function = null; @@ -5047,7 +5142,7 @@ class CodeEditor : Window return found; } - void GoToMethod(char * methodName /*Method method*/) + void GoToMethod(const char * methodName /*Method method*/) { if(methodName) { @@ -5483,7 +5578,7 @@ class CodeEditor : Window sheet.DeleteObject(object); } - void RenameObject(ObjectInfo object, char * name) + void RenameObject(ObjectInfo object, const char * name) { bool valid = false; @@ -5547,7 +5642,7 @@ class CodeEditor : Window if(subMember.dataType && subMember.dataType.kind == classType && subMember.dataType._class) { - char * bitmapName = (char *)eClass_GetProperty(subMember.dataType._class.registered, "icon"); + char * bitmapName = (char *)(intptr)eClass_GetProperty(subMember.dataType._class.registered, "icon"); if(bitmapName) { bitmap = { bitmapName }; @@ -5645,7 +5740,7 @@ class CodeEditor : Window if(member.dataType && member.dataType.kind == classType && member.dataType._class) { - char * bitmapName = (char *)eClass_GetProperty(member.dataType._class.registered, "icon"); + char * bitmapName = (char *)(intptr)eClass_GetProperty(member.dataType._class.registered, "icon"); if(bitmapName) { bitmap = { bitmapName }; @@ -5676,8 +5771,6 @@ class CodeEditor : Window for(_class = whatClass; _class && _class.type != systemClass; _class = _class.base) { Method method; - Property prop; - DataMember member; for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next) { @@ -5688,7 +5781,7 @@ class CodeEditor : Window if(!method.dataType) method.dataType = ProcessTypeString(method.dataTypeString, false); - if(MatchTypes(method.dataType, methodType, null, whatClass, /*null, */whatClass, false, true, false, false)) + if(MatchTypes(method.dataType, methodType, null, whatClass, /*null, */whatClass, false, true, false, false, true)) { DataRow row = membersList.FindString(method.name); if(!row) @@ -5708,14 +5801,13 @@ class CodeEditor : Window } } - void ListClassPropertiesAndVirtual(Class whatClass, String curString) + void ListClassPropertiesAndVirtual(Class whatClass, const String curString) { Class _class; bool isPrivate = false; for(_class = whatClass; _class /*&& _class.type != systemClass*/; _class = _class.base) { Method method; - Property prop; DataMember member; for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next) @@ -5760,7 +5852,7 @@ class CodeEditor : Window if(member.dataType && member.dataType.kind == classType && member.dataType._class) { - char * bitmapName = (char *)eClass_GetProperty(member.dataType._class.registered, "icon"); + char * bitmapName = (char *)(intptr)eClass_GetProperty(member.dataType._class.registered, "icon"); if(bitmapName) { bitmap = { bitmapName }; @@ -5785,8 +5877,6 @@ class CodeEditor : Window { if(type && (type.kind == classType || type.kind == structType || type.kind == unionType)) { - Class _class; - if(type.kind == classType) { if(type._class) @@ -5842,14 +5932,14 @@ class CodeEditor : Window for(link = (BTNamedLink)nameSpace.defines.first; link; link = (BTNamedLink)((BTNode)link).next ) { - DefinedExpression definedExp = link.data; + //DefinedExpression definedExp = link.data; DataRow row = membersList.AddString(link /*definedExp*/.name); row.icon = icons[typeData]; } for(link = (BTNamedLink)nameSpace.functions.first; link; link = (BTNamedLink)((BTNode)link).next) { - GlobalFunction function = link.data; + //GlobalFunction function = link.data; DataRow row = membersList.AddString(link /*function*/.name); row.icon = icons[typeMethod]; } @@ -5879,7 +5969,7 @@ class CodeEditor : Window for(_class : classes) { EnumClassData enumeration = (EnumClassData)_class.data; - NamedLink item; + NamedLink64 item; for(item = enumeration.values.first; item; item = item.next) { DataRow row = membersList.AddString(item.name); @@ -5904,7 +5994,7 @@ class CodeEditor : Window return result; } - void ListNameSpaceByString(Module mainModule, char * string) + void ListNameSpaceByString(Module mainModule, const char * string) { NameSpace * nameSpace; Module module; @@ -5932,14 +6022,14 @@ class CodeEditor : Window 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 || (dest._class.registered != _class && strcmp(dest._class.registered.dataTypeString, "char *"))) && !dest.classObjectType)) && + if(_class.type == enumClass && (dest.kind != classType || ((!dest._class || !dest._class.registered || (dest._class.registered != _class && strcmp(dest._class.registered.dataTypeString, "char *") && strcmp(dest._class.string, "bool"))) && !dest.classObjectType)) && dest.kind != pointerType && dest.kind != ellipsisType) { OldList conversions { }; Type type { }; type.kind = classType; type._class = FindClass(_class.name); - if(MatchTypes(type, dest, &conversions, null, null, true, false, false, false)) + if(MatchTypes(type, dest, &conversions, null, null, true, false, false, false, true)) { ListEnumValues(_class); result = true; @@ -5955,7 +6045,7 @@ class CodeEditor : Window return result; } - NameSpace * FindNameSpace(NameSpace nameSpace, char * name) + NameSpace * FindNameSpace(NameSpace nameSpace, const char * name) { int start = 0, c; char ch; @@ -5983,7 +6073,7 @@ class CodeEditor : Window return (NameSpace *)nameSpace; } - void ListSymbols(Expression exp, bool enumOnly, char * string, Identifier realIdentifier) + void ListSymbols(Expression exp, bool enumOnly, const char * string, Identifier realIdentifier) { bool listedEnums = false; Type destType = (exp && exp.destType && !exp.destType.truth) ? exp.destType : null; @@ -6025,7 +6115,9 @@ class CodeEditor : Window } } - if(this.privateModule && destType && (destType.kind != pointerType || destType.type.kind != voidType) && destType.kind != ellipsisType) + if(this.privateModule && destType && (destType.kind == _BoolType || destType.kind == classType || destType.kind == enumType || destType.kind == structType || destType.kind == templateType || destType.kind == thisClassType || destType.kind == unionType || + (destType.kind == pointerType && destType.type.kind != voidType))) + //if(this.privateModule && destType && (destType.kind != pointerType || destType.type.kind != voidType) && destType.kind != ellipsisType) { listedEnums = ListEnumsModule(this.privateModule, destType); } @@ -6041,7 +6133,7 @@ class CodeEditor : Window } else if(destType && destType.kind == enumType) { - NamedLink value; + NamedLink64 value; for(value = destType.members.first; value; value = value.next) { @@ -6103,7 +6195,7 @@ class CodeEditor : Window BitmapResource bitmap = null; if(symbol.type && symbol.type.kind == classType && symbol.type._class && symbol.type._class) { - char * bitmapName = (char *)eClass_GetProperty(symbol.type._class.registered, "icon"); + char * bitmapName = (char *)(intptr)eClass_GetProperty(symbol.type._class.registered, "icon"); if(bitmapName) { bitmap = { bitmapName }; @@ -6195,7 +6287,7 @@ class CodeEditor : Window void OverrideVirtualFunction(ClassFunction function, Method method, Class _class, bool isInstance, bool extraIndent) { EditBoxStream f { editBox = editBox }; - uint position = 0; + int position = 0; EditLine l1, l2; int x1,y1,x2,y2; @@ -6212,7 +6304,7 @@ class CodeEditor : Window Type dataType = method.dataType; Type returnType = dataType.returnType; Type param; - Class moduleClass = eSystem_FindClass(this.privateModule, "Module"); + // Class moduleClass = eSystem_FindClass(this.privateModule, "Module"); if(insideDef.prev) f.Printf("\n\n"); @@ -6254,7 +6346,7 @@ class CodeEditor : Window if(!_class || ( - (isInstance ? _class : _class.base)._vTbl[method.vid] == moduleClass._vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad] || + (isInstance ? _class : _class.base)._vTbl[method.vid] == null /*moduleClass._vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__Module_OnLoad]*/ || (isInstance ? _class : _class.base)._vTbl[method.vid] == DummyMethod)) // Temp Check for DefaultFunction { if(returnType && returnType.kind == classType && !strcmp(returnType._class.string, "bool")) @@ -6303,7 +6395,6 @@ class CodeEditor : Window { bool didOverride = false; EditLine line = editBox.line; - char * text = line.text; int lineNum, charPos; Expression exp = null; EditLine l1, l2; @@ -6405,11 +6496,12 @@ class CodeEditor : Window int rowCount; char tempString[1024]; char * string = null; - CodePosition idStart, idEnd; + CodePosition idStart { }; + CodePosition idEnd { }; if(membersListShown) { - char * buffer = membersLine.text; + const char * buffer = membersLine.text; int c; bool firstChar = true; int len = 0; @@ -6441,7 +6533,7 @@ class CodeEditor : Window } string[len] = 0; */ - int x, y; + int x = 0, y; int len = 0; EditLine editLine = editBox.line; bool firstChar = true; @@ -6450,7 +6542,7 @@ class CodeEditor : Window string = tempString; for(y = lineNum-1; y >= 0; y--) { - char * buffer = editLine.text; + const char * buffer = editLine.text; int lineCount = editLine.count; for(x = (y == lineNum-1) ? (Min(charPos, lineCount) - 1 ): lineCount-1; x >= 0; x--) { @@ -6575,7 +6667,7 @@ class CodeEditor : Window DataRow row = string ? membersList.FindSubString(string) : null; if(row && !membersList.FindSubStringAfter(row, string) && !caretMove) { - char * newString = row.string; + const char * newString = row.string; if(!membersListShown) { membersLoc.start.line = idStart.line-1; @@ -6680,10 +6772,7 @@ class CodeEditor : Window void InvokeParameters(bool exact, bool reposition, bool caretMove) { - EditLine line = editBox.line; - char * text = line.text; int lineNum, charPos; - Expression exp = null; EditLine l1, l2; int x1,y1, x2,y2;