Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 9173 → Rev 9174

/programs/develop/cedit/SRC/CEdit.ob07
25,13 → 25,13
G := Graph, T := Text, E := Encodings,
CB := Clipboard, Languages,
ChangeLog, Scroll,
RW, Ini, box_lib, Icons, Tabs;
RW, Ini, box_lib, Icons, Tabs, Timer;
 
CONST
header = "CEdit (17-jul-2021)";
header = "CEdit (02-sep-2021)";
 
ShellFilter = "";
EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI";
EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI|JSON";
 
fontWidth = K.fontWidth;
fontHeight = K.fontHeight;
48,10 → 48,7
btnLower = 27;
btnBuild = 28;
btnRun = 29;
btnUp = 30;
btnDown = 31;
btnLeft = 32;
btnRight = 33;
 
btnYes = 40;
btnNo = 41;
btnFindNext = 60;
63,11 → 60,12
 
btnFile = 70;
btnEdit = 71;
btnEncoding = 72;
btnView = 73;
btnSyntax = 74;
btnProgram = 75;
btnTools = 76;
btnMenuSearch = 72;
btnEncoding = 73;
btnView = 74;
btnSyntax = 75;
btnProgram = 76;
btnTools = 77;
 
MainMenuHeight = fontHeight + 7;
 
91,7 → 89,8
 
menuFileX = searchLeft;
menuEditX = menuFileX + 4*fontWidth + 2 + 7;
menuEncodingX = menuEditX + 4*fontWidth + 2 + 7;
menuSearchX = menuEditX + 4*fontWidth + 2 + 7;
menuEncodingX = menuSearchX + 6*fontWidth + 2 + 7;
menuViewX = menuEncodingX + 8*fontWidth + 2 + 7;
menuSyntaxX = menuViewX + 4*fontWidth + 2 + 7;
menuProgramX = menuSyntaxX + 6*fontWidth + 2 + 7;
106,8 → 105,9
menuUndo = 6;
menuRedo = 7;
 
menuSearch = 8;
menuGoto = 9;
menuCurLine = 100;
menuIndent = 110;
menuCase = 120;
 
menuNew = 10;
menuOpen = 11;
127,9 → 127,10
menuC = 31;
menuFasm = 32;
menuIni = 33;
menuLua = 34;
menuOberon = 35;
menuPascal = 36;
menuJSON = 34;
menuLua = 35;
menuOberon = 36;
menuPascal = 37;
 
menuBuild = 50;
menuBuildScript = 51;
147,7 → 148,29
menuBoard = 71;
menuSysFunc = 72;
 
menuFind = 80;
menuFindNext = 81;
menuFindPrev = 82;
menuGoto = 83;
menuBookmark = 130;
 
menuMoveUp = 101;
menuMoveDown = 102;
menuDuplicate = 103;
menuRemove = 104;
 
menuIncInd = 111;
menuDecInd = 112;
 
menuUpper = 121;
menuLower = 122;
 
menuToggleBookmark = 131;
menuNextBookmark = 132;
menuPrevBookmark = 133;
 
maxTexts = 32;
scrollDelay = 40;
 
 
VAR
165,8 → 188,8
confirm, notFound, search, searchOpened, modified: BOOLEAN;
 
switch, closing: BOOLEAN;
leftButton, VScroll, HScroll: BOOLEAN;
vScroll, hScroll: Scroll.tScroll;
leftButton: BOOLEAN;
hScroll, vScroll: Scroll.tScroll;
LEFT: INTEGER;
 
FindEdit, ReplaceEdit, GotoEdit: box_lib.edit_box;
177,9 → 200,11
 
replaced: INTEGER;
 
mainTID: INTEGER;
mainTID, delay: INTEGER;
 
context, menuFile, menuEdit, menuEncoding, menuView, menuSyntax, menuProgram, menuTools: Menu.tMenu;
context, menuFile, menuEdit, menuSearch, menuEncoding,
menuView, menuSyntax, menuProgram, menuTools,
subCurLine, subIndent, subCase, subBookmark: Menu.tMenu;
 
icons: INTEGER;
grayIcons: INTEGER;
202,10 → 227,29
 
 
PROCEDURE EditBox_Focus (edit: box_lib.edit_box): BOOLEAN;
RETURN 1 IN BITS(edit.flags)
VAR
res: BOOLEAN;
BEGIN
res := FALSE;
IF edit # NIL THEN
res := 1 IN BITS(edit.flags)
END
RETURN res
END EditBox_Focus;
 
 
PROCEDURE resetTimer;
BEGIN
IF EditBox_Focus(FindEdit) OR EditBox_Focus(ReplaceEdit) OR EditBox_Focus(GotoEdit) THEN
T.hideCursor;
Timer.stop
ELSE
T.showCursor;
Timer.reset
END
END resetTimer;
 
 
PROCEDURE EditBox_SetFocus (edit: box_lib.edit_box; value: BOOLEAN);
BEGIN
IF value THEN
224,7 → 268,8
EditBox_SetFocus(FindEdit, FALSE);
EditBox_SetFocus(ReplaceEdit, FALSE);
EditBox_SetFocus(GotoEdit, FALSE);
EditBox_SetFocus(edit, value)
EditBox_SetFocus(edit, value);
resetTimer
END SetFocus;
 
 
245,6 → 290,7
VAR
top, left, right, bottom, x, y, width: INTEGER;
BEGIN
Timer.stop;
width := minWidth + LENGTH(s)*fontWidth;
left := (canvas.width - width) DIV 2 + LEFT;
top := (canvas.height - height) DIV 2 + TOP;
362,6 → 408,16
END DrawState;
 
 
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.paint(scroll)
END DrawScroll;
 
 
PROCEDURE repaint;
VAR
width, height, scrollX, scrollY, y: INTEGER;
371,6 → 427,7
K.DeleteButton(btnYes);
K.DeleteButton(btnNo);
confirm := FALSE;
resetTimer;
closing := FALSE
END;
IF ~search OR (searchText = "") THEN
393,10 → 450,8
END;
 
T.getScroll(text, scrollX, scrollY);
vScroll.value := scrollY; vScroll.maxVal := text.count - 1;
hScroll.value := scrollX; hScroll.maxVal := text.maxLength;
Scroll.draw(vScroll, LEFT + canvas.width - 1, TOP + scrollWidth - 1);
Scroll.draw(hScroll, LEFT + scrollWidth, TOP + canvas.height - 1);
DrawScroll(vScroll, LEFT + canvas.width - 1, TOP - 1, scrollY, text.count - 1);
DrawScroll(hScroll, LEFT, TOP + canvas.height - 1, scrollX, text.maxLength);
 
G.DrawCanvas(canvas, LEFT, TOP);
NotFound;
426,8 → 481,8
G.SetFont(canvas, font);
T.setCanvas(canvas);
T.resize(canvas.width, canvas.height);
Scroll.resize(vScroll, vScroll.xSize, canvas.height - scrollWidth*2 + 2);
Scroll.resize(hScroll, canvas.width - scrollWidth*2, hScroll.ySize);
Scroll.resize(vScroll, vScroll.width, canvas.height + 1);
Scroll.resize(hScroll, canvas.width, hScroll.height);
END resize;
 
 
519,6 → 574,9
K.BeginDraw;
K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header);
IF (text # NIL) & ~K.RolledUp() THEN
IF confirm THEN
resetTimer
END;
confirm := FALSE;
K.ClientSize(width, height);
 
528,6 → 586,7
 
drawMainMenu(menuFile, menuFileX, btnFile, "file");
drawMainMenu(menuEdit, menuEditX, btnEdit, "edit");
drawMainMenu(menuSearch, menuSearchX, btnMenuSearch, "search");
drawMainMenu(menuEncoding, menuEncodingX, btnEncoding, "encoding");
drawMainMenu(menuView, menuViewX, btnView, "view");
drawMainMenu(menuSyntax, menuSyntaxX, btnSyntax, "syntax");
571,19 → 630,6
 
toolbarIcons;
 
K.CreateButton(btnUp, LEFT + canvas.width - 1, TOP - 1, scrollWidth - 1, scrollWidth, K.btnColor, 0X);
K.DrawText69(LEFT + canvas.width - 1 + (scrollWidth - 6) DIV 2, TOP + (scrollWidth - 9) DIV 2, K.btnTextColor, 18X);
K.CreateButton(btnDown, LEFT + canvas.width - 1, TOP + canvas.height - scrollWidth - 1, scrollWidth - 1, scrollWidth, K.btnColor, 0X);
K.DrawText69(LEFT + canvas.width - 1 + (scrollWidth - 6) DIV 2, TOP + canvas.height - scrollWidth + (scrollWidth - 9) DIV 2, K.btnTextColor, 19X);
 
K.CreateButton(btnLeft, LEFT, TOP + canvas.height - 1, scrollWidth, scrollWidth - 1, K.btnColor, 0X);
K.DrawText69(LEFT + (scrollWidth - 6) DIV 2, TOP + canvas.height - 1 + (scrollWidth - 9) DIV 2 + 1, K.btnTextColor, 1BX);
K.CreateButton(btnRight, LEFT + canvas.width - scrollWidth - 1, TOP + canvas.height - 1, scrollWidth, scrollWidth - 1, K.btnColor, 0X);
K.DrawText69(LEFT + canvas.width - scrollWidth - 1 + (scrollWidth - 6) DIV 2, TOP + canvas.height - 1 + (scrollWidth - 9) DIV 2 + 1, K.btnTextColor, 1AX);
 
K.PutPixel(LEFT + canvas.width + scrollWidth - 2, TOP - 1, K.winColor);
K.PutPixel(LEFT, TOP + canvas.height + scrollWidth - 2, K.winColor);
 
DrawState(text, width, height);
IF search & searchOpened THEN
SearchPanel(searchLeft, TOP)
619,8 → 665,18
END getKBState;
 
 
PROCEDURE stopTimer;
BEGIN
T.hideCursor;
Timer.stop;
repaint;
Timer.stop
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
630,7 → 686,8
COPY(OD.FilePath, FileName)
ELSE
FileName := ""
END
END;
resetTimer
END OpenFile;
 
 
665,6 → 722,7
|Languages.langC: ext := "c"
|Languages.langFasm: ext := "asm"
|Languages.langIni: ext := "ini"
|Languages.langJSON: ext := "json"
|Languages.langLua: ext := "lua"
|Languages.langOberon: ext := "ob07"
|Languages.langPascal: ext := "pas"
764,6 → 822,7
VAR
left, top, right, bottom: INTEGER;
BEGIN
stopTimer;
draw_window;
confirm := TRUE;
left := (canvas.width - width) DIV 2 + LEFT;
778,6 → 837,13
END Confirm;
 
 
PROCEDURE Exit;
BEGIN
Timer.kill;
K.Exit
END Exit;
 
 
PROCEDURE closeFile (conf: BOOLEAN; n: INTEGER);
VAR
i: INTEGER;
796,7 → 862,7
IF curText >= 0 THEN
Switch(texts[curText])
ELSE
K.Exit
Exit
END;
draw_window
END
849,6 → 915,7
curText := n;
Tabs.switch(tabs, n);
Switch(texts[n]);
resetTimer;
draw_window
END SwitchTab;
 
947,6 → 1014,18
shift, ctrl: BOOLEAN;
BEGIN
getKBState(shift, ctrl);
IF ~hScroll.mouse THEN
Scroll.MouseDown(hScroll, x + LEFT, y + TOP);
T.getScroll(text, scrollX, scrollY);
T.scroll(text, hScroll.value - scrollX, 0);
repaint
END;
IF ~vScroll.mouse THEN
Scroll.MouseDown(vScroll, x + LEFT, y + TOP);
T.getScroll(text, scrollX, scrollY);
T.scroll(text, 0, vScroll.value - scrollY);
repaint
END;
IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
leftButton := TRUE;
SetFocus(FindEdit, FALSE);
955,18 → 1034,6
END;
T.mouse(text, x, y);
repaint
ELSIF (canvas.width < x) & (x < canvas.width + scrollWidth) & (scrollWidth < y) & (y < canvas.height - scrollWidth) THEN
VScroll := TRUE;
Scroll.mouse(vScroll, x - canvas.width, y - scrollWidth);
T.getScroll(text, scrollX, scrollY);
T.scroll(text, 0, vScroll.value - scrollY);
repaint
ELSIF (scrollWidth < x) & (x < canvas.width - scrollWidth) & (canvas.height < y) & (y < canvas.height + scrollWidth) THEN
HScroll := TRUE;
Scroll.mouse(hScroll, x - scrollWidth, y - canvas.height);
T.getScroll(text, scrollX, scrollY);
T.scroll(text, hScroll.value - scrollX, 0);
repaint
END
RETURN K.GetTickCount()
END click;
975,10 → 1042,8
PROCEDURE LeftButtonUp;
BEGIN
leftButton := FALSE;
VScroll := FALSE;
HScroll := FALSE;
Scroll.MouseUp(vScroll);
Scroll.MouseUp(hScroll);
Scroll.MouseUp(vScroll)
END LeftButtonUp;
 
 
1000,6 → 1065,24
END Close;
 
 
PROCEDURE CloseMenu;
BEGIN
Menu.close(menuFile);
Menu.close(menuEdit);
Menu.close(menuSearch);
Menu.close(menuEncoding);
Menu.close(menuView);
Menu.close(menuSyntax);
Menu.close(menuProgram);
Menu.close(menuTools);
Menu.close(subCurLine);
Menu.close(subIndent);
Menu.close(subCase);
Menu.close(subBookmark);
Menu.close(context);
END CloseMenu;
 
 
PROCEDURE MenuItemClick (menu: Menu.tMenu; id: INTEGER);
BEGIN
K.SendIPC(mainTID, id)
1011,7 → 1094,9
gotoVal: INTEGER;
BEGIN
EditBox_GetValue(GotoEdit, gotoText);
IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN END
IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN
SetFocus(GotoEdit, FALSE)
END
END goto;
 
 
1034,11 → 1119,166
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 ~((0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height)) THEN
menu := NIL
END
ELSE
K.WinPos(winX, winY);
K.ClientPos(cliX, cliY);
x := winX + cliX;
y := 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);
INC(x, menuFileX)
ELSIF (menu = menuEdit) OR (menu = context) THEN
Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition));
Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition));
Menu.setEnabled(menu, menuCut, selected);
Menu.setEnabled(menu, menuCopy, selected);
Menu.setEnabled(menu, menuDelete, selected);
Menu.setEnabled(menu, menuPaste, CB.available());
IF menu = menuEdit THEN
INC(x, menuEditX)
ELSE
IF y + menu.height >= canvas.height THEN
DEC(y, menu.height)
END;
IF x + menu.width >= canvas.width THEN
DEC(x, menu.width)
END;
CanvasToScreen(x, y)
END
ELSIF menu = menuEncoding THEN
Menu.setCheck(menu, menuUTF8BOM, ORD(text.enc = E.UTF8BOM)*2);
Menu.setCheck(menu, menuUTF8, ORD(text.enc = E.UTF8)*2);
Menu.setCheck(menu, menuCP866, ORD(text.enc = E.CP866)*2);
Menu.setCheck(menu, menuWin1251, ORD(text.enc = E.W1251)*2);
INC(x, menuEncodingX)
ELSIF menu = menuView THEN
Menu.setCheck(menu, menuNumbers, ORD(text.numbers));
Menu.setCheck(menu, menuFontSize, ORD(font = font2));
FOR i := 0 TO Ini.sections.count - 1 DO
Menu.setCheck(menu, menuColors + i, ORD(Ini.curSectionNum = i)*2)
END;
INC(x, menuViewX)
ELSIF menu = menuSyntax THEN
Menu.setCheck(menu, menuNone, ORD(text.lang = Languages.langNone)*2);
Menu.setCheck(menu, menuC, ORD(text.lang = Languages.langC)*2);
Menu.setCheck(menu, menuFasm, ORD(text.lang = Languages.langFasm)*2);
Menu.setCheck(menu, menuIni, ORD(text.lang = Languages.langIni)*2);
Menu.setCheck(menu, menuJSON, ORD(text.lang = Languages.langJSON)*2);
Menu.setCheck(menu, menuLua, ORD(text.lang = Languages.langLua)*2);
Menu.setCheck(menu, menuOberon, ORD(text.lang = Languages.langOberon)*2);
Menu.setCheck(menu, menuPascal, ORD(text.lang = Languages.langPascal)*2);
INC(x, menuSyntaxX)
ELSIF menu = menuProgram THEN
Menu.setEnabled(menu, menuBuild, buildScript # "");
Menu.setEnabled(menu, menuDebug, debugScript # "");
Menu.setEnabled(menu, menuRun, runScript # "");
INC(x, menuProgramX)
ELSIF menu = menuTools THEN
INC(x, menuToolsX)
ELSIF menu = menuSearch THEN
INC(x, menuSearchX)
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);
 
IF menu # NIL THEN
Timer.stop;
IF Menu.opened(menu) THEN
Menu.close(menu)
END;
Menu.open(menu, x, y)
END;
END ShowMenu;
 
 
PROCEDURE receiveIPC;
VAR
scrollIPC: BOOLEAN;
BEGIN
IF IPC[0] # Menu.lastTID THEN
scrollIPC := FALSE;
 
IF IPC[0] = Timer.ID THEN
T.toggleCursor;
repaint;
IPC[2] := 0
ELSIF IPC[0] = mainTID THEN
IF IPC[2] = Scroll.ScrollIPC THEN
Scroll.change(hScroll);
IF hScroll.Dec THEN
T.scroll(text, -1, 0)
ELSIF hScroll.Inc THEN
T.scroll(text, 1, 0)
END;
Scroll.change(vScroll);
IF vScroll.Dec THEN
T.scroll(text, 0, -1)
ELSIF vScroll.Inc THEN
T.scroll(text, 0, 1)
END;
repaint;
 
IF (0 IN K.MouseState()) THEN
WHILE (0 IN K.MouseState()) & (delay > 0) DO
K.Pause(1);
DEC(delay)
END;
IF delay = 0 THEN
IPC[0] := 0;
IPC[1] := 0;
scrollIPC := TRUE;
Scroll.SendIPC;
delay := 2
ELSE
delay := scrollDelay
END
ELSE
delay := scrollDelay
END
END;
IPC[2] := 0
ELSIF ~Menu.isSender(IPC[0]) THEN
IPC[2] := 0
END;
CASE IPC[2] OF
|0:
|menuCut: T.key(text, ORD("X"), FALSE, TRUE)
1072,12 → 1312,22
|menuRedo:
T.redo(text);
repaint
|menuSearch:
|menuFind:
ShowSearchPanel;
SetFocus(FindEdit, TRUE)
|menuFindNext:
notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW))
|menuFindPrev:
notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW))
|menuGoto:
ShowSearchPanel;
SetFocus(GotoEdit, TRUE)
|menuToggleBookmark:
T.toggleLabel(text)
|menuNextBookmark:
T.gotoLabel(text, TRUE)
|menuPrevBookmark:
T.gotoLabel(text, FALSE)
|menuNumbers:
T.toggleNumbers(text)
|menuFontSize:
1095,6 → 1345,8
T.setLang(text, Languages.langFasm)
|menuIni:
T.setLang(text, Languages.langIni)
|menuJSON:
T.setLang(text, Languages.langJSON)
|menuLua:
T.setLang(text, Languages.langLua)
|menuOberon:
1129,9 → 1381,27
K.Run("/rd/1/docpack", "f")
|menuColors..menuMaxColors:
Ini.selectSection(IPC[2] - menuColors)
|menuMoveUp:
T.upLine(text)
|menuMoveDown:
T.downLine(text)
|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;
IF ~scrollIPC THEN
IPC[0] := 0;
IPC[1] := 0
END
END receiveIPC;
 
 
1147,7 → 1417,7
|17: menuItem := menuClose
|21: menuItem := menuRedo
|30: menuItem := menuSelectAll
|33: menuItem := menuSearch
|33: menuItem := menuFind
|34: menuItem := menuGoto
|44: menuItem := menuUndo
|45: menuItem := menuCut
1222,9 → 1492,6
Menu.AddMenuItem(menu, menuUndo, "undo ctrl-Z");
Menu.AddMenuItem(menu, menuRedo, "redo ctrl-Y");
Menu.delimiter(menu);
Menu.AddMenuItem(menu, menuSearch, "search ctrl-F");
Menu.AddMenuItem(menu, menuGoto, "go to line ctrl-G");
Menu.delimiter(menu);
Menu.AddMenuItem(menu, menuCut, "cut ctrl-X");
Menu.AddMenuItem(menu, menuCopy, "copy ctrl-C");
Menu.AddMenuItem(menu, menuPaste, "paste ctrl-V");
1231,10 → 1498,33
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, MenuItemClick, MenuKeyDown)
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, MenuItemClick, MenuKeyDown)
END CreateMenuSearch;
 
 
PROCEDURE CreateMenuEncoding (): Menu.tMenu;
VAR
menu: List.tList;
1279,6 → 1569,7
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");
1293,7 → 1584,7
menu: List.tList;
BEGIN
menu := List.create(NIL);
Menu.AddMenuItem(menu, menuBuild, "build ctrl+F9");
Menu.AddMenuItem(menu, menuBuild, "build ctrl-F9");
Menu.AddMenuItem(menu, menuBuildScript, "script");
Menu.delimiter(menu);
Menu.AddMenuItem(menu, menuRun, "run F9");
1317,103 → 1608,53
END CreateMenuTools;
 
 
PROCEDURE CanvasToScreen (VAR x, y: INTEGER);
PROCEDURE CreateMenuCurLine(): Menu.tMenu;
VAR
cliX, cliY,
winX, winY: INTEGER;
menu: List.tList;
BEGIN
K.WinPos(winX, winY);
K.ClientPos(cliX, cliY);
x := x + winX + cliX + LEFT;
y := y + winY + cliY + TOP;
END CanvasToScreen;
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, MenuItemClick, MenuKeyDown)
END CreateMenuCurLine;
 
 
PROCEDURE ShowMenu (menu: Menu.tMenu);
PROCEDURE CreateMenuIndent(): Menu.tMenu;
VAR
winX, winY, cliX, cliY, x, y, i: INTEGER;
selected: BOOLEAN;
menu: List.tList;
BEGIN
IF menu # context THEN
K.WinPos(winX, winY);
K.ClientPos(cliX, cliY);
x := winX + cliX;
y := MainMenuHeight + winY + cliY
ELSE
mouse(x, y);
IF ~((0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height)) THEN
menu := NIL
END
END;
menu := List.create(NIL);
Menu.AddMenuItem(menu, menuIncInd, "increase Tab");
Menu.AddMenuItem(menu, menuDecInd, "decrease shift-Bksp");
RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
END CreateMenuIndent;
 
IF menu = menuFile THEN
Menu.setEnabled(menu, menuSave, text.modified);
Menu.setEnabled(menu, menuFolder, text.fileName # "");
i := 0;
WHILE (i < textsCount) & ~texts[i].modified DO
INC(i)
END;
Menu.setEnabled(menu, menuSaveAll, i < textsCount);
INC(x, menuFileX)
ELSIF (menu = menuEdit) OR (menu = context) THEN
Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition));
Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition));
selected := T.selected(text);
Menu.setEnabled(menu, menuCut, selected);
Menu.setEnabled(menu, menuCopy, selected);
Menu.setEnabled(menu, menuDelete, selected);
Menu.setEnabled(menu, menuPaste, CB.available());
IF menu = menuEdit THEN
INC(x, menuEditX)
ELSE
IF y + menu.height >= canvas.height THEN
DEC(y, menu.height)
END;
IF x + menu.width >= canvas.width THEN
DEC(x, menu.width)
END;
CanvasToScreen(x, y)
END
ELSIF menu = menuEncoding THEN
Menu.setCheck(menu, menuUTF8BOM, ORD(text.enc = E.UTF8BOM)*2);
Menu.setCheck(menu, menuUTF8, ORD(text.enc = E.UTF8)*2);
Menu.setCheck(menu, menuCP866, ORD(text.enc = E.CP866)*2);
Menu.setCheck(menu, menuWin1251, ORD(text.enc = E.W1251)*2);
INC(x, menuEncodingX)
ELSIF menu = menuView THEN
Menu.setCheck(menu, menuNumbers, ORD(text.numbers));
Menu.setCheck(menu, menuFontSize, ORD(font = font2));
FOR i := 0 TO Ini.sections.count - 1 DO
Menu.setCheck(menu, menuColors + i, ORD(Ini.curSectionNum = i)*2)
END;
INC(x, menuViewX)
ELSIF menu = menuSyntax THEN
Menu.setCheck(menu, menuNone, ORD(text.lang = Languages.langNone)*2);
Menu.setCheck(menu, menuC, ORD(text.lang = Languages.langC)*2);
Menu.setCheck(menu, menuFasm, ORD(text.lang = Languages.langFasm)*2);
Menu.setCheck(menu, menuIni, ORD(text.lang = Languages.langIni)*2);
Menu.setCheck(menu, menuLua, ORD(text.lang = Languages.langLua)*2);
Menu.setCheck(menu, menuOberon, ORD(text.lang = Languages.langOberon)*2);
Menu.setCheck(menu, menuPascal, ORD(text.lang = Languages.langPascal)*2);
INC(x, menuSyntaxX)
ELSIF menu = menuProgram THEN
Menu.setEnabled(menu, menuBuild, buildScript # "");
Menu.setEnabled(menu, menuDebug, debugScript # "");
Menu.setEnabled(menu, menuRun, runScript # "");
INC(x, menuProgramX)
ELSIF menu = menuTools THEN
INC(x, menuToolsX)
END;
 
IF menu # NIL THEN
IF Menu.opened(menu) THEN
Menu.close(menu)
END;
Menu.open(menu, x, y)
END
END ShowMenu;
PROCEDURE 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, MenuItemClick, MenuKeyDown)
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, MenuItemClick, MenuKeyDown)
END CreateMenuBookmark;
 
 
PROCEDURE KeyDown (key: INTEGER);
VAR
keyCode: INTEGER;
1460,6 → 1701,9
END
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)
1498,7 → 1742,8
|80: key := 40
|75: key := 37
|77: key := 39
|82: key := -1 (* insert *)
|82, 91, 219, 92, 220: key := -1 (* insert, windows *)
|93: ShowMenu(context); key := -1
|83: key := 46
|59, 62..66, 68, 87, 88: key := -1 (* F1, F4..F8, F10, F11, F12 *)
ELSE
1575,6 → 1820,8
ShowMenu(menuFile)
|btnEdit:
ShowMenu(menuEdit)
|btnMenuSearch:
ShowMenu(menuSearch)
|btnEncoding:
ShowMenu(menuEncoding)
|btnView:
1638,18 → 1885,6
Script(buildScript)
|btnRun:
Script(runScript)
|btnUp:
T.scroll(text, 0, -1);
repaint
|btnDown:
T.scroll(text, 0, 1);
repaint
|btnLeft:
T.scroll(text, -1, 0);
repaint
|btnRight:
T.scroll(text, 1, 0);
repaint
|btnFindNext:
IF searchText # "" THEN
notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW));
1686,20 → 1921,14
focus := EditBox_Focus(eb);
box_lib.edit_box_mouse(eb);
IF focus # EditBox_Focus(eb) THEN
SetFocus(eb, TRUE)
SetFocus(eb, TRUE);
repaint
END
END EditBox;
 
 
BEGIN
Menu.close(menuFile);
Menu.close(menuEdit);
Menu.close(menuEncoding);
Menu.close(menuView);
Menu.close(menuSyntax);
Menu.close(menuProgram);
Menu.close(menuTools);
Menu.close(context);
CloseMenu;
IF ~resized THEN
msState := K.MouseState();
IF ~(0 IN msState) OR (16 IN msState) THEN
1717,18 → 1946,18
repaint
END
END;
IF VScroll THEN
IF Scroll.isActive(hScroll) THEN
mouse(x, y);
Scroll.mouse(vScroll, x, y - scrollWidth);
Scroll.MouseMove(hScroll, x + LEFT, y + TOP);
T.getScroll(text, scrollX, scrollY);
T.scroll(text, 0, vScroll.value - scrollY);
T.scroll(text, hScroll.value - scrollX, 0);
repaint
END;
IF HScroll THEN
IF Scroll.isActive(vScroll) THEN
mouse(x, y);
Scroll.mouse(hScroll, x - scrollWidth, y);
Scroll.MouseMove(vScroll, x + LEFT, y + TOP);
T.getScroll(text, scrollX, scrollY);
T.scroll(text, hScroll.value - scrollX, 0);
T.scroll(text, 0, vScroll.value - scrollY);
repaint
END;
IF (8 IN msState) & ~(24 IN msState) THEN
1740,9 → 1969,13
END;
IF 24 IN msState THEN
mouse(x, y);
IF ~hScroll.mouse THEN
Scroll.MouseDown(hScroll, x + LEFT, y + TOP)
END;
IF ~vScroll.mouse THEN
Scroll.MouseDown(vScroll, x + LEFT, y + TOP)
END;
IF (ABS(x - firstClickX) < 5) & (ABS(y - firstClickY) < 5) THEN
VScroll := FALSE;
HScroll := FALSE;
IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
leftButton := FALSE;
T.selectWord(text);
1808,6 → 2041,7
resized: BOOLEAN;
firstClickX, firstClickY, time: INTEGER;
BEGIN
delay := scrollDelay;
K.GetSystemColors;
Icons.get(icons, grayIcons);
modified := FALSE;
1836,17 → 2070,28
font2 := G.CreateFont(2, "", {});
font := font1;
G.SetFont(canvas, font);
T.init(NIL);
T.init(resetTimer);
T.setCanvas(canvas);
U.ptr2str(K.GetCommandLine(), fileName);
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;
menuEncoding := CreateMenuEncoding();
menuView := CreateMenuView();
menuSyntax := CreateMenuSyntax();
menuProgram := CreateMenuProgram();
menuTools := CreateMenuTools();
 
Ini.getSettings(buildScript, runScript, debugScript);
IF fileName = "" THEN
text := T.New();
filePath := "/rd/1"
1854,7 → 2099,7
text := T.open(fileName, err);
IF text = NIL THEN
error("'cedit: error opening file' -E");
K.Exit
Exit
ELSE
U.getPath(fileName, filePath)
END
1861,9 → 2106,8
END;
OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, "");
insert(0, text);
 
vScroll := Scroll.create(scrollWidth, canvas.height - scrollWidth*2 + 2);
hScroll := Scroll.create(canvas.width - scrollWidth*2, scrollWidth);
Scroll.create(FALSE, canvas.width, scrollWidth, scrollWidth, scrollWidth, hScroll);
Scroll.create(TRUE, scrollWidth, canvas.height, scrollWidth, scrollWidth, vScroll);
T.resize(canvas.width, canvas.height);
T.SetPos(text, 0, 0);
confirm := FALSE;
1876,19 → 2120,23
cs := FALSE;
whole := FALSE;
replaced := 0;
Ini.getStr("paths", "build", buildScript);
Ini.getStr("paths", "run", runScript);
Ini.getStr("paths", "debug", debugScript);
K.SetEventsMask({0, 1, 2, 5, 6, 31});
Menu.init(resetTimer);
draw_window;
Timer.create(mainTID);
WHILE TRUE DO
CASE K.WaitForEvent() OF
|1: Redraw(resized, width, height, cliWidth, cliHeight)
|1: IF Menu.redraw THEN
Redraw(resized, width, height, cliWidth, cliHeight)
ELSE
Menu.Redraw;
K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header);
repaint
END
|2: KeyDown(K.GetKey())
|3: BtnClick
|6: MouseEvent(resized, firstClickX, firstClickY, time)
|7: receiveIPC
ELSE
END
END
END main;