From e9c913f9dbacb00901073ea272187484282bfda2 Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Sat, 10 Jul 2021 23:39:41 +0000 Subject: [PATCH] update cedit by akron1 git-svn-id: svn://kolibrios.org@9050 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/common/settings/assoc.ini | 2 +- programs/develop/cedit/CEDIT | Bin 29205 -> 30763 bytes programs/develop/cedit/SRC/CEdit.ob07 | 348 ++++++++++++++++++---- programs/develop/cedit/SRC/ChangeLog.ob07 | 61 ++-- programs/develop/cedit/SRC/KolibriOS.ob07 | 31 +- programs/develop/cedit/SRC/Languages.ob07 | 7 + programs/develop/cedit/SRC/Lines.ob07 | 15 +- programs/develop/cedit/SRC/List.ob07 | 28 +- programs/develop/cedit/SRC/Tabs.ob07 | 215 +++++++++++++ programs/develop/cedit/SRC/Text.ob07 | 33 +- 10 files changed, 603 insertions(+), 137 deletions(-) create mode 100644 programs/develop/cedit/SRC/Tabs.ob07 diff --git a/data/common/settings/assoc.ini b/data/common/settings/assoc.ini index f519ec0abe..baa8eca7bc 100644 --- a/data/common/settings/assoc.ini +++ b/data/common/settings/assoc.ini @@ -77,7 +77,7 @@ icon=98 exec=/kolibrios/utils/thashview icon=124 -[TextEditor] +[TextEdit] exec=/kolibrios/utils/t_edit icon=9 next=$CodeEdit diff --git a/programs/develop/cedit/CEDIT b/programs/develop/cedit/CEDIT index 94946da8ee2e56fe794cecf9dedb7630f9a36f42..06a73bc1826079eec31d1d9b4e875c4656677514 100644 GIT binary patch literal 30763 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

?lM*Ah6 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 literal 29205 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

l37xcQt%+NFj5tuQzmq;&OBwp^`FUC% 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 diff --git a/programs/develop/cedit/SRC/CEdit.ob07 b/programs/develop/cedit/SRC/CEdit.ob07 index f8d1c06624..67ae724a46 100644 --- a/programs/develop/cedit/SRC/CEdit.ob07 +++ b/programs/develop/cedit/SRC/CEdit.ob07 @@ -25,10 +25,10 @@ IMPORT G := Graph, T := Text, E := Encodings, CB := Clipboard, Languages, ChangeLog, Scroll, - RW, Ini, box_lib, Icons; + RW, Ini, box_lib, Icons, Tabs; CONST - header = "CEdit (06-jul-2021)"; + header = "CEdit (10-jul-2021)"; ShellFilter = ""; EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI"; @@ -80,7 +80,7 @@ CONST toolbarDelim = 7; iconPad = (toolBtnSize - Icons.SIZE) DIV 2; - TOP = btnTop + toolBtnSize + 7; + TOP = btnTop + toolBtnSize + 10 + Tabs.tabHeight; RIGHT = scrollWidth - 2; BOTTOM = scrollWidth + 18; @@ -115,8 +115,10 @@ CONST menuOpen = 11; menuSave = 12; menuSaveAs = 13; - menuFolder = 14; - menuExit = 15; + menuSaveAll = 14; + menuFolder = 15; + menuClose = 16; + menuExit = 17; menuNumbers = 20; menuFontSize = 21; @@ -146,17 +148,25 @@ CONST menuPipet = 70; menuSysFunc = 71; + maxTexts = 32; + VAR canvas: G.tCanvas; font, font1, font2: G.tFont; + + tabs: Tabs.tTabs; text: T.tText; + texts: ARRAY maxTexts OF T.tText; + textsCount, curText: INTEGER; + winWidth, winHeight: INTEGER; shift: SET; AppPath, runScript, buildScript, debugScript: RW.tFileName; OD: OpenDlg.Dialog; confirm, notFound, search, modified: BOOLEAN; + switch: BOOLEAN; leftButton, VScroll, HScroll: BOOLEAN; vScroll, hScroll: Scroll.tScroll; LEFT: INTEGER; @@ -335,6 +345,26 @@ BEGIN END WriteModified; +PROCEDURE DrawState (text: T.tText; width, height: INTEGER); +VAR + y: INTEGER; +BEGIN + y := (btnHeight - fontHeight) DIV 2 + btnTop; + K.DrawRect(width - 12*fontWidth, y, 12*fontWidth, fontHeight, K.winColor); + CASE text.enc OF + |E.UTF8: K.DrawText866(width - 5*fontWidth, y, K.textColor, "UTF-8") + |E.UTF8BOM: K.DrawText866(width - 9*fontWidth, y, K.textColor, "UTF-8-BOM") + |E.CP866: K.DrawText866(width - 5*fontWidth, y, K.textColor, "CP866") + |E.W1251: K.DrawText866(width - 12*fontWidth, y, K.textColor, "Windows-1251") + END; + + y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2; + K.DrawRect(LEFT + 16*fontWidth, TOP + canvas.height + scrollWidth - 1, width - LEFT - 24*fontWidth, BOTTOM - scrollWidth + 1, K.winColor); + K.DrawText866(LEFT + 16*fontWidth, y, K.textColor, text.fileName); + WriteModified(width - 8*fontWidth, y) +END DrawState; + + PROCEDURE repaint; VAR width, height, scrollX, scrollY, y: INTEGER; @@ -348,8 +378,14 @@ BEGIN IF ~search THEN T.wordSel(text) END; - T.draw(text); K.ClientSize(width, height); + IF switch THEN + DrawState(text, width, height); + Tabs.draw(tabs); + IF search & T.search(text, searchText, cs, whole) THEN END; + switch := FALSE + END; + T.draw(text); y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2; K.DrawRect(LEFT, TOP + canvas.height + scrollWidth - 1, 16*fontWidth, BOTTOM - scrollWidth + 1, K.winColor); WritePos(y); @@ -360,7 +396,7 @@ BEGIN T.getScroll(text, scrollX, scrollY); vScroll.value := scrollY; vScroll.maxVal := text.count - 1; - hScroll.value := scrollX; hScroll.maxVal := Lines.maxLength; + hScroll.value := scrollX; hScroll.maxVal := text.maxLength; Scroll.draw(vScroll, LEFT + canvas.width - 1, TOP + scrollWidth - 1); Scroll.draw(hScroll, LEFT + scrollWidth, TOP + canvas.height - 1); @@ -388,6 +424,7 @@ BEGIN K.ClientSize(cliWidth, cliHeight); G.destroy(canvas); canvas := G.CreateCanvas(cliWidth - (LEFT + RIGHT + 1), cliHeight - (TOP + BOTTOM)); + Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, cliWidth - (LEFT + RIGHT + 1), Tabs.tabHeight); G.SetFont(canvas, font); T.setCanvas(canvas); T.resize(canvas.width, canvas.height); @@ -448,7 +485,7 @@ END SearchPanel; PROCEDURE draw_window; VAR - width, height, x, y: INTEGER; + width, height, x: INTEGER; PROCEDURE drawToolbarBtn (id, x: INTEGER); @@ -547,21 +584,11 @@ BEGIN K.PutPixel(LEFT + canvas.width + scrollWidth - 2, TOP, K.winColor); K.PutPixel(LEFT, TOP + canvas.height + scrollWidth - 2, K.winColor); - y := (btnHeight - fontHeight) DIV 2 + btnTop; - CASE text.enc OF - |E.UTF8: K.DrawText866(width - 5*fontWidth, y, K.textColor, "UTF-8") - |E.UTF8BOM: K.DrawText866(width - 9*fontWidth, y, K.textColor, "UTF-8-BOM") - |E.CP866: K.DrawText866(width - 5*fontWidth, y, K.textColor, "CP866") - |E.W1251: K.DrawText866(width - 12*fontWidth, y, K.textColor, "Windows-1251") - END; + DrawState(text, width, height); IF search THEN SearchPanel(searchLeft, TOP) END; - - y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2; - K.DrawRect(LEFT + 16*fontWidth, TOP + canvas.height + scrollWidth - 1, width - LEFT - 24*fontWidth, BOTTOM - scrollWidth + 1, K.winColor); - K.DrawText866(LEFT + 16*fontWidth, y, K.textColor, text.fileName); - WriteModified(width - 8*fontWidth, y); + Tabs.draw(tabs); repaint END; K.EndDraw @@ -622,9 +649,20 @@ BEGIN END error; -PROCEDURE saveAs; +PROCEDURE saveError (name: RW.tFileName); VAR - fileName: RW.tFileName; + s: RW.tFileName; +BEGIN + s := "'cedit: error saving file "; + U.append8(s, name); + U.append8(s, "' -E"); + error(s) +END saveError; + + +PROCEDURE saveAs (text: T.tText); +VAR + fileName, name: RW.tFileName; ext: ARRAY 8 OF CHAR; BEGIN OD._type := OpenDlg.tsave; @@ -645,44 +683,86 @@ BEGIN OpenFile(fileName, EditFilter); IF fileName # "" THEN IF T.save(text, fileName, text.enc, RW.EOL_CRLF) THEN - T.setName(text, fileName) + T.setName(text, fileName); + U.getFileName(fileName, name, U.SLASH); + Tabs.rename(tabs, curText, name) ELSE - error("'cedit: error saving file' -E") + saveError(fileName) END END END saveAs; -PROCEDURE save; +PROCEDURE getIdx (text: T.tText): INTEGER; +VAR + i: INTEGER; +BEGIN + i := 0; + WHILE texts[i] # text DO + INC(i) + END + RETURN i +END getIdx; + + +PROCEDURE Switch (txt: T.tText); +BEGIN + Tabs.switch(tabs, curText); + text := txt; + T.switch(txt); + switch := TRUE +END Switch; + + +PROCEDURE save (text: T.tText); BEGIN IF text.modified THEN IF text.fileName # "" THEN IF ~T.save(text, text.fileName, text.enc, RW.EOL_CRLF) THEN - error("'cedit: error saving file' -E") + saveError(text.fileName) END ELSE - saveAs + curText := getIdx(text); + Switch(text); + saveAs(text) END END END save; -PROCEDURE SelfRun (file: ARRAY OF CHAR); -BEGIN - K.Run(AppPath, file) -END SelfRun; - - -PROCEDURE open; +PROCEDURE saveAll; VAR - fileName: RW.tFileName; + i: INTEGER; BEGIN - OD._type := OpenDlg.topen; - OpenFile(fileName, EditFilter); - IF fileName # "" THEN - SelfRun(fileName) - END -END open; + i := textsCount - 1; + WHILE i >= 0 DO + IF texts[i].modified THEN + save(texts[i]) + END; + DEC(i) + END; +END saveAll; + + +PROCEDURE insert (pos: INTEGER; txt: T.tText); +VAR + i: INTEGER; + name: RW.tFileName; +BEGIN + FOR i := textsCount - 1 TO pos BY -1 DO + texts[i + 1] := texts[i] + END; + texts[pos] := txt; + INC(textsCount); + curText := pos; + IF txt.fileName = "" THEN + name := "new" + ELSE + U.getFileName(txt.fileName, name, U.SLASH) + END; + Tabs.add(tabs, name); + Switch(txt) +END insert; PROCEDURE Confirm; @@ -707,6 +787,104 @@ BEGIN END Confirm; +PROCEDURE closeFile (conf: BOOLEAN); +VAR + i: INTEGER; +BEGIN + IF text.modified & conf THEN + Confirm + ELSE + Tabs.delete(tabs, curText); + FOR i := curText + 1 TO textsCount - 1 DO + texts[i - 1] := texts[i] + END; + DEC(textsCount); + IF curText = textsCount THEN + DEC(curText) + END; + IF curText >= 0 THEN + Switch(texts[curText]) + ELSE + K.Exit + END; + draw_window + END +END closeFile; + + +PROCEDURE NewFile; +VAR + nov: T.tText; +BEGIN + IF textsCount < maxTexts THEN + nov := T.New(); + T.SetPos(nov, 0, 0); + insert(textsCount, nov) + ELSE + error("'cedit: too many files' -E") + END +END NewFile; + + +PROCEDURE getFileNum (fileName: RW.tFileName): INTEGER; +VAR + i: INTEGER; + + PROCEDURE nameEq (name1, name2: RW.tFileName): BOOLEAN; + VAR + n1, n2: RW.tFileName; + BEGIN + n1 := name1; + n2 := name2; + U.upcase(n1); + U.upcase(n2) + RETURN n1 = n2 + END nameEq; + +BEGIN + i := 0; + WHILE (i < textsCount) & ~nameEq(texts[i].fileName, fileName) DO + INC(i) + END; + IF i = textsCount THEN + i := -1 + END + RETURN i +END getFileNum; + + +PROCEDURE open; +VAR + fileName: RW.tFileName; + nov: T.tText; + err, n: INTEGER; +BEGIN + IF textsCount < maxTexts THEN + OD._type := OpenDlg.topen; + OpenFile(fileName, EditFilter); + IF fileName # "" THEN + n := getFileNum(fileName); + IF n = -1 THEN + nov := T.open(fileName, err); + IF nov = NIL THEN + error("'cedit: error opening file' -E") + ELSE + insert(textsCount, nov); + T.SetPos(nov, 0, 0) + END + ELSE + curText := n; + Tabs.switch(tabs, n); + Switch(texts[n]); + draw_window + END + END + ELSE + error("'cedit: too many files' -E") + END +END open; + + PROCEDURE createEdit (left, top: INTEGER): box_lib.edit_box; VAR edit, EditBox0: box_lib.edit_box; @@ -813,11 +991,18 @@ END LeftButtonUp; PROCEDURE close; +VAR + cont: BOOLEAN; BEGIN - IF text.modified THEN - Confirm - ELSE - K.Exit + cont := TRUE; + WHILE (textsCount > 0) & cont DO + IF text.modified THEN + Confirm; + cont := FALSE + ELSE + closeFile(FALSE); + repaint + END END END close; @@ -859,15 +1044,20 @@ BEGIN |menuSelectAll: T.key(text, ORD("A"), {T.CTRL}) |menuNew: - SelfRun("") + NewFile |menuOpen: open |menuSave: - save; + save(text); repaint |menuSaveAs: - saveAs; + saveAs(text); repaint + |menuSaveAll: + saveAll; + repaint + |menuClose: + closeFile(TRUE) |menuFolder: K.Run("/rd/1/File Managers/Eolite", text.fileName) |menuExit: @@ -1010,13 +1200,16 @@ VAR menu: List.tList; BEGIN menu := List.create(NIL); - Menu.AddMenuItem(menu, menuNew, "new ctrl-N"); - Menu.AddMenuItem(menu, menuOpen, "open ctrl-O"); - Menu.AddMenuItem(menu, menuSave, "save ctrl-S"); - Menu.AddMenuItem(menu, menuSaveAs, "save as"); - Menu.AddMenuItem(menu, menuFolder, "folder"); + Menu.AddMenuItem(menu, menuNew, "new ctrl-N"); + Menu.AddMenuItem(menu, menuOpen, "open ctrl-O"); + Menu.AddMenuItem(menu, menuSave, "save ctrl-S"); + Menu.AddMenuItem(menu, menuSaveAs, "save as"); + Menu.AddMenuItem(menu, menuSaveAll, "save all"); + Menu.AddMenuItem(menu, menuFolder, "folder"); Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuExit, "exit"); + Menu.AddMenuItem(menu, menuClose, "close"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuExit, "exit"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuFile; @@ -1155,6 +1348,11 @@ BEGIN IF menu = menuFile THEN Menu.setEnabled(menu, menuSave, text.modified); Menu.setEnabled(menu, menuFolder, text.fileName # ""); + i := 0; + WHILE (i < textsCount) & ~texts[i].modified DO + INC(i) + END; + Menu.setEnabled(menu, menuSaveAll, i < textsCount); INC(x, menuFileX) ELSIF (menu = menuEdit) OR (menu = context) THEN Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition)); @@ -1218,7 +1416,7 @@ END ShowMenu; PROCEDURE main; VAR width, height, x, y, scrollX, scrollY, i: INTEGER; - key: INTEGER; + key, btn: INTEGER; msState: SET; scroll: INTEGER; err: INTEGER; @@ -1230,6 +1428,9 @@ BEGIN K.GetSystemColors; Icons.get(icons, grayIcons); modified := FALSE; + switch := FALSE; + textsCount := 0; + curText := 0; mainTID := K.ThreadID(); K.SetIPC(IPC); U.ptr2str(K.GetName(), AppPath); @@ -1239,7 +1440,7 @@ BEGIN resized := FALSE; shift := {}; K.ScreenSize(winWidth, winHeight); - winWidth := (winWidth * 80) DIV 100 - (128 + 30); + winWidth := (winWidth*80) DIV 100 - (128 + 30); winHeight := winHeight - (128 + 30); winWidth := MAX(winWidth, minWinWidth); winHeight := MAX(winHeight, minWinHeight); @@ -1247,6 +1448,8 @@ BEGIN cliHeight := winHeight; LEFT := searchLeft; canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 10), winHeight - (TOP + BOTTOM + 4) - K.SkinHeight()); + tabs := Tabs.create(); + Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, canvas.width, Tabs.tabHeight); font1 := G.CreateFont(1, "", {}); font2 := G.CreateFont(2, "", {}); font := font1; @@ -1275,6 +1478,7 @@ BEGIN END END; OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, ""); + insert(0, text); vScroll := Scroll.create(scrollWidth, canvas.height - scrollWidth*2 + 1); hScroll := Scroll.create(canvas.width - scrollWidth*2, scrollWidth); @@ -1320,9 +1524,9 @@ BEGIN getKBState; IF confirm THEN IF key DIV 65536 = 28 THEN (* Enter *) - save; + save(text); IF ~text.modified THEN - K.Exit + closeFile(FALSE) END; repaint END; @@ -1407,7 +1611,7 @@ BEGIN open |30: key := ORD("A") |31: key := -1; - save + save(text) |32: key := ORD("D") |38: key := ORD("L") |44: T.undo(text); @@ -1416,7 +1620,7 @@ BEGIN |46: key := ORD("C") |47: key := ORD("V") |49: key := -1; - SelfRun("") + NewFile ELSE key := -1 END @@ -1431,7 +1635,17 @@ BEGIN END; repaint |3: - CASE K.ButtonCode() OF + btn := K.ButtonCode(); + CASE btn OF + |Tabs.btnID .. Tabs.btnID + maxTexts - 1: + DEC(btn, Tabs.btnID); + curText := btn; + Tabs.switch(tabs, btn); + Switch(texts[btn]); + draw_window + |Tabs.btnID - 1: Tabs.scroll(tabs, -1); switch := TRUE; repaint + |Tabs.btnID - 2: Tabs.scroll(tabs, +1); switch := TRUE; repaint + |0: |btnFile: @@ -1449,21 +1663,23 @@ BEGIN |btnTools: ShowMenu(menuTools) |btnNo: - K.Exit + closeFile(FALSE); + repaint |btnYes: - save; + save(text); IF ~text.modified THEN - K.Exit + closeFile(FALSE) END; repaint |btnClose: close |btnNew: - SelfRun("") + NewFile; + repaint |btnOpen: open |btnSave: - save; + save(text); repaint |btnSearch: IF ~search THEN diff --git a/programs/develop/cedit/SRC/ChangeLog.ob07 b/programs/develop/cedit/SRC/ChangeLog.ob07 index 20e1b7344f..c3e4be22e5 100644 --- a/programs/develop/cedit/SRC/ChangeLog.ob07 +++ b/programs/develop/cedit/SRC/ChangeLog.ob07 @@ -42,11 +42,15 @@ TYPE END; + tLog* = POINTER TO RECORD + Log*: List.tList; + guard: tGuard; + isLast: BOOLEAN + END; + VAR - Log*: List.tList; - guard: tGuard; - isLast: BOOLEAN; + CL*: tLog; PROCEDURE isLastGuard* (guard: tGuard): BOOLEAN; @@ -55,7 +59,7 @@ VAR res: BOOLEAN; BEGIN IF guard # NIL THEN - item := Log.last; + item := CL.Log.last; WHILE ~(item IS tGuard) DO item := item.prev END; @@ -72,7 +76,7 @@ VAR item: List.tItem; BEGIN ASSERT(guard # NIL); - item := Log.first; + item := CL.Log.first; WHILE ~(item IS tGuard) DO item := item.next END @@ -82,8 +86,8 @@ END isFirstGuard; PROCEDURE setGuard* (_guard: tGuard); BEGIN - guard := _guard; - isLast := isLastGuard(_guard) + CL.guard := _guard; + CL.isLast := isLastGuard(_guard) END setGuard; @@ -102,9 +106,9 @@ VAR item: List.tItem; (*res: INTEGER;*) BEGIN - isLast := TRUE; + CL.isLast := TRUE; REPEAT - item := List.pop(Log); + item := List.pop(CL.Log); IF item # guard THEN (* IF item IS tUntypedPtr THEN @@ -115,7 +119,7 @@ BEGIN DISPOSE(item) END UNTIL item = guard; - List.append(Log, item) + List.append(CL.Log, item) END clear; @@ -126,10 +130,10 @@ BEGIN NEW(item); item.adr := adrV; SYSTEM.GET(adrX, item.val); - IF ~isLast THEN - clear(guard) + IF ~CL.isLast THEN + clear(CL.guard) END; - List.append(Log, item) + List.append(CL.Log, item) END changeWord; @@ -140,10 +144,10 @@ BEGIN NEW(item); item.adr := SYSTEM.ADR(v); item.val := x; - IF ~isLast THEN - clear(guard) + IF ~CL.isLast THEN + clear(CL.guard) END; - List.append(Log, item) + List.append(CL.Log, item) END changeBool; @@ -179,10 +183,27 @@ BEGIN END untypedPtr; *) +PROCEDURE set* (_CL: tLog); +BEGIN + CL := _CL +END set; + + +PROCEDURE create* (VAR maxLength: INTEGER): tLog; +VAR + newLog: tLog; +BEGIN + NEW(newLog); + newLog.guard := NIL; + newLog.isLast := TRUE; + newLog.Log := List.create(NIL); + CL := newLog; + Lines.setMaxLength(maxLength) + RETURN newLog +END create; + + BEGIN - guard := NIL; - isLast := TRUE; List.init(changeInt, changePtr); - Lines.init(changeInt, changePtr, changeBool(*, typedPtr, untypedPtr*)); - Log := List.create(NIL) + Lines.init(changeInt, changePtr, changeBool(*, typedPtr, untypedPtr*)) END ChangeLog. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/KolibriOS.ob07 b/programs/develop/cedit/SRC/KolibriOS.ob07 index 4e007c2a6c..e556d6b2f1 100644 --- a/programs/develop/cedit/SRC/KolibriOS.ob07 +++ b/programs/develop/cedit/SRC/KolibriOS.ob07 @@ -23,20 +23,6 @@ IMPORT KOSAPI, SYSTEM; CONST -(* - winColor* = 0EEEEEEH; - textColor* = 0000000H; - btnColor* = 0CCCCCCH; - btnTextColor* = 0000000H; - toolbarColor* = 0DFDFDFH; - scrollColor* = 0A0A0A0H; - scrollBkColor* = winColor; - borderColor* = 0808080H; - selMenuColor* = 0CCE8FFH; - shadowColor* = 0808080H; - caseColor* = 00000FFH; - disCaseColor* = 0808080H; -*) fontWidth* = 8; fontHeight* = 16; @@ -44,7 +30,7 @@ VAR winColor*, textColor*, btnColor*, btnTextColor*, toolbarColor*, scrollColor*, scrollBkColor*, - borderColor*, selMenuColor*, shadowColor*, + borderColor*, shadowColor*, caseColor*, disCaseColor*: INTEGER; @@ -172,6 +158,12 @@ BEGIN END DrawText866; +PROCEDURE DrawText866bk* (x, y, color, bkColor: INTEGER; text: ARRAY OF CHAR); +BEGIN + KOSAPI.sysfunc6(4, x * 65536 + y, color + LSL(0D0H, 24), SYSTEM.ADR(text[0]), 0, bkColor) +END DrawText866bk; + + PROCEDURE MousePos* (VAR x, y: INTEGER); VAR res: INTEGER; @@ -343,15 +335,6 @@ PROCEDURE GetSystemColors*; VAR buf: ARRAY 10 OF INTEGER; BEGIN -(* winColor := 0EEEEEEH; - textColor := 0000000H; - btnColor := 0CCCCCCH; - btnTextColor := 0000000H; - scrollColor := 0A0A0A0H; - scrollBkColor := winColor; - borderColor := 0808080H; - *) - selMenuColor := 0CCE8FFH; toolbarColor := 0DFDFDFH; shadowColor := 0808080H; caseColor := 00000FFH; diff --git a/programs/develop/cedit/SRC/Languages.ob07 b/programs/develop/cedit/SRC/Languages.ob07 index ca5e554a81..f747da3e23 100644 --- a/programs/develop/cedit/SRC/Languages.ob07 +++ b/programs/develop/cedit/SRC/Languages.ob07 @@ -27,6 +27,8 @@ CONST langNone* = 0; langC* = 1; langOberon* = 2; langPascal* = 3; langFasm* = 4; langLua* = 5; langIni* = 6; + csLang = {langNone, langC, langOberon, langLua, langIni}; + TYPE tLine = Lines.tLine; @@ -43,6 +45,11 @@ VAR oberonKW, cKW, pascalKW, luaKW, iniKW, fasmKW: ARRAY 3 OF tKeyWords; +PROCEDURE isCS* (lang: INTEGER): BOOLEAN; + RETURN lang IN csLang +END isCS; + + PROCEDURE checkKW (s: ARRAY OF WCHAR; KW: tKeyWords): BOOLEAN; VAR i: INTEGER; diff --git a/programs/develop/cedit/SRC/Lines.ob07 b/programs/develop/cedit/SRC/Lines.ob07 index 27b79acade..a78ad5fdea 100644 --- a/programs/develop/cedit/SRC/Lines.ob07 +++ b/programs/develop/cedit/SRC/Lines.ob07 @@ -51,7 +51,7 @@ VAR (* _typedPtr: PTypedPtr; _untypedPtr: PUntypedPtr;*) - maxLength*: INTEGER; + pMaxLength: INTEGER; PROCEDURE movInt (VAR v: INTEGER; x: INTEGER); @@ -75,9 +75,12 @@ END movPtr; PROCEDURE malloc (size: INTEGER): INTEGER; VAR ptr: INTEGER; + maxLength: INTEGER; BEGIN + ASSERT(pMaxLength # 0); + SYSTEM.GET(pMaxLength, maxLength); IF size > maxLength THEN - maxLength := size + SYSTEM.PUT(pMaxLength, size) END; size := size*WCHAR_SIZE + 4; INC(size, (-size) MOD 32); @@ -422,6 +425,12 @@ BEGIN END init; +PROCEDURE setMaxLength* (VAR maxLength: INTEGER); BEGIN - maxLength := 64 + pMaxLength := SYSTEM.ADR(maxLength) +END setMaxLength; + + +BEGIN + pMaxLength := 0 END Lines. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/List.ob07 b/programs/develop/cedit/SRC/List.ob07 index a4309a44f7..46956216b5 100644 --- a/programs/develop/cedit/SRC/List.ob07 +++ b/programs/develop/cedit/SRC/List.ob07 @@ -176,18 +176,22 @@ BEGIN movPtr(a.next, b0); movPtr(b.next, a); movPtr(a.prev, b); - IF (a0 # NIL) & (b0 # NIL) THEN - movPtr(a0.next, b); - movPtr(b0.prev, a); - ELSIF (a0 # NIL) & (b0 = NIL) THEN - movPtr(a0.next, b); - movPtr(list.last, a) - ELSIF (a0 = NIL) & (b0 # NIL) THEN - movPtr(b0.prev, a); - movPtr(list.first, b) - ELSIF (a0 = NIL) & (b0 = NIL) THEN - movPtr(list.first, b); - movPtr(list.last, a) + IF a0 # NIL THEN + IF b0 # NIL THEN + movPtr(a0.next, b); + movPtr(b0.prev, a); + ELSE + movPtr(a0.next, b); + movPtr(list.last, a) + END + ELSE + IF b0 # NIL THEN + movPtr(b0.prev, a); + movPtr(list.first, b) + ELSE + movPtr(list.first, b); + movPtr(list.last, a) + END END END END _exchange; diff --git a/programs/develop/cedit/SRC/Tabs.ob07 b/programs/develop/cedit/SRC/Tabs.ob07 new file mode 100644 index 0000000000..e00422f8f1 --- /dev/null +++ b/programs/develop/cedit/SRC/Tabs.ob07 @@ -0,0 +1,215 @@ +(* + Copyright 2021 Anton Krotov + + This file is part of CEdit. + + CEdit is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + CEdit is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with CEdit. If not, see . +*) + +MODULE Tabs; + +IMPORT List, K := KolibriOS, RW; + +CONST + + btnID* = 100; + tabHeight* = 22; + curTabHeight = 26; + + +TYPE + + tItem = POINTER TO RECORD (List.tItem) + + val: RW.tFileName + + END; + + tTabs* = POINTER TO RECORD + + strings: List.tList; + first, current: INTEGER; + width, height: INTEGER; + x, y: INTEGER + + END; + + +PROCEDURE drawTab (t: tTabs; id, x, y, width, height: INTEGER; s: ARRAY OF CHAR); +VAR + x2, y2: INTEGER; +BEGIN + IF id = t.current THEN + INC(height, curTabHeight - tabHeight); + DEC(y, curTabHeight - tabHeight) + END; + x2 := x + width - 1; + y2 := y + height - 1; + K.DrawRect(x, y, width, height, K.winColor); + K.DrawLine(x, y, x2, y, K.borderColor); + K.DrawLine(x2, y, x2, y2, K.borderColor); + K.DrawLine(x2, y2, x, y2, K.borderColor); + K.DrawLine(x, y2, x, y, K.borderColor); + K.DrawText866bk(x + K.fontWidth, y + (height - K.fontHeight) DIV 2, K.textColor, K.winColor, s); + K.CreateButton(id + ORD({30}) + btnID, x, y - 1, width, height - 1, K.winColor, ""); +END drawTab; + + +PROCEDURE tabWidth (tab: tItem): INTEGER; + RETURN (LENGTH(tab.val) + 2)*K.fontWidth +END tabWidth; + + +PROCEDURE Width (t: tTabs; pos, n: INTEGER): INTEGER; +VAR + res, i: INTEGER; + item: List.tItem; +BEGIN + res := 0; + i := pos; + item := List.getItem(t.strings, i); + WHILE (item # NIL) & (i <= n) DO + INC(res, tabWidth(item(tItem))); + item := item.next; + INC(i) + END + RETURN res +END Width; + + +PROCEDURE draw* (t: tTabs); +CONST + scrWidth = 10; +VAR + x, y, xmax, n, width: INTEGER; + item: List.tItem; +BEGIN + y := t.y; + x := t.x; + K.DrawRect(x, y - (curTabHeight - tabHeight), t.width + 2*scrWidth, t.height + (curTabHeight - tabHeight), K.winColor); + IF Width(t, 0, t.strings.count - 1) > t.width THEN + INC(x, 2*scrWidth); + K.CreateButton(btnID - 1, t.x, t.y, scrWidth, t.height - 1, K.btnColor, "<"); + K.CreateButton(btnID - 2, t.x + scrWidth, t.y, scrWidth, t.height - 1, K.btnColor, ">") + ELSE + t.first := 0 + END; + xmax := x + t.width - 1; + + n := t.strings.count - 1; + WHILE (n >= 0) & (Width(t, n, t.strings.count - 1) <= t.width) DO + DEC(n) + END; + IF n < 0 THEN + n := 0 + ELSE + INC(n) + END; + IF n < t.first THEN + t.first := n + END; + + K.DrawRect(x, y, t.width, t.height, K.winColor); + item := List.getItem(t.strings, t.first); + n := t.first; + WHILE (item # NIL) & (x <= xmax) DO + width := tabWidth(item(tItem)); + IF x + width - 1 <= xmax THEN + drawTab(t, n, x, y, width, t.height, item(tItem).val) + END; + INC(n); + INC(x, width); + item := item.next + END +END draw; + + +PROCEDURE add* (t: tTabs; s: ARRAY OF CHAR); +VAR + item: tItem; +BEGIN + NEW(item); + item.val := s; + List.append(t.strings, item); +END add; + + +PROCEDURE rename* (t: tTabs; n: INTEGER; s: ARRAY OF CHAR); +VAR + item: List.tItem; +BEGIN + item := List.getItem(t.strings, n); + item(tItem).val := s +END rename; + + +PROCEDURE delete* (t: tTabs; n: INTEGER); +VAR + item: List.tItem; +BEGIN + item := List.getItem(t.strings, n); + List.delete(t.strings, item) +END delete; + + +PROCEDURE scroll* (t: tTabs; n: INTEGER); +VAR + pos: INTEGER; +BEGIN + pos := t.first + n; + IF pos < 0 THEN + pos := 0 + ELSIF pos >= t.strings.count THEN + pos := t.strings.count - 1 + END; + t.first := pos +END scroll; + + +PROCEDURE switch* (t: tTabs; n: INTEGER); +BEGIN + IF (0 <= n) & (n < t.strings.count) THEN + t.current := n; + IF n < t.first THEN + t.first := 0 + END; + WHILE Width(t, t.first, n) > t.width DO + INC(t.first) + END + END +END switch; + + +PROCEDURE setArea* (t: tTabs; x, y, width, height: INTEGER); +BEGIN + t.x := x; + t.y := y; + t.width := width; + t.height := height +END setArea; + + +PROCEDURE create* (): tTabs; +VAR + res: tTabs; +BEGIN + NEW(res); + res.strings := List.create(NIL); + res.current := 0; + res.first := 0 + RETURN res +END create; + + +END Tabs. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/Text.ob07 b/programs/develop/cedit/SRC/Text.ob07 index f66cae6f4b..adf0d60b67 100644 --- a/programs/develop/cedit/SRC/Text.ob07 +++ b/programs/develop/cedit/SRC/Text.ob07 @@ -80,7 +80,9 @@ TYPE foundList: List.tList; idxData: Search.tBuffer; foundSel: INTEGER; - searchText: tString + searchText: tString; + chLog*: ChangeLog.tLog; + maxLength*: INTEGER END; tProcedure = PROCEDURE; @@ -393,7 +395,7 @@ BEGIN ELSIF (c = "'") OR (c = '"') THEN String(text, line, i, y, backColor) ELSIF (U.isLetter(c) OR (c = "_")) THEN - ident(text, i, i, y, line, backColor, FALSE) + ident(text, i, i, y, line, backColor, Lang.isCS(lang)) ELSIF isFASMdelim(c) THEN PrintLex(text, line, i, i, y, colors.delim, backColor) ELSIF U.isDigit(c) THEN @@ -438,7 +440,7 @@ BEGIN String(text, line, i, y, backColor); cond := 0 ELSIF (U.isLetter(c) OR (c = "_")) THEN - ident(text, i, i - ORD((i > 0) & (getChar(line, i - 1) = "#")), y, line, backColor, TRUE); + ident(text, i, i - ORD((i > 0) & (getChar(line, i - 1) = "#")), y, line, backColor, Lang.isCS(lang)); cond := 0 ELSIF U.isDigit(c) THEN k := i; @@ -557,7 +559,7 @@ BEGIN PrintLex(text, line, k, i, y, color, backColor); cond := 0 ELSIF (depth = 0) & (U.isLetter(c) OR (c = "_")) THEN - ident(text, i, i, y, line, backColor, TRUE); + ident(text, i, i, y, line, backColor, Lang.isCS(lang)); cond := 0 ELSIF c = "(" THEN cond := 1 @@ -645,7 +647,7 @@ BEGIN PrintLex(text, line, k, i, y, colors.num, backColor); cond := 0 ELSIF U.isLetter(c) OR (c = "_") THEN - ident(text, i, i, y, line, backColor, TRUE); + ident(text, i, i, y, line, backColor, Lang.isCS(lang)); cond := 0 ELSE cond := 0 @@ -744,7 +746,7 @@ BEGIN PrintLex(text, line, k, i, y, colors.num, backColor); cond := 0 ELSIF (U.isLetter(c) OR (c = "_")) THEN - ident(text, i, i, y, line, backColor, FALSE); + ident(text, i, i, y, line, backColor, Lang.isCS(lang)); cond := 0 ELSE cond := 0 @@ -786,7 +788,7 @@ BEGIN DEC(i); PrintLex(text, line, k, i, y, colors.num, backColor) ELSIF (U.isLetter(c) OR (c = "_")) THEN - ident(text, i, i, y, line, backColor, TRUE) + ident(text, i, i, y, line, backColor, Lang.isCS(lang)) END ELSIF depth = 1 THEN IF c = "]" THEN @@ -1179,7 +1181,7 @@ PROCEDURE scroll* (text: tText; h, v: INTEGER); BEGIN INC(text.scroll.X, h); INC(text.scroll.Y, v); - text.scroll.X := MIN(MAX(text.scroll.X, 0), Lines.maxLength); + text.scroll.X := MIN(MAX(text.scroll.X, 0), text.maxLength); text.scroll.Y := MIN(MAX(text.scroll.Y, 0), text.count - 1) END scroll; @@ -1264,7 +1266,7 @@ BEGIN text.modified := TRUE END; - item := ChangeLog.Log.first; + item := ChangeLog.CL.Log.first; WHILE item # guard DO ChangeLog.redo(item); item := item.next @@ -1579,7 +1581,7 @@ BEGIN str := "" END END; - IF search(text, str, TRUE, TRUE) THEN END + IF search(text, str, Lang.isCS(text.lang), TRUE) THEN END END wordSel; @@ -1809,7 +1811,7 @@ BEGIN END; IF text.guard THEN NEW(guard); - List.append(ChangeLog.Log, guard); + List.append(ChangeLog.CL.Log, guard); text.edition := guard; text.guard := FALSE; ELSE @@ -1944,11 +1946,20 @@ BEGIN END draw; +PROCEDURE switch* (text: tText); +BEGIN + ChangeLog.set(text.chLog); + Lines.setMaxLength(text.maxLength) +END switch; + + PROCEDURE create (fileName: RW.tFileName): tText; VAR text: tText; BEGIN NEW(text); + text.maxLength := 64; + text.chLog := ChangeLog.create(text.maxLength); NEW(text.cursor); NEW(text.select2); text.cursor.X := 0;