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