Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 9049 → Rev 9050

/programs/develop/cedit/CEDIT
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/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
/programs/develop/cedit/SRC/ChangeLog.ob07
42,13 → 42,17
 
END;
 
 
VAR
tLog* = POINTER TO RECORD
Log*: List.tList;
guard: tGuard;
isLast: BOOLEAN;
isLast: BOOLEAN
END;
 
 
VAR
CL*: tLog;
 
 
PROCEDURE isLastGuard* (guard: tGuard): BOOLEAN;
VAR
item: List.tItem;
55,7 → 59,7
res: BOOLEAN;
BEGIN
IF guard # NIL THEN
item := Log.last;
item := CL.Log.last;
WHILE ~(item IS tGuard) DO
item := item.prev
END;
72,7 → 76,7
item: List.tItem;
BEGIN
ASSERT(guard # NIL);
item := Log.first;
item := CL.Log.first;
WHILE ~(item IS tGuard) DO
item := item.next
END
82,8 → 86,8
 
PROCEDURE setGuard* (_guard: tGuard);
BEGIN
guard := _guard;
isLast := isLastGuard(_guard)
CL.guard := _guard;
CL.isLast := isLastGuard(_guard)
END setGuard;
 
 
102,9 → 106,9
item: List.tItem;
(*res: INTEGER;*)
BEGIN
isLast := TRUE;
CL.isLast := TRUE;
REPEAT
item := List.pop(Log);
item := List.pop(CL.Log);
IF item # guard THEN
(*
IF item IS tUntypedPtr THEN
115,7 → 119,7
DISPOSE(item)
END
UNTIL item = guard;
List.append(Log, item)
List.append(CL.Log, item)
END clear;
 
 
126,10 → 130,10
NEW(item);
item.adr := adrV;
SYSTEM.GET(adrX, item.val);
IF ~isLast THEN
clear(guard)
IF ~CL.isLast THEN
clear(CL.guard)
END;
List.append(Log, item)
List.append(CL.Log, item)
END changeWord;
 
 
140,10 → 144,10
NEW(item);
item.adr := SYSTEM.ADR(v);
item.val := x;
IF ~isLast THEN
clear(guard)
IF ~CL.isLast THEN
clear(CL.guard)
END;
List.append(Log, item)
List.append(CL.Log, item)
END changeBool;
 
 
179,10 → 183,27
END untypedPtr;
*)
 
PROCEDURE set* (_CL: tLog);
BEGIN
guard := NIL;
isLast := TRUE;
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
List.init(changeInt, changePtr);
Lines.init(changeInt, changePtr, changeBool(*, typedPtr, untypedPtr*));
Log := List.create(NIL)
Lines.init(changeInt, changePtr, changeBool(*, typedPtr, untypedPtr*))
END ChangeLog.
/programs/develop/cedit/SRC/KolibriOS.ob07
23,20 → 23,6
KOSAPI, SYSTEM;
 
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;
fontHeight* = 16;
 
44,7 → 30,7
 
winColor*, textColor*, btnColor*, btnTextColor*,
toolbarColor*, scrollColor*, scrollBkColor*,
borderColor*, selMenuColor*, shadowColor*,
borderColor*, shadowColor*,
caseColor*, disCaseColor*: INTEGER;
 
 
172,6 → 158,12
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);
VAR
res: INTEGER;
343,15 → 335,6
VAR
buf: ARRAY 10 OF INTEGER;
BEGIN
(* winColor := 0EEEEEEH;
textColor := 0000000H;
btnColor := 0CCCCCCH;
btnTextColor := 0000000H;
scrollColor := 0A0A0A0H;
scrollBkColor := winColor;
borderColor := 0808080H;
*)
selMenuColor := 0CCE8FFH;
toolbarColor := 0DFDFDFH;
shadowColor := 0808080H;
caseColor := 00000FFH;
/programs/develop/cedit/SRC/Languages.ob07
27,6 → 27,8
langNone* = 0; langC* = 1; langOberon* = 2; langPascal* = 3;
langFasm* = 4; langLua* = 5; langIni* = 6;
 
csLang = {langNone, langC, langOberon, langLua, langIni};
 
TYPE
 
tLine = Lines.tLine;
43,6 → 45,11
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;
VAR
i: INTEGER;
/programs/develop/cedit/SRC/Lines.ob07
51,7 → 51,7
(* _typedPtr: PTypedPtr;
_untypedPtr: PUntypedPtr;*)
 
maxLength*: INTEGER;
pMaxLength: INTEGER;
 
 
PROCEDURE movInt (VAR v: INTEGER; x: INTEGER);
75,9 → 75,12
PROCEDURE malloc (size: INTEGER): INTEGER;
VAR
ptr: INTEGER;
maxLength: INTEGER;
BEGIN
ASSERT(pMaxLength # 0);
SYSTEM.GET(pMaxLength, maxLength);
IF size > maxLength THEN
maxLength := size
SYSTEM.PUT(pMaxLength, size)
END;
size := size*WCHAR_SIZE + 4;
INC(size, (-size) MOD 32);
422,6 → 425,12
END init;
 
 
PROCEDURE setMaxLength* (VAR maxLength: INTEGER);
BEGIN
maxLength := 64
pMaxLength := SYSTEM.ADR(maxLength)
END setMaxLength;
 
 
BEGIN
pMaxLength := 0
END Lines.
/programs/develop/cedit/SRC/List.ob07
176,20 → 176,24
movPtr(a.next, b0);
movPtr(b.next, a);
movPtr(a.prev, b);
IF (a0 # NIL) & (b0 # NIL) THEN
IF a0 # NIL THEN
IF b0 # NIL THEN
movPtr(a0.next, b);
movPtr(b0.prev, a);
ELSIF (a0 # NIL) & (b0 = NIL) THEN
ELSE
movPtr(a0.next, b);
movPtr(list.last, a)
ELSIF (a0 = NIL) & (b0 # NIL) THEN
END
ELSE
IF b0 # NIL THEN
movPtr(b0.prev, a);
movPtr(list.first, b)
ELSIF (a0 = NIL) & (b0 = NIL) THEN
ELSE
movPtr(list.first, b);
movPtr(list.last, a)
END
END
END
END _exchange;
 
 
/programs/develop/cedit/SRC/Tabs.ob07
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.
/programs/develop/cedit/SRC/Text.ob07
80,7 → 80,9
foundList: List.tList;
idxData: Search.tBuffer;
foundSel: INTEGER;
searchText: tString
searchText: tString;
chLog*: ChangeLog.tLog;
maxLength*: INTEGER
END;
 
tProcedure = PROCEDURE;
393,7 → 395,7
ELSIF (c = "'") OR (c = '"') THEN
String(text, line, i, y, backColor)
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
PrintLex(text, line, i, i, y, colors.delim, backColor)
ELSIF U.isDigit(c) THEN
438,7 → 440,7
String(text, line, i, y, backColor);
cond := 0
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
ELSIF U.isDigit(c) THEN
k := i;
557,7 → 559,7
PrintLex(text, line, k, i, y, color, backColor);
cond := 0
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
ELSIF c = "(" THEN
cond := 1
645,7 → 647,7
PrintLex(text, line, k, i, y, colors.num, backColor);
cond := 0
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
ELSE
cond := 0
744,7 → 746,7
PrintLex(text, line, k, i, y, colors.num, backColor);
cond := 0
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
ELSE
cond := 0
786,7 → 788,7
DEC(i);
PrintLex(text, line, k, i, y, colors.num, backColor)
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
ELSIF depth = 1 THEN
IF c = "]" THEN
1179,7 → 1181,7
BEGIN
INC(text.scroll.X, h);
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)
END scroll;
 
1264,7 → 1266,7
text.modified := TRUE
END;
 
item := ChangeLog.Log.first;
item := ChangeLog.CL.Log.first;
WHILE item # guard DO
ChangeLog.redo(item);
item := item.next
1579,7 → 1581,7
str := ""
END
END;
IF search(text, str, TRUE, TRUE) THEN END
IF search(text, str, Lang.isCS(text.lang), TRUE) THEN END
END wordSel;
 
 
1809,7 → 1811,7
END;
IF text.guard THEN
NEW(guard);
List.append(ChangeLog.Log, guard);
List.append(ChangeLog.CL.Log, guard);
text.edition := guard;
text.guard := FALSE;
ELSE
1944,11 → 1946,20
END draw;
 
 
PROCEDURE switch* (text: tText);
BEGIN
ChangeLog.set(text.chLog);
Lines.setMaxLength(text.maxLength)
END switch;
 
 
PROCEDURE create (fileName: RW.tFileName): tText;
VAR
text: tText;
BEGIN
NEW(text);
text.maxLength := 64;
text.chLog := ChangeLog.create(text.maxLength);
NEW(text.cursor);
NEW(text.select2);
text.cursor.X := 0;