Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 9049 → Rev 9050

/programs/develop/cedit/SRC/CEdit.ob07
25,10 → 25,10
G := Graph, T := Text, E := Encodings,
CB := Clipboard, Languages,
ChangeLog, Scroll,
RW, Ini, box_lib, Icons;
RW, Ini, box_lib, Icons, Tabs;
 
CONST
header = "CEdit (06-jul-2021)";
header = "CEdit (10-jul-2021)";
 
ShellFilter = "";
EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI";
80,7 → 80,7
toolbarDelim = 7;
iconPad = (toolBtnSize - Icons.SIZE) DIV 2;
 
TOP = btnTop + toolBtnSize + 7;
TOP = btnTop + toolBtnSize + 10 + Tabs.tabHeight;
RIGHT = scrollWidth - 2;
BOTTOM = scrollWidth + 18;
 
115,8 → 115,10
menuOpen = 11;
menuSave = 12;
menuSaveAs = 13;
menuFolder = 14;
menuExit = 15;
menuSaveAll = 14;
menuFolder = 15;
menuClose = 16;
menuExit = 17;
 
menuNumbers = 20;
menuFontSize = 21;
146,11 → 148,18
menuPipet = 70;
menuSysFunc = 71;
 
maxTexts = 32;
 
 
VAR
canvas: G.tCanvas;
font, font1, font2: G.tFont;
 
tabs: Tabs.tTabs;
text: T.tText;
texts: ARRAY maxTexts OF T.tText;
textsCount, curText: INTEGER;
 
winWidth, winHeight: INTEGER;
shift: SET;
AppPath, runScript, buildScript, debugScript: RW.tFileName;
157,6 → 166,7
OD: OpenDlg.Dialog;
confirm, notFound, search, modified: BOOLEAN;
 
switch: BOOLEAN;
leftButton, VScroll, HScroll: BOOLEAN;
vScroll, hScroll: Scroll.tScroll;
LEFT: INTEGER;
335,6 → 345,26
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;
VAR
width, height, scrollX, scrollY, y: INTEGER;
348,8 → 378,14
IF ~search THEN
T.wordSel(text)
END;
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);
K.ClientSize(width, height);
y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
K.DrawRect(LEFT, TOP + canvas.height + scrollWidth - 1, 16*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
WritePos(y);
360,7 → 396,7
 
T.getScroll(text, scrollX, scrollY);
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(hScroll, LEFT + scrollWidth, TOP + canvas.height - 1);
 
388,6 → 424,7
K.ClientSize(cliWidth, cliHeight);
G.destroy(canvas);
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);
T.setCanvas(canvas);
T.resize(canvas.width, canvas.height);
448,7 → 485,7
 
PROCEDURE draw_window;
VAR
width, height, x, y: INTEGER;
width, height, x: INTEGER;
 
 
PROCEDURE drawToolbarBtn (id, x: INTEGER);
547,21 → 584,11
K.PutPixel(LEFT + canvas.width + scrollWidth - 2, TOP, K.winColor);
K.PutPixel(LEFT, TOP + canvas.height + scrollWidth - 2, K.winColor);
 
y := (btnHeight - fontHeight) DIV 2 + btnTop;
CASE text.enc OF
|E.UTF8: K.DrawText866(width - 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;
DrawState(text, width, height);
IF search THEN
SearchPanel(searchLeft, TOP)
END;
 
y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
K.DrawRect(LEFT + 16*fontWidth, TOP + canvas.height + scrollWidth - 1, width - LEFT - 24*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
K.DrawText866(LEFT + 16*fontWidth, y, K.textColor, text.fileName);
WriteModified(width - 8*fontWidth, y);
Tabs.draw(tabs);
repaint
END;
K.EndDraw
622,9 → 649,20
END error;
 
 
PROCEDURE saveAs;
PROCEDURE saveError (name: RW.tFileName);
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;
BEGIN
OD._type := OpenDlg.tsave;
645,44 → 683,86
OpenFile(fileName, EditFilter);
IF fileName # "" 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
error("'cedit: error saving file' -E")
saveError(fileName)
END
END
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
IF text.modified THEN
IF text.fileName # "" THEN
IF ~T.save(text, text.fileName, text.enc, RW.EOL_CRLF) THEN
error("'cedit: error saving file' -E")
saveError(text.fileName)
END
ELSE
saveAs
curText := getIdx(text);
Switch(text);
saveAs(text)
END
END
END save;
 
 
PROCEDURE SelfRun (file: ARRAY OF CHAR);
PROCEDURE saveAll;
VAR
i: INTEGER;
BEGIN
K.Run(AppPath, file)
END SelfRun;
i := textsCount - 1;
WHILE i >= 0 DO
IF texts[i].modified THEN
save(texts[i])
END;
DEC(i)
END;
END saveAll;
 
 
PROCEDURE open;
PROCEDURE insert (pos: INTEGER; txt: T.tText);
VAR
fileName: RW.tFileName;
i: INTEGER;
name: RW.tFileName;
BEGIN
OD._type := OpenDlg.topen;
OpenFile(fileName, EditFilter);
IF fileName # "" THEN
SelfRun(fileName)
END
END open;
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;
707,6 → 787,104
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;
VAR
edit, EditBox0: box_lib.edit_box;
813,12 → 991,19
 
 
PROCEDURE close;
VAR
cont: BOOLEAN;
BEGIN
cont := TRUE;
WHILE (textsCount > 0) & cont DO
IF text.modified THEN
Confirm
Confirm;
cont := FALSE
ELSE
K.Exit
closeFile(FALSE);
repaint
END
END
END close;
 
 
859,15 → 1044,20
|menuSelectAll: T.key(text, ORD("A"), {T.CTRL})
 
|menuNew:
SelfRun("")
NewFile
|menuOpen:
open
|menuSave:
save;
save(text);
repaint
|menuSaveAs:
saveAs;
saveAs(text);
repaint
|menuSaveAll:
saveAll;
repaint
|menuClose:
closeFile(TRUE)
|menuFolder:
K.Run("/rd/1/File Managers/Eolite", text.fileName)
|menuExit:
1014,8 → 1204,11
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");
Menu.delimiter(menu);
Menu.AddMenuItem(menu, menuExit, "exit");
RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
END CreateMenuFile;
1155,6 → 1348,11
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));
1218,7 → 1416,7
PROCEDURE main;
VAR
width, height, x, y, scrollX, scrollY, i: INTEGER;
key: INTEGER;
key, btn: INTEGER;
msState: SET;
scroll: INTEGER;
err: INTEGER;
1230,6 → 1428,9
K.GetSystemColors;
Icons.get(icons, grayIcons);
modified := FALSE;
switch := FALSE;
textsCount := 0;
curText := 0;
mainTID := K.ThreadID();
K.SetIPC(IPC);
U.ptr2str(K.GetName(), AppPath);
1247,6 → 1448,8
cliHeight := winHeight;
LEFT := searchLeft;
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, "", {});
font2 := G.CreateFont(2, "", {});
font := font1;
1275,6 → 1478,7
END
END;
OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, "");
insert(0, text);
 
vScroll := Scroll.create(scrollWidth, canvas.height - scrollWidth*2 + 1);
hScroll := Scroll.create(canvas.width - scrollWidth*2, scrollWidth);
1320,9 → 1524,9
getKBState;
IF confirm THEN
IF key DIV 65536 = 28 THEN (* Enter *)
save;
save(text);
IF ~text.modified THEN
K.Exit
closeFile(FALSE)
END;
repaint
END;
1407,7 → 1611,7
open
|30: key := ORD("A")
|31: key := -1;
save
save(text)
|32: key := ORD("D")
|38: key := ORD("L")
|44: T.undo(text);
1416,7 → 1620,7
|46: key := ORD("C")
|47: key := ORD("V")
|49: key := -1;
SelfRun("")
NewFile
ELSE
key := -1
END
1431,7 → 1635,17
END;
repaint
|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:
 
|btnFile:
1449,21 → 1663,23
|btnTools:
ShowMenu(menuTools)
|btnNo:
K.Exit
closeFile(FALSE);
repaint
|btnYes:
save;
save(text);
IF ~text.modified THEN
K.Exit
closeFile(FALSE)
END;
repaint
|btnClose:
close
|btnNew:
SelfRun("")
NewFile;
repaint
|btnOpen:
open
|btnSave:
save;
save(text);
repaint
|btnSearch:
IF ~search THEN