/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; |