From d916fda5dc4cbd666f20cb79d9e08fa2805f32f0 Mon Sep 17 00:00:00 2001 From: jaskaran-singh-77 Date: Tue, 10 Mar 2026 09:58:32 +0000 Subject: [PATCH] CEdit: Use version constant instead of hardcoded date (#329) - Replace hardcoded date "CEdit (11-jan-2026)" with version "CEdit 1.0" - Add separate VERSION and APPNAME constants for better maintainability - Fixes issue #329 --- programs/develop/cedit/SRC/CEdit.ob07 | 4675 +++++++++++++------------ 1 file changed, 2339 insertions(+), 2336 deletions(-) diff --git a/programs/develop/cedit/SRC/CEdit.ob07 b/programs/develop/cedit/SRC/CEdit.ob07 index fc775cc28..a4c5944bf 100644 --- a/programs/develop/cedit/SRC/CEdit.ob07 +++ b/programs/develop/cedit/SRC/CEdit.ob07 @@ -1,2336 +1,2339 @@ -(* - Copyright 2021-2023 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, Args, - U := Utils, Lines, Menu, List, - G := Graph, T := Text, E := Encodings, - CB := Clipboard, Languages, - ChangeLog, Scroll, CheckBox, Icons, - RW, Ini, EB := EditBox, Tabs, Toolbar, SB := StatusBar; - -CONST - HEADER = "CEdit (11-jan-2026)"; - - ShellFilter = ""; - EditFilter = "sh|inc|txt|asm|ob07|c|cpp|h|pas|pp|lua|ini|json"; - - fontWidth = K.fontWidth; - fontHeight = K.fontHeight; - - btnClose = 1; - - btnNew = 20; - btnOpen = 21; - btnSave = 22; - btnSearch = 23; - btnUndo = 24; - btnRedo = 25; - btnUpper = 26; - btnLower = 27; - btnBuild = 28; - btnRun = 29; - - btnYes = 40; - btnNo = 41; - btnFindNext = 42; - btnReplace = 43; - btnReplaceAll = 44; - btnGoto = 45; - btnCloseSearch = 46; - btnHideSearch = 47; - - mainMenuBtn = 60; - - btnHeight = 25; - btnWidth = 75; - - toolbarTop = Menu.MainMenuHeight + 3; - - TOP = toolbarTop + Toolbar.BtnSize + 9 + Tabs.tabHeight; - - minWinWidth = 635; minWinHeight = 550; - - SEARCH_PADDING = 10; - LEFT_PADDING = 1; - RIGHT_PADDING = 1; - - EditBox_Width = 180; - EDITBOX_MAXCHARS = 500; - - menuCut = 1; - menuCopy = 2; - menuPaste = 3; - menuDelete = 4; - menuSelectAll = 5; - - menuUndo = 6; - menuRedo = 7; - - menuCurLine = 100; - menuIndent = 110; - menuCase = 120; - - menuNew = 10; - menuOpen = 11; - menuSave = 12; - menuSaveAs = 13; - menuSaveAll = 14; - menuFolder = 15; - menuClose = 16; - menuExit = 17; - - menuFontSmall = 20; - menuFontMedium = menuFontSmall + 1; - menuFontLarge = menuFontMedium + 1; - menuIncLS = menuFontLarge + 1; - menuDecLS = menuIncLS + 1; - menuColors = 1000; - menuMaxColors = menuColors + Ini.MAX_SECTIONS - 1; - - menuText = 30; - menuC = 31; - menuFasm = 32; - menuIni = 33; - menuJSON = 34; - menuLua = 35; - menuOberon = 36; - menuPascal = 37; - - menuBuild = 50; - menuBuildScript = 51; - menuRun = 52; - menuRunScript = 53; - menuDebug = 54; - menuDebugScript = 55; - menuFASM = 56; - - menuUTF8BOM = 60; - menuUTF8 = 61; - menuCP866 = 62; - menuCP1251 = 63; - menuEOL = 140; - menuConv1251_866 = 64; - menuConv866_1251 = 65; - - menuPipet = 70; - menuMagnify = 71; - menuBoard = 72; - menuSysFunc = 73; - - menuFind = 80; - menuFindNext = 81; - menuFindPrev = 82; - menuGoto = 83; - menuBookmark = 130; - - menuLineNumbers = 90; - menuAutoIndents = 91; - menuAutoBrackets = 92; - menuTrimSpace = 93; - - menuMoveUp = 101; - menuMoveDown = 102; - menuDuplicate = 103; - menuRemove = 104; - - menuIncInd = 111; - menuDecInd = 112; - - menuUpper = 121; - menuLower = 122; - - menuToggleBookmark = 131; - menuNextBookmark = 132; - menuPrevBookmark = 133; - - menuLF = 141; - menuCRLF = 142; - menuCR = 143; - - maxTexts = 32; - - SHIFT = Menu.SHIFT; - CTRL = Menu.CTRL; - - ClippingArea = 32 + T.MaxLineSpacing; - - -VAR - header: RW.tFileName; - canvas: G.tCanvas; - font: G.tFont; - - tabs: Tabs.tTabs; - text: T.tText; - texts: ARRAY maxTexts OF T.tText; - textsCount, curText: INTEGER; - - winWidth, winHeight: INTEGER; - SkinHeight, scrollWidth: INTEGER; - AppPath, runScript, buildScript, debugScript, CurFolder: RW.tFileName; - OD: OpenDlg.Dialog; - confirm, notFound, menuFindClicked, search, searchOpened: BOOLEAN; - - switch, closing, newtab: BOOLEAN; - leftButton: BOOLEAN; - LEFT, RIGHT, BOTTOM: INTEGER; - - FindEdit, ReplaceEdit, GotoEdit: EB.tEditBox; - hScroll, vScroll: Scroll.tScroll; - CS, WH, BKW: CheckBox.tCheckBox; - - new_searchText, searchText, replaceText, gotoText: T.tString; - cs, whole: BOOLEAN; - - replaced: INTEGER; - - context, menuFile, menuEdit, menuSearch, menuEncoding, - menuView, menuLanguage, menuProgram, menuTools, menuOptions, - subCurLine, subIndent, subCase, subBookmark, subEOL: Menu.tMenu; - - mainMenu: Menu.tMain; - - menuActive: BOOLEAN; - - toolbar: Toolbar.tToolbar; - - CursorTime, CurrentTime: INTEGER; - timerEnabled: BOOLEAN; - - IPC: ARRAY 64 OF INTEGER; mainTID: INTEGER; - - -PROCEDURE EditBox_Focus (edit: EB.tEditBox): BOOLEAN; - RETURN 1 IN edit.flags -END EditBox_Focus; - - -PROCEDURE resetTimer; -BEGIN - IF EditBox_Focus(FindEdit) OR EditBox_Focus(ReplaceEdit) OR EditBox_Focus(GotoEdit) THEN - T.hideCursor; - timerEnabled := FALSE - ELSE - T.showCursor; - timerEnabled := TRUE - END; - CursorTime := CurrentTime -END resetTimer; - - -PROCEDURE EditBox_SetFocus (VAR edit: EB.tEditBox; value: BOOLEAN); -BEGIN - IF value THEN - INCL(edit.flags, 1) - ELSE - EXCL(edit.flags, 1) - END; - IF search & searchOpened THEN - EB.draw(edit) - END -END EditBox_SetFocus; - - -PROCEDURE SetFocus (VAR edit: EB.tEditBox; value: BOOLEAN); -BEGIN - EditBox_SetFocus(FindEdit, FALSE); - EditBox_SetFocus(ReplaceEdit, FALSE); - EditBox_SetFocus(GotoEdit, FALSE); - EditBox_SetFocus(edit, value); - resetTimer -END 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; -VAR - top, left, right, bottom, x, y, width: INTEGER; -BEGIN - timerEnabled := FALSE; - CursorTime := CurrentTime; - 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.colors.work); - Rect(left, top, right, bottom, K.colors.line); - K.DrawText(x, y, K.colors.work_text, s); -END Message; - - -PROCEDURE NotFound; -BEGIN - IF notFound THEN - Message("not found"); - IF menuFindClicked THEN - menuFindClicked := FALSE - ELSE - notFound := FALSE - END; - SetFocus(FindEdit, TRUE) - 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; - SetFocus(FindEdit, TRUE) - END -END Replaced; - - -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 SetCaption (fileName: RW.tFileName); -VAR - newHeader: RW.tFileName; -BEGIN - newHeader := HEADER; - IF text.fileName # "" THEN - U.append8(newHeader, " - "); - U.append8(newHeader, text.fileName) - END; - IF newHeader # header THEN - header := newHeader; - K.SetCaption(header) - END -END SetCaption; - - -PROCEDURE Status (text: T.tText; height: INTEGER); -VAR - line, col, chars, lines: INTEGER; -BEGIN - T.getPos(text, col, line); - T.getSelCnt(text, chars, lines); - SB.setWidth(canvas.width + scrollWidth); - SB.setPos(line, col); - IF text.foundSel # 0 THEN - SB.setSel("", text.foundCur, text.foundCnt, " / ") - ELSE - SB.setSel("sel: ", chars, lines, " | ") - END; - SB.setEnc(E.eolNames[T.getEol(text)], E.names[T.getEnc(text)]); - SB.draw(LEFT, height - BOTTOM + scrollWidth - 1); - Tabs.modify(tabs, getIdx(text), text.modified) -END Status; - - -PROCEDURE DrawScroll (VAR scroll: Scroll.tScroll; left, top, value, maxVal: INTEGER); -BEGIN - scroll.maxVal := maxVal; - scroll.left := left; - scroll.top := top; - Scroll.setValue(scroll, value); - Scroll.draw(scroll) -END DrawScroll; - - -PROCEDURE drawText; -BEGIN - G.SetColor(canvas, K.colors.line); - G.VLine(canvas, 0, 0, canvas.height - 1); - G.DrawCanvas(canvas, LEFT, TOP) -END drawText; - - -PROCEDURE repaint; -VAR - width, height, scrollX, scrollY: INTEGER; -BEGIN - IF (text # NIL) & ~K.RolledUp() THEN - IF confirm THEN - K.DeleteButton(btnYes); - K.DeleteButton(btnNo); - confirm := FALSE; - resetTimer; - closing := FALSE - END; - IF ~search OR (searchText = "") THEN - T.wordSel(text) - END; - K.ClientSize(width, height); - IF switch THEN - Status(text, height); - Tabs.draw(tabs); - IF search & T.search(text, searchText, cs, whole) THEN END; - switch := FALSE - END; - T.draw(text); - Status(text, height); - - T.getScroll(text, scrollX, scrollY); - DrawScroll(vScroll, LEFT + canvas.width, TOP - 1, scrollY, text.count - 1); - DrawScroll(hScroll, LEFT, TOP + canvas.height, scrollX, text.maxLength); - IF search & searchOpened THEN - CheckBox.draw(BKW); - CheckBox.draw(CS); - CheckBox.draw(WH); - END; - IF ~search OR (searchText = "") THEN - T.wordSel(text) - END; - drawText; - NotFound; - Replaced; - Toolbar.enable(toolbar, btnSave, text.modified); - Toolbar.enable(toolbar, btnUndo, ~ChangeLog.isFirstGuard(text.edition)); - Toolbar.enable(toolbar, btnRedo, ~ChangeLog.isLastGuard(text.edition)); - Toolbar.enable(toolbar, btnUpper, T.selected(text)); - Toolbar.enable(toolbar, btnLower, T.selected(text)); - Toolbar.enable(toolbar, btnBuild, (buildScript # "") OR text.fasm); - Toolbar.enable(toolbar, btnRun, (runScript # "") OR text.fasm); - Toolbar.drawIcons(toolbar) - 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); - IF font # G.fonts[2] THEN - SB.SetFont(font) - ELSE - SB.SetFont(G.fonts[1]) - END; - BOTTOM := SB.height() + scrollWidth - 1; - G.destroy(canvas); - canvas := G.CreateCanvas(cliWidth - (LEFT + RIGHT + 2 + RIGHT_PADDING), cliHeight - (TOP + BOTTOM + 1 - ClippingArea)); - DEC(canvas.height, ClippingArea); - Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, cliWidth - (LEFT + RIGHT + 2 + RIGHT_PADDING), Tabs.tabHeight); - G.SetFont(canvas, font); - T.setCanvas(canvas); - T.resize(canvas.width, canvas.height); - Scroll.resize(vScroll, vScroll.width, canvas.height + 2); - Scroll.resize(hScroll, canvas.width + 1, hScroll.height); -END resize; - - -PROCEDURE SearchPanel (left, top: INTEGER); -VAR - y, right, bottom: INTEGER; -BEGIN - DEC(top, Tabs.tabHeight); - right := left + EditBox_Width + SEARCH_PADDING*2; - bottom := top + 395 + btnHeight + SEARCH_PADDING; - Rect(left, top, right, bottom, K.colors.line); - - K.CreateButton(btnCloseSearch, right - 20, top, 20, 20, Tabs.btnCloseColor, ""); - 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); - - K.CreateButton(btnHideSearch, right - 40, top, 20, 20, K.colors.button, ""); - K.DrawLine(right - 34, top + 14, right - 26, top + 14, K.colors.button_text); - K.DrawLine(right - 34, top + 15, right - 26, top + 15, K.colors.button_text); - - INC(top, 15); - INC(left, SEARCH_PADDING); - K.DrawText866(left, top, K.colors.work_text, "find"); - K.DrawText866(left, top + 55, K.colors.work_text, "replace with"); - K.DrawText866(left, top + 330, K.colors.work_text, "go to line"); - BKW.top := top + 110; - BKW.left := left; - CS.top := top + 140; - CS.left := left; - WH.top := top + 170; - WH.left := left; - FindEdit.top := top + 20; - ReplaceEdit.top := top + 75; - GotoEdit.top := top + 350; - FindEdit.left := left; - ReplaceEdit.left := left; - GotoEdit.left := left; - EB.draw(FindEdit); - EB.draw(ReplaceEdit); - EB.draw(GotoEdit); - y := top + 200; - K.CreateButton(btnFindNext, left, y, btnWidth, btnHeight, K.colors.button, "next"); INC(y, btnHeight + 10); - K.CreateButton(btnReplace, left, y, btnWidth, btnHeight, K.colors.button, "replace"); INC(y, btnHeight + 10); - K.CreateButton(btnReplaceAll, left, y, btnWidth + 5*fontWidth - 2, btnHeight, K.colors.button, "replace all"); - K.CreateButton(btnGoto, left, top + 380, btnWidth, btnHeight, K.colors.button, "go"); -END SearchPanel; - - -PROCEDURE draw_window; -VAR - width, height: INTEGER; -BEGIN - K.BeginDraw; - K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.colors.work, 73H, 0, 0, ""); - IF (text # NIL) & ~K.RolledUp() THEN - IF confirm THEN - resetTimer - END; - confirm := FALSE; - K.ClientSize(width, height); - - K.DrawRect(0, 0, width, TOP - 1, K.colors.work); - K.DrawRect(0, 0, LEFT, height, K.colors.work); - K.DrawRect(width - RIGHT_PADDING, 0, RIGHT_PADDING, height, K.colors.work); - K.DrawRect(LEFT + canvas.width + 1, TOP + canvas.height + 1, scrollWidth - 1, scrollWidth - 1, K.colors.work); - Menu.DrawMain(mainMenu); - - Toolbar.draw(toolbar); - SetCaption(text.fileName); - Status(text, height); - IF search & searchOpened THEN - SearchPanel(LEFT_PADDING, TOP) - END; - Tabs.draw(tabs); - repaint - END; - K.EndDraw -END draw_window; - - -PROCEDURE mouse (VAR x, y: INTEGER); -VAR - msState: SET; -BEGIN - K.mouse(msState, x, y); - DEC(x, LEFT); - DEC(y, TOP) -END mouse; - - -PROCEDURE stopTimer; -BEGIN - T.hideCursor; - timerEnabled := FALSE; - CursorTime := CurrentTime; - repaint -END stopTimer; - - -PROCEDURE OpenFile (VAR FileName: RW.tFileName; filter: ARRAY OF CHAR); -BEGIN - stopTimer; - 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; - resetTimer -END OpenFile; - - -PROCEDURE error (s: RW.tFileName); -VAR - temp: RW.tFileName; -BEGIN - temp := "'CEdit: "; - U.append8(temp, s); - U.append8(temp, "' -E"); - K.Run("/sys/@notify", temp) -END error; - - -PROCEDURE saveError (name: RW.tFileName); -VAR - s: RW.tFileName; -BEGIN - s := "error saving file "; - U.append8(s, name); - error(s) -END saveError; - - -PROCEDURE saveAs (text: T.tText); -VAR - fileName, name: 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."; - Languages.getExt(text.lang, ext); - U.append8(OD.FileName, ext) - END; - OpenFile(fileName, EditFilter); - IF fileName # "" THEN - IF T.save(text, fileName) THEN - T.setName(text, fileName); - U.getFileName(fileName, name, U.SLASH); - Tabs.rename(tabs, curText, name) - ELSE - saveError(fileName) - END - END -END saveAs; - - -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) THEN - saveError(text.fileName) - END - ELSE - curText := getIdx(text); - Switch(text); - saveAs(text) - END; - Tabs.modify(tabs, getIdx(text), text.modified) - END -END save; - - -PROCEDURE saveAll; -VAR - i: INTEGER; - txt: T.tText; -BEGIN - i := textsCount - 1; - WHILE i >= 0 DO - txt := texts[i]; - IF txt.modified THEN - T.switch(txt); - save(txt) - END; - DEC(i) - END; - T.switch(text) -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; -CONST - width = btnWidth*2 + 30; - height = btnHeight*2 + 20; -VAR - left, top, right, bottom: INTEGER; -BEGIN - stopTimer; - 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.colors.work); - Rect(left, top, right, bottom, K.colors.line); - K.DrawText866(left + (width - 10*fontWidth) DIV 2, top + 10, K.colors.work_text, "save file?"); - K.CreateButton(btnYes, left + 10, top + 35, btnWidth, btnHeight, K.colors.button, "yes"); - K.CreateButton(btnNo, left + 20 + btnWidth, top + 35, btnWidth, btnHeight, K.colors.button, "no"); -END Confirm; - - -PROCEDURE closeFile (conf: BOOLEAN; n: INTEGER); -VAR - i: INTEGER; -BEGIN - IF texts[n].modified & conf THEN - Confirm - ELSE - Tabs.delete(tabs, n); - T.destroy(texts[n]); - FOR i := n + 1 TO textsCount - 1 DO - texts[i - 1] := texts[i] - END; - DEC(textsCount); - IF (curText = textsCount) OR (n < curText) THEN - DEC(curText) - END; - IF curText >= 0 THEN - Switch(texts[curText]) - ELSE - K.Exit - END; - draw_window - END -END closeFile; - - -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.lowcase8(n1); - U.lowcase8(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 SwitchTab (n: INTEGER); -BEGIN - curText := n; - Tabs.switch(tabs, n); - Switch(texts[n]); - resetTimer; - IF ~newtab THEN - draw_window - END -END SwitchTab; - - -PROCEDURE NewFile; -VAR - nov: T.tText; -BEGIN - IF textsCount < maxTexts THEN - nov := T.New(); - T.SetPos(nov, 0, 0); - insert(textsCount, nov); - newtab := TRUE; - SwitchTab(curText) - ELSE - error("too many files") - END -END NewFile; - - -PROCEDURE open (_fileName: RW.tFileName): BOOLEAN; -VAR - fileName: RW.tFileName; - nov: T.tText; - err, n: INTEGER; - res, empty: BOOLEAN; -BEGIN - res := TRUE; - IF textsCount < maxTexts THEN - fileName := _fileName; - IF fileName = "" THEN - OD._type := OpenDlg.topen; - OpenFile(fileName, EditFilter) - END; - IF fileName # "" THEN - n := getFileNum(fileName); - IF n = -1 THEN - nov := T.open(fileName, 0, 0, err); - IF nov = NIL THEN - error("error opening file"); - SwitchTab(curText); - res := FALSE - ELSE - T.switch(text); - empty := (textsCount = 1) & (text.fileName = "") & T.empty(text) & - ChangeLog.isFirstGuard(text.edition) & ChangeLog.isLastGuard(text.edition); - T.switch(nov); - T.SetPos(nov, 0, 0); - insert(textsCount, nov); - IF empty THEN - closeFile(FALSE, 0) - END; - Scroll.setValue(hScroll, 0); - Scroll.setValue(vScroll, 0) - END - ELSE - SwitchTab(n) - END - END - ELSE - error("too many files"); - res := FALSE - END - RETURN res -END open; - - -PROCEDURE OpenDial; -VAR - res: BOOLEAN; -BEGIN - res := open("") -END OpenDial; - - -PROCEDURE createSearchForm; -BEGIN - EB.create(LEFT_PADDING, TOP + 20, EditBox_Width, EDITBOX_MAXCHARS, FindEdit); - EB.create(LEFT_PADDING, TOP + 20 + 55, EditBox_Width, EDITBOX_MAXCHARS, ReplaceEdit); - EB.create(LEFT_PADDING, TOP + 20 + 330, EditBox_Width, EDITBOX_MAXCHARS, GotoEdit); - INCL(GotoEdit.flags, 15); - CheckBox.create("backward", BKW); - CheckBox.create("match case", CS); - CheckBox.create("whole word", WH); -END createSearchForm; - - -PROCEDURE EditBox_Get (edit: EB.tEditBox; VAR s: ARRAY OF WCHAR); -VAR - str: ARRAY EDITBOX_MAXCHARS + 1 OF CHAR; - i: INTEGER; -BEGIN - EB.get(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_Get; - - -PROCEDURE Search; -BEGIN - search := ~search; - LEFT := LEFT_PADDING; - IF search THEN - searchOpened := TRUE; - INC(LEFT, EditBox_Width + SEARCH_PADDING*2 + 4); - IF T.search(text, searchText, cs, whole) THEN END - ELSE - IF T.search(text, "", FALSE, FALSE) THEN END - END; - SetFocus(FindEdit, search); - resize; - draw_window -END Search; - - -PROCEDURE click (x, y: INTEGER): INTEGER; -VAR - scrollX, scrollY: INTEGER; - shift, ctrl: BOOLEAN; -BEGIN - K.getKBState(shift, ctrl); - T.getScroll(text, scrollX, scrollY); - T.scroll(text, hScroll.value - scrollX, vScroll.value - scrollY); - IF U.between(0, x, canvas.width - 1) & U.between(0, y, canvas.height - 1) THEN - leftButton := TRUE; - SetFocus(FindEdit, FALSE); - IF ~shift THEN - T.resetSelect(text) - END; - T.mouse(text, x, y) - END; - repaint - RETURN K.GetTickCount() -END click; - - -PROCEDURE Close; -VAR - cont: BOOLEAN; -BEGIN - closing := TRUE; - cont := TRUE; - WHILE (textsCount > 0) & cont DO - IF text.modified THEN - Confirm; - cont := FALSE - ELSE - closeFile(FALSE, curText); - repaint - END - END -END Close; - - -PROCEDURE CloseMenu; -BEGIN - Menu.close(subEOL); - Menu.close(subCurLine); - Menu.close(subIndent); - Menu.close(subCase); - Menu.close(subBookmark); - Menu.close(menuFile); - Menu.close(menuEdit); - Menu.close(menuSearch); - Menu.close(menuEncoding); - Menu.close(menuView); - Menu.close(menuLanguage); - Menu.close(menuProgram); - Menu.close(menuTools); - Menu.close(menuOptions); - Menu.close(context) -END CloseMenu; - - -PROCEDURE goto; -VAR - gotoVal: INTEGER; -BEGIN - EditBox_Get(GotoEdit, gotoText); - IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN - SetFocus(GotoEdit, FALSE) - END -END goto; - - -PROCEDURE Script (script: ARRAY OF CHAR); -BEGIN - IF script # "" THEN - U.getPath(script, CurFolder); - K.SetCurFolder(CurFolder); - K.Run("/sys/@open", script) - END -END Script; - - -PROCEDURE ShowSearchPanel (goto: BOOLEAN); -VAR - i: INTEGER; -BEGIN - IF T.selected(text) & ~goto THEN - T.getSelectedText(text, new_searchText); - IF new_searchText # "" THEN - i := 0; - WHILE (new_searchText[i] # 0X) & (new_searchText[i] # Lines.TAB) DO - INC(i) - END; - IF new_searchText[i] = 0X THEN - searchText := new_searchText; - EB.set(FindEdit, searchText); - notFound := ~T.search(text, searchText, cs, whole); - END - END - END; - IF ~search THEN - Search - ELSIF ~searchOpened THEN - search := FALSE; - Search - END; - IF goto THEN - SetFocus(GotoEdit, TRUE) - ELSE - SetFocus(FindEdit, TRUE) - END -END ShowSearchPanel; - - -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, enabled: BOOLEAN; -BEGIN - IF menu = context THEN - mouse(x, y); - IF ~(U.between(0, x, canvas.width - 1) & U.between(0, y, canvas.height - 1)) THEN - menu := NIL - END - ELSE - K.WinPos(winX, winY); - K.ClientPos(cliX, cliY); - x := winX + cliX; - y := Menu.MainMenuHeight + winY + cliY - END; - selected := T.selected(text); - - 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) - ELSIF (menu = menuEdit) OR (menu = context) THEN - Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition)); - Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition)); - Menu.setEnabled(menu, menuCut, selected); - Menu.setEnabled(menu, menuCopy, selected); - Menu.setEnabled(menu, menuDelete, selected); - Menu.setEnabled(menu, menuPaste, CB.available()); - IF menu = context THEN - 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); - menu.x := x; - x := 0 - END - ELSIF menu = menuEncoding THEN - Menu.option(menu, menuUTF8BOM, T.getEnc(text) = E.UTF8BOM); - Menu.option(menu, menuUTF8, T.getEnc(text) = E.UTF8); - Menu.option(menu, menuCP866, T.getEnc(text) = E.CP866); - Menu.option(menu, menuCP1251, T.getEnc(text) = E.CP1251) - ELSIF menu = menuView THEN - Menu.option(menu, menuFontSmall, font = G.fonts[0]); - Menu.option(menu, menuFontMedium, font = G.fonts[1]); - Menu.option(menu, menuFontLarge, font = G.fonts[2]); - Menu.setEnabled(menu, menuIncLS, T.LineSpacing < T.MaxLineSpacing); - Menu.setEnabled(menu, menuDecLS, T.LineSpacing > 0); - FOR i := 0 TO Ini.sections.count - 1 DO - Menu.option(menu, menuColors + i, Ini.curSectionNum = i) - END - ELSIF menu = menuLanguage THEN - Menu.option(menu, menuText, text.lang = Languages.langText); - Menu.option(menu, menuC, text.lang = Languages.langC); - Menu.option(menu, menuFasm, text.lang = Languages.langFasm); - Menu.option(menu, menuIni, text.lang = Languages.langIni); - Menu.option(menu, menuJSON, text.lang = Languages.langJSON); - Menu.option(menu, menuLua, text.lang = Languages.langLua); - Menu.option(menu, menuOberon, text.lang = Languages.langOberon); - Menu.option(menu, menuPascal, text.lang = Languages.langPascal); - ELSIF menu = menuProgram THEN - Menu.setEnabled(menu, menuBuild, (buildScript # "") OR text.fasm); - Menu.setEnabled(menu, menuDebug, (debugScript # "") OR text.fasm); - Menu.setEnabled(menu, menuRun, (runScript # "") OR text.fasm); - Menu.setEnabled(menu, menuBuildScript, ~text.fasm); - Menu.setEnabled(menu, menuDebugScript, ~text.fasm); - Menu.setEnabled(menu, menuRunScript, ~text.fasm); - Menu.check(menu, menuFASM, text.fasm) - ELSIF menu = menuOptions THEN - Menu.check(menu, menuLineNumbers, T.lineNumbers); - Menu.check(menu, menuAutoIndents, T.autoIndents); - Menu.check(menu, menuAutoBrackets, T.autoBrackets); - Menu.check(menu, menuTrimSpace, T.trimSpace) - END; - - enabled := search & (searchText # ""); - Menu.setEnabled(menuSearch, menuFindNext, enabled); - Menu.setEnabled(menuSearch, menuFindPrev, enabled); - - Menu.setEnabled(subIndent, menuIncInd, selected); - Menu.setEnabled(subIndent, menuDecInd, selected); - - Menu.setEnabled(subCase, menuUpper, selected); - Menu.setEnabled(subCase, menuLower, selected); - - Menu.option(subEOL, menuCRLF, T.getEol(text) = E.EOL_CRLF); - Menu.option(subEOL, menuLF, T.getEol(text) = E.EOL_LF); - Menu.option(subEOL, menuCR, T.getEol(text) = E.EOL_CR); - - IF menu # NIL THEN - timerEnabled := FALSE; - IF Menu.opened(menu) THEN - Menu.close(menu) - END; - Menu.open(menu, menu.x + x, y); - menuActive := TRUE - END -END ShowMenu; - - -PROCEDURE setScript (VAR script: RW.tFileName); -VAR - temp: RW.tFileName; -BEGIN - OpenFile(temp, ShellFilter); - IF temp # "" THEN - script := temp - END -END setScript; - - -PROCEDURE FasmCompile (run, debug: BOOLEAN); -VAR - curFileName, ext, outfile, path, param: RW.tFileName; -BEGIN - curFileName := texts[curText].fileName; - U.getFileName(curFileName, param, U.SLASH); - U.getFileName(curFileName, ext, "."); - U.getPath(curFileName, path); - outfile := param; - IF (ext # "") & ((LENGTH(ext) + 1) < LENGTH(outfile)) THEN - outfile[LENGTH(outfile) - LENGTH(ext) - 1] := 0X - ELSE - U.append8(outfile, ".kex") - END; - U.append8(param, ","); - U.append8(param, outfile); - U.append8(param, ","); - U.append8(param, path); - U.append8(param, U.SLASH); - IF run THEN - U.append8(param, ",run") - ELSIF debug THEN - U.append8(param, ",dbg") - END; - K.Run("/sys/develop/fasm", param) -END FasmCompile; - - -PROCEDURE ProgramBuild; -BEGIN - IF ~text.fasm THEN - Script(buildScript) - ELSE - FasmCompile(FALSE, FALSE) - END -END ProgramBuild; - - -PROCEDURE ProgramRun; -BEGIN - IF ~text.fasm THEN - Script(runScript) - ELSE - FasmCompile(TRUE, FALSE) - END -END ProgramRun; - - -PROCEDURE ProgramDebug; -BEGIN - IF ~text.fasm THEN - Script(debugScript) - ELSE - FasmCompile(FALSE, TRUE) - END -END ProgramDebug; - - -PROCEDURE ClickMenu; -VAR - item: List.tItem; -BEGIN - IF Menu.MenuItem < 0 THEN - item := List.getItem(mainMenu, (-Menu.MenuItem - mainMenuBtn) MOD mainMenu.count); - IF item # NIL THEN - ShowMenu(item(Menu.tMainItem).menu) - END; - Menu.SetItem(0) - END; - CASE Menu.MenuItem OF - |0: - |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 - |menuOpen: - OpenDial - |menuSave: - save(text); - repaint - |menuSaveAs: - saveAs(text); - repaint - |menuSaveAll: - saveAll; - repaint - |menuClose: - closeFile(TRUE, curText) - |menuFolder: - K.Run("/sys/File Managers/Eolite", text.fileName) - |menuExit: - Close - |menuUndo: - T.undo(text); - repaint - |menuRedo: - T.redo(text); - repaint - |menuFind: - ShowSearchPanel(FALSE) - |menuFindNext: - notFound := ~T.findNext(text, BKW.value); - menuFindClicked := TRUE - |menuFindPrev: - notFound := ~T.findNext(text, ~BKW.value); - menuFindClicked := TRUE - |menuGoto: - ShowSearchPanel(TRUE) - |menuToggleBookmark: - T.toggleLabel(text) - |menuNextBookmark: - T.gotoLabel(text, TRUE) - |menuPrevBookmark: - T.gotoLabel(text, FALSE) - |menuFontSmall..menuFontLarge: - font := G.fonts[Menu.MenuItem - menuFontSmall]; - Ini.setInt("settings", "font", Menu.MenuItem - menuFontSmall); - resize - |menuIncLS, menuDecLS: - T.setLineSpacing(canvas, T.LineSpacing + ORD(Menu.MenuItem = menuIncLS)*2 - 1); - Ini.setInt("settings", "line_spacing", T.LineSpacing) - |menuText: - T.setLang(text, Languages.langText) - |menuC: - T.setLang(text, Languages.langC) - |menuFasm: - T.setLang(text, Languages.langFasm) - |menuIni: - T.setLang(text, Languages.langIni) - |menuJSON: - T.setLang(text, Languages.langJSON) - |menuLua: - T.setLang(text, Languages.langLua) - |menuOberon: - T.setLang(text, Languages.langOberon) - |menuPascal: - T.setLang(text, Languages.langPascal) - |menuBuild: - ProgramBuild - |menuBuildScript: - setScript(buildScript) - |menuRun: - ProgramRun - |menuRunScript: - setScript(runScript) - |menuDebug: - ProgramDebug - |menuDebugScript: - setScript(debugScript) - |menuFASM: - text.fasm := ~text.fasm - |menuUTF8BOM: - T.setEnc(text, E.UTF8BOM) - |menuUTF8: - T.setEnc(text, E.UTF8) - |menuCP866: - T.setEnc(text, E.CP866) - |menuCP1251: - T.setEnc(text, E.CP1251) - |menuLF: - T.setEol(text, E.EOL_LF) - |menuCRLF: - T.setEol(text, E.EOL_CRLF) - |menuCR: - T.setEol(text, E.EOL_CR) - |menuConv1251_866: - T.convert(text, (*E.cp866,*) E.CP1251) - |menuConv866_1251: - T.convert(text, (*E.cp1251,*) E.CP866) - |menuPipet: - K.Run("/sys/develop/pipet", "") - |menuMagnify: - K.Run("/sys/magnify", "") - |menuBoard: - K.Run("/sys/develop/board", "") - |menuSysFunc: - K.Run("/sys/docpack", "e") - |menuLineNumbers: - T.toggleNumbers; - Ini.setInt("settings", "line_numbers", ORD(T.lineNumbers)) - |menuAutoIndents: - T.toggleIndents; - Ini.setInt("settings", "auto_indents", ORD(T.autoIndents)) - |menuAutoBrackets: - T.toggleBrackets; - Ini.setInt("settings", "auto_brackets", ORD(T.autoBrackets)) - |menuTrimSpace: - T.toggleTrimSpace; - Ini.setInt("settings", "trim_space", ORD(T.trimSpace)) - |menuColors..menuMaxColors: - Ini.selectSection(Menu.MenuItem - menuColors); - Ini.setInt("settings", "theme", Menu.MenuItem - menuColors) - |menuMoveUp: - T.MoveLines(text, FALSE) - |menuMoveDown: - T.MoveLines(text, TRUE) - |menuDuplicate: - T.dupLine(text) - |menuRemove: - T.delLine(text) - |menuIncInd: - T.Indent(text, TRUE) - |menuDecInd: - T.Indent(text, FALSE) - |menuUpper: - T.chCase(text, TRUE) - |menuLower: - T.chCase(text, FALSE) - END; - Menu.SetItem(0) -END ClickMenu; - - -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, mainTID) -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, menuSaveAll, "save all"); - Menu.AddMenuItem(menu, menuFolder, "folder"); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuClose, "close ctrl-W"); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuExit, "exit"); - RETURN Menu.create(menu, mainTID) -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, 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"); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuCurLine, "current line"); - Menu.child(menu, subCurLine); - Menu.AddMenuItem(menu, menuIndent, "indent"); - Menu.child(menu, subIndent); - Menu.AddMenuItem(menu, menuCase, "case"); - Menu.child(menu, subCase); - RETURN Menu.create(menu, mainTID) -END CreateMenuEdit; - - -PROCEDURE CreateMenuSearch (): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuFind, "search ctrl-F"); - Menu.AddMenuItem(menu, menuFindNext, "find next F3"); - Menu.AddMenuItem(menu, menuFindPrev, "find previous shift-F3"); - Menu.AddMenuItem(menu, menuGoto, "go to line ctrl-G"); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuBookmark, "bookmark"); - Menu.child(menu, subBookmark); - RETURN Menu.create(menu, mainTID) -END CreateMenuSearch; - - -PROCEDURE CreateMenuEncoding (): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - 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, menuCP1251, E.names[E.CP1251]); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuConv1251_866, "convert 1251 >> 866"); - Menu.AddMenuItem(menu, menuConv866_1251, "convert 866 >> 1251"); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuEOL, "EOL"); - Menu.child(menu, subEOL); - RETURN Menu.create(menu, mainTID) -END CreateMenuEncoding; - - -PROCEDURE CreateMenuEOL (): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuCRLF, E.eolNames[E.EOL_CRLF]); - Menu.AddMenuItem(menu, menuLF, E.eolNames[E.EOL_LF]); - Menu.AddMenuItem(menu, menuCR, E.eolNames[E.EOL_CR]); - RETURN Menu.create(menu, mainTID) -END CreateMenuEOL; - - -PROCEDURE CreateMenuView (): Menu.tMenu; -VAR - menu: List.tList; - colors: Ini.tSection; - idx: INTEGER; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuFontSmall, "small"); - Menu.AddMenuItem(menu, menuFontMedium, "medium"); - Menu.AddMenuItem(menu, menuFontLarge, "large"); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuIncLS, "line spacing ++"); - Menu.AddMenuItem(menu, menuDecLS, "line spacing --"); - 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, mainTID) -END CreateMenuView; - - -PROCEDURE CreateMenuLanguage (): 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, menuJSON, "JSON"); - Menu.AddMenuItem(menu, menuLua, "Lua"); - Menu.AddMenuItem(menu, menuOberon, "Oberon"); - Menu.AddMenuItem(menu, menuPascal, "Pascal"); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuText, "Text"); - RETURN Menu.create(menu, mainTID) -END CreateMenuLanguage; - - -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 ctrl-F8"); - Menu.AddMenuItem(menu, menuDebugScript, "script"); - Menu.delimiter(menu); - Menu.AddMenuItem(menu, menuFASM, "Fasm"); - RETURN Menu.create(menu, mainTID) -END CreateMenuProgram; - - -PROCEDURE CreateMenuTools (): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuPipet, "pipet"); - Menu.AddMenuItem(menu, menuMagnify, "magnify"); - Menu.AddMenuItem(menu, menuBoard, "board"); - Menu.AddMenuItem(menu, menuSysFunc, "system functions"); - RETURN Menu.create(menu, mainTID) -END CreateMenuTools; - - -PROCEDURE CreateMenuOptions (): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuLineNumbers, "line numbers"); - Menu.AddMenuItem(menu, menuAutoIndents, "automatic indents"); - Menu.AddMenuItem(menu, menuAutoBrackets, "automatic brackets"); - Menu.AddMenuItem(menu, menuTrimSpace, "trim trailing space"); - RETURN Menu.create(menu, mainTID) -END CreateMenuOptions; - - -PROCEDURE CreateMenuCurLine(): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuMoveUp, "move up ctrl-Up"); - Menu.AddMenuItem(menu, menuMoveDown, "move down ctrl-Down"); - Menu.AddMenuItem(menu, menuDuplicate, "duplicate ctrl-D"); - Menu.AddMenuItem(menu, menuRemove, "remove ctrl-Del"); - RETURN Menu.create(menu, mainTID) -END CreateMenuCurLine; - - -PROCEDURE CreateMenuIndent(): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuIncInd, "increase Tab"); - Menu.AddMenuItem(menu, menuDecInd, "decrease shift-Bksp"); - RETURN Menu.create(menu, mainTID) -END CreateMenuIndent; - - -PROCEDURE CreateMenuCase(): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuUpper, "UPPER ctrl-U"); - Menu.AddMenuItem(menu, menuLower, "lower ctrl-L"); - RETURN Menu.create(menu, mainTID) -END CreateMenuCase; - - -PROCEDURE CreateMenuBookmark(): Menu.tMenu; -VAR - menu: List.tList; -BEGIN - menu := List.create(NIL); - Menu.AddMenuItem(menu, menuToggleBookmark, "toggle ctrl-F2"); - Menu.AddMenuItem(menu, menuNextBookmark, "next F2"); - Menu.AddMenuItem(menu, menuPrevBookmark, "previous shift-F2"); - RETURN Menu.create(menu, mainTID) -END CreateMenuBookmark; - - -PROCEDURE Shortcuts; -BEGIN - Menu.AddShortcut(17 + CTRL, menuClose); - Menu.AddShortcut(21 + CTRL, menuRedo); - Menu.AddShortcut(30 + CTRL, menuSelectAll); - Menu.AddShortcut(32 + CTRL, menuDuplicate); - Menu.AddShortcut(33 + CTRL, menuFind); - Menu.AddShortcut(35 + CTRL, menuFind); - Menu.AddShortcut(34 + CTRL, menuGoto); - Menu.AddShortcut(44 + CTRL, menuUndo); - Menu.AddShortcut(45 + CTRL, menuCut); - Menu.AddShortcut(46 + CTRL, menuCopy); - Menu.AddShortcut(47 + CTRL, menuPaste); - Menu.AddShortcut(24 + CTRL, menuOpen); - Menu.AddShortcut(31 + CTRL, menuSave); - Menu.AddShortcut(49 + CTRL, menuNew); - Menu.AddShortcut(67 + CTRL, menuBuild); - Menu.AddShortcut(66 + CTRL, menuDebug); - Menu.AddShortcut(83 + CTRL, menuRemove); - Menu.AddShortcut(22 + CTRL, menuUpper); - Menu.AddShortcut(38 + CTRL, menuLower); - Menu.AddShortcut(60 + CTRL, menuToggleBookmark); - Menu.AddShortcut(72 + CTRL, menuMoveUp); - Menu.AddShortcut(80 + CTRL, menuMoveDown); - Menu.AddShortcut(83, menuDelete); - Menu.AddShortcut(67, menuRun); - Menu.AddShortcut(15, menuIncInd); - Menu.AddShortcut(14 + SHIFT, menuDecInd); - Menu.AddShortcut(60 + SHIFT, menuPrevBookmark); - Menu.AddShortcut(60, menuNextBookmark); - Menu.AddShortcut(61 + SHIFT, menuFindPrev); - Menu.AddShortcut(61, menuFindNext); -END Shortcuts; - - -PROCEDURE HideSearch; -BEGIN - SetFocus(FindEdit, FALSE); - searchOpened := FALSE; - LEFT := LEFT_PADDING; - resize; - draw_window -END HideSearch; - - -PROCEDURE KeyDown (key: INTEGER); -VAR - keyCode, ah: INTEGER; - shift, ctrl, rep: BOOLEAN; -BEGIN - K.getKBState(shift, ctrl); - rep := FALSE; - keyCode := key DIV 65536; - - (* Numpad *) - ah := (key DIV 256) MOD 256; - CASE keyCode OF - |83: IF ah = 46 THEN keyCode := 52 END (* . / Del *) - |82: IF ah = 48 THEN keyCode := 11 END (* 0 / Ins *) - |79: IF ah = 49 THEN keyCode := 2 END (* 1 / End *) - |80: IF ah = 50 THEN keyCode := 3 END (* 2 / Down *) - |81: IF ah = 51 THEN keyCode := 4 END (* 3 / PgDn *) - |75: IF ah = 52 THEN keyCode := 5 END (* 4 / <- *) - |76: IF ah = 55 THEN keyCode := -1 END (* 5 / --- *) - |77: IF ah = 54 THEN keyCode := 7 END (* 6 / -> *) - |71: IF ah = 55 THEN keyCode := 8 END (* 7 / Home *) - |72: IF ah = 56 THEN keyCode := 9 END (* 8 / Up *) - |73: IF ah = 57 THEN keyCode := 10 END (* 9 / PgUp *) - ELSE - (* nothing to do *) - END; - - IF confirm THEN - IF keyCode = 28 THEN (* Enter *) - save(text); - IF ~text.modified THEN - closeFile(FALSE, curText) - END - END; - key := -1 - ELSE - IF keyCode = -1 THEN - key := -1 - ELSIF keyCode = 61 THEN (* F3 *) - key := -1; - IF search & (searchText # "") THEN - IF shift THEN - notFound := ~T.findNext(text, ~BKW.value) - ELSE - notFound := ~T.findNext(text, BKW.value) - END - END - ELSIF keyCode = 60 THEN (* F2 *) - key := -1; - IF ctrl THEN - T.toggleLabel(text) - ELSE - T.gotoLabel(text, ~shift) - END - ELSIF keyCode = 66 THEN (* F8 *) - key := -1; - IF ctrl THEN - ProgramDebug - END - ELSIF keyCode = 67 THEN (* F9 *) - key := -1; - IF ctrl THEN - ProgramBuild - ELSE - ProgramRun - END - ELSIF keyCode = 68 THEN (* F10 *) - IF shift THEN - ShowMenu(context) - ELSE - ShowMenu(menuFile) - END; - key := -1 - ELSIF keyCode = 1 THEN (* Esc *) - IF search THEN - IF shift THEN - HideSearch - ELSE - Search - END - END; - key := -1 - ELSIF (keyCode = 55) & (key DIV 256 MOD 256 = 52) THEN (* PrtScn *) - key := -1 - ELSIF (keyCode = 14) & shift THEN (* shift+Backspace *) - key := -1; - T.input(text, -8) - ELSIF (keyCode = 15) & ctrl THEN (* ctrl+Tab *) - key := -1; - SwitchTab((curText + 1) MOD textsCount) - ELSIF ((keyCode = 33) OR (keyCode = 35)) & ctrl THEN (* ctrl+F, ctrl+H*) - key := -1; - ShowSearchPanel(FALSE) - ELSIF (keyCode = 34) & ctrl THEN (* ctrl+G *) - key := -1; - ShowSearchPanel(TRUE) - ELSIF (keyCode = 18) & ctrl THEN (* ctrl+E *) - key := -1; - T.selectWord(text) - ELSE - IF EditBox_Focus(FindEdit) THEN - IF keyCode = 15 THEN (* Tab *) - IF shift THEN - SetFocus(GotoEdit, TRUE) - ELSE - SetFocus(ReplaceEdit, TRUE) - END - ELSIF keyCode = 28 THEN (* Enter *) - IF searchOpened & (searchText # "") THEN - notFound := ~T.findNext(text, BKW.value) - END - ELSE - EB.key(FindEdit, key); - EditBox_Get(FindEdit, new_searchText); - IF new_searchText # searchText THEN - searchText := new_searchText; - notFound := ~T.search(text, searchText, cs, whole) - END - END - ELSIF EditBox_Focus(ReplaceEdit) THEN - IF keyCode = 15 THEN (* Tab *) - IF shift THEN - SetFocus(FindEdit, TRUE) - ELSE - SetFocus(GotoEdit, TRUE) - END - ELSIF keyCode = 28 THEN (* Enter *) - IF searchOpened & (searchText # "") THEN - notFound := ~T.findNext(text, BKW.value) - END - ELSE - EB.key(ReplaceEdit, key); - EditBox_Get(ReplaceEdit, replaceText) - END - ELSIF EditBox_Focus(GotoEdit) THEN - IF keyCode = 15 THEN (* Tab *) - IF shift THEN - SetFocus(ReplaceEdit, TRUE) - ELSE - SetFocus(FindEdit, TRUE) - END - ELSE - IF (key DIV 256) MOD 256 = 13 THEN - goto - ELSE - EB.key(GotoEdit, key) - END - 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, 91, 219, 92, 220: key := -1 (* insert, windows *) - |93: ShowMenu(context); key := -1 - |83: key := 46 - |59, 62..66, 87, 88: key := -1 (* F1, F4..F8, 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; - OpenDial - |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, - 20: key := -1; - NewFile - ELSE - key := -1 - END - ELSE - T.input(text, E.cp866[key DIV 256 MOD 256]); - IF key DIV 256 MOD 256 = 13 THEN - rep := TRUE - END; - key := -1 - END - END; - IF key >= 0 THEN - T.key(text, key, shift, ctrl); - IF ((key = 38) OR (key = 40) OR (key = ORD("D"))) & ctrl THEN - rep := TRUE - END - END - END - END - END; - IF key # -2 THEN - repaint; - IF rep THEN - repaint - END - END -END KeyDown; - - -PROCEDURE BtnClick; -VAR - btn: INTEGER; - middle, exit: BOOLEAN; - menu: Menu.tMenu; -BEGIN - exit := FALSE; - btn := K.ButtonCode(middle); - IF U.between(Tabs.btnID, 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 - ELSIF U.between(Tabs.btnClose, btn, Tabs.btnClose + maxTexts - 1) THEN - DEC(btn, Tabs.btnClose); - IF texts[btn].modified THEN - SwitchTab(btn) - END; - closeFile(TRUE, btn); - middle := TRUE; - btn := 0 - ELSE - IF middle THEN - btn := 0 - END - END; - IF btn # 0 THEN - menu := Menu.ClickMain(mainMenu, btn); - IF menu # NIL THEN - ShowMenu(menu); - btn := 0 - END - END; - - CASE btn OF - |0: - |Tabs.btnLeft, Tabs.btnRight: - Tabs.scroll(tabs, btn); - switch := TRUE - |btnNo: - exit := closing; - closeFile(FALSE, curText); - repaint - |btnYes: - exit := closing; - save(text); - IF ~text.modified THEN - closeFile(FALSE, curText) - END; - repaint - |btnClose: - exit := TRUE - |btnNew: - NewFile - |btnOpen: - OpenDial - |btnSave: - save(text) - |btnSearch: - ShowSearchPanel(FALSE) - |btnCloseSearch: - Search - |btnHideSearch: - HideSearch - |btnUndo: - T.undo(text) - |btnRedo: - T.redo(text) - |btnUpper: - T.chCase(text, TRUE) - |btnLower: - T.chCase(text, FALSE) - |btnBuild: - ProgramBuild - |btnRun: - ProgramRun - |btnFindNext: - IF searchText # "" THEN - notFound := ~T.findNext(text, BKW.value); - SetFocus(FindEdit, FALSE) - END - |btnReplace: - T.replace(text, replaceText, LENGTH(searchText)); - SetFocus(FindEdit, FALSE) - |btnReplaceAll: - notFound := ~T.search(text, searchText, cs, whole); - IF ~notFound THEN - replaced := T.replaceAll(text, replaceText, LENGTH(searchText)); - END; - SetFocus(FindEdit, FALSE) - |btnGoto: - goto - END; - - IF ~middle THEN - IF exit THEN - Close - ELSE - repaint - END - 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; - pos1, pos2: T.tPoint; - shift, ctrl: BOOLEAN; - - - PROCEDURE EditBox (VAR eb: EB.tEditBox); - VAR - focus: BOOLEAN; - BEGIN - focus := EditBox_Focus(eb); - EB.mouse(eb); - IF focus # EditBox_Focus(eb) THEN - SetFocus(eb, TRUE); - repaint - END - END EditBox; - - -BEGIN - CloseMenu; - IF ~resized THEN - msState := K.MouseState(); - IF ~(0 IN msState) OR (16 IN msState) THEN - leftButton := FALSE - END; - scroll := K.Scroll(); - IF scroll # 0 THEN - K.getKBState(shift, ctrl); - IF shift THEN - T.scroll(text, scroll*3, 0) - ELSE - T.scroll(text, 0, scroll*3) - END; - repaint - END; - IF leftButton THEN - IF K.GetTickCount() - time >= DELAY THEN - T.getPos(text, pos1.Y, pos1.X); - mouse(x, y); - T.mouse(text, x, y); - T.getPos(text, pos2.Y, pos2.X); - IF (pos1.X # pos2.X) OR (pos1.Y # pos2.Y) THEN - repaint - END - END - END; - - Scroll.mouse(hScroll); - Scroll.mouse(vScroll); - msState := K.MouseState(); - T.getScroll(text, scrollX, scrollY); - IF (hScroll.value # scrollX) OR (vScroll.value # scrollY) THEN - T.scroll(text, hScroll.value - scrollX, vScroll.value - scrollY); - 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 U.between(-4, x - firstClickX, 4) & U.between(-4, y - firstClickY, 4) THEN - IF U.between(0, x, canvas.width - 1) & U.between(0, y, canvas.height - 1) THEN - leftButton := FALSE; - T.selectWord(text); - repaint - ELSIF Tabs.DblClicked(tabs, x + LEFT, y + TOP) THEN - leftButton := FALSE; - NewFile; - repaint - END - ELSE - firstClickX := x; - firstClickY := y; - time := click(firstClickX, firstClickY) - END - END; - IF msState = {} THEN - mouse(x, y); - Menu.MouseMove(mainMenu, x + LEFT, y + TOP) - END - END; - IF search & searchOpened THEN - CheckBox.mouse(BKW); - CheckBox.mouse(CS); - CheckBox.mouse(WH); - EditBox(FindEdit); - EditBox(ReplaceEdit); - EditBox(GotoEdit); - IF (CS.value # cs) OR (WH.value # whole) THEN - cs := CS.value; - whole := WH.value; - 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 - onClose: BOOLEAN; -BEGIN - onClose := (Menu.MenuItem = menuClose) OR (Menu.MenuItem = menuExit); - IF ~onClose THEN - ClickMenu - END; - K.GetSystemColors; - IF ~K.RolledUp() THEN - K.ClientSize(width, height); - IF (width # cliWidth) OR (height # cliHeight) THEN - cliWidth := width; - cliHeight := height; - resize; - resized := TRUE - END - ELSE - SetCaption(text.fileName) - END; - draw_window; - IF SkinHeight # K.SkinHeight() THEN - SkinHeight := K.SkinHeight(); - Redraw(resized, width, height, cliWidth, cliHeight) - END; - IF onClose THEN - ClickMenu - END -END Redraw; - - -PROCEDURE ScrollChange; -BEGIN - T.scroll(text, hScroll.btn, vScroll.btn); - IF menuActive THEN - draw_window; - menuActive := FALSE - ELSE - repaint - END -END ScrollChange; - - -PROCEDURE receiveIPC; -VAR - x, y, cliX, cliY, winX, winY: INTEGER; -BEGIN - K.ClientPos(cliX, cliY); - K.WinPos(winX, winY); - x := IPC[2] DIV 65536 - cliX - winX; - y := IPC[2] MOD 65536 - cliY - winY; - Menu.MouseMove(mainMenu, x, y); - IPC[1] := 0; - IPC[0] := 0 -END receiveIPC; - - -PROCEDURE main; -VAR - fileName, filePath: RW.tFileName; - width, height, cliWidth, cliHeight: INTEGER; - resized: BOOLEAN; - firstClickX, firstClickY, time, blink, i: INTEGER; - key, scr: INTEGER; - text_ptr, text_size, errno: INTEGER; -BEGIN - mainTID := K.ThreadID(); - header := ""; - K.GetSystemColors; - switch := FALSE; - closing := FALSE; - textsCount := 0; - curText := 0; - Args.GetArg(0, AppPath); - Ini.load(AppPath); - Ini.getSettings; - runScript := Ini.runScript; - buildScript := Ini.buildScript; - debugScript := Ini.debugScript; - leftButton := FALSE; - resized := FALSE; - newtab := FALSE; - K.ScreenSize(winWidth, winHeight); - scrollWidth := winHeight DIV 35; - winWidth := (winWidth*80) DIV 100 - (128 + 30); - winHeight := winHeight - (128 + 30); - winWidth := MAX(winWidth, minWinWidth); - winHeight := MAX(winHeight, minWinHeight); - cliWidth := winWidth; - cliHeight := winHeight; - - LEFT := LEFT_PADDING; - RIGHT := scrollWidth - 2; - BOTTOM := SB.height() + scrollWidth - 1; - SkinHeight := K.SkinHeight(); - canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 11 + RIGHT_PADDING), winHeight - (TOP + BOTTOM + 5 - ClippingArea) - SkinHeight); - DEC(canvas.height, ClippingArea); - tabs := Tabs.create(); - Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, canvas.width, Tabs.tabHeight); - font := G.fonts[Ini.font]; - G.SetFont(canvas, font); - T.init(resetTimer, Ini.lineNumbers, Ini.autoIndents, Ini.autoBrackets, Ini.trimSpace, Ini.lineSpacing); - Ini.selectSection(Ini.theme); - T.setCanvas(canvas); - - mainMenu := Menu.CreateMain(mainMenuBtn); - - Menu.init(resetTimer); - context := CreateContextMenu(); - menuFile := CreateMenuFile(); - subCurLine := CreateMenuCurLine(); - subIndent := CreateMenuIndent(); - subCase := CreateMenuCase(); - menuEdit := CreateMenuEdit(); - subCurLine.parent := menuEdit; - subIndent.parent := menuEdit; - subCase.parent := menuEdit; - subBookmark := CreateMenuBookmark(); - menuSearch := CreateMenuSearch(); - subBookmark.parent := menuSearch; - subEOL := CreateMenuEOL(); - menuEncoding := CreateMenuEncoding(); - subEOL.parent := menuEncoding; - menuView := CreateMenuView(); - menuLanguage := CreateMenuLanguage(); - menuProgram := CreateMenuProgram(); - menuTools := CreateMenuTools(); - menuOptions := CreateMenuOptions(); - - - Menu.AddMainItem(mainMenu, "file", menuFile); - Menu.AddMainItem(mainMenu, "edit", menuEdit); - Menu.AddMainItem(mainMenu, "search", menuSearch); - Menu.AddMainItem(mainMenu, "encoding", menuEncoding); - Menu.AddMainItem(mainMenu, "view", menuView); - Menu.AddMainItem(mainMenu, "language", menuLanguage); - Menu.AddMainItem(mainMenu, "program", menuProgram); - Menu.AddMainItem(mainMenu, "tools", menuTools); - Menu.AddMainItem(mainMenu, "options", menuOptions); - Shortcuts; - - Toolbar.create(toolbar, LEFT_PADDING + 5, toolbarTop); - Toolbar.add(toolbar, btnNew, Icons.icoNew, ""); - Toolbar.add(toolbar, btnOpen, Icons.icoOpen, ""); - Toolbar.add(toolbar, btnSave, Icons.icoSave, ""); - Toolbar.delimiter(toolbar); - Toolbar.add(toolbar, btnSearch, Icons.icoSearch, ""); - Toolbar.delimiter(toolbar); - Toolbar.add(toolbar, btnUndo, Icons.icoUndo, ""); - Toolbar.add(toolbar, btnRedo, Icons.icoRedo, ""); - Toolbar.delimiter(toolbar); - Toolbar.add(toolbar, btnUpper, -1, "AB"); - Toolbar.add(toolbar, btnLower, -1, "ab"); - Toolbar.delimiter(toolbar); - Toolbar.add(toolbar, btnBuild, Icons.icoBuild, ""); - Toolbar.add(toolbar, btnRun, Icons.icoRun, ""); - - filePath := "/sys"; - IF Args.argc = 1 THEN - text := T.New(); - insert(0, text); - T.SetPos(text, 0, 0) - END; - FOR i := 1 TO Args.argc - 1 DO - Args.GetArg(i, fileName); - IF fileName[0] # "*" THEN - IF open(fileName) THEN - U.getPath(fileName, filePath) - END - ELSE - K.docpack(fileName, text_ptr, text_size); - IF text_ptr # 0 THEN - text := T.open("", text_ptr, text_size, errno); - IF text # NIL THEN - insert(0, text); - T.SetPos(text, 0, 0) - END - END - END - END; - IF textsCount = 0 THEN - K.Exit - END; - SwitchTab(textsCount - 1); - - Scroll.create(FALSE, canvas.width + 1, scrollWidth, scrollWidth, scrollWidth*3 DIV 2, ScrollChange, hScroll); - Scroll.create(TRUE, scrollWidth, canvas.height + 2, scrollWidth, scrollWidth*3 DIV 2, ScrollChange, vScroll); - T.resize(canvas.width, canvas.height); - confirm := FALSE; - notFound := FALSE; - menuFindClicked := FALSE; - menuActive := FALSE; - search := FALSE; - searchOpened := FALSE; - createSearchForm; - new_searchText := ""; - searchText := ""; - cs := FALSE; - whole := FALSE; - replaced := 0; - - OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, ""); - - IPC[1] := 0; - IPC[0] := 0; - K.SetIPC(IPC); - K.SetEventsMask({0, 1, 2, 5, 6, 31}); - draw_window; - blink := Ini.blink; - IF blink <= 0 THEN - blink := 0 - ELSIF blink < 30 THEN - blink := 30 - END; - timerEnabled := TRUE; - CursorTime := K.GetTickCount(); - WHILE TRUE DO - - CurrentTime := K.GetTickCount(); - IF (CurrentTime - CursorTime > blink) & (blink > 0) & timerEnabled & ~K.RolledUp() THEN - CursorTime := CurrentTime; - T.cursor(text); - drawText - END; - - CASE K.EventTimeout(10) OF - |0: - |1: Redraw(resized, width, height, cliWidth, cliHeight) - |2: - key := K.GetKey(); - IF ~K.RolledUp() THEN - KeyDown(key) - END - |3: BtnClick - |6: - IF ~K.RolledUp() THEN - MouseEvent(resized, firstClickX, firstClickY, time) - ELSE - scr := K.Scroll() - END - |7: receiveIPC - END; - IF newtab THEN - Redraw(resized, width, height, cliWidth, cliHeight); - newtab := FALSE - END - END -END main; - - -BEGIN - main -END CEdit. +(* + Copyright 2021-2023 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, Args, + U := Utils, Lines, Menu, List, + G := Graph, T := Text, E := Encodings, + CB := Clipboard, Languages, + ChangeLog, Scroll, CheckBox, Icons, + RW, Ini, EB := EditBox, Tabs, Toolbar, SB := StatusBar; + +CONST + VERSION = "1.0"; + APPNAME = "CEdit"; + HEADER = APPNAME + " " + VERSION; + + + ShellFilter = ""; + EditFilter = "sh|inc|txt|asm|ob07|c|cpp|h|pas|pp|lua|ini|json"; + + fontWidth = K.fontWidth; + fontHeight = K.fontHeight; + + btnClose = 1; + + btnNew = 20; + btnOpen = 21; + btnSave = 22; + btnSearch = 23; + btnUndo = 24; + btnRedo = 25; + btnUpper = 26; + btnLower = 27; + btnBuild = 28; + btnRun = 29; + + btnYes = 40; + btnNo = 41; + btnFindNext = 42; + btnReplace = 43; + btnReplaceAll = 44; + btnGoto = 45; + btnCloseSearch = 46; + btnHideSearch = 47; + + mainMenuBtn = 60; + + btnHeight = 25; + btnWidth = 75; + + toolbarTop = Menu.MainMenuHeight + 3; + + TOP = toolbarTop + Toolbar.BtnSize + 9 + Tabs.tabHeight; + + minWinWidth = 635; minWinHeight = 550; + + SEARCH_PADDING = 10; + LEFT_PADDING = 1; + RIGHT_PADDING = 1; + + EditBox_Width = 180; + EDITBOX_MAXCHARS = 500; + + menuCut = 1; + menuCopy = 2; + menuPaste = 3; + menuDelete = 4; + menuSelectAll = 5; + + menuUndo = 6; + menuRedo = 7; + + menuCurLine = 100; + menuIndent = 110; + menuCase = 120; + + menuNew = 10; + menuOpen = 11; + menuSave = 12; + menuSaveAs = 13; + menuSaveAll = 14; + menuFolder = 15; + menuClose = 16; + menuExit = 17; + + menuFontSmall = 20; + menuFontMedium = menuFontSmall + 1; + menuFontLarge = menuFontMedium + 1; + menuIncLS = menuFontLarge + 1; + menuDecLS = menuIncLS + 1; + menuColors = 1000; + menuMaxColors = menuColors + Ini.MAX_SECTIONS - 1; + + menuText = 30; + menuC = 31; + menuFasm = 32; + menuIni = 33; + menuJSON = 34; + menuLua = 35; + menuOberon = 36; + menuPascal = 37; + + menuBuild = 50; + menuBuildScript = 51; + menuRun = 52; + menuRunScript = 53; + menuDebug = 54; + menuDebugScript = 55; + menuFASM = 56; + + menuUTF8BOM = 60; + menuUTF8 = 61; + menuCP866 = 62; + menuCP1251 = 63; + menuEOL = 140; + menuConv1251_866 = 64; + menuConv866_1251 = 65; + + menuPipet = 70; + menuMagnify = 71; + menuBoard = 72; + menuSysFunc = 73; + + menuFind = 80; + menuFindNext = 81; + menuFindPrev = 82; + menuGoto = 83; + menuBookmark = 130; + + menuLineNumbers = 90; + menuAutoIndents = 91; + menuAutoBrackets = 92; + menuTrimSpace = 93; + + menuMoveUp = 101; + menuMoveDown = 102; + menuDuplicate = 103; + menuRemove = 104; + + menuIncInd = 111; + menuDecInd = 112; + + menuUpper = 121; + menuLower = 122; + + menuToggleBookmark = 131; + menuNextBookmark = 132; + menuPrevBookmark = 133; + + menuLF = 141; + menuCRLF = 142; + menuCR = 143; + + maxTexts = 32; + + SHIFT = Menu.SHIFT; + CTRL = Menu.CTRL; + + ClippingArea = 32 + T.MaxLineSpacing; + + +VAR + header: RW.tFileName; + canvas: G.tCanvas; + font: G.tFont; + + tabs: Tabs.tTabs; + text: T.tText; + texts: ARRAY maxTexts OF T.tText; + textsCount, curText: INTEGER; + + winWidth, winHeight: INTEGER; + SkinHeight, scrollWidth: INTEGER; + AppPath, runScript, buildScript, debugScript, CurFolder: RW.tFileName; + OD: OpenDlg.Dialog; + confirm, notFound, menuFindClicked, search, searchOpened: BOOLEAN; + + switch, closing, newtab: BOOLEAN; + leftButton: BOOLEAN; + LEFT, RIGHT, BOTTOM: INTEGER; + + FindEdit, ReplaceEdit, GotoEdit: EB.tEditBox; + hScroll, vScroll: Scroll.tScroll; + CS, WH, BKW: CheckBox.tCheckBox; + + new_searchText, searchText, replaceText, gotoText: T.tString; + cs, whole: BOOLEAN; + + replaced: INTEGER; + + context, menuFile, menuEdit, menuSearch, menuEncoding, + menuView, menuLanguage, menuProgram, menuTools, menuOptions, + subCurLine, subIndent, subCase, subBookmark, subEOL: Menu.tMenu; + + mainMenu: Menu.tMain; + + menuActive: BOOLEAN; + + toolbar: Toolbar.tToolbar; + + CursorTime, CurrentTime: INTEGER; + timerEnabled: BOOLEAN; + + IPC: ARRAY 64 OF INTEGER; mainTID: INTEGER; + + +PROCEDURE EditBox_Focus (edit: EB.tEditBox): BOOLEAN; + RETURN 1 IN edit.flags +END EditBox_Focus; + + +PROCEDURE resetTimer; +BEGIN + IF EditBox_Focus(FindEdit) OR EditBox_Focus(ReplaceEdit) OR EditBox_Focus(GotoEdit) THEN + T.hideCursor; + timerEnabled := FALSE + ELSE + T.showCursor; + timerEnabled := TRUE + END; + CursorTime := CurrentTime +END resetTimer; + + +PROCEDURE EditBox_SetFocus (VAR edit: EB.tEditBox; value: BOOLEAN); +BEGIN + IF value THEN + INCL(edit.flags, 1) + ELSE + EXCL(edit.flags, 1) + END; + IF search & searchOpened THEN + EB.draw(edit) + END +END EditBox_SetFocus; + + +PROCEDURE SetFocus (VAR edit: EB.tEditBox; value: BOOLEAN); +BEGIN + EditBox_SetFocus(FindEdit, FALSE); + EditBox_SetFocus(ReplaceEdit, FALSE); + EditBox_SetFocus(GotoEdit, FALSE); + EditBox_SetFocus(edit, value); + resetTimer +END 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; +VAR + top, left, right, bottom, x, y, width: INTEGER; +BEGIN + timerEnabled := FALSE; + CursorTime := CurrentTime; + 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.colors.work); + Rect(left, top, right, bottom, K.colors.line); + K.DrawText(x, y, K.colors.work_text, s); +END Message; + + +PROCEDURE NotFound; +BEGIN + IF notFound THEN + Message("not found"); + IF menuFindClicked THEN + menuFindClicked := FALSE + ELSE + notFound := FALSE + END; + SetFocus(FindEdit, TRUE) + 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; + SetFocus(FindEdit, TRUE) + END +END Replaced; + + +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 SetCaption (fileName: RW.tFileName); +VAR + newHeader: RW.tFileName; +BEGIN + newHeader := HEADER; + IF text.fileName # "" THEN + U.append8(newHeader, " - "); + U.append8(newHeader, text.fileName) + END; + IF newHeader # header THEN + header := newHeader; + K.SetCaption(header) + END +END SetCaption; + + +PROCEDURE Status (text: T.tText; height: INTEGER); +VAR + line, col, chars, lines: INTEGER; +BEGIN + T.getPos(text, col, line); + T.getSelCnt(text, chars, lines); + SB.setWidth(canvas.width + scrollWidth); + SB.setPos(line, col); + IF text.foundSel # 0 THEN + SB.setSel("", text.foundCur, text.foundCnt, " / ") + ELSE + SB.setSel("sel: ", chars, lines, " | ") + END; + SB.setEnc(E.eolNames[T.getEol(text)], E.names[T.getEnc(text)]); + SB.draw(LEFT, height - BOTTOM + scrollWidth - 1); + Tabs.modify(tabs, getIdx(text), text.modified) +END Status; + + +PROCEDURE DrawScroll (VAR scroll: Scroll.tScroll; left, top, value, maxVal: INTEGER); +BEGIN + scroll.maxVal := maxVal; + scroll.left := left; + scroll.top := top; + Scroll.setValue(scroll, value); + Scroll.draw(scroll) +END DrawScroll; + + +PROCEDURE drawText; +BEGIN + G.SetColor(canvas, K.colors.line); + G.VLine(canvas, 0, 0, canvas.height - 1); + G.DrawCanvas(canvas, LEFT, TOP) +END drawText; + + +PROCEDURE repaint; +VAR + width, height, scrollX, scrollY: INTEGER; +BEGIN + IF (text # NIL) & ~K.RolledUp() THEN + IF confirm THEN + K.DeleteButton(btnYes); + K.DeleteButton(btnNo); + confirm := FALSE; + resetTimer; + closing := FALSE + END; + IF ~search OR (searchText = "") THEN + T.wordSel(text) + END; + K.ClientSize(width, height); + IF switch THEN + Status(text, height); + Tabs.draw(tabs); + IF search & T.search(text, searchText, cs, whole) THEN END; + switch := FALSE + END; + T.draw(text); + Status(text, height); + + T.getScroll(text, scrollX, scrollY); + DrawScroll(vScroll, LEFT + canvas.width, TOP - 1, scrollY, text.count - 1); + DrawScroll(hScroll, LEFT, TOP + canvas.height, scrollX, text.maxLength); + IF search & searchOpened THEN + CheckBox.draw(BKW); + CheckBox.draw(CS); + CheckBox.draw(WH); + END; + IF ~search OR (searchText = "") THEN + T.wordSel(text) + END; + drawText; + NotFound; + Replaced; + Toolbar.enable(toolbar, btnSave, text.modified); + Toolbar.enable(toolbar, btnUndo, ~ChangeLog.isFirstGuard(text.edition)); + Toolbar.enable(toolbar, btnRedo, ~ChangeLog.isLastGuard(text.edition)); + Toolbar.enable(toolbar, btnUpper, T.selected(text)); + Toolbar.enable(toolbar, btnLower, T.selected(text)); + Toolbar.enable(toolbar, btnBuild, (buildScript # "") OR text.fasm); + Toolbar.enable(toolbar, btnRun, (runScript # "") OR text.fasm); + Toolbar.drawIcons(toolbar) + 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); + IF font # G.fonts[2] THEN + SB.SetFont(font) + ELSE + SB.SetFont(G.fonts[1]) + END; + BOTTOM := SB.height() + scrollWidth - 1; + G.destroy(canvas); + canvas := G.CreateCanvas(cliWidth - (LEFT + RIGHT + 2 + RIGHT_PADDING), cliHeight - (TOP + BOTTOM + 1 - ClippingArea)); + DEC(canvas.height, ClippingArea); + Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, cliWidth - (LEFT + RIGHT + 2 + RIGHT_PADDING), Tabs.tabHeight); + G.SetFont(canvas, font); + T.setCanvas(canvas); + T.resize(canvas.width, canvas.height); + Scroll.resize(vScroll, vScroll.width, canvas.height + 2); + Scroll.resize(hScroll, canvas.width + 1, hScroll.height); +END resize; + + +PROCEDURE SearchPanel (left, top: INTEGER); +VAR + y, right, bottom: INTEGER; +BEGIN + DEC(top, Tabs.tabHeight); + right := left + EditBox_Width + SEARCH_PADDING*2; + bottom := top + 395 + btnHeight + SEARCH_PADDING; + Rect(left, top, right, bottom, K.colors.line); + + K.CreateButton(btnCloseSearch, right - 20, top, 20, 20, Tabs.btnCloseColor, ""); + 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); + + K.CreateButton(btnHideSearch, right - 40, top, 20, 20, K.colors.button, ""); + K.DrawLine(right - 34, top + 14, right - 26, top + 14, K.colors.button_text); + K.DrawLine(right - 34, top + 15, right - 26, top + 15, K.colors.button_text); + + INC(top, 15); + INC(left, SEARCH_PADDING); + K.DrawText866(left, top, K.colors.work_text, "find"); + K.DrawText866(left, top + 55, K.colors.work_text, "replace with"); + K.DrawText866(left, top + 330, K.colors.work_text, "go to line"); + BKW.top := top + 110; + BKW.left := left; + CS.top := top + 140; + CS.left := left; + WH.top := top + 170; + WH.left := left; + FindEdit.top := top + 20; + ReplaceEdit.top := top + 75; + GotoEdit.top := top + 350; + FindEdit.left := left; + ReplaceEdit.left := left; + GotoEdit.left := left; + EB.draw(FindEdit); + EB.draw(ReplaceEdit); + EB.draw(GotoEdit); + y := top + 200; + K.CreateButton(btnFindNext, left, y, btnWidth, btnHeight, K.colors.button, "next"); INC(y, btnHeight + 10); + K.CreateButton(btnReplace, left, y, btnWidth, btnHeight, K.colors.button, "replace"); INC(y, btnHeight + 10); + K.CreateButton(btnReplaceAll, left, y, btnWidth + 5*fontWidth - 2, btnHeight, K.colors.button, "replace all"); + K.CreateButton(btnGoto, left, top + 380, btnWidth, btnHeight, K.colors.button, "go"); +END SearchPanel; + + +PROCEDURE draw_window; +VAR + width, height: INTEGER; +BEGIN + K.BeginDraw; + K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.colors.work, 73H, 0, 0, ""); + IF (text # NIL) & ~K.RolledUp() THEN + IF confirm THEN + resetTimer + END; + confirm := FALSE; + K.ClientSize(width, height); + + K.DrawRect(0, 0, width, TOP - 1, K.colors.work); + K.DrawRect(0, 0, LEFT, height, K.colors.work); + K.DrawRect(width - RIGHT_PADDING, 0, RIGHT_PADDING, height, K.colors.work); + K.DrawRect(LEFT + canvas.width + 1, TOP + canvas.height + 1, scrollWidth - 1, scrollWidth - 1, K.colors.work); + Menu.DrawMain(mainMenu); + + Toolbar.draw(toolbar); + SetCaption(text.fileName); + Status(text, height); + IF search & searchOpened THEN + SearchPanel(LEFT_PADDING, TOP) + END; + Tabs.draw(tabs); + repaint + END; + K.EndDraw +END draw_window; + + +PROCEDURE mouse (VAR x, y: INTEGER); +VAR + msState: SET; +BEGIN + K.mouse(msState, x, y); + DEC(x, LEFT); + DEC(y, TOP) +END mouse; + + +PROCEDURE stopTimer; +BEGIN + T.hideCursor; + timerEnabled := FALSE; + CursorTime := CurrentTime; + repaint +END stopTimer; + + +PROCEDURE OpenFile (VAR FileName: RW.tFileName; filter: ARRAY OF CHAR); +BEGIN + stopTimer; + 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; + resetTimer +END OpenFile; + + +PROCEDURE error (s: RW.tFileName); +VAR + temp: RW.tFileName; +BEGIN + temp := "'CEdit: "; + U.append8(temp, s); + U.append8(temp, "' -E"); + K.Run("/sys/@notify", temp) +END error; + + +PROCEDURE saveError (name: RW.tFileName); +VAR + s: RW.tFileName; +BEGIN + s := "error saving file "; + U.append8(s, name); + error(s) +END saveError; + + +PROCEDURE saveAs (text: T.tText); +VAR + fileName, name: 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."; + Languages.getExt(text.lang, ext); + U.append8(OD.FileName, ext) + END; + OpenFile(fileName, EditFilter); + IF fileName # "" THEN + IF T.save(text, fileName) THEN + T.setName(text, fileName); + U.getFileName(fileName, name, U.SLASH); + Tabs.rename(tabs, curText, name) + ELSE + saveError(fileName) + END + END +END saveAs; + + +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) THEN + saveError(text.fileName) + END + ELSE + curText := getIdx(text); + Switch(text); + saveAs(text) + END; + Tabs.modify(tabs, getIdx(text), text.modified) + END +END save; + + +PROCEDURE saveAll; +VAR + i: INTEGER; + txt: T.tText; +BEGIN + i := textsCount - 1; + WHILE i >= 0 DO + txt := texts[i]; + IF txt.modified THEN + T.switch(txt); + save(txt) + END; + DEC(i) + END; + T.switch(text) +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; +CONST + width = btnWidth*2 + 30; + height = btnHeight*2 + 20; +VAR + left, top, right, bottom: INTEGER; +BEGIN + stopTimer; + 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.colors.work); + Rect(left, top, right, bottom, K.colors.line); + K.DrawText866(left + (width - 10*fontWidth) DIV 2, top + 10, K.colors.work_text, "save file?"); + K.CreateButton(btnYes, left + 10, top + 35, btnWidth, btnHeight, K.colors.button, "yes"); + K.CreateButton(btnNo, left + 20 + btnWidth, top + 35, btnWidth, btnHeight, K.colors.button, "no"); +END Confirm; + + +PROCEDURE closeFile (conf: BOOLEAN; n: INTEGER); +VAR + i: INTEGER; +BEGIN + IF texts[n].modified & conf THEN + Confirm + ELSE + Tabs.delete(tabs, n); + T.destroy(texts[n]); + FOR i := n + 1 TO textsCount - 1 DO + texts[i - 1] := texts[i] + END; + DEC(textsCount); + IF (curText = textsCount) OR (n < curText) THEN + DEC(curText) + END; + IF curText >= 0 THEN + Switch(texts[curText]) + ELSE + K.Exit + END; + draw_window + END +END closeFile; + + +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.lowcase8(n1); + U.lowcase8(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 SwitchTab (n: INTEGER); +BEGIN + curText := n; + Tabs.switch(tabs, n); + Switch(texts[n]); + resetTimer; + IF ~newtab THEN + draw_window + END +END SwitchTab; + + +PROCEDURE NewFile; +VAR + nov: T.tText; +BEGIN + IF textsCount < maxTexts THEN + nov := T.New(); + T.SetPos(nov, 0, 0); + insert(textsCount, nov); + newtab := TRUE; + SwitchTab(curText) + ELSE + error("too many files") + END +END NewFile; + + +PROCEDURE open (_fileName: RW.tFileName): BOOLEAN; +VAR + fileName: RW.tFileName; + nov: T.tText; + err, n: INTEGER; + res, empty: BOOLEAN; +BEGIN + res := TRUE; + IF textsCount < maxTexts THEN + fileName := _fileName; + IF fileName = "" THEN + OD._type := OpenDlg.topen; + OpenFile(fileName, EditFilter) + END; + IF fileName # "" THEN + n := getFileNum(fileName); + IF n = -1 THEN + nov := T.open(fileName, 0, 0, err); + IF nov = NIL THEN + error("error opening file"); + SwitchTab(curText); + res := FALSE + ELSE + T.switch(text); + empty := (textsCount = 1) & (text.fileName = "") & T.empty(text) & + ChangeLog.isFirstGuard(text.edition) & ChangeLog.isLastGuard(text.edition); + T.switch(nov); + T.SetPos(nov, 0, 0); + insert(textsCount, nov); + IF empty THEN + closeFile(FALSE, 0) + END; + Scroll.setValue(hScroll, 0); + Scroll.setValue(vScroll, 0) + END + ELSE + SwitchTab(n) + END + END + ELSE + error("too many files"); + res := FALSE + END + RETURN res +END open; + + +PROCEDURE OpenDial; +VAR + res: BOOLEAN; +BEGIN + res := open("") +END OpenDial; + + +PROCEDURE createSearchForm; +BEGIN + EB.create(LEFT_PADDING, TOP + 20, EditBox_Width, EDITBOX_MAXCHARS, FindEdit); + EB.create(LEFT_PADDING, TOP + 20 + 55, EditBox_Width, EDITBOX_MAXCHARS, ReplaceEdit); + EB.create(LEFT_PADDING, TOP + 20 + 330, EditBox_Width, EDITBOX_MAXCHARS, GotoEdit); + INCL(GotoEdit.flags, 15); + CheckBox.create("backward", BKW); + CheckBox.create("match case", CS); + CheckBox.create("whole word", WH); +END createSearchForm; + + +PROCEDURE EditBox_Get (edit: EB.tEditBox; VAR s: ARRAY OF WCHAR); +VAR + str: ARRAY EDITBOX_MAXCHARS + 1 OF CHAR; + i: INTEGER; +BEGIN + EB.get(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_Get; + + +PROCEDURE Search; +BEGIN + search := ~search; + LEFT := LEFT_PADDING; + IF search THEN + searchOpened := TRUE; + INC(LEFT, EditBox_Width + SEARCH_PADDING*2 + 4); + IF T.search(text, searchText, cs, whole) THEN END + ELSE + IF T.search(text, "", FALSE, FALSE) THEN END + END; + SetFocus(FindEdit, search); + resize; + draw_window +END Search; + + +PROCEDURE click (x, y: INTEGER): INTEGER; +VAR + scrollX, scrollY: INTEGER; + shift, ctrl: BOOLEAN; +BEGIN + K.getKBState(shift, ctrl); + T.getScroll(text, scrollX, scrollY); + T.scroll(text, hScroll.value - scrollX, vScroll.value - scrollY); + IF U.between(0, x, canvas.width - 1) & U.between(0, y, canvas.height - 1) THEN + leftButton := TRUE; + SetFocus(FindEdit, FALSE); + IF ~shift THEN + T.resetSelect(text) + END; + T.mouse(text, x, y) + END; + repaint + RETURN K.GetTickCount() +END click; + + +PROCEDURE Close; +VAR + cont: BOOLEAN; +BEGIN + closing := TRUE; + cont := TRUE; + WHILE (textsCount > 0) & cont DO + IF text.modified THEN + Confirm; + cont := FALSE + ELSE + closeFile(FALSE, curText); + repaint + END + END +END Close; + + +PROCEDURE CloseMenu; +BEGIN + Menu.close(subEOL); + Menu.close(subCurLine); + Menu.close(subIndent); + Menu.close(subCase); + Menu.close(subBookmark); + Menu.close(menuFile); + Menu.close(menuEdit); + Menu.close(menuSearch); + Menu.close(menuEncoding); + Menu.close(menuView); + Menu.close(menuLanguage); + Menu.close(menuProgram); + Menu.close(menuTools); + Menu.close(menuOptions); + Menu.close(context) +END CloseMenu; + + +PROCEDURE goto; +VAR + gotoVal: INTEGER; +BEGIN + EditBox_Get(GotoEdit, gotoText); + IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN + SetFocus(GotoEdit, FALSE) + END +END goto; + + +PROCEDURE Script (script: ARRAY OF CHAR); +BEGIN + IF script # "" THEN + U.getPath(script, CurFolder); + K.SetCurFolder(CurFolder); + K.Run("/sys/@open", script) + END +END Script; + + +PROCEDURE ShowSearchPanel (goto: BOOLEAN); +VAR + i: INTEGER; +BEGIN + IF T.selected(text) & ~goto THEN + T.getSelectedText(text, new_searchText); + IF new_searchText # "" THEN + i := 0; + WHILE (new_searchText[i] # 0X) & (new_searchText[i] # Lines.TAB) DO + INC(i) + END; + IF new_searchText[i] = 0X THEN + searchText := new_searchText; + EB.set(FindEdit, searchText); + notFound := ~T.search(text, searchText, cs, whole); + END + END + END; + IF ~search THEN + Search + ELSIF ~searchOpened THEN + search := FALSE; + Search + END; + IF goto THEN + SetFocus(GotoEdit, TRUE) + ELSE + SetFocus(FindEdit, TRUE) + END +END ShowSearchPanel; + + +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, enabled: BOOLEAN; +BEGIN + IF menu = context THEN + mouse(x, y); + IF ~(U.between(0, x, canvas.width - 1) & U.between(0, y, canvas.height - 1)) THEN + menu := NIL + END + ELSE + K.WinPos(winX, winY); + K.ClientPos(cliX, cliY); + x := winX + cliX; + y := Menu.MainMenuHeight + winY + cliY + END; + selected := T.selected(text); + + 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) + ELSIF (menu = menuEdit) OR (menu = context) THEN + Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition)); + Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition)); + Menu.setEnabled(menu, menuCut, selected); + Menu.setEnabled(menu, menuCopy, selected); + Menu.setEnabled(menu, menuDelete, selected); + Menu.setEnabled(menu, menuPaste, CB.available()); + IF menu = context THEN + 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); + menu.x := x; + x := 0 + END + ELSIF menu = menuEncoding THEN + Menu.option(menu, menuUTF8BOM, T.getEnc(text) = E.UTF8BOM); + Menu.option(menu, menuUTF8, T.getEnc(text) = E.UTF8); + Menu.option(menu, menuCP866, T.getEnc(text) = E.CP866); + Menu.option(menu, menuCP1251, T.getEnc(text) = E.CP1251) + ELSIF menu = menuView THEN + Menu.option(menu, menuFontSmall, font = G.fonts[0]); + Menu.option(menu, menuFontMedium, font = G.fonts[1]); + Menu.option(menu, menuFontLarge, font = G.fonts[2]); + Menu.setEnabled(menu, menuIncLS, T.LineSpacing < T.MaxLineSpacing); + Menu.setEnabled(menu, menuDecLS, T.LineSpacing > 0); + FOR i := 0 TO Ini.sections.count - 1 DO + Menu.option(menu, menuColors + i, Ini.curSectionNum = i) + END + ELSIF menu = menuLanguage THEN + Menu.option(menu, menuText, text.lang = Languages.langText); + Menu.option(menu, menuC, text.lang = Languages.langC); + Menu.option(menu, menuFasm, text.lang = Languages.langFasm); + Menu.option(menu, menuIni, text.lang = Languages.langIni); + Menu.option(menu, menuJSON, text.lang = Languages.langJSON); + Menu.option(menu, menuLua, text.lang = Languages.langLua); + Menu.option(menu, menuOberon, text.lang = Languages.langOberon); + Menu.option(menu, menuPascal, text.lang = Languages.langPascal); + ELSIF menu = menuProgram THEN + Menu.setEnabled(menu, menuBuild, (buildScript # "") OR text.fasm); + Menu.setEnabled(menu, menuDebug, (debugScript # "") OR text.fasm); + Menu.setEnabled(menu, menuRun, (runScript # "") OR text.fasm); + Menu.setEnabled(menu, menuBuildScript, ~text.fasm); + Menu.setEnabled(menu, menuDebugScript, ~text.fasm); + Menu.setEnabled(menu, menuRunScript, ~text.fasm); + Menu.check(menu, menuFASM, text.fasm) + ELSIF menu = menuOptions THEN + Menu.check(menu, menuLineNumbers, T.lineNumbers); + Menu.check(menu, menuAutoIndents, T.autoIndents); + Menu.check(menu, menuAutoBrackets, T.autoBrackets); + Menu.check(menu, menuTrimSpace, T.trimSpace) + END; + + enabled := search & (searchText # ""); + Menu.setEnabled(menuSearch, menuFindNext, enabled); + Menu.setEnabled(menuSearch, menuFindPrev, enabled); + + Menu.setEnabled(subIndent, menuIncInd, selected); + Menu.setEnabled(subIndent, menuDecInd, selected); + + Menu.setEnabled(subCase, menuUpper, selected); + Menu.setEnabled(subCase, menuLower, selected); + + Menu.option(subEOL, menuCRLF, T.getEol(text) = E.EOL_CRLF); + Menu.option(subEOL, menuLF, T.getEol(text) = E.EOL_LF); + Menu.option(subEOL, menuCR, T.getEol(text) = E.EOL_CR); + + IF menu # NIL THEN + timerEnabled := FALSE; + IF Menu.opened(menu) THEN + Menu.close(menu) + END; + Menu.open(menu, menu.x + x, y); + menuActive := TRUE + END +END ShowMenu; + + +PROCEDURE setScript (VAR script: RW.tFileName); +VAR + temp: RW.tFileName; +BEGIN + OpenFile(temp, ShellFilter); + IF temp # "" THEN + script := temp + END +END setScript; + + +PROCEDURE FasmCompile (run, debug: BOOLEAN); +VAR + curFileName, ext, outfile, path, param: RW.tFileName; +BEGIN + curFileName := texts[curText].fileName; + U.getFileName(curFileName, param, U.SLASH); + U.getFileName(curFileName, ext, "."); + U.getPath(curFileName, path); + outfile := param; + IF (ext # "") & ((LENGTH(ext) + 1) < LENGTH(outfile)) THEN + outfile[LENGTH(outfile) - LENGTH(ext) - 1] := 0X + ELSE + U.append8(outfile, ".kex") + END; + U.append8(param, ","); + U.append8(param, outfile); + U.append8(param, ","); + U.append8(param, path); + U.append8(param, U.SLASH); + IF run THEN + U.append8(param, ",run") + ELSIF debug THEN + U.append8(param, ",dbg") + END; + K.Run("/sys/develop/fasm", param) +END FasmCompile; + + +PROCEDURE ProgramBuild; +BEGIN + IF ~text.fasm THEN + Script(buildScript) + ELSE + FasmCompile(FALSE, FALSE) + END +END ProgramBuild; + + +PROCEDURE ProgramRun; +BEGIN + IF ~text.fasm THEN + Script(runScript) + ELSE + FasmCompile(TRUE, FALSE) + END +END ProgramRun; + + +PROCEDURE ProgramDebug; +BEGIN + IF ~text.fasm THEN + Script(debugScript) + ELSE + FasmCompile(FALSE, TRUE) + END +END ProgramDebug; + + +PROCEDURE ClickMenu; +VAR + item: List.tItem; +BEGIN + IF Menu.MenuItem < 0 THEN + item := List.getItem(mainMenu, (-Menu.MenuItem - mainMenuBtn) MOD mainMenu.count); + IF item # NIL THEN + ShowMenu(item(Menu.tMainItem).menu) + END; + Menu.SetItem(0) + END; + CASE Menu.MenuItem OF + |0: + |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 + |menuOpen: + OpenDial + |menuSave: + save(text); + repaint + |menuSaveAs: + saveAs(text); + repaint + |menuSaveAll: + saveAll; + repaint + |menuClose: + closeFile(TRUE, curText) + |menuFolder: + K.Run("/sys/File Managers/Eolite", text.fileName) + |menuExit: + Close + |menuUndo: + T.undo(text); + repaint + |menuRedo: + T.redo(text); + repaint + |menuFind: + ShowSearchPanel(FALSE) + |menuFindNext: + notFound := ~T.findNext(text, BKW.value); + menuFindClicked := TRUE + |menuFindPrev: + notFound := ~T.findNext(text, ~BKW.value); + menuFindClicked := TRUE + |menuGoto: + ShowSearchPanel(TRUE) + |menuToggleBookmark: + T.toggleLabel(text) + |menuNextBookmark: + T.gotoLabel(text, TRUE) + |menuPrevBookmark: + T.gotoLabel(text, FALSE) + |menuFontSmall..menuFontLarge: + font := G.fonts[Menu.MenuItem - menuFontSmall]; + Ini.setInt("settings", "font", Menu.MenuItem - menuFontSmall); + resize + |menuIncLS, menuDecLS: + T.setLineSpacing(canvas, T.LineSpacing + ORD(Menu.MenuItem = menuIncLS)*2 - 1); + Ini.setInt("settings", "line_spacing", T.LineSpacing) + |menuText: + T.setLang(text, Languages.langText) + |menuC: + T.setLang(text, Languages.langC) + |menuFasm: + T.setLang(text, Languages.langFasm) + |menuIni: + T.setLang(text, Languages.langIni) + |menuJSON: + T.setLang(text, Languages.langJSON) + |menuLua: + T.setLang(text, Languages.langLua) + |menuOberon: + T.setLang(text, Languages.langOberon) + |menuPascal: + T.setLang(text, Languages.langPascal) + |menuBuild: + ProgramBuild + |menuBuildScript: + setScript(buildScript) + |menuRun: + ProgramRun + |menuRunScript: + setScript(runScript) + |menuDebug: + ProgramDebug + |menuDebugScript: + setScript(debugScript) + |menuFASM: + text.fasm := ~text.fasm + |menuUTF8BOM: + T.setEnc(text, E.UTF8BOM) + |menuUTF8: + T.setEnc(text, E.UTF8) + |menuCP866: + T.setEnc(text, E.CP866) + |menuCP1251: + T.setEnc(text, E.CP1251) + |menuLF: + T.setEol(text, E.EOL_LF) + |menuCRLF: + T.setEol(text, E.EOL_CRLF) + |menuCR: + T.setEol(text, E.EOL_CR) + |menuConv1251_866: + T.convert(text, (*E.cp866,*) E.CP1251) + |menuConv866_1251: + T.convert(text, (*E.cp1251,*) E.CP866) + |menuPipet: + K.Run("/sys/develop/pipet", "") + |menuMagnify: + K.Run("/sys/magnify", "") + |menuBoard: + K.Run("/sys/develop/board", "") + |menuSysFunc: + K.Run("/sys/docpack", "e") + |menuLineNumbers: + T.toggleNumbers; + Ini.setInt("settings", "line_numbers", ORD(T.lineNumbers)) + |menuAutoIndents: + T.toggleIndents; + Ini.setInt("settings", "auto_indents", ORD(T.autoIndents)) + |menuAutoBrackets: + T.toggleBrackets; + Ini.setInt("settings", "auto_brackets", ORD(T.autoBrackets)) + |menuTrimSpace: + T.toggleTrimSpace; + Ini.setInt("settings", "trim_space", ORD(T.trimSpace)) + |menuColors..menuMaxColors: + Ini.selectSection(Menu.MenuItem - menuColors); + Ini.setInt("settings", "theme", Menu.MenuItem - menuColors) + |menuMoveUp: + T.MoveLines(text, FALSE) + |menuMoveDown: + T.MoveLines(text, TRUE) + |menuDuplicate: + T.dupLine(text) + |menuRemove: + T.delLine(text) + |menuIncInd: + T.Indent(text, TRUE) + |menuDecInd: + T.Indent(text, FALSE) + |menuUpper: + T.chCase(text, TRUE) + |menuLower: + T.chCase(text, FALSE) + END; + Menu.SetItem(0) +END ClickMenu; + + +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, mainTID) +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, menuSaveAll, "save all"); + Menu.AddMenuItem(menu, menuFolder, "folder"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuClose, "close ctrl-W"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuExit, "exit"); + RETURN Menu.create(menu, mainTID) +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, 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"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuCurLine, "current line"); + Menu.child(menu, subCurLine); + Menu.AddMenuItem(menu, menuIndent, "indent"); + Menu.child(menu, subIndent); + Menu.AddMenuItem(menu, menuCase, "case"); + Menu.child(menu, subCase); + RETURN Menu.create(menu, mainTID) +END CreateMenuEdit; + + +PROCEDURE CreateMenuSearch (): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuFind, "search ctrl-F"); + Menu.AddMenuItem(menu, menuFindNext, "find next F3"); + Menu.AddMenuItem(menu, menuFindPrev, "find previous shift-F3"); + Menu.AddMenuItem(menu, menuGoto, "go to line ctrl-G"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuBookmark, "bookmark"); + Menu.child(menu, subBookmark); + RETURN Menu.create(menu, mainTID) +END CreateMenuSearch; + + +PROCEDURE CreateMenuEncoding (): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + 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, menuCP1251, E.names[E.CP1251]); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuConv1251_866, "convert 1251 >> 866"); + Menu.AddMenuItem(menu, menuConv866_1251, "convert 866 >> 1251"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuEOL, "EOL"); + Menu.child(menu, subEOL); + RETURN Menu.create(menu, mainTID) +END CreateMenuEncoding; + + +PROCEDURE CreateMenuEOL (): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuCRLF, E.eolNames[E.EOL_CRLF]); + Menu.AddMenuItem(menu, menuLF, E.eolNames[E.EOL_LF]); + Menu.AddMenuItem(menu, menuCR, E.eolNames[E.EOL_CR]); + RETURN Menu.create(menu, mainTID) +END CreateMenuEOL; + + +PROCEDURE CreateMenuView (): Menu.tMenu; +VAR + menu: List.tList; + colors: Ini.tSection; + idx: INTEGER; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuFontSmall, "small"); + Menu.AddMenuItem(menu, menuFontMedium, "medium"); + Menu.AddMenuItem(menu, menuFontLarge, "large"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuIncLS, "line spacing ++"); + Menu.AddMenuItem(menu, menuDecLS, "line spacing --"); + 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, mainTID) +END CreateMenuView; + + +PROCEDURE CreateMenuLanguage (): 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, menuJSON, "JSON"); + Menu.AddMenuItem(menu, menuLua, "Lua"); + Menu.AddMenuItem(menu, menuOberon, "Oberon"); + Menu.AddMenuItem(menu, menuPascal, "Pascal"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuText, "Text"); + RETURN Menu.create(menu, mainTID) +END CreateMenuLanguage; + + +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 ctrl-F8"); + Menu.AddMenuItem(menu, menuDebugScript, "script"); + Menu.delimiter(menu); + Menu.AddMenuItem(menu, menuFASM, "Fasm"); + RETURN Menu.create(menu, mainTID) +END CreateMenuProgram; + + +PROCEDURE CreateMenuTools (): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuPipet, "pipet"); + Menu.AddMenuItem(menu, menuMagnify, "magnify"); + Menu.AddMenuItem(menu, menuBoard, "board"); + Menu.AddMenuItem(menu, menuSysFunc, "system functions"); + RETURN Menu.create(menu, mainTID) +END CreateMenuTools; + + +PROCEDURE CreateMenuOptions (): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuLineNumbers, "line numbers"); + Menu.AddMenuItem(menu, menuAutoIndents, "automatic indents"); + Menu.AddMenuItem(menu, menuAutoBrackets, "automatic brackets"); + Menu.AddMenuItem(menu, menuTrimSpace, "trim trailing space"); + RETURN Menu.create(menu, mainTID) +END CreateMenuOptions; + + +PROCEDURE CreateMenuCurLine(): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuMoveUp, "move up ctrl-Up"); + Menu.AddMenuItem(menu, menuMoveDown, "move down ctrl-Down"); + Menu.AddMenuItem(menu, menuDuplicate, "duplicate ctrl-D"); + Menu.AddMenuItem(menu, menuRemove, "remove ctrl-Del"); + RETURN Menu.create(menu, mainTID) +END CreateMenuCurLine; + + +PROCEDURE CreateMenuIndent(): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuIncInd, "increase Tab"); + Menu.AddMenuItem(menu, menuDecInd, "decrease shift-Bksp"); + RETURN Menu.create(menu, mainTID) +END CreateMenuIndent; + + +PROCEDURE CreateMenuCase(): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuUpper, "UPPER ctrl-U"); + Menu.AddMenuItem(menu, menuLower, "lower ctrl-L"); + RETURN Menu.create(menu, mainTID) +END CreateMenuCase; + + +PROCEDURE CreateMenuBookmark(): Menu.tMenu; +VAR + menu: List.tList; +BEGIN + menu := List.create(NIL); + Menu.AddMenuItem(menu, menuToggleBookmark, "toggle ctrl-F2"); + Menu.AddMenuItem(menu, menuNextBookmark, "next F2"); + Menu.AddMenuItem(menu, menuPrevBookmark, "previous shift-F2"); + RETURN Menu.create(menu, mainTID) +END CreateMenuBookmark; + + +PROCEDURE Shortcuts; +BEGIN + Menu.AddShortcut(17 + CTRL, menuClose); + Menu.AddShortcut(21 + CTRL, menuRedo); + Menu.AddShortcut(30 + CTRL, menuSelectAll); + Menu.AddShortcut(32 + CTRL, menuDuplicate); + Menu.AddShortcut(33 + CTRL, menuFind); + Menu.AddShortcut(35 + CTRL, menuFind); + Menu.AddShortcut(34 + CTRL, menuGoto); + Menu.AddShortcut(44 + CTRL, menuUndo); + Menu.AddShortcut(45 + CTRL, menuCut); + Menu.AddShortcut(46 + CTRL, menuCopy); + Menu.AddShortcut(47 + CTRL, menuPaste); + Menu.AddShortcut(24 + CTRL, menuOpen); + Menu.AddShortcut(31 + CTRL, menuSave); + Menu.AddShortcut(49 + CTRL, menuNew); + Menu.AddShortcut(67 + CTRL, menuBuild); + Menu.AddShortcut(66 + CTRL, menuDebug); + Menu.AddShortcut(83 + CTRL, menuRemove); + Menu.AddShortcut(22 + CTRL, menuUpper); + Menu.AddShortcut(38 + CTRL, menuLower); + Menu.AddShortcut(60 + CTRL, menuToggleBookmark); + Menu.AddShortcut(72 + CTRL, menuMoveUp); + Menu.AddShortcut(80 + CTRL, menuMoveDown); + Menu.AddShortcut(83, menuDelete); + Menu.AddShortcut(67, menuRun); + Menu.AddShortcut(15, menuIncInd); + Menu.AddShortcut(14 + SHIFT, menuDecInd); + Menu.AddShortcut(60 + SHIFT, menuPrevBookmark); + Menu.AddShortcut(60, menuNextBookmark); + Menu.AddShortcut(61 + SHIFT, menuFindPrev); + Menu.AddShortcut(61, menuFindNext); +END Shortcuts; + + +PROCEDURE HideSearch; +BEGIN + SetFocus(FindEdit, FALSE); + searchOpened := FALSE; + LEFT := LEFT_PADDING; + resize; + draw_window +END HideSearch; + + +PROCEDURE KeyDown (key: INTEGER); +VAR + keyCode, ah: INTEGER; + shift, ctrl, rep: BOOLEAN; +BEGIN + K.getKBState(shift, ctrl); + rep := FALSE; + keyCode := key DIV 65536; + + (* Numpad *) + ah := (key DIV 256) MOD 256; + CASE keyCode OF + |83: IF ah = 46 THEN keyCode := 52 END (* . / Del *) + |82: IF ah = 48 THEN keyCode := 11 END (* 0 / Ins *) + |79: IF ah = 49 THEN keyCode := 2 END (* 1 / End *) + |80: IF ah = 50 THEN keyCode := 3 END (* 2 / Down *) + |81: IF ah = 51 THEN keyCode := 4 END (* 3 / PgDn *) + |75: IF ah = 52 THEN keyCode := 5 END (* 4 / <- *) + |76: IF ah = 55 THEN keyCode := -1 END (* 5 / --- *) + |77: IF ah = 54 THEN keyCode := 7 END (* 6 / -> *) + |71: IF ah = 55 THEN keyCode := 8 END (* 7 / Home *) + |72: IF ah = 56 THEN keyCode := 9 END (* 8 / Up *) + |73: IF ah = 57 THEN keyCode := 10 END (* 9 / PgUp *) + ELSE + (* nothing to do *) + END; + + IF confirm THEN + IF keyCode = 28 THEN (* Enter *) + save(text); + IF ~text.modified THEN + closeFile(FALSE, curText) + END + END; + key := -1 + ELSE + IF keyCode = -1 THEN + key := -1 + ELSIF keyCode = 61 THEN (* F3 *) + key := -1; + IF search & (searchText # "") THEN + IF shift THEN + notFound := ~T.findNext(text, ~BKW.value) + ELSE + notFound := ~T.findNext(text, BKW.value) + END + END + ELSIF keyCode = 60 THEN (* F2 *) + key := -1; + IF ctrl THEN + T.toggleLabel(text) + ELSE + T.gotoLabel(text, ~shift) + END + ELSIF keyCode = 66 THEN (* F8 *) + key := -1; + IF ctrl THEN + ProgramDebug + END + ELSIF keyCode = 67 THEN (* F9 *) + key := -1; + IF ctrl THEN + ProgramBuild + ELSE + ProgramRun + END + ELSIF keyCode = 68 THEN (* F10 *) + IF shift THEN + ShowMenu(context) + ELSE + ShowMenu(menuFile) + END; + key := -1 + ELSIF keyCode = 1 THEN (* Esc *) + IF search THEN + IF shift THEN + HideSearch + ELSE + Search + END + END; + key := -1 + ELSIF (keyCode = 55) & (key DIV 256 MOD 256 = 52) THEN (* PrtScn *) + key := -1 + ELSIF (keyCode = 14) & shift THEN (* shift+Backspace *) + key := -1; + T.input(text, -8) + ELSIF (keyCode = 15) & ctrl THEN (* ctrl+Tab *) + key := -1; + SwitchTab((curText + 1) MOD textsCount) + ELSIF ((keyCode = 33) OR (keyCode = 35)) & ctrl THEN (* ctrl+F, ctrl+H*) + key := -1; + ShowSearchPanel(FALSE) + ELSIF (keyCode = 34) & ctrl THEN (* ctrl+G *) + key := -1; + ShowSearchPanel(TRUE) + ELSIF (keyCode = 18) & ctrl THEN (* ctrl+E *) + key := -1; + T.selectWord(text) + ELSE + IF EditBox_Focus(FindEdit) THEN + IF keyCode = 15 THEN (* Tab *) + IF shift THEN + SetFocus(GotoEdit, TRUE) + ELSE + SetFocus(ReplaceEdit, TRUE) + END + ELSIF keyCode = 28 THEN (* Enter *) + IF searchOpened & (searchText # "") THEN + notFound := ~T.findNext(text, BKW.value) + END + ELSE + EB.key(FindEdit, key); + EditBox_Get(FindEdit, new_searchText); + IF new_searchText # searchText THEN + searchText := new_searchText; + notFound := ~T.search(text, searchText, cs, whole) + END + END + ELSIF EditBox_Focus(ReplaceEdit) THEN + IF keyCode = 15 THEN (* Tab *) + IF shift THEN + SetFocus(FindEdit, TRUE) + ELSE + SetFocus(GotoEdit, TRUE) + END + ELSIF keyCode = 28 THEN (* Enter *) + IF searchOpened & (searchText # "") THEN + notFound := ~T.findNext(text, BKW.value) + END + ELSE + EB.key(ReplaceEdit, key); + EditBox_Get(ReplaceEdit, replaceText) + END + ELSIF EditBox_Focus(GotoEdit) THEN + IF keyCode = 15 THEN (* Tab *) + IF shift THEN + SetFocus(ReplaceEdit, TRUE) + ELSE + SetFocus(FindEdit, TRUE) + END + ELSE + IF (key DIV 256) MOD 256 = 13 THEN + goto + ELSE + EB.key(GotoEdit, key) + END + 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, 91, 219, 92, 220: key := -1 (* insert, windows *) + |93: ShowMenu(context); key := -1 + |83: key := 46 + |59, 62..66, 87, 88: key := -1 (* F1, F4..F8, 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; + OpenDial + |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, + 20: key := -1; + NewFile + ELSE + key := -1 + END + ELSE + T.input(text, E.cp866[key DIV 256 MOD 256]); + IF key DIV 256 MOD 256 = 13 THEN + rep := TRUE + END; + key := -1 + END + END; + IF key >= 0 THEN + T.key(text, key, shift, ctrl); + IF ((key = 38) OR (key = 40) OR (key = ORD("D"))) & ctrl THEN + rep := TRUE + END + END + END + END + END; + IF key # -2 THEN + repaint; + IF rep THEN + repaint + END + END +END KeyDown; + + +PROCEDURE BtnClick; +VAR + btn: INTEGER; + middle, exit: BOOLEAN; + menu: Menu.tMenu; +BEGIN + exit := FALSE; + btn := K.ButtonCode(middle); + IF U.between(Tabs.btnID, 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 + ELSIF U.between(Tabs.btnClose, btn, Tabs.btnClose + maxTexts - 1) THEN + DEC(btn, Tabs.btnClose); + IF texts[btn].modified THEN + SwitchTab(btn) + END; + closeFile(TRUE, btn); + middle := TRUE; + btn := 0 + ELSE + IF middle THEN + btn := 0 + END + END; + IF btn # 0 THEN + menu := Menu.ClickMain(mainMenu, btn); + IF menu # NIL THEN + ShowMenu(menu); + btn := 0 + END + END; + + CASE btn OF + |0: + |Tabs.btnLeft, Tabs.btnRight: + Tabs.scroll(tabs, btn); + switch := TRUE + |btnNo: + exit := closing; + closeFile(FALSE, curText); + repaint + |btnYes: + exit := closing; + save(text); + IF ~text.modified THEN + closeFile(FALSE, curText) + END; + repaint + |btnClose: + exit := TRUE + |btnNew: + NewFile + |btnOpen: + OpenDial + |btnSave: + save(text) + |btnSearch: + ShowSearchPanel(FALSE) + |btnCloseSearch: + Search + |btnHideSearch: + HideSearch + |btnUndo: + T.undo(text) + |btnRedo: + T.redo(text) + |btnUpper: + T.chCase(text, TRUE) + |btnLower: + T.chCase(text, FALSE) + |btnBuild: + ProgramBuild + |btnRun: + ProgramRun + |btnFindNext: + IF searchText # "" THEN + notFound := ~T.findNext(text, BKW.value); + SetFocus(FindEdit, FALSE) + END + |btnReplace: + T.replace(text, replaceText, LENGTH(searchText)); + SetFocus(FindEdit, FALSE) + |btnReplaceAll: + notFound := ~T.search(text, searchText, cs, whole); + IF ~notFound THEN + replaced := T.replaceAll(text, replaceText, LENGTH(searchText)); + END; + SetFocus(FindEdit, FALSE) + |btnGoto: + goto + END; + + IF ~middle THEN + IF exit THEN + Close + ELSE + repaint + END + 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; + pos1, pos2: T.tPoint; + shift, ctrl: BOOLEAN; + + + PROCEDURE EditBox (VAR eb: EB.tEditBox); + VAR + focus: BOOLEAN; + BEGIN + focus := EditBox_Focus(eb); + EB.mouse(eb); + IF focus # EditBox_Focus(eb) THEN + SetFocus(eb, TRUE); + repaint + END + END EditBox; + + +BEGIN + CloseMenu; + IF ~resized THEN + msState := K.MouseState(); + IF ~(0 IN msState) OR (16 IN msState) THEN + leftButton := FALSE + END; + scroll := K.Scroll(); + IF scroll # 0 THEN + K.getKBState(shift, ctrl); + IF shift THEN + T.scroll(text, scroll*3, 0) + ELSE + T.scroll(text, 0, scroll*3) + END; + repaint + END; + IF leftButton THEN + IF K.GetTickCount() - time >= DELAY THEN + T.getPos(text, pos1.Y, pos1.X); + mouse(x, y); + T.mouse(text, x, y); + T.getPos(text, pos2.Y, pos2.X); + IF (pos1.X # pos2.X) OR (pos1.Y # pos2.Y) THEN + repaint + END + END + END; + + Scroll.mouse(hScroll); + Scroll.mouse(vScroll); + msState := K.MouseState(); + T.getScroll(text, scrollX, scrollY); + IF (hScroll.value # scrollX) OR (vScroll.value # scrollY) THEN + T.scroll(text, hScroll.value - scrollX, vScroll.value - scrollY); + 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 U.between(-4, x - firstClickX, 4) & U.between(-4, y - firstClickY, 4) THEN + IF U.between(0, x, canvas.width - 1) & U.between(0, y, canvas.height - 1) THEN + leftButton := FALSE; + T.selectWord(text); + repaint + ELSIF Tabs.DblClicked(tabs, x + LEFT, y + TOP) THEN + leftButton := FALSE; + NewFile; + repaint + END + ELSE + firstClickX := x; + firstClickY := y; + time := click(firstClickX, firstClickY) + END + END; + IF msState = {} THEN + mouse(x, y); + Menu.MouseMove(mainMenu, x + LEFT, y + TOP) + END + END; + IF search & searchOpened THEN + CheckBox.mouse(BKW); + CheckBox.mouse(CS); + CheckBox.mouse(WH); + EditBox(FindEdit); + EditBox(ReplaceEdit); + EditBox(GotoEdit); + IF (CS.value # cs) OR (WH.value # whole) THEN + cs := CS.value; + whole := WH.value; + 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 + onClose: BOOLEAN; +BEGIN + onClose := (Menu.MenuItem = menuClose) OR (Menu.MenuItem = menuExit); + IF ~onClose THEN + ClickMenu + END; + K.GetSystemColors; + IF ~K.RolledUp() THEN + K.ClientSize(width, height); + IF (width # cliWidth) OR (height # cliHeight) THEN + cliWidth := width; + cliHeight := height; + resize; + resized := TRUE + END + ELSE + SetCaption(text.fileName) + END; + draw_window; + IF SkinHeight # K.SkinHeight() THEN + SkinHeight := K.SkinHeight(); + Redraw(resized, width, height, cliWidth, cliHeight) + END; + IF onClose THEN + ClickMenu + END +END Redraw; + + +PROCEDURE ScrollChange; +BEGIN + T.scroll(text, hScroll.btn, vScroll.btn); + IF menuActive THEN + draw_window; + menuActive := FALSE + ELSE + repaint + END +END ScrollChange; + + +PROCEDURE receiveIPC; +VAR + x, y, cliX, cliY, winX, winY: INTEGER; +BEGIN + K.ClientPos(cliX, cliY); + K.WinPos(winX, winY); + x := IPC[2] DIV 65536 - cliX - winX; + y := IPC[2] MOD 65536 - cliY - winY; + Menu.MouseMove(mainMenu, x, y); + IPC[1] := 0; + IPC[0] := 0 +END receiveIPC; + + +PROCEDURE main; +VAR + fileName, filePath: RW.tFileName; + width, height, cliWidth, cliHeight: INTEGER; + resized: BOOLEAN; + firstClickX, firstClickY, time, blink, i: INTEGER; + key, scr: INTEGER; + text_ptr, text_size, errno: INTEGER; +BEGIN + mainTID := K.ThreadID(); + header := ""; + K.GetSystemColors; + switch := FALSE; + closing := FALSE; + textsCount := 0; + curText := 0; + Args.GetArg(0, AppPath); + Ini.load(AppPath); + Ini.getSettings; + runScript := Ini.runScript; + buildScript := Ini.buildScript; + debugScript := Ini.debugScript; + leftButton := FALSE; + resized := FALSE; + newtab := FALSE; + K.ScreenSize(winWidth, winHeight); + scrollWidth := winHeight DIV 35; + winWidth := (winWidth*80) DIV 100 - (128 + 30); + winHeight := winHeight - (128 + 30); + winWidth := MAX(winWidth, minWinWidth); + winHeight := MAX(winHeight, minWinHeight); + cliWidth := winWidth; + cliHeight := winHeight; + + LEFT := LEFT_PADDING; + RIGHT := scrollWidth - 2; + BOTTOM := SB.height() + scrollWidth - 1; + SkinHeight := K.SkinHeight(); + canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 11 + RIGHT_PADDING), winHeight - (TOP + BOTTOM + 5 - ClippingArea) - SkinHeight); + DEC(canvas.height, ClippingArea); + tabs := Tabs.create(); + Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, canvas.width, Tabs.tabHeight); + font := G.fonts[Ini.font]; + G.SetFont(canvas, font); + T.init(resetTimer, Ini.lineNumbers, Ini.autoIndents, Ini.autoBrackets, Ini.trimSpace, Ini.lineSpacing); + Ini.selectSection(Ini.theme); + T.setCanvas(canvas); + + mainMenu := Menu.CreateMain(mainMenuBtn); + + Menu.init(resetTimer); + context := CreateContextMenu(); + menuFile := CreateMenuFile(); + subCurLine := CreateMenuCurLine(); + subIndent := CreateMenuIndent(); + subCase := CreateMenuCase(); + menuEdit := CreateMenuEdit(); + subCurLine.parent := menuEdit; + subIndent.parent := menuEdit; + subCase.parent := menuEdit; + subBookmark := CreateMenuBookmark(); + menuSearch := CreateMenuSearch(); + subBookmark.parent := menuSearch; + subEOL := CreateMenuEOL(); + menuEncoding := CreateMenuEncoding(); + subEOL.parent := menuEncoding; + menuView := CreateMenuView(); + menuLanguage := CreateMenuLanguage(); + menuProgram := CreateMenuProgram(); + menuTools := CreateMenuTools(); + menuOptions := CreateMenuOptions(); + + + Menu.AddMainItem(mainMenu, "file", menuFile); + Menu.AddMainItem(mainMenu, "edit", menuEdit); + Menu.AddMainItem(mainMenu, "search", menuSearch); + Menu.AddMainItem(mainMenu, "encoding", menuEncoding); + Menu.AddMainItem(mainMenu, "view", menuView); + Menu.AddMainItem(mainMenu, "language", menuLanguage); + Menu.AddMainItem(mainMenu, "program", menuProgram); + Menu.AddMainItem(mainMenu, "tools", menuTools); + Menu.AddMainItem(mainMenu, "options", menuOptions); + Shortcuts; + + Toolbar.create(toolbar, LEFT_PADDING + 5, toolbarTop); + Toolbar.add(toolbar, btnNew, Icons.icoNew, ""); + Toolbar.add(toolbar, btnOpen, Icons.icoOpen, ""); + Toolbar.add(toolbar, btnSave, Icons.icoSave, ""); + Toolbar.delimiter(toolbar); + Toolbar.add(toolbar, btnSearch, Icons.icoSearch, ""); + Toolbar.delimiter(toolbar); + Toolbar.add(toolbar, btnUndo, Icons.icoUndo, ""); + Toolbar.add(toolbar, btnRedo, Icons.icoRedo, ""); + Toolbar.delimiter(toolbar); + Toolbar.add(toolbar, btnUpper, -1, "AB"); + Toolbar.add(toolbar, btnLower, -1, "ab"); + Toolbar.delimiter(toolbar); + Toolbar.add(toolbar, btnBuild, Icons.icoBuild, ""); + Toolbar.add(toolbar, btnRun, Icons.icoRun, ""); + + filePath := "/sys"; + IF Args.argc = 1 THEN + text := T.New(); + insert(0, text); + T.SetPos(text, 0, 0) + END; + FOR i := 1 TO Args.argc - 1 DO + Args.GetArg(i, fileName); + IF fileName[0] # "*" THEN + IF open(fileName) THEN + U.getPath(fileName, filePath) + END + ELSE + K.docpack(fileName, text_ptr, text_size); + IF text_ptr # 0 THEN + text := T.open("", text_ptr, text_size, errno); + IF text # NIL THEN + insert(0, text); + T.SetPos(text, 0, 0) + END + END + END + END; + IF textsCount = 0 THEN + K.Exit + END; + SwitchTab(textsCount - 1); + + Scroll.create(FALSE, canvas.width + 1, scrollWidth, scrollWidth, scrollWidth*3 DIV 2, ScrollChange, hScroll); + Scroll.create(TRUE, scrollWidth, canvas.height + 2, scrollWidth, scrollWidth*3 DIV 2, ScrollChange, vScroll); + T.resize(canvas.width, canvas.height); + confirm := FALSE; + notFound := FALSE; + menuFindClicked := FALSE; + menuActive := FALSE; + search := FALSE; + searchOpened := FALSE; + createSearchForm; + new_searchText := ""; + searchText := ""; + cs := FALSE; + whole := FALSE; + replaced := 0; + + OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, ""); + + IPC[1] := 0; + IPC[0] := 0; + K.SetIPC(IPC); + K.SetEventsMask({0, 1, 2, 5, 6, 31}); + draw_window; + blink := Ini.blink; + IF blink <= 0 THEN + blink := 0 + ELSIF blink < 30 THEN + blink := 30 + END; + timerEnabled := TRUE; + CursorTime := K.GetTickCount(); + WHILE TRUE DO + + CurrentTime := K.GetTickCount(); + IF (CurrentTime - CursorTime > blink) & (blink > 0) & timerEnabled & ~K.RolledUp() THEN + CursorTime := CurrentTime; + T.cursor(text); + drawText + END; + + CASE K.EventTimeout(10) OF + |0: + |1: Redraw(resized, width, height, cliWidth, cliHeight) + |2: + key := K.GetKey(); + IF ~K.RolledUp() THEN + KeyDown(key) + END + |3: BtnClick + |6: + IF ~K.RolledUp() THEN + MouseEvent(resized, firstClickX, firstClickY, time) + ELSE + scr := K.Scroll() + END + |7: receiveIPC + END; + IF newtab THEN + Redraw(resized, width, height, cliWidth, cliHeight); + newtab := FALSE + END + END +END main; + + +BEGIN + main +END CEdit.