(* 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 CEdit; IMPORT OpenDlg, K := KolibriOS, U := Utils, Lines, Menu, List, G := Graph, T := Text, E := Encodings, CB := Clipboard, Languages, ChangeLog, Scroll, RW, Ini, box_lib, Icons; CONST header = "CEdit (03-jun-2021)"; ShellFilter = ""; EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI"; fontWidth = K.fontWidth; fontHeight = K.fontHeight; scrollWidth = 22; btnClose = 1; btnNew = 20; btnOpen = 21; btnSave = 22; btnSearch = 23; btnUndo = 24; btnRedo = 25; btnUpper = 26; btnLower = 27; btnBuild = 28; btnRun = 29; btnUp = 30; btnDown = 31; btnLeft = 32; btnRight = 33; btnYes = 40; btnNo = 41; btnFindEdit = 50; btnReplaceEdit = 51; btnGotoEdit = 52; btnFindNext = 60; btnReplace = 61; btnReplaceAll = 62; btnGoto = 63; btnCloseFind = 64; btnFile = 70; btnEdit = 71; btnEncoding = 72; btnView = 73; btnSyntax = 74; btnProgram = 75; btnTools = 76; MainMenuHeight = fontHeight + 7; btnHeight = 25; btnWidth = 75; btnTop = MainMenuHeight + 3; toolBtnSize = 24; toolbarDelim = 7; TOP = btnTop + toolBtnSize + 7; RIGHT = scrollWidth - 2; BOTTOM = scrollWidth + 25; minWinWidth = 635; minWinHeight = 542; SEARCH_PADDING = 10; searchLeft = 10; EditBox_Width = 180; EDITBOX_MAXCHARS = 500; menuFileX = searchLeft; menuEditX = menuFileX + 4*fontWidth + 2 + 7; menuEncodingX = menuEditX + 4*fontWidth + 2 + 7; menuViewX = menuEncodingX + 8*fontWidth + 2 + 7; menuSyntaxX = menuViewX + 4*fontWidth + 2 + 7; menuProgramX = menuSyntaxX + 6*fontWidth + 2 + 7; menuToolsX = menuProgramX + 7*fontWidth + 2 + 7; menuCut = 1; menuCopy = 2; menuPaste = 3; menuDelete = 4; menuSelectAll = 5; menuUndo = 6; menuRedo = 7; menuSearch = 8; menuGoto = 9; menuNew = 10; menuOpen = 11; menuSave = 12; menuSaveAs = 13; menuFolder = 14; menuExit = 15; menuNumbers = 20; menuColors = 1000; menuMaxColors = menuColors + Ini.MAX_SECTIONS - 1; menuNone = 30; menuC = 31; menuFasm = 32; menuIni = 33; menuLua = 34; menuOberon = 35; menuPascal = 36; menuBuild = 50; menuBuildScript = 51; menuRun = 52; menuRunScript = 53; menuDebug = 54; menuDebugScript = 55; menuUTF8BOM = 60; menuUTF8 = 61; menuCP866 = 62; menuWin1251 = 63; menuPipet = 70; menuSysFunc = 71; VAR canvas: G.tCanvas; font: G.tFont; text: T.tText; winWidth, winHeight: INTEGER; shift: SET; AppPath, runScript, buildScript, debugScript: RW.tFileName; OD: OpenDlg.Dialog; confirm, notFound, search, modified: BOOLEAN; leftButton, VScroll, HScroll: BOOLEAN; vScroll, hScroll: Scroll.tScroll; LEFT: INTEGER; FindEdit, ReplaceEdit, GotoEdit: box_lib.edit_box; CS, WH, BKW: box_lib.checkbox; new_searchText, searchText, replaceText, gotoText: T.tString; cs, whole: BOOLEAN; replaced: INTEGER; mainTID: INTEGER; context, menuFile, menuEdit, menuEncoding, menuView, menuSyntax, menuProgram, menuTools: Menu.tMenu; icons: INTEGER; grayIcons: INTEGER; IPC: ARRAY 64 OF INTEGER; PROCEDURE WritePos (y: INTEGER); VAR s1, s2: ARRAY 32 OF WCHAR; line, col: INTEGER; BEGIN T.getPos(text, col, line); U.int2str(line, s1); U.int2str(col, s2); U.append(s1, ": "); U.append(s1, s2); K.DrawText(LEFT, y, K.textColor, s1) END WritePos; PROCEDURE EditBox_Focus (edit: box_lib.edit_box): BOOLEAN; RETURN 1 IN BITS(edit.flags) END EditBox_Focus; PROCEDURE EditBox_SetFocus (edit: box_lib.edit_box; value: BOOLEAN); BEGIN IF value THEN edit.flags := ORD(BITS(edit.flags) + {1}) ELSE edit.flags := ORD(BITS(edit.flags) - {1}) END; IF search THEN box_lib.edit_box_draw(edit) END END EditBox_SetFocus; PROCEDURE Rect (left, top, right, bottom, color: INTEGER); BEGIN K.DrawLine(left, top, right, top, color); K.DrawLine(left, bottom, right, bottom, color); K.DrawLine(left, top, left, bottom, color); K.DrawLine(right, top, right, bottom, color); END Rect; PROCEDURE Message (s: ARRAY OF WCHAR); CONST minWidth = 30; height = 40; borderColor = 808080H; VAR top, left, right, bottom, x, y, width: INTEGER; BEGIN width := minWidth + LENGTH(s)*fontWidth; left := (canvas.width - width) DIV 2 + LEFT; top := (canvas.height - height) DIV 2 + TOP; bottom := top + height - 1; right := left + width - 1; x := minWidth DIV 2 + left; y := (height - fontHeight) DIV 2 + top; K.DrawRect(left, top, width, height, K.winColor); Rect(left, top, right, bottom, borderColor); K.DrawText(x, y, K.textColor, s); END Message; PROCEDURE NotFound; BEGIN IF notFound THEN Message("not found"); notFound := FALSE; EditBox_SetFocus(FindEdit, TRUE); EditBox_SetFocus(ReplaceEdit, FALSE); EditBox_SetFocus(GotoEdit, FALSE) END END NotFound; PROCEDURE Replaced; VAR s, s1: ARRAY 32 OF WCHAR; BEGIN IF replaced # 0 THEN s := "replaced: "; U.int2str(replaced, s1); U.append(s, s1); Message(s); replaced := 0; EditBox_SetFocus(FindEdit, TRUE); EditBox_SetFocus(ReplaceEdit, FALSE); EditBox_SetFocus(GotoEdit, FALSE) END END Replaced; PROCEDURE toolbarIcons; CONST iconPad = (toolBtnSize - 16) DIV 2; VAR x, color: INTEGER; BEGIN x := searchLeft + (toolBtnSize + 5)*2; IF text.modified THEN Icons.draw(icons, 5, x + iconPad, btnTop + iconPad) ELSE Icons.draw(grayIcons, 5, x + iconPad, btnTop + iconPad) END; IF text.edition # NIL THEN x := searchLeft + (toolBtnSize + 5)*4 + toolbarDelim*2; IF ChangeLog.isFirstGuard(text.edition) THEN Icons.draw(grayIcons, 37, x + iconPad, btnTop + iconPad) ELSE Icons.draw(icons, 37, x + iconPad, btnTop + iconPad) END; x := searchLeft + (toolBtnSize + 5)*5 + toolbarDelim*2; IF ChangeLog.isLastGuard(text.edition) THEN Icons.draw(grayIcons, 36, x + iconPad, btnTop + iconPad) ELSE Icons.draw(icons, 36, x + iconPad, btnTop + iconPad) END END; IF T.selected(text) THEN color := K.caseColor ELSE color := K.disCaseColor END; x := searchLeft + (toolBtnSize + 5)*6 + toolbarDelim*3; K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor); K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "AB"); INC(x, toolBtnSize + 5); K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor); K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "ab"); x := searchLeft + (toolBtnSize + 5)*8 + toolbarDelim*4; IF buildScript # "" THEN Icons.draw(icons, 54, x + iconPad, btnTop + iconPad) ELSE Icons.draw(grayIcons, 54, x + iconPad, btnTop + iconPad) END; INC(x, toolBtnSize + 5); IF runScript # "" THEN Icons.draw(icons, 53, x + iconPad, btnTop + iconPad) ELSE Icons.draw(grayIcons, 53, x + iconPad, btnTop + iconPad) END END toolbarIcons; PROCEDURE WriteModified (x, y: INTEGER); BEGIN modified := text.modified; K.DrawRect(x, TOP + canvas.height + scrollWidth - 1, 9*fontWidth, BOTTOM - scrollWidth + 1, K.winColor); IF modified THEN K.DrawText866(x, y, K.textColor, "modified") END END WriteModified; PROCEDURE repaint; VAR width, height, scrollX, scrollY, y: INTEGER; BEGIN IF text # NIL THEN IF confirm THEN K.DeleteButton(btnYes); K.DeleteButton(btnNo); confirm := FALSE END; T.draw(text); K.ClientSize(width, height); 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); IF modified # text.modified THEN WriteModified(width - 9*fontWidth, y) END; T.getScroll(text, scrollX, scrollY); vScroll.value := scrollY; vScroll.maxVal := text.count - 1; hScroll.value := scrollX; hScroll.maxVal := Lines.maxLength; Scroll.draw(vScroll, LEFT + canvas.width - 1, TOP + scrollWidth - 1); Scroll.draw(hScroll, LEFT + scrollWidth, TOP + canvas.height - 1); G.DrawCanvas(canvas, LEFT, TOP); NotFound; Replaced; toolbarIcons END END repaint; PROCEDURE resize; VAR cliWidth, cliHeight: INTEGER; BEGIN K.WinSize(winWidth, winHeight); IF winWidth < minWinWidth THEN winWidth := minWinWidth END; IF winHeight < minWinHeight THEN winHeight := minWinHeight END; K.SetWinSize(winWidth, winHeight); K.WinSize(winWidth, winHeight); K.ClientSize(cliWidth, cliHeight); G.destroy(canvas); canvas := G.CreateCanvas(cliWidth - (LEFT + RIGHT + 1), cliHeight - (TOP + BOTTOM)); G.SetFont(canvas, font); T.setCanvas(canvas); T.resize(canvas.width, canvas.height); Scroll.resize(vScroll, vScroll.xSize, canvas.height - scrollWidth*2 + 1); Scroll.resize(hScroll, canvas.width - scrollWidth*2, hScroll.ySize); END resize; PROCEDURE SearchPanel (left, top: INTEGER); VAR y, right, bottom, color: INTEGER; BEGIN right := left + EditBox_Width + SEARCH_PADDING*2; bottom := top + 395 + btnHeight + SEARCH_PADDING; color := K.borderColor; Rect(left, top, right, bottom, color); K.CreateButton(btnCloseFind, right - 20, top, 20, 20, 0EF999FH, ""); K.DrawLine(right - 14, top + 5, right - 5, top + 14, 0FFFFFFH); K.DrawLine(right - 15, top + 5, right - 5, top + 15, 0FFFFFFH); K.DrawLine(right - 15, top + 6, right - 6, top + 15, 0FFFFFFH); K.DrawLine(right - 15, top + 14, right - 6, top + 5, 0FFFFFFH); K.DrawLine(right - 15, top + 15, right - 5, top + 5, 0FFFFFFH); K.DrawLine(right - 14, top + 15, right - 5, top + 6, 0FFFFFFH); INC(top, 15); INC(left, SEARCH_PADDING); K.DrawText866(left, top, K.textColor, "find"); K.DrawText866(left, top + 55, K.textColor, "replace with"); K.CreateButton(btnFindEdit + ORD({30}), left, top + 20, EditBox_Width, fontHeight + 5, 0, ""); K.CreateButton(btnReplaceEdit + ORD({30}), left, top + 75, EditBox_Width, fontHeight + 5, 0, ""); K.DrawText866(left, top + 330, K.textColor, "go to line"); K.CreateButton(btnGotoEdit + ORD({30}), left, top + 350, EditBox_Width, fontHeight + 5, 0, ""); BKW.top_s := BKW.top_s MOD 65536 + (top + 110) * 65536; CS.top_s := CS.top_s MOD 65536 + (top + 140) * 65536; WH.top_s := WH.top_s MOD 65536 + (top + 170) * 65536; BKW.left_s := BKW.left_s MOD 65536 + left * 65536; CS.left_s := CS.left_s MOD 65536 + left * 65536; WH.left_s := WH.left_s MOD 65536 + left * 65536; FindEdit.top := top + 20; ReplaceEdit.top := top + 75; GotoEdit.top := top + 350; FindEdit.left := left; ReplaceEdit.left := left; GotoEdit.left := left; box_lib.edit_box_draw(FindEdit); box_lib.edit_box_draw(ReplaceEdit); box_lib.edit_box_draw(GotoEdit); box_lib.check_box_draw2(BKW); K.DrawText866(left + 20, top + 110, K.textColor, "backward"); box_lib.check_box_draw2(CS); K.DrawText866(left + 20, top + 140, K.textColor, "match case"); box_lib.check_box_draw2(WH); K.DrawText866(left + 20, top + 170, K.textColor, "whole word"); y := top + 200; K.CreateButton(btnFindNext, left, y, btnWidth, btnHeight, K.btnColor, "next"); INC(y, btnHeight + 10); K.CreateButton(btnReplace, left, y, btnWidth, btnHeight, K.btnColor, "replace"); INC(y, btnHeight + 10); K.CreateButton(btnReplaceAll, left, y, btnWidth + 5*fontWidth - 2, btnHeight, K.btnColor, "replace all"); K.CreateButton(btnGoto, left, top + 380, btnWidth, btnHeight, K.btnColor, "go"); END SearchPanel; PROCEDURE draw_window; CONST iconPad = (toolBtnSize - 16) DIV 2; VAR width, height, x, y: INTEGER; PROCEDURE drawToolbarBtn (id, x: INTEGER); BEGIN K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor); K.DrawLine(x, btnTop + toolBtnSize, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor); K.DrawLine(x + toolBtnSize, btnTop, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor); K.CreateButton(id + ORD({30}), x, btnTop, toolBtnSize, toolBtnSize, K.btnColor, ""); END drawToolbarBtn; PROCEDURE drawMainMenu (menu: Menu.tMenu; x: INTEGER; btn: INTEGER; caption: ARRAY OF WCHAR); VAR menuColor, n: INTEGER; BEGIN IF menu.tid # 0 THEN menuColor := K.selMenuColor ELSE menuColor := K.winColor END; n := LENGTH(caption); K.DrawRect(x, 0, n*fontWidth + 2, MainMenuHeight, menuColor); K.CreateButton(btn + ORD({30}), x, 0, n*fontWidth + 2, MainMenuHeight, K.btnColor, ""); K.DrawText(x + 1, (MainMenuHeight - fontHeight) DIV 2 + 1, K.textColor, caption) END drawMainMenu; BEGIN K.BeginDraw; K.CreateWindow(50 + K.GetTickCount() MOD 128, 50 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header); IF (text # NIL) & ~K.RolledUp() THEN confirm := FALSE; K.ClientSize(width, height); K.DrawRect(0, 0, width, TOP, K.winColor); K.DrawRect(0, 0, LEFT, height, K.winColor); K.DrawRect(LEFT + canvas.width - 1, TOP + canvas.height - 1, scrollWidth, scrollWidth, K.winColor); drawMainMenu(menuFile, menuFileX, btnFile, "file"); drawMainMenu(menuEdit, menuEditX, btnEdit, "edit"); drawMainMenu(menuEncoding, menuEncodingX, btnEncoding, "encoding"); drawMainMenu(menuView, menuViewX, btnView, "view"); drawMainMenu(menuSyntax, menuSyntaxX, btnSyntax, "syntax"); drawMainMenu(menuProgram, menuProgramX, btnProgram, "program"); drawMainMenu(menuTools, menuToolsX, btnTools, "tools"); x := searchLeft; drawToolbarBtn(btnNew, x); Icons.draw(icons, 2, x + iconPad, btnTop + iconPad); INC(x, toolBtnSize + 5); drawToolbarBtn(btnOpen, x); Icons.draw(icons, 0, x + iconPad, btnTop + iconPad); INC(x, toolBtnSize + 5); drawToolbarBtn(btnSave, x); INC(x, toolBtnSize + 5 + toolbarDelim); drawToolbarBtn(btnSearch, x); Icons.draw(icons, 49, x + iconPad, btnTop + iconPad); INC(x, toolBtnSize + 5 + toolbarDelim); drawToolbarBtn(btnUndo, x); INC(x, toolBtnSize + 5); drawToolbarBtn(btnRedo, x); INC(x, toolBtnSize + 5 + toolbarDelim); drawToolbarBtn(btnUpper, x); INC(x, toolBtnSize + 5); drawToolbarBtn(btnLower, x); INC(x, toolBtnSize + 5 + toolbarDelim); drawToolbarBtn(btnBuild, x); Icons.draw(icons, 54, x + iconPad, btnTop + iconPad); INC(x, toolBtnSize + 5); drawToolbarBtn(btnRun, x); Icons.draw(icons, 53, x + iconPad, btnTop + iconPad); INC(x, toolBtnSize + 5); K.CreateButton(btnUp, LEFT + canvas.width - 1, TOP, scrollWidth - 1, scrollWidth, K.btnColor, 0X); K.DrawText69(LEFT + canvas.width - 1 + (scrollWidth - 6) DIV 2, TOP + (scrollWidth - 9) DIV 2, K.btnTextColor, 18X); K.CreateButton(btnDown, LEFT + canvas.width - 1, TOP + canvas.height - scrollWidth - 1, scrollWidth - 1, scrollWidth, K.btnColor, 0X); K.DrawText69(LEFT + canvas.width - 1 + (scrollWidth - 6) DIV 2, TOP + canvas.height - scrollWidth + (scrollWidth - 9) DIV 2, K.btnTextColor, 19X); K.CreateButton(btnLeft, LEFT, TOP + canvas.height - 1, scrollWidth, scrollWidth - 1, K.btnColor, 0X); K.DrawText69(LEFT + (scrollWidth - 6) DIV 2, TOP + canvas.height - 1 + (scrollWidth - 9) DIV 2 + 1, K.btnTextColor, 1BX); K.CreateButton(btnRight, LEFT + canvas.width - scrollWidth - 1, TOP + canvas.height - 1, scrollWidth, scrollWidth - 1, K.btnColor, 0X); K.DrawText69(LEFT + canvas.width - scrollWidth - 1 + (scrollWidth - 6) DIV 2, TOP + canvas.height - 1 + (scrollWidth - 9) DIV 2 + 1, K.btnTextColor, 1AX); 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 - 6*fontWidth, y, K.textColor, "UTF-8") |E.UTF8BOM: K.DrawText866(width - 10*fontWidth, y, K.textColor, "UTF-8-BOM") |E.CP866: K.DrawText866(width - 6*fontWidth, y, K.textColor, "CP866") |E.W1251: K.DrawText866(width - 13*fontWidth, y, K.textColor, "Windows-1251") END; 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 - 25*fontWidth, BOTTOM - scrollWidth + 1, K.winColor); K.DrawText866(LEFT + 16*fontWidth, y, K.textColor, text.fileName); WriteModified(width - 9*fontWidth, y); repaint END; K.EndDraw END draw_window; PROCEDURE mouse (VAR x, y: INTEGER); VAR mouseX, mouseY, cliX, cliY, winX, winY: INTEGER; BEGIN K.MousePos(mouseX, mouseY); K.WinPos(winX, winY); K.ClientPos(cliX, cliY); x := mouseX - winX - cliX - LEFT; y := mouseY - winY - cliY - TOP; END mouse; PROCEDURE getKBState; VAR kbState: SET; BEGIN kbState := K.GetControlKeys(); IF {0, 1} * kbState # {} THEN INCL(shift, T.SHIFT) ELSE EXCL(shift, T.SHIFT) END; IF {2, 3} * kbState # {} THEN INCL(shift, T.CTRL) ELSE EXCL(shift, T.CTRL) END END getKBState; PROCEDURE OpenFile (VAR FileName: RW.tFileName; filter: ARRAY OF CHAR); BEGIN OpenDlg.SetFilter(OD, filter); OpenDlg.Show(OD, 500, 400); WHILE OD.status = 2 DO K.Pause(30) END; IF OD.status = 1 THEN COPY(OD.FilePath, FileName) ELSE FileName := "" END END OpenFile; PROCEDURE error (s: RW.tFileName); BEGIN K.Run("/rd/1/@notify", s) END error; PROCEDURE saveAs; VAR fileName: RW.tFileName; ext: ARRAY 8 OF CHAR; BEGIN OD._type := OpenDlg.tsave; U.getFileName(text.fileName, OD.FileName, U.SLASH); IF OD.FileName = "" THEN OD.FileName := "NewFile."; CASE text.lang OF |Languages.langNone: ext := "txt" |Languages.langC: ext := "c" |Languages.langFasm: ext := "asm" |Languages.langIni: ext := "ini" |Languages.langLua: ext := "lua" |Languages.langOberon: ext := "ob07" |Languages.langPascal: ext := "pas" END; U.append8(OD.FileName, ext) END; OpenFile(fileName, EditFilter); IF fileName # "" THEN IF T.save(text, fileName, text.enc, RW.EOL_CRLF) THEN T.setName(text, fileName) ELSE error("'cedit: error saving file' -E") END END END saveAs; PROCEDURE save; 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") END ELSE saveAs END END END save; PROCEDURE SelfRun (file: ARRAY OF CHAR); BEGIN K.Run(AppPath, file) END SelfRun; PROCEDURE open; VAR fileName: RW.tFileName; BEGIN OD._type := OpenDlg.topen; OpenFile(fileName, EditFilter); IF fileName # "" THEN SelfRun(fileName) END END open; PROCEDURE Confirm; CONST width = btnWidth*2 + 30; height = btnHeight*2 + 20; lineColor = 808080H; VAR left, top, right, bottom: INTEGER; BEGIN draw_window; confirm := TRUE; left := (canvas.width - width) DIV 2 + LEFT; top := (canvas.height - height) DIV 2 + TOP; right := left + width - 1; bottom := top + height - 1; K.DrawRect(left, top, width, height, K.winColor); Rect(left, top, right, bottom, lineColor); K.DrawText866(left + (width - 10*fontWidth) DIV 2, top + 10, K.textColor, "save file?"); K.CreateButton(btnYes, left + 10, top + 35, btnWidth, btnHeight, K.btnColor, "yes"); K.CreateButton(btnNo, left + 20 + btnWidth, top + 35, btnWidth, btnHeight, K.btnColor, "no"); END Confirm; PROCEDURE createEdit (left, top: INTEGER): box_lib.edit_box; VAR edit, EditBox0: box_lib.edit_box; BEGIN NEW(EditBox0); EditBox0.text := K.malloc(EDITBOX_MAXCHARS + 2); ASSERT(EditBox0.text # 0); edit := box_lib.kolibri_new_edit_box(left, top, EditBox_Width, EDITBOX_MAXCHARS, EditBox0); edit.flags := 4002H; edit.text_color := 30000000H; EditBox_SetFocus(edit, FALSE) RETURN edit END createEdit; PROCEDURE createSearchForm; BEGIN FindEdit := createEdit(searchLeft, TOP + 20); ReplaceEdit := createEdit(searchLeft, TOP + 20 + 55); GotoEdit := createEdit(searchLeft, TOP + 20 + 330); GotoEdit.flags := ORD(BITS(GotoEdit.flags) + BITS(8000H)); BKW := box_lib.kolibri_new_check_box(searchLeft, TOP + 90 + 20, 16, 16, "", 8*fontWidth + 4); CS := box_lib.kolibri_new_check_box(searchLeft, TOP + 120 + 20, 16, 16, "", 10*fontWidth + 4); WH := box_lib.kolibri_new_check_box(searchLeft, TOP + 150 + 20, 16, 16, "", 10*fontWidth + 4); END createSearchForm; PROCEDURE EditBox_GetValue (edit: box_lib.edit_box; VAR s: ARRAY OF WCHAR); VAR str: ARRAY EDITBOX_MAXCHARS + 1 OF CHAR; i: INTEGER; BEGIN box_lib.edit_box_get_value(edit, str); i := 0; WHILE str[i] # 0X DO s[i] := WCHR(E.cp866[ORD(str[i])]); INC(i) END; s[i] := 0X END EditBox_GetValue; PROCEDURE Search; BEGIN search := ~search; IF search THEN LEFT := searchLeft + EditBox_Width + SEARCH_PADDING*3; IF T.search(text, searchText, cs, whole) THEN END ELSE LEFT := searchLeft; IF T.search(text, "", FALSE, FALSE) THEN END END; EditBox_SetFocus(FindEdit, search); EditBox_SetFocus(ReplaceEdit, FALSE); EditBox_SetFocus(GotoEdit, FALSE); resize; draw_window END Search; PROCEDURE click (x, y: INTEGER): INTEGER; VAR scrollX, scrollY: INTEGER; BEGIN IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN leftButton := TRUE; EditBox_SetFocus(FindEdit, FALSE); EditBox_SetFocus(ReplaceEdit, FALSE); EditBox_SetFocus(GotoEdit, FALSE); IF ~(T.SHIFT IN shift) THEN T.resetSelect(text) END; T.mouse(text, x, y); repaint ELSIF (canvas.width < x) & (x < canvas.width + scrollWidth) & (scrollWidth < y) & (y < canvas.height - scrollWidth) THEN VScroll := TRUE; DEC(x, canvas.width); DEC(y, scrollWidth); Scroll.mouse(vScroll, x, y); T.getScroll(text, scrollX, scrollY); T.scroll(text, 0, vScroll.value - scrollY); repaint ELSIF (scrollWidth < x) & (x < canvas.width - scrollWidth) & (canvas.height < y) & (y < canvas.height + scrollWidth) THEN HScroll := TRUE; DEC(x, scrollWidth); DEC(y, canvas.height); Scroll.mouse(hScroll, x, y); T.getScroll(text, scrollX, scrollY); T.scroll(text, hScroll.value - scrollX, 0); repaint END RETURN K.GetTickCount() END click; PROCEDURE LeftButtonUp; BEGIN leftButton := FALSE; VScroll := FALSE; HScroll := FALSE; Scroll.MouseUp(vScroll); Scroll.MouseUp(hScroll); END LeftButtonUp; PROCEDURE close; BEGIN IF text.modified THEN Confirm ELSE K.Exit END END close; PROCEDURE MenuItemClick (menu: Menu.tMenu; id: INTEGER); BEGIN K.SendIPC(mainTID, id) END MenuItemClick; PROCEDURE goto; VAR gotoVal: INTEGER; BEGIN EditBox_GetValue(GotoEdit, gotoText); IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN END END goto; PROCEDURE Script (script: ARRAY OF CHAR); BEGIN IF script # "" THEN K.Run("/rd/1/@open", script) END END Script; PROCEDURE receiveIPC; BEGIN IF IPC[0] # Menu.lastTID THEN IPC[2] := 0 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}) |menuNew: SelfRun("") |menuOpen: open |menuSave: save; repaint |menuSaveAs: saveAs; repaint |menuFolder: K.Run("/rd/1/File Managers/Eolite", text.fileName) |menuExit: close |menuUndo: T.undo(text); repaint |menuRedo: T.redo(text); repaint |menuSearch: IF ~search THEN Search END; EditBox_SetFocus(FindEdit, TRUE); EditBox_SetFocus(ReplaceEdit, FALSE); EditBox_SetFocus(GotoEdit, FALSE) |menuGoto: IF ~search THEN Search END; EditBox_SetFocus(GotoEdit, TRUE); EditBox_SetFocus(FindEdit, FALSE); EditBox_SetFocus(ReplaceEdit, FALSE) |menuNumbers: T.toggleNumbers(text) |menuNone: T.setLang(text, Languages.langNone) |menuC: T.setLang(text, Languages.langC) |menuFasm: T.setLang(text, Languages.langFasm) |menuIni: T.setLang(text, Languages.langIni) |menuLua: T.setLang(text, Languages.langLua) |menuOberon: T.setLang(text, Languages.langOberon) |menuPascal: T.setLang(text, Languages.langPascal) |menuBuild: Script(buildScript) |menuBuildScript: OpenFile(buildScript, ShellFilter) |menuRun: Script(runScript) |menuRunScript: OpenFile(runScript, ShellFilter) |menuDebug: Script(debugScript) |menuDebugScript: OpenFile(debugScript, ShellFilter) |menuUTF8BOM: text.enc := E.UTF8BOM |menuUTF8: text.enc := E.UTF8 |menuCP866: text.enc := E.CP866 |menuWin1251: text.enc := E.W1251 |menuPipet: K.Run("/rd/1/develop/pipet", "") |menuSysFunc: K.Run("/rd/1/docpack", "f") |menuColors..menuMaxColors: Ini.selectSection(IPC[2] - menuColors) END; IPC[0] := 0; IPC[1] := 0 END receiveIPC; PROCEDURE MenuKeyDown (menu: Menu.tMenu; key: INTEGER): BOOLEAN; VAR menuItem: INTEGER; BEGIN menuItem := -1; getKBState; IF (T.CTRL IN shift) THEN CASE key DIV 65536 OF |21: menuItem := menuRedo |30: menuItem := menuSelectAll |33: menuItem := menuSearch |34: menuItem := menuGoto |44: menuItem := menuUndo |45: menuItem := menuCut |46: menuItem := menuCopy |47: menuItem := menuPaste |24: menuItem := menuOpen |31: menuItem := menuSave |49: menuItem := menuNew |67: menuItem := menuBuild ELSE END ELSE IF key DIV 65536 = 83 THEN menuItem := menuDelete ELSIF key DIV 65536 = 67 THEN menuItem := menuRun END END; IF menuItem # -1 THEN IF Menu.isEnabled(menu, menuItem) THEN MenuItemClick(menu, menuItem) ELSE menuItem := -1 END END RETURN menuItem # -1 END MenuKeyDown; PROCEDURE CreateContextMenu (): Menu.tMenu; VAR menu: List.tList; BEGIN menu := List.create(NIL); Menu.AddMenuItem(menu, menuUndo, "undo ctrl-Z"); Menu.AddMenuItem(menu, menuRedo, "redo ctrl-Y"); Menu.delimiter(menu); Menu.AddMenuItem(menu, menuCut, "cut ctrl-X"); Menu.AddMenuItem(menu, menuCopy, "copy ctrl-C"); Menu.AddMenuItem(menu, menuPaste, "paste ctrl-V"); Menu.AddMenuItem(menu, menuDelete, "delete"); Menu.delimiter(menu); Menu.AddMenuItem(menu, menuSelectAll, "select all ctrl-A"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateContextMenu; PROCEDURE CreateMenuFile (): Menu.tMenu; 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.delimiter(menu); Menu.AddMenuItem(menu, menuExit, "exit"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuFile; PROCEDURE CreateMenuEdit (): Menu.tMenu; VAR menu: List.tList; BEGIN menu := List.create(NIL); Menu.AddMenuItem(menu, menuUndo, "undo ctrl-Z"); Menu.AddMenuItem(menu, menuRedo, "redo ctrl-Y"); Menu.delimiter(menu); Menu.AddMenuItem(menu, menuSearch, "search ctrl-F"); Menu.AddMenuItem(menu, menuGoto, "go to line ctrl-G"); Menu.delimiter(menu); Menu.AddMenuItem(menu, menuCut, "cut ctrl-X"); Menu.AddMenuItem(menu, menuCopy, "copy ctrl-C"); Menu.AddMenuItem(menu, menuPaste, "paste ctrl-V"); Menu.AddMenuItem(menu, menuDelete, "delete"); Menu.delimiter(menu); Menu.AddMenuItem(menu, menuSelectAll, "select all ctrl-A"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuEdit; PROCEDURE CreateMenuEncoding (): Menu.tMenu; 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"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuEncoding; PROCEDURE CreateMenuView (): Menu.tMenu; VAR menu: List.tList; colors: Ini.tSection; idx: INTEGER; BEGIN menu := List.create(NIL); Menu.AddMenuItem(menu, menuNumbers, "line numbers"); Menu.delimiter(menu); colors := Ini.sections.first(Ini.tSection); idx := menuColors; WHILE colors # NIL DO Menu.AddMenuItem(menu, idx, colors.name); INC(idx); colors := colors.next(Ini.tSection) END; RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuView; PROCEDURE CreateMenuSyntax (): Menu.tMenu; VAR menu: List.tList; BEGIN menu := List.create(NIL); Menu.AddMenuItem(menu, menuC, "C"); Menu.AddMenuItem(menu, menuFasm, "Fasm"); Menu.AddMenuItem(menu, menuIni, "Ini"); Menu.AddMenuItem(menu, menuLua, "Lua"); Menu.AddMenuItem(menu, menuOberon, "Oberon"); Menu.AddMenuItem(menu, menuPascal, "Pascal"); Menu.delimiter(menu); Menu.AddMenuItem(menu, menuNone, "none"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuSyntax; PROCEDURE CreateMenuProgram (): Menu.tMenu; VAR menu: List.tList; BEGIN menu := List.create(NIL); Menu.AddMenuItem(menu, menuBuild, "build ctrl+F9"); Menu.AddMenuItem(menu, menuBuildScript, "script"); Menu.delimiter(menu); Menu.AddMenuItem(menu, menuRun, "run F9"); Menu.AddMenuItem(menu, menuRunScript, "script"); Menu.delimiter(menu); Menu.AddMenuItem(menu, menuDebug, "debug"); Menu.AddMenuItem(menu, menuDebugScript, "script"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuProgram; PROCEDURE CreateMenuTools (): Menu.tMenu; VAR menu: List.tList; BEGIN menu := List.create(NIL); Menu.AddMenuItem(menu, menuPipet, "pipet"); Menu.AddMenuItem(menu, menuSysFunc, "system functions"); RETURN Menu.create(menu, MenuItemClick, MenuKeyDown) END CreateMenuTools; PROCEDURE CanvasToScreen (VAR x, y: INTEGER); VAR cliX, cliY, winX, winY: INTEGER; BEGIN K.WinPos(winX, winY); K.ClientPos(cliX, cliY); x := x + winX + cliX + LEFT; y := y + winY + cliY + TOP; END CanvasToScreen; PROCEDURE ShowMenu (menu: Menu.tMenu); VAR winX, winY, cliX, cliY, x, y, i: INTEGER; selected: BOOLEAN; BEGIN IF menu # context THEN K.WinPos(winX, winY); K.ClientPos(cliX, cliY); x := winX + cliX; y := MainMenuHeight + winY + cliY ELSE mouse(x, y); IF ~((0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height)) THEN menu := NIL END END; IF menu = menuFile THEN Menu.setEnabled(menu, menuSave, text.modified); Menu.setEnabled(menu, menuFolder, text.fileName # ""); INC(x, menuFileX) ELSIF (menu = menuEdit) OR (menu = context) THEN Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition)); Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition)); selected := T.selected(text); Menu.setEnabled(menu, menuCut, selected); Menu.setEnabled(menu, menuCopy, selected); Menu.setEnabled(menu, menuDelete, selected); Menu.setEnabled(menu, menuPaste, CB.available()); IF menu = menuEdit THEN INC(x, menuEditX) ELSE IF y + menu.height >= canvas.height THEN DEC(y, menu.height) END; IF x + menu.width >= canvas.width THEN DEC(x, menu.width) END; CanvasToScreen(x, y) END ELSIF menu = menuEncoding THEN Menu.setCheck(menu, menuUTF8BOM, ORD(text.enc = E.UTF8BOM)*2); Menu.setCheck(menu, menuUTF8, ORD(text.enc = E.UTF8)*2); Menu.setCheck(menu, menuCP866, ORD(text.enc = E.CP866)*2); Menu.setCheck(menu, menuWin1251, ORD(text.enc = E.W1251)*2); INC(x, menuEncodingX) ELSIF menu = menuView THEN Menu.setCheck(menu, menuNumbers, ORD(text.numbers)); FOR i := 0 TO Ini.sections.count - 1 DO Menu.setCheck(menu, menuColors + i, ORD(Ini.curSectionNum = i)*2) END; INC(x, menuViewX) ELSIF menu = menuSyntax THEN Menu.setCheck(menu, menuNone, ORD(text.lang = Languages.langNone)*2); Menu.setCheck(menu, menuC, ORD(text.lang = Languages.langC)*2); Menu.setCheck(menu, menuFasm, ORD(text.lang = Languages.langFasm)*2); Menu.setCheck(menu, menuIni, ORD(text.lang = Languages.langIni)*2); Menu.setCheck(menu, menuLua, ORD(text.lang = Languages.langLua)*2); Menu.setCheck(menu, menuOberon, ORD(text.lang = Languages.langOberon)*2); Menu.setCheck(menu, menuPascal, ORD(text.lang = Languages.langPascal)*2); INC(x, menuSyntaxX) ELSIF menu = menuProgram THEN Menu.setEnabled(menu, menuBuild, buildScript # ""); Menu.setEnabled(menu, menuDebug, debugScript # ""); Menu.setEnabled(menu, menuRun, runScript # ""); INC(x, menuProgramX) ELSIF menu = menuTools THEN INC(x, menuToolsX) END; IF menu # NIL THEN IF Menu.opened(menu) THEN Menu.close(menu) END; Menu.open(menu, x, y) END END ShowMenu; PROCEDURE main; VAR width, height, x, y, scrollX, scrollY: INTEGER; key: INTEGER; msState: SET; scroll: INTEGER; err: INTEGER; fileName, filePath: RW.tFileName; cliWidth, cliHeight: INTEGER; resized: BOOLEAN; firstClickX, firstClickY, time: INTEGER; BEGIN K.GetSystemColors; Icons.get(icons, grayIcons); modified := FALSE; 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 := {}; winWidth := minWinWidth; winHeight := minWinHeight; cliWidth := winWidth; cliHeight := winHeight; LEFT := 10; canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 10), winHeight - (TOP + BOTTOM + 4) - K.SkinHeight()); font := G.CreateFont(1, "", {}); G.SetFont(canvas, font); T.init(NIL); T.setCanvas(canvas); U.ptr2str(K.GetCommandLine(), fileName); context := CreateContextMenu(); menuFile := CreateMenuFile(); menuEdit := CreateMenuEdit(); menuEncoding := CreateMenuEncoding(); menuView := CreateMenuView(); menuSyntax := CreateMenuSyntax(); menuProgram := CreateMenuProgram(); menuTools := CreateMenuTools(); IF fileName = "" THEN text := T.New(); filePath := "/rd/1" ELSE text := T.open(fileName, err); IF text = NIL THEN error("'cedit: error opening file' -E"); K.Exit ELSE U.getPath(fileName, filePath) END END; OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, ""); vScroll := Scroll.create(scrollWidth, canvas.height - scrollWidth*2 + 1); hScroll := Scroll.create(canvas.width - scrollWidth*2, scrollWidth); T.resize(canvas.width, canvas.height); T.SetPos(text, 0, 0); confirm := FALSE; notFound := FALSE; search := FALSE; createSearchForm; new_searchText := ""; searchText := ""; cs := FALSE; whole := FALSE; replaced := 0; draw_window; repaint; buildScript := ""; runScript := ""; debugScript := ""; WHILE TRUE DO CASE K.WaitForEvent() OF |1: 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 |2: key := K.GetKey(); getKBState; IF key DIV 65536 = 61 THEN (* F3 *) key := -1; IF search & (searchText # "") THEN notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW)) 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 = 55) & (key DIV 256 MOD 256 = 52) THEN key := -1 (* PrtScn *) 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 |21: T.redo(text); key := -1 |22: key := ORD("U") |24: key := -1; open |30: key := ORD("A") |31: key := -1; save |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; SelfRun("") ELSE key := -1 END ELSE T.input(text, E.cp866[key DIV 256 MOD 256]); key := -1 END END; IF key # -1 THEN T.key(text, key, shift) END END; repaint |3: CASE K.ButtonCode() OF |0: |btnFile: ShowMenu(menuFile) |btnEdit: ShowMenu(menuEdit) |btnEncoding: ShowMenu(menuEncoding) |btnView: ShowMenu(menuView) |btnSyntax: ShowMenu(menuSyntax) |btnProgram: ShowMenu(menuProgram) |btnTools: ShowMenu(menuTools) |btnNo: K.Exit |btnYes: save; IF ~text.modified THEN K.Exit END; repaint |btnClose: close |btnNew: SelfRun("") |btnOpen: open |btnSave: save; 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 |7: receiveIPC ELSE END END END main; BEGIN main END CEdit.