From f73a566b8b05c56ec9b6d5901ff18e0885ec910f Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Wed, 21 Jul 2021 16:13:29 +0000 Subject: [PATCH] CEDIT: new version by akron1 git-svn-id: svn://kolibrios.org@9073 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/cedit/CEDIT | Bin 31209 -> 31727 bytes programs/develop/cedit/README.TXT | 2 +- programs/develop/cedit/SRC/CEdit.ob07 | 947 +++++++++++----------- programs/develop/cedit/SRC/ChangeLog.ob07 | 97 ++- programs/develop/cedit/SRC/Clipboard.ob07 | 5 +- programs/develop/cedit/SRC/Encodings.ob07 | 5 + programs/develop/cedit/SRC/File.ob07 | 30 + programs/develop/cedit/SRC/Languages.ob07 | 2 +- programs/develop/cedit/SRC/Lines.ob07 | 15 +- programs/develop/cedit/SRC/Tabs.ob07 | 2 +- programs/develop/cedit/SRC/Text.ob07 | 111 ++- 11 files changed, 696 insertions(+), 520 deletions(-) diff --git a/programs/develop/cedit/CEDIT b/programs/develop/cedit/CEDIT index 70cbbe306c220ee216001688cc04c8f907f19901..6b0474e70a4560b0d053666b3295cb12c96d70de 100644 GIT binary patch literal 31727 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 W`0X-G(;zv&_#Eh8002}G000Lmmo+W` literal 31209 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 0) & cont DO IF text.modified THEN @@ -1005,7 +997,7 @@ BEGIN repaint END END -END close; +END Close; PROCEDURE MenuItemClick (menu: Menu.tMenu; id: INTEGER); @@ -1031,6 +1023,17 @@ BEGIN END Script; +PROCEDURE ShowSearchPanel; +BEGIN + IF ~search THEN + Search + ELSIF ~searchOpened THEN + search := FALSE; + Search + END +END ShowSearchPanel; + + PROCEDURE receiveIPC; BEGIN IF IPC[0] # Menu.lastTID THEN @@ -1038,11 +1041,11 @@ BEGIN END; CASE IPC[2] OF |0: - |menuCut: T.key(text, ORD("X"), {T.CTRL}) - |menuCopy: T.key(text, ORD("C"), {T.CTRL}) - |menuPaste: T.key(text, ORD("V"), {T.CTRL}) - |menuDelete: T.key(text, 46, {}) - |menuSelectAll: T.key(text, ORD("A"), {T.CTRL}) + |menuCut: T.key(text, ORD("X"), FALSE, TRUE) + |menuCopy: T.key(text, ORD("C"), FALSE, TRUE) + |menuPaste: T.key(text, ORD("V"), FALSE, TRUE) + |menuDelete: T.key(text, 46, FALSE, FALSE) + |menuSelectAll: T.key(text, ORD("A"), FALSE, TRUE) |menuNew: NewFile @@ -1062,7 +1065,7 @@ BEGIN |menuFolder: K.Run("/rd/1/File Managers/Eolite", text.fileName) |menuExit: - close + Close |menuUndo: T.undo(text); repaint @@ -1070,19 +1073,11 @@ BEGIN T.redo(text); repaint |menuSearch: - IF ~search THEN - Search - END; - EditBox_SetFocus(FindEdit, TRUE); - EditBox_SetFocus(ReplaceEdit, FALSE); - EditBox_SetFocus(GotoEdit, FALSE) + ShowSearchPanel; + SetFocus(FindEdit, TRUE) |menuGoto: - IF ~search THEN - Search - END; - EditBox_SetFocus(GotoEdit, TRUE); - EditBox_SetFocus(FindEdit, FALSE); - EditBox_SetFocus(ReplaceEdit, FALSE) + ShowSearchPanel; + SetFocus(GotoEdit, TRUE) |menuNumbers: T.toggleNumbers(text) |menuFontSize: @@ -1128,6 +1123,8 @@ BEGIN text.enc := E.W1251 |menuPipet: K.Run("/rd/1/develop/pipet", "") + |menuBoard: + K.Run("/rd/1/develop/board", "") |menuSysFunc: K.Run("/rd/1/docpack", "f") |menuColors..menuMaxColors: @@ -1141,10 +1138,11 @@ END receiveIPC; PROCEDURE MenuKeyDown (menu: Menu.tMenu; key: INTEGER): BOOLEAN; VAR menuItem: INTEGER; + shift, ctrl: BOOLEAN; BEGIN menuItem := -1; - getKBState; - IF (T.CTRL IN shift) THEN + getKBState(shift, ctrl); + IF ctrl THEN CASE key DIV 65536 OF |17: menuItem := menuClose |21: menuItem := menuRedo @@ -1242,10 +1240,10 @@ VAR menu: List.tList; BEGIN menu := List.create(NIL); - Menu.AddMenuItem(menu, menuUTF8BOM, "UTF-8-BOM"); - Menu.AddMenuItem(menu, menuUTF8, "UTF-8"); - Menu.AddMenuItem(menu, menuCP866, "CP866"); - Menu.AddMenuItem(menu, menuWin1251, "Windows-1251"); + Menu.AddMenuItem(menu, menuUTF8BOM, E.names[E.UTF8BOM]); + Menu.AddMenuItem(menu, menuUTF8, E.names[E.UTF8]); + Menu.AddMenuItem(menu, menuCP866, E.names[E.CP866]); + Menu.AddMenuItem(menu, menuWin1251, E.names[E.W1251]); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuEncoding; @@ -1313,6 +1311,7 @@ VAR BEGIN menu := List.create(NIL); Menu.AddMenuItem(menu, menuPipet, "pipet"); + Menu.AddMenuItem(menu, menuBoard, "board"); Menu.AddMenuItem(menu, menuSysFunc, "system functions"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuTools; @@ -1415,32 +1414,413 @@ BEGIN END ShowMenu; +PROCEDURE KeyDown (key: INTEGER); +VAR + keyCode: INTEGER; + shift, ctrl: BOOLEAN; +BEGIN + keyCode := key DIV 65536; + getKBState(shift, ctrl); + IF confirm THEN + IF keyCode = 28 THEN (* Enter *) + save(text); + IF ~text.modified THEN + closeFile(FALSE, curText) + END + END; + key := -1 + ELSE + IF keyCode = 61 THEN (* F3 *) + key := -1; + IF search & (searchText # "") THEN + IF shift THEN + notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW)) + ELSE + notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW)) + END + END + ELSIF keyCode = 60 THEN (* F2 *) + key := -1; + IF ctrl THEN + T.toggleLabel(text) + ELSE + T.gotoLabel(text, ~shift) + END + ELSIF keyCode = 67 THEN (* F9 *) + key := -1; + IF ctrl THEN + Script(buildScript) + ELSE + Script(runScript) + END + ELSIF keyCode = 1 THEN (* Esc *) + key := -1; + IF search THEN + Search + END + ELSIF (keyCode = 55) & (key DIV 256 MOD 256 = 52) THEN (* PrtScn *) + key := -1 + ELSIF (keyCode = 15) & ctrl THEN (* ctrl+Tab *) + key := -1; + SwitchTab((curText + 1) MOD textsCount) + ELSIF (keyCode = 33) & ctrl THEN + key := -1; + ShowSearchPanel; + SetFocus(FindEdit, TRUE) + ELSIF (keyCode = 34) & ctrl THEN + key := -1; + ShowSearchPanel; + SetFocus(GotoEdit, TRUE) + ELSE + IF EditBox_Focus(FindEdit) THEN + box_lib.edit_box_key(FindEdit, key); + EditBox_GetValue(FindEdit, new_searchText); + IF new_searchText # searchText THEN + searchText := new_searchText; + notFound := ~T.search(text, searchText, cs, whole) + END + ELSIF EditBox_Focus(ReplaceEdit) THEN + box_lib.edit_box_key(ReplaceEdit, key); + EditBox_GetValue(ReplaceEdit, replaceText) + ELSIF EditBox_Focus(GotoEdit) THEN + IF (key DIV 256) MOD 256 = 13 THEN + goto + ELSE + box_lib.edit_box_key(GotoEdit, key) + END + ELSE + CASE keyCode OF + |73: key := 33 + |81: key := 34 + |71: key := 36 + |79: key := 35 + |72: key := 38 + |80: key := 40 + |75: key := 37 + |77: key := 39 + |82: key := -1 (* insert *) + |83: key := 46 + |59, 62..66, 68, 87, 88: key := -1 (* F1, F4..F8, F10, F11, F12 *) + ELSE + IF ctrl THEN + CASE keyCode OF + |17: closeFile(TRUE, curText); + key := -2 + |21: T.redo(text); + key := -1 + |22: key := ORD("U") + |24: key := -1; + open + |30: key := ORD("A") + |31: key := -1; + save(text) + |32: key := ORD("D") + |38: key := ORD("L") + |44: T.undo(text); + key := -1 + |45: key := ORD("X") + |46: key := ORD("C") + |47: key := ORD("V") + |49: key := -1; + NewFile + ELSE + key := -1 + END + ELSE + T.input(text, E.cp866[key DIV 256 MOD 256]); + key := -1 + END + END; + IF key >= 0 THEN + T.key(text, key, shift, ctrl) + END + END + END + END; + IF key # -2 THEN + repaint + END +END KeyDown; + + +PROCEDURE BtnClick; +VAR + btn: INTEGER; + middle, exit: BOOLEAN; +BEGIN + btn := K.ButtonCode(middle); + IF (Tabs.btnID <= btn) & (btn <= Tabs.btnID + maxTexts - 1) THEN + DEC(btn, Tabs.btnID); + IF middle THEN + IF texts[btn].modified THEN + SwitchTab(btn) + END; + closeFile(TRUE, btn) + ELSE + SwitchTab(btn) + END; + btn := 0 + ELSE + IF middle THEN + btn := 0 + END + END; + CASE btn OF + |Tabs.btnID - 1: Tabs.scroll(tabs, -1); switch := TRUE; repaint + |Tabs.btnID - 2: Tabs.scroll(tabs, +1); switch := TRUE; repaint + + |0: + + |btnFile: + ShowMenu(menuFile) + |btnEdit: + ShowMenu(menuEdit) + |btnEncoding: + ShowMenu(menuEncoding) + |btnView: + ShowMenu(menuView) + |btnSyntax: + ShowMenu(menuSyntax) + |btnProgram: + ShowMenu(menuProgram) + |btnTools: + ShowMenu(menuTools) + |btnNo: + exit := closing; + closeFile(FALSE, curText); + repaint; + IF exit THEN + Close + END + |btnYes: + exit := closing; + save(text); + IF ~text.modified THEN + closeFile(FALSE, curText) + END; + repaint; + IF exit THEN + Close + END + |btnClose: + Close + |btnNew: + NewFile; + repaint + |btnOpen: + open + |btnSave: + save(text); + repaint + |btnSearch: + ShowSearchPanel + |btnCloseFind: + Search + |btnHideFind: + SetFocus(FindEdit, FALSE); + searchOpened := FALSE; + LEFT := searchLeft; + resize; + draw_window + |btnUndo: + T.undo(text); + repaint + |btnRedo: + T.redo(text); + repaint + |btnUpper: + T.chCase(text, TRUE); + repaint + |btnLower: + T.chCase(text, FALSE); + repaint + |btnBuild: + Script(buildScript) + |btnRun: + Script(runScript) + |btnUp: + T.scroll(text, 0, -1); + repaint + |btnDown: + T.scroll(text, 0, 1); + repaint + |btnLeft: + T.scroll(text, -1, 0); + repaint + |btnRight: + T.scroll(text, 1, 0); + repaint + |btnFindNext: + IF searchText # "" THEN + notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW)); + repaint + END + |btnReplace: + T.replace(text, replaceText, LENGTH(searchText)); + repaint + |btnReplaceAll: + notFound := ~T.search(text, searchText, cs, whole); + IF ~notFound THEN + replaced := T.replaceAll(text, replaceText, LENGTH(searchText)); + END; + repaint + |btnGoto: + goto; + repaint + END +END BtnClick; + + +PROCEDURE MouseEvent (VAR resized: BOOLEAN; VAR firstClickX, firstClickY, time: INTEGER); +CONST + DELAY = 10; +VAR + msState: SET; + scroll, x, y, scrollX, scrollY: INTEGER; + + + PROCEDURE EditBox (eb: box_lib.edit_box); + VAR + focus: BOOLEAN; + BEGIN + focus := EditBox_Focus(eb); + box_lib.edit_box_mouse(eb); + IF focus # EditBox_Focus(eb) THEN + SetFocus(eb, TRUE) + END + END EditBox; + + +BEGIN + Menu.close(menuFile); + Menu.close(menuEdit); + Menu.close(menuEncoding); + Menu.close(menuView); + Menu.close(menuSyntax); + Menu.close(menuProgram); + Menu.close(menuTools); + Menu.close(context); + IF ~resized THEN + msState := K.MouseState(); + IF ~(0 IN msState) OR (16 IN msState) THEN + LeftButtonUp + END; + scroll := K.Scroll(); + IF scroll # 0 THEN + T.scroll(text, 0, scroll*3); + repaint + END; + IF leftButton THEN + IF K.GetTickCount() - time >= DELAY THEN + mouse(x, y); + T.mouse(text, x, y); + repaint + END + END; + IF VScroll THEN + mouse(x, y); + Scroll.mouse(vScroll, x, y - scrollWidth); + T.getScroll(text, scrollX, scrollY); + T.scroll(text, 0, vScroll.value - scrollY); + repaint + END; + IF HScroll THEN + mouse(x, y); + Scroll.mouse(hScroll, x - scrollWidth, y); + T.getScroll(text, scrollX, scrollY); + T.scroll(text, hScroll.value - scrollX, 0); + repaint + END; + IF (8 IN msState) & ~(24 IN msState) THEN + mouse(firstClickX, firstClickY); + time := click(firstClickX, firstClickY) + END; + IF 9 IN msState THEN + ShowMenu(context) + END; + IF 24 IN msState THEN + mouse(x, y); + IF (ABS(x - firstClickX) < 5) & (ABS(y - firstClickY) < 5) THEN + VScroll := FALSE; + HScroll := FALSE; + IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN + leftButton := FALSE; + T.selectWord(text); + repaint + END + ELSE + firstClickX := x; + firstClickY := y; + time := click(firstClickX, firstClickY) + END + END + END; + IF search & searchOpened THEN + EditBox(FindEdit); + EditBox(ReplaceEdit); + EditBox(GotoEdit); + box_lib.check_box_mouse2(CS); + box_lib.check_box_mouse2(WH); + box_lib.check_box_mouse2(BKW); + IF box_lib.check_box_get_value(CS) # cs THEN + cs := ~cs; + notFound := ~T.search(text, searchText, cs, whole); + repaint + END; + IF box_lib.check_box_get_value(WH) # whole THEN + whole := ~whole; + notFound := ~T.search(text, searchText, cs, whole); + repaint + END + END; + resized := FALSE +END MouseEvent; + + +PROCEDURE Redraw (VAR resized: BOOLEAN; VAR width, height, cliWidth, cliHeight: INTEGER); +VAR + i: INTEGER; +BEGIN + K.GetSystemColors; + FOR i := 0 TO 1 DO + IF ~K.RolledUp() THEN + K.ClientSize(width, height); + IF (width # cliWidth) OR (height # cliHeight) THEN + cliWidth := width; + cliHeight := height; + resize; + resized := TRUE + END; + K.SetEventsMask({0, 1, 2, 5, 6, 31}) + ELSE + K.SetEventsMask({0, 30, 31}) + END; + draw_window + END +END Redraw; + + PROCEDURE main; VAR - width, height, x, y, scrollX, scrollY, i: INTEGER; - key, btn: INTEGER; - msState: SET; - scroll: INTEGER; err: INTEGER; fileName, filePath: RW.tFileName; - cliWidth, cliHeight: INTEGER; - resized, middle: BOOLEAN; + width, height, cliWidth, cliHeight: INTEGER; + resized: BOOLEAN; firstClickX, firstClickY, time: INTEGER; BEGIN K.GetSystemColors; Icons.get(icons, grayIcons); modified := FALSE; switch := FALSE; + closing := FALSE; textsCount := 0; curText := 0; mainTID := K.ThreadID(); K.SetIPC(IPC); U.ptr2str(K.GetName(), AppPath); Ini.load(AppPath); - K.SetEventsMask({0, 1, 2, 5, 6, 31}); LeftButtonUp; resized := FALSE; - shift := {}; K.ScreenSize(winWidth, winHeight); winWidth := (winWidth*80) DIV 100 - (128 + 30); winHeight := winHeight - (128 + 30); @@ -1489,6 +1869,7 @@ BEGIN confirm := FALSE; notFound := FALSE; search := FALSE; + searchOpened := FALSE; createSearchForm; new_searchText := ""; searchText := ""; @@ -1498,378 +1879,14 @@ BEGIN Ini.getStr("paths", "build", buildScript); Ini.getStr("paths", "run", runScript); Ini.getStr("paths", "debug", debugScript); + K.SetEventsMask({0, 1, 2, 5, 6, 31}); draw_window; - repaint; WHILE TRUE DO CASE K.WaitForEvent() OF - |1: - FOR i := 0 TO 1 DO - K.GetSystemColors; - Icons.get(icons, grayIcons); - IF ~K.RolledUp() THEN - K.ClientSize(width, height); - IF (width # cliWidth) OR (height # cliHeight) THEN - cliWidth := width; - cliHeight := height; - resize; - resized := TRUE; - END; - K.SetEventsMask({0, 1, 2, 5, 6, 31}) - ELSE - K.SetEventsMask({0, 30, 31}) - END; - draw_window - END - - |2: - key := K.GetKey(); - getKBState; - IF confirm THEN - IF key DIV 65536 = 28 THEN (* Enter *) - save(text); - IF ~text.modified THEN - closeFile(FALSE, curText) - END; - repaint - END; - key := -1 - END; - IF key DIV 65536 = 61 THEN (* F3 *) - key := -1; - IF search & (searchText # "") THEN - IF T.SHIFT IN shift THEN - notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW)) - ELSE - notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW)) - END - END - ELSIF key DIV 65536 = 60 THEN (* F2 *) - key := -1; - IF T.CTRL IN shift THEN - T.toggleLabel(text) - ELSE - T.gotoLabel(text, ~(T.SHIFT IN shift)) - END - ELSIF key DIV 65536 = 67 THEN (* F9 *) - key := -1; - IF T.CTRL IN shift THEN - Script(buildScript) - ELSE - Script(runScript) - END - ELSIF key DIV 65536 = 1 THEN (* Esc *) - key := -1; - IF search THEN - Search - END - ELSIF (key DIV 65536 = 55) & (key DIV 256 MOD 256 = 52) THEN - key := -1 (* PrtScn *) - ELSIF (T.CTRL IN shift) & (key DIV 65536 = 15) THEN (* ctrl+Tab *) - key := -1; - curText := (curText + 1) MOD textsCount; - Tabs.switch(tabs, curText); - Switch(texts[curText]); - draw_window - ELSIF (T.CTRL IN shift) & (key DIV 65536 = 33) THEN - key := -1; - IF ~search THEN - Search - END; - EditBox_SetFocus(FindEdit, TRUE); - EditBox_SetFocus(ReplaceEdit, FALSE); - EditBox_SetFocus(GotoEdit, FALSE) - ELSIF (T.CTRL IN shift) & (key DIV 65536 = 34) THEN - key := -1; - IF ~search THEN - Search - END; - EditBox_SetFocus(GotoEdit, TRUE); - EditBox_SetFocus(FindEdit, FALSE); - EditBox_SetFocus(ReplaceEdit, FALSE) - END; - IF (key # -1) & EditBox_Focus(FindEdit) THEN - box_lib.edit_box_key(FindEdit, key); - EditBox_GetValue(FindEdit, new_searchText); - IF new_searchText # searchText THEN - searchText := new_searchText; - notFound := ~T.search(text, searchText, cs, whole) - END - ELSIF (key # -1) & EditBox_Focus(ReplaceEdit) THEN - box_lib.edit_box_key(ReplaceEdit, key); - EditBox_GetValue(ReplaceEdit, replaceText) - ELSIF (key # -1) & EditBox_Focus(GotoEdit) THEN - IF (key DIV 256) MOD 256 = 13 THEN - goto - ELSE - box_lib.edit_box_key(GotoEdit, key) - END - ELSIF key # -1 THEN - CASE key DIV 65536 OF - |73: key := 33 - |81: key := 34 - |71: key := 36 - |79: key := 35 - |72: key := 38 - |80: key := 40 - |75: key := 37 - |77: key := 39 - |82: key := -1 (* insert *) - |83: key := 46 - |59, 60, 62..66, 68, 87, 88: key := -1 (* F1, F2, F4..F8, F10, F11, F12 *) - ELSE - IF (T.CTRL IN shift) THEN - CASE key DIV 65536 OF - |17: closeFile(TRUE, curText); - key := -2 - |21: T.redo(text); - key := -1 - |22: key := ORD("U") - |24: key := -1; - open - |30: key := ORD("A") - |31: key := -1; - save(text) - |32: key := ORD("D") - |38: key := ORD("L") - |44: T.undo(text); - key := -1 - |45: key := ORD("X") - |46: key := ORD("C") - |47: key := ORD("V") - |49: key := -1; - NewFile - ELSE - key := -1 - END - ELSE - T.input(text, E.cp866[key DIV 256 MOD 256]); - key := -1 - END - END; - IF key >= 0 THEN - T.key(text, key, shift) - END - END; - IF key # -2 THEN - repaint - END - |3: - btn := K.ButtonCode(middle); - IF (Tabs.btnID <= btn) & (btn <= Tabs.btnID + maxTexts - 1) THEN - DEC(btn, Tabs.btnID); - IF middle THEN - IF texts[btn].modified THEN - curText := btn; - Tabs.switch(tabs, btn); - Switch(texts[btn]); - draw_window; - END; - closeFile(TRUE, btn) - ELSE - curText := btn; - Tabs.switch(tabs, btn); - Switch(texts[btn]); - draw_window - END; - btn := 0 - ELSE - IF middle THEN - btn := 0 - END - END; - CASE btn OF - |Tabs.btnID - 1: Tabs.scroll(tabs, -1); switch := TRUE; repaint - |Tabs.btnID - 2: Tabs.scroll(tabs, +1); switch := TRUE; repaint - - |0: - - |btnFile: - ShowMenu(menuFile) - |btnEdit: - ShowMenu(menuEdit) - |btnEncoding: - ShowMenu(menuEncoding) - |btnView: - ShowMenu(menuView) - |btnSyntax: - ShowMenu(menuSyntax) - |btnProgram: - ShowMenu(menuProgram) - |btnTools: - ShowMenu(menuTools) - |btnNo: - closeFile(FALSE, curText); - repaint - |btnYes: - save(text); - IF ~text.modified THEN - closeFile(FALSE, curText) - END; - repaint - |btnClose: - close - |btnNew: - NewFile; - repaint - |btnOpen: - open - |btnSave: - save(text); - repaint - |btnSearch: - IF ~search THEN - Search - END - |btnCloseFind: - Search - |btnUndo: - T.undo(text); - repaint - |btnRedo: - T.redo(text); - repaint - |btnUpper: - T.chCase(text, TRUE); - repaint - |btnLower: - T.chCase(text, FALSE); - repaint - |btnBuild: - Script(buildScript) - |btnRun: - Script(runScript) - |btnUp: - T.scroll(text, 0, -1); - repaint - |btnDown: - T.scroll(text, 0, 1); - repaint - |btnLeft: - T.scroll(text, -1, 0); - repaint - |btnRight: - T.scroll(text, 1, 0); - repaint - |btnFindEdit: - EditBox_SetFocus(FindEdit, TRUE); - EditBox_SetFocus(ReplaceEdit, FALSE); - EditBox_SetFocus(GotoEdit, FALSE) - |btnReplaceEdit: - EditBox_SetFocus(ReplaceEdit, TRUE); - EditBox_SetFocus(FindEdit, FALSE); - EditBox_SetFocus(GotoEdit, FALSE) - |btnGotoEdit: - EditBox_SetFocus(GotoEdit, TRUE); - EditBox_SetFocus(FindEdit, FALSE); - EditBox_SetFocus(ReplaceEdit, FALSE) - |btnFindNext: - IF searchText # "" THEN - notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW)); - repaint - END - |btnReplace: - T.replace(text, replaceText, LENGTH(searchText)); - repaint - |btnReplaceAll: - notFound := ~T.search(text, searchText, cs, whole); - IF ~notFound THEN - replaced := T.replaceAll(text, replaceText, LENGTH(searchText)); - END; - repaint - |btnGoto: - goto; - repaint - END - |6: - Menu.close(menuFile); - Menu.close(menuEdit); - Menu.close(menuEncoding); - Menu.close(menuView); - Menu.close(menuSyntax); - Menu.close(menuProgram); - Menu.close(menuTools); - Menu.close(context); - IF ~resized THEN - getKBState; - msState := K.MouseState(); - IF ~(0 IN msState) OR (16 IN msState) THEN - LeftButtonUp - END; - scroll := K.Scroll(); - IF scroll # 0 THEN - T.scroll(text, 0, scroll*3); - repaint - END; - IF leftButton THEN - IF K.GetTickCount() - time > 9 THEN - mouse(x, y); - T.mouse(text, x, y); - repaint - END - END; - IF VScroll THEN - mouse(x, y); - Scroll.mouse(vScroll, x, y - scrollWidth); - T.getScroll(text, scrollX, scrollY); - T.scroll(text, 0, vScroll.value - scrollY); - repaint - END; - IF HScroll THEN - mouse(x, y); - Scroll.mouse(hScroll, x - scrollWidth, y); - T.getScroll(text, scrollX, scrollY); - T.scroll(text, hScroll.value - scrollX, 0); - repaint - END; - IF (8 IN msState) & ~(24 IN msState) THEN - mouse(firstClickX, firstClickY); - time := click(firstClickX, firstClickY) - END; - IF 9 IN msState THEN - ShowMenu(context) - END; - IF 24 IN msState THEN - mouse(x, y); - IF (ABS(x - firstClickX) < 5) & (ABS(y - firstClickY) < 5) THEN - VScroll := FALSE; - HScroll := FALSE; - IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN - leftButton := FALSE; - T.selectWord(text); - repaint - END - ELSE - firstClickX := x; - firstClickY := y; - time := click(firstClickX, firstClickY) - END - END - END; - IF search THEN - IF EditBox_Focus(FindEdit) THEN - box_lib.edit_box_mouse(FindEdit) - END; - IF EditBox_Focus(ReplaceEdit) THEN - box_lib.edit_box_mouse(ReplaceEdit) - END; - IF EditBox_Focus(GotoEdit) THEN - box_lib.edit_box_mouse(GotoEdit) - END; - box_lib.check_box_mouse2(CS); - box_lib.check_box_mouse2(WH); - box_lib.check_box_mouse2(BKW); - IF box_lib.check_box_get_value(CS) # cs THEN - cs := ~cs; - notFound := ~T.search(text, searchText, cs, whole); - repaint - END; - IF box_lib.check_box_get_value(WH) # whole THEN - whole := ~whole; - notFound := ~T.search(text, searchText, cs, whole); - repaint - END - END; - resized := FALSE + |1: Redraw(resized, width, height, cliWidth, cliHeight) + |2: KeyDown(K.GetKey()) + |3: BtnClick + |6: MouseEvent(resized, firstClickX, firstClickY, time) |7: receiveIPC ELSE END diff --git a/programs/develop/cedit/SRC/ChangeLog.ob07 b/programs/develop/cedit/SRC/ChangeLog.ob07 index c3e4be22e5..e05b365699 100644 --- a/programs/develop/cedit/SRC/ChangeLog.ob07 +++ b/programs/develop/cedit/SRC/ChangeLog.ob07 @@ -27,7 +27,7 @@ TYPE END; tBoolItem = POINTER TO RECORD (List.tItem) - adr: INTEGER; val: BOOLEAN + adr: INTEGER; val: BOOLEAN; save: BOOLEAN END; (* tUntypedPtr = POINTER TO RECORD (List.tItem) @@ -39,7 +39,7 @@ TYPE END; *) tGuard* = POINTER TO RECORD (List.tItem) - + saved*: BOOLEAN END; tLog* = POINTER TO RECORD @@ -123,6 +123,21 @@ BEGIN END clear; +PROCEDURE save* (guard: tGuard); +VAR + item: List.tItem; +BEGIN + item := CL.Log.first; + WHILE item # NIL DO + IF item IS tGuard THEN + item(tGuard).saved := FALSE + END; + item := item.next + END; + guard.saved := TRUE +END save; + + PROCEDURE changeWord (adrV, adrX: INTEGER); VAR item: tIntItem; @@ -144,6 +159,7 @@ BEGIN NEW(item); item.adr := SYSTEM.ADR(v); item.val := x; + item.save := FALSE; IF ~CL.isLast THEN clear(CL.guard) END; @@ -151,6 +167,81 @@ BEGIN END changeBool; +PROCEDURE delSaved*; +VAR + boolItem: tBoolItem; + cur: List.tItem; + del: BOOLEAN; +BEGIN + cur := CL.guard.next; + WHILE cur # NIL DO + IF cur IS tBoolItem THEN + boolItem := cur(tBoolItem); + del := boolItem.save + ELSE + del := FALSE + END; + cur := cur.next; + IF del THEN + List.delete(CL.Log, boolItem); + DISPOSE(boolItem) + END + END +END delSaved; + + +PROCEDURE delCurSaved*; +VAR + boolItem: tBoolItem; + cur: List.tItem; + del: BOOLEAN; +BEGIN + cur := CL.guard.prev; + WHILE (cur # NIL) & ~(cur IS tGuard) DO + IF cur IS tBoolItem THEN + boolItem := cur(tBoolItem); + del := boolItem.save + ELSE + del := FALSE + END; + cur := cur.prev; + IF del THEN + SYSTEM.PUT(boolItem.adr, ~boolItem.val); + List.delete(CL.Log, boolItem); + DISPOSE(boolItem) + END + END +END delCurSaved; + + +PROCEDURE changeBool2 (VAR v: BOOLEAN; x: BOOLEAN); +VAR + item, boolItem: tBoolItem; + cur: List.tItem; + del: BOOLEAN; +BEGIN + NEW(item); + item.adr := SYSTEM.ADR(v); + item.val := x; + item.save := TRUE; + cur := CL.guard.prev; + WHILE cur # NIL DO + IF cur IS tBoolItem THEN + boolItem := cur(tBoolItem); + del := boolItem.save & (boolItem.adr = SYSTEM.ADR(v)) & (boolItem.val = x) + ELSE + del := FALSE + END; + cur := cur.prev; + IF del THEN + List.delete(CL.Log, boolItem); + DISPOSE(boolItem) + END + END; + List.insert(CL.Log, CL.guard.prev, item) +END changeBool2; + + PROCEDURE changeInt (VAR v: INTEGER; x: INTEGER); BEGIN changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x)) @@ -205,5 +296,5 @@ END create; BEGIN List.init(changeInt, changePtr); - Lines.init(changeInt, changePtr, changeBool(*, typedPtr, untypedPtr*)) + Lines.init(changeInt, changePtr, changeBool, changeBool2(*, typedPtr, untypedPtr*)) END ChangeLog. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/Clipboard.ob07 b/programs/develop/cedit/SRC/Clipboard.ob07 index bd615c6ed6..11953327e8 100644 --- a/programs/develop/cedit/SRC/Clipboard.ob07 +++ b/programs/develop/cedit/SRC/Clipboard.ob07 @@ -118,11 +118,8 @@ END appends; PROCEDURE eol* (buffer: tBuffer); -VAR - s: ARRAY 2 OF WCHAR; BEGIN - s[0] := 0DX; s[1] := 0AX; - appends(buffer, s, 0, 1) + appends(buffer, 0DX + 0AX, 0, 1) END eol; diff --git a/programs/develop/cedit/SRC/Encodings.ob07 b/programs/develop/cedit/SRC/Encodings.ob07 index 0007b452c7..6146293207 100644 --- a/programs/develop/cedit/SRC/Encodings.ob07 +++ b/programs/develop/cedit/SRC/Encodings.ob07 @@ -29,6 +29,7 @@ TYPE VAR cpW1251*, cp866*: CP; + names*: ARRAY 4, 16 OF WCHAR; UNI*: ARRAY 65536, 2 OF INTEGER; @@ -121,6 +122,10 @@ END setUNI; BEGIN + names[CP866] := "CP866"; + names[W1251] := "Windows-1251"; + names[UTF8] := "UTF-8"; + names[UTF8BOM] := "UTF-8-BOM"; InitW1251(cpW1251); InitCP866(cp866); setUNI diff --git a/programs/develop/cedit/SRC/File.ob07 b/programs/develop/cedit/SRC/File.ob07 index dc99a0c680..e49cdd3d5d 100644 --- a/programs/develop/cedit/SRC/File.ob07 +++ b/programs/develop/cedit/SRC/File.ob07 @@ -265,6 +265,36 @@ BEGIN END Create; +PROCEDURE Copy* (From, To: ARRAY OF CHAR): BOOLEAN; +VAR + buf, size: INTEGER; + outFile: FS; + res: BOOLEAN; +BEGIN + res := FALSE; + size := FileSize(From); + IF size > 0 THEN + buf := Load(From, size) + ELSE + buf := -1; + size := 0 + END; + IF buf # 0 THEN + outFile := Create(To); + IF outFile # NIL THEN + IF size # 0 THEN + res := Write(outFile, buf, size) = size + END; + Close(outFile) + END; + IF size # 0 THEN + buf := KOSAPI.free(buf) + END + END + RETURN res +END Copy; + + PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN; VAR fd: rFD; diff --git a/programs/develop/cedit/SRC/Languages.ob07 b/programs/develop/cedit/SRC/Languages.ob07 index f747da3e23..ffafb951a6 100644 --- a/programs/develop/cedit/SRC/Languages.ob07 +++ b/programs/develop/cedit/SRC/Languages.ob07 @@ -27,7 +27,7 @@ CONST langNone* = 0; langC* = 1; langOberon* = 2; langPascal* = 3; langFasm* = 4; langLua* = 5; langIni* = 6; - csLang = {langNone, langC, langOberon, langLua, langIni}; + csLang = {langC, langOberon, langLua, langIni}; TYPE diff --git a/programs/develop/cedit/SRC/Lines.ob07 b/programs/develop/cedit/SRC/Lines.ob07 index 1a758855df..adba577979 100644 --- a/programs/develop/cedit/SRC/Lines.ob07 +++ b/programs/develop/cedit/SRC/Lines.ob07 @@ -46,7 +46,7 @@ TYPE VAR _movInt: PmovInt; - _movBool: PmovBool; + _movBool, _movBool2: PmovBool; _movPtr: PmovPtr; (* _typedPtr: PTypedPtr; _untypedPtr: PUntypedPtr;*) @@ -66,6 +66,12 @@ BEGIN END movBool; +PROCEDURE movBool2 (VAR v: BOOLEAN; x: BOOLEAN); +BEGIN + _movBool2(v, x) +END movBool2; + + PROCEDURE movPtr (VAR v: List.tItem; x: List.tItem); BEGIN _movPtr(v, x) @@ -174,8 +180,8 @@ END modify; PROCEDURE save* (line: tLine); BEGIN IF ~line.temp THEN - movBool(line.saved, TRUE); - movBool(line.modified, FALSE) + movBool2(line.saved, TRUE); + movBool2(line.modified, FALSE) END; line.modified := FALSE; line.saved := TRUE @@ -416,11 +422,12 @@ BEGIN END chCase; -PROCEDURE init* (movInt: PmovInt; movPtr: PmovPtr; movBool: PmovBool(*; typedPtr: PTypedPtr; untypedPtr: PUntypedPtr*)); +PROCEDURE init* (movInt: PmovInt; movPtr: PmovPtr; movBool, movBool2: PmovBool(*; typedPtr: PTypedPtr; untypedPtr: PUntypedPtr*)); BEGIN _movInt := movInt; _movPtr := movPtr; _movBool := movBool; + _movBool2 := movBool2; (* _typedPtr := typedPtr; _untypedPtr := untypedPtr;*) END init; diff --git a/programs/develop/cedit/SRC/Tabs.ob07 b/programs/develop/cedit/SRC/Tabs.ob07 index 6e7aadb525..72142e2793 100644 --- a/programs/develop/cedit/SRC/Tabs.ob07 +++ b/programs/develop/cedit/SRC/Tabs.ob07 @@ -71,7 +71,7 @@ BEGIN END; K.DrawLine(x, y2, x, y, K.borderColor); K.DrawText866bk(x + K.fontWidth, y + (height - K.fontHeight) DIV 2, K.textColor, color, s); - K.CreateButton(id + ORD({30}) + btnID, x, y - 1, width, height - 1, color, ""); + K.CreateButton(id + ORD({30}) + btnID, x + 1, y - 1, width - 1, height - 1, color, ""); END drawTab; diff --git a/programs/develop/cedit/SRC/Text.ob07 b/programs/develop/cedit/SRC/Text.ob07 index 52297e09f7..13acc2387a 100644 --- a/programs/develop/cedit/SRC/Text.ob07 +++ b/programs/develop/cedit/SRC/Text.ob07 @@ -27,7 +27,7 @@ IMPORT E := Encodings, CB := Clipboard, K := KolibriOS, - ChangeLog, + ChangeLog, File, Lang := Languages; @@ -37,8 +37,6 @@ CONST TAB = RW.TAB_SIZE; lenEOL = CB.lenEOL; - SHIFT* = 0; CTRL* = 1; - mark_width = 2; pad_left = mark_width + 3; pad_top = 0; @@ -1187,20 +1185,19 @@ END scroll; PROCEDURE save* (text: tText; name: RW.tFileName; enc, nl: INTEGER): BOOLEAN; +CONST + tempFile = "/tmp0/1/cedit~.tmp"; VAR line: tLine; file: RW.tOutput; res: BOOLEAN; Len: INTEGER; -(* item: List.tItem;*) BEGIN + ChangeLog.setGuard(text.edition); res := TRUE; - file := RW.create(name, enc, nl); + file := RW.create(tempFile, enc, nl); IF file # NIL THEN -(* IF ChangeLog.Log.last IS ChangeLog.tGuard THEN - item := List.pop(ChangeLog.Log); - DISPOSE(item) - END;*) + ChangeLog.delSaved; line := text.first(tLine); WHILE (line # NIL) & res DO Len := Lines.trimLength(line); @@ -1219,14 +1216,21 @@ BEGIN END; IF ~RW.close(file) THEN res := FALSE - END; - IF res THEN - text.modified := FALSE END ELSE res := FALSE END; - text.guard := TRUE + IF res THEN + res := File.Copy(tempFile, name); + IF res THEN + text.modified := FALSE; + ChangeLog.save(text.edition); + IF File.Delete(tempFile) THEN END + END + END; + IF ~res THEN + ChangeLog.delCurSaved + END RETURN res END save; @@ -1262,8 +1266,7 @@ BEGIN IF item # NIL THEN guard := item(tGuard); - text.edition := guard; - text.modified := TRUE + text.edition := guard END; item := ChangeLog.CL.Log.first; @@ -1272,7 +1275,8 @@ BEGIN item := item.next END; redoGuard(text, guard); - ChangeLog.setGuard(guard) + ChangeLog.setGuard(guard); + text.modified := ~guard.saved END undo; @@ -1291,7 +1295,8 @@ BEGIN guard := item(tGuard); redoGuard(text, guard) END; - ChangeLog.setGuard(guard) + ChangeLog.setGuard(guard); + text.modified := ~guard.saved END redo; @@ -1432,19 +1437,42 @@ PROCEDURE gotoLabel* (text: tText; frw: BOOLEAN); VAR line: tLine; n: INTEGER; + + PROCEDURE search (VAR line: tLine; VAR n: INTEGER; frw: BOOLEAN); + BEGIN + IF frw THEN + WHILE (line # NIL) & ~line.label DO + NextLine(line); + INC(n) + END + ELSE + WHILE (line # NIL) & ~line.label DO + PrevLine(line); + DEC(n) + END + END + END search; + BEGIN n := text.cursor.Y; line := text.curLine; IF frw THEN - REPEAT - line := line.next(tLine); - INC(n) - UNTIL (line = NIL) OR line.label + NextLine(line); + INC(n) ELSE - REPEAT - line := line.prev(tLine); - DEC(n) - UNTIL (line = NIL) OR line.label + PrevLine(line); + DEC(n) + END; + search(line, n, frw); + IF line = NIL THEN + IF frw THEN + n := 0; + line := text.first(tLine) + ELSE + n := text.count - 1; + line := text.last(tLine) + END; + search(line, n, frw) END; IF line # NIL THEN IF goto(text, n + 1) THEN END @@ -1615,9 +1643,9 @@ BEGIN END wordSel; -PROCEDURE key* (text: tText; code: INTEGER; shift: SET); +PROCEDURE key* (text: tText; code: INTEGER; shift, ctrl: BOOLEAN); BEGIN - IF SHIFT IN shift THEN + IF shift THEN setSelect(text) ELSE IF (33 <= code) & (code <= 40) THEN @@ -1627,27 +1655,27 @@ BEGIN CASE code OF |33: - IF CTRL IN shift THEN + IF ctrl THEN UpDown(text, text.scroll.Y - text.cursor.Y) ELSE text.scroll.Y := MAX(text.scroll.Y - textsize.Y, 0); UpDown(text, -textsize.Y) END |34: - IF CTRL IN shift THEN + IF ctrl THEN UpDown(text, MIN(text.scroll.Y + textsize.Y - 1, text.count - 1) - text.cursor.Y) ELSE text.scroll.Y := MIN(text.scroll.Y + textsize.Y, text.count - 1); UpDown(text, textsize.Y) END |35: - IF CTRL IN shift THEN + IF ctrl THEN SetPos(text, text.last(tLine).length, text.count - 1) ELSE SetPos(text, text.curLine.length, text.cursor.Y) END |36: - IF CTRL IN shift THEN + IF ctrl THEN SetPos(text, 0, 0) ELSE SetPos(text, 0, text.cursor.Y) @@ -1659,7 +1687,7 @@ BEGIN SetPos(text, text.cursor.X - 1, text.cursor.Y) END |38: - IF CTRL IN shift THEN + IF ctrl THEN upLine(text) ELSE UpDown(text, -1) @@ -1671,49 +1699,49 @@ BEGIN SetPos(text, text.cursor.X + 1, text.cursor.Y) END |40: - IF CTRL IN shift THEN + IF ctrl THEN downLine(text) ELSE UpDown(text, 1) END |46: - IF CTRL IN shift THEN + IF ctrl THEN delLine(text) ELSE delete(text); ShowCursor; drawCursor := TRUE END |ORD("C"): - IF CTRL IN shift THEN + IF ctrl THEN IF selected(text) THEN copy(text) END END |ORD("X"): - IF CTRL IN shift THEN + IF ctrl THEN IF selected(text) THEN copy(text); delSelect(text) END END |ORD("V"): - IF CTRL IN shift THEN + IF ctrl THEN IF CB.available() THEN paste(text) END END |ORD("A"): - IF CTRL IN shift THEN + IF ctrl THEN text.select2.X := 0; text.select2.Y := 0; text.select := text.select2; SetPos(text, text.last(tLine).length, text.count - 1) END |ORD("L"), ORD("U"): - IF CTRL IN shift THEN + IF ctrl THEN changeCase(text, code = ORD("U")) END |ORD("D"): - IF CTRL IN shift THEN + IF ctrl THEN dupLine(text) END ELSE @@ -1842,8 +1870,9 @@ BEGIN IF text.guard THEN NEW(guard); List.append(ChangeLog.CL.Log, guard); + guard.saved := ChangeLog.isFirstGuard(guard); text.edition := guard; - text.guard := FALSE; + text.guard := FALSE ELSE guard := text.edition END;