From 254d30c0750f0a14b07576eed05f6e96a314f602 Mon Sep 17 00:00:00 2001 From: Anton Krotov Date: Mon, 24 Jan 2022 22:03:13 +0000 Subject: [PATCH] CEdit: optimization; small font (6x9) support git-svn-id: svn://kolibrios.org@9668 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/cedit/CEDIT | Bin 30603 -> 31196 bytes programs/develop/cedit/SRC/CEdit.ob07 | 83 +++++--- programs/develop/cedit/SRC/ChangeLog.ob07 | 28 ++- programs/develop/cedit/SRC/CheckBox.ob07 | 2 +- programs/develop/cedit/SRC/Graph.ob07 | 61 ++++-- programs/develop/cedit/SRC/Icons.ob07 | 4 +- programs/develop/cedit/SRC/Lines.ob07 | 61 +++++- programs/develop/cedit/SRC/List.ob07 | 33 +-- programs/develop/cedit/SRC/Menu.ob07 | 2 +- programs/develop/cedit/SRC/StatusBar.ob07 | 24 ++- programs/develop/cedit/SRC/Text.ob07 | 233 ++++++++++++++-------- 11 files changed, 374 insertions(+), 157 deletions(-) diff --git a/programs/develop/cedit/CEDIT b/programs/develop/cedit/CEDIT index 8722fe8fa3a1bb83f6885e4642855f29ce42a124..0ef59a7338b762bbd34d14f3d2a2e672cd87a692 100644 GIT binary patch literal 31196 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 L94Q9y3jhEIKt`}p literal 30603 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 blink) & (blink > 0) & timerEnabled & ~K.RolledUp() THEN CursorTime := CurrentTime; - T.toggleCursor; - repaint + T.cursor(text); + drawText END; CASE K.EventTimeout(10) OF diff --git a/programs/develop/cedit/SRC/ChangeLog.ob07 b/programs/develop/cedit/SRC/ChangeLog.ob07 index 02d7c3cd5a..55f46ef701 100644 --- a/programs/develop/cedit/SRC/ChangeLog.ob07 +++ b/programs/develop/cedit/SRC/ChangeLog.ob07 @@ -46,7 +46,7 @@ TYPE tLog* = POINTER TO RECORD Log*, Pointers*: List.tList; - guard: tGuard; + guard, first: tGuard; isLast: BOOLEAN END; @@ -73,16 +73,25 @@ BEGIN END isLastGuard; -PROCEDURE isFirstGuard* (guard: tGuard): BOOLEAN; +PROCEDURE getFirstGuard (): tGuard; VAR - item: List.tItem; + item: List.tItem; BEGIN - ASSERT(guard # NIL); - item := CL.Log.first; - WHILE ~(item IS tGuard) DO - item := item.next - END - RETURN guard = item + item := CL.Log.first; + WHILE ~(item IS tGuard) DO + item := item.next + END + RETURN item(tGuard) +END getFirstGuard; + + +PROCEDURE isFirstGuard* (guard: tGuard): BOOLEAN; +BEGIN + ASSERT(guard # NIL); + IF CL.first = NIL THEN + CL.first := getFirstGuard() + END + RETURN guard = CL.first END isFirstGuard; @@ -285,6 +294,7 @@ VAR BEGIN NEW(newLog); newLog.guard := NIL; + newLog.first := NIL; newLog.isLast := TRUE; newLog.Log := List.create(NIL); newLog.Pointers := List.create(NIL); diff --git a/programs/develop/cedit/SRC/CheckBox.ob07 b/programs/develop/cedit/SRC/CheckBox.ob07 index f7486bc389..84f884cd6a 100644 --- a/programs/develop/cedit/SRC/CheckBox.ob07 +++ b/programs/develop/cedit/SRC/CheckBox.ob07 @@ -82,7 +82,7 @@ BEGIN res.mouse := FALSE; COPY(text, res.text); res.canvas := G.CreateCanvas(fontHeight + padding + LENGTH(res.text)*fontWidth, fontHeight + 1); - G.SetFont(res.canvas, G.CreateFont(1, "", {})); + G.SetFont(res.canvas, G.font1); chkbox := res END create; diff --git a/programs/develop/cedit/SRC/Graph.ob07 b/programs/develop/cedit/SRC/Graph.ob07 index 27d32123e9..1e71740c63 100644 --- a/programs/develop/cedit/SRC/Graph.ob07 +++ b/programs/develop/cedit/SRC/Graph.ob07 @@ -19,7 +19,7 @@ MODULE Graph; -IMPORT SYSTEM, KOSAPI, Lines, Languages; +IMPORT SYSTEM, KOSAPI, Lines, Languages, E := Encodings; CONST @@ -39,6 +39,7 @@ TYPE height*: INTEGER; width*: INTEGER; size: INTEGER; + flags: INTEGER; name*: ARRAY 256 OF WCHAR END; @@ -50,6 +51,10 @@ TYPE mode: INTEGER END; +VAR + + font0*, font1*, font2*: tFont; + PROCEDURE getRGB* (color: INTEGER; VAR r, g, b: BYTE); BEGIN @@ -83,15 +88,26 @@ BEGIN END SetBkColor; -PROCEDURE CreateFont* (height: INTEGER; name: ARRAY OF WCHAR; attr: SET): tFont; +PROCEDURE CreateFont (size: INTEGER; name: ARRAY OF WCHAR; attr: SET): tFont; VAR font: tFont; BEGIN + ASSERT(size IN {0, 1, 2}); NEW(font); - font.size := MAX(MIN(height, 8), 1); - font.width := font.size*8; - font.height := font.size*16; - DEC(font.size); + font.size := size; + IF size = 0 THEN + font.width := 6; + font.height := 9; + font.flags := 08000000H + ELSE + font.width := size*8; + font.height := size*16; + IF size = 1 THEN + font.flags := 28000000H + ELSIF size = 2 THEN + font.flags := 29000000H + END + END; font.name := name RETURN font END CreateFont; @@ -256,24 +272,25 @@ PROCEDURE TextOut* (canvas: tCanvas; x, y: INTEGER; text: INTEGER; n: INTEGER; d CONST WCHAR_SIZE = 2; VAR - color, i, font: INTEGER; + color, i, ch: INTEGER; + font: tFont; c: WCHAR; BEGIN - IF (0 <= y) & (y <= canvas.height - canvas.font.height - 1) THEN + font := canvas.font; + IF (0 <= y) & (y <= canvas.height - font.height - 1) THEN IF x < 0 THEN - i := -(x DIV canvas.font.width); - INC(x, i*canvas.font.width); + i := -(x DIV font.width); + INC(x, i*font.width); DEC(n, i) ELSE i := 0 END; IF n > 0 THEN - n := MAX(MIN(n, (canvas.width - x) DIV canvas.font.width), 0); + n := MAX(MIN(n, (canvas.width - x) DIV font.width), 0); color := canvas.color; canvas.color := canvas.backColor; - FillRect(canvas, x, y, x + n*canvas.font.width, y + canvas.font.height); + FillRect(canvas, x, y, x + n*font.width, y + font.height); canvas.color := color; - font := LSL(28H + canvas.font.size, 24); WHILE n > 0 DO SYSTEM.GET(text + i*WCHAR_SIZE, c); IF ~Lines.isSpace(c) THEN @@ -285,9 +302,17 @@ BEGIN IF c = Lines.NUL THEN c := 0X END; - KOSAPI.sysfunc6(4, x*65536 + y, font + color, SYSTEM.ADR(c), 1, canvas.bitmap - 8) + IF font = font0 THEN + ch := E.UNI[ORD(c), E.CP866]; + IF ch = E.UNDEF THEN + c := "?" + ELSE + c := WCHR(ch) + END + END; + KOSAPI.sysfunc6(4, x*65536 + y, font.flags + color, SYSTEM.ADR(c), 1, canvas.bitmap - 8) END; - INC(x, canvas.font.width); + INC(x, font.width); INC(i); DEC(n) END @@ -322,10 +347,14 @@ END CreateCanvas; PROCEDURE destroy* (VAR canvas: tCanvas); BEGIN IF canvas # NIL THEN - canvas.bitmap := KOSAPI.free(canvas.bitmap); + canvas.bitmap := KOSAPI.free(canvas.bitmap - 8); DISPOSE(canvas) END END destroy; +BEGIN + font0 := CreateFont(0, "", {}); + font1 := CreateFont(1, "", {}); + font2 := CreateFont(2, "", {}); END Graph. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/Icons.ob07 b/programs/develop/cedit/SRC/Icons.ob07 index ee051afdb4..a53a1e42ce 100644 --- a/programs/develop/cedit/SRC/Icons.ob07 +++ b/programs/develop/cedit/SRC/Icons.ob07 @@ -56,7 +56,7 @@ BEGIN END GetInf; -PROCEDURE GetImg* (ptr, size: INTEGER): INTEGER; +PROCEDURE GetImg (ptr, size: INTEGER): INTEGER; VAR image_data, dst, x, type: INTEGER; BEGIN @@ -133,7 +133,7 @@ BEGIN (*ELSE copy(source, icons); copy(source, grayIcons)*) - END; + END END get; diff --git a/programs/develop/cedit/SRC/Lines.ob07 b/programs/develop/cedit/SRC/Lines.ob07 index 2bf203dfee..33d6f325c2 100644 --- a/programs/develop/cedit/SRC/Lines.ob07 +++ b/programs/develop/cedit/SRC/Lines.ob07 @@ -45,6 +45,12 @@ TYPE PTypedPtr = PROCEDURE (p: List.tItem); PUntypedPtr = PROCEDURE (p: INTEGER); + tVector* = POINTER TO RECORD + size, data: INTEGER + END; + + tVectorItem = tLine; + VAR @@ -58,6 +64,57 @@ VAR tabs*: BOOLEAN; +PROCEDURE createVector* (size: INTEGER): tVector; +VAR + res: tVector; +BEGIN + IF size > 0 THEN + NEW(res); + res.size := size; + IF size < 4096 THEN + size := 4096 + END; + res.data := API._NEW(size*SYSTEM.SIZE(tVectorItem)); + IF res.data = 0 THEN + DISPOSE(res) + END + ELSE + res := NIL + END + RETURN res +END createVector; + + +PROCEDURE destroyVector* (VAR vector: tVector); +BEGIN + IF vector # NIL THEN + IF vector.data # 0 THEN + vector.data := API._DISPOSE(vector.data) + END; + DISPOSE(vector) + END +END destroyVector; + + +PROCEDURE setVectorItem* (vector: tVector; idx: INTEGER; item: tVectorItem); +BEGIN + ASSERT(vector # NIL); + ASSERT((0 <= idx) & (idx < vector.size)); + SYSTEM.PUT(vector.data + idx*SYSTEM.SIZE(tVectorItem), item) +END setVectorItem; + + +PROCEDURE getVectorItem* (vector: tVector; idx: INTEGER): tVectorItem; +VAR + res: tVectorItem; +BEGIN + ASSERT(vector # NIL); + ASSERT((0 <= idx) & (idx < vector.size)); + SYSTEM.GET(vector.data + idx*SYSTEM.SIZE(tVectorItem), res) + RETURN res +END getVectorItem; + + PROCEDURE movInt (VAR v: INTEGER; x: INTEGER); BEGIN _movInt(v, x) @@ -173,8 +230,8 @@ BEGIN ASSERT(line.temp); IF size > 0 THEN line.ptr := API._DISPOSE(line.ptr); - size := size*WCHAR_SIZE + 4; - INC(size, (-size) MOD 32); + size := size*WCHAR_SIZE + 4; + INC(size, (-size) MOD 32); line.ptr := API._NEW(size) ELSE destroy(line) diff --git a/programs/develop/cedit/SRC/List.ob07 b/programs/develop/cedit/SRC/List.ob07 index 849215c86c..b2cc1922e0 100644 --- a/programs/develop/cedit/SRC/List.ob07 +++ b/programs/develop/cedit/SRC/List.ob07 @@ -22,7 +22,7 @@ MODULE List; TYPE tItem* = POINTER TO RECORD - prev*, next*: tItem + next*, prev*: tItem END; tList* = POINTER TO RECORD @@ -54,18 +54,27 @@ END create; PROCEDURE getItem* (list: tList; idx: INTEGER): tItem; VAR - item: tItem; + item: tItem; BEGIN - IF idx < 0 THEN - item := NIL - ELSE - item := list.first; - WHILE (idx > 0) & (item # NIL) DO - item := item.next; - DEC(idx) - END - END - RETURN item + IF (idx < 0) OR (idx >= list.count) THEN + item := NIL + ELSE + IF list.count DIV 2 < idx THEN + item := list.last; + idx := list.count - idx - 1; + WHILE idx > 0 DO + item := item.prev; + DEC(idx) + END + ELSE + item := list.first; + WHILE idx > 0 DO + item := item.next; + DEC(idx) + END + END + END + RETURN item END getItem; diff --git a/programs/develop/cedit/SRC/Menu.ob07 b/programs/develop/cedit/SRC/Menu.ob07 index 1b72a1f491..1ce3c3a911 100644 --- a/programs/develop/cedit/SRC/Menu.ob07 +++ b/programs/develop/cedit/SRC/Menu.ob07 @@ -641,7 +641,7 @@ BEGIN END; m.width := maxLength*fontWidth + LEFT + RIGHT; m.height := items.count*fontHeight - 2; - m.font := G.CreateFont(1, "", {}); + m.font := G.font1; m.canvas := G.CreateCanvas(m.width + 1, m.height + 1); G.SetFont(m.canvas, m.font); RETURN m diff --git a/programs/develop/cedit/SRC/StatusBar.ob07 b/programs/develop/cedit/SRC/StatusBar.ob07 index efbba64b47..b2f52478db 100644 --- a/programs/develop/cedit/SRC/StatusBar.ob07 +++ b/programs/develop/cedit/SRC/StatusBar.ob07 @@ -76,12 +76,17 @@ BEGIN END setEnc; +PROCEDURE height* (): INTEGER; + RETURN font.height + 3 +END height; + + PROCEDURE setWidth* (width: INTEGER); BEGIN ASSERT(width > 0); - IF (SB.canvas = NIL) OR (SB.canvas.width # width) THEN + IF (SB.canvas = NIL) OR (SB.canvas.width # width) OR (SB.canvas.height # height()) THEN G.destroy(SB.canvas); - SB.canvas := G.CreateCanvas(width, 19); + SB.canvas := G.CreateCanvas(width, height()); G.SetFont(SB.canvas, font) END END setWidth; @@ -100,13 +105,22 @@ BEGIN G.SetTextColor(SB.canvas, K.colors.work_text); G.clear(SB.canvas); TextOut(1, SB.pos); - TextOut(16*K.fontWidth, SB.sel); - TextOut(SB.canvas.width - LENGTH(SB.enc)*K.fontWidth - 1, SB.enc); + TextOut(16*font.width, SB.sel); + TextOut(SB.canvas.width - LENGTH(SB.enc)*font.width - 1, SB.enc); G.DrawCanvas(SB.canvas, left, top) END draw; +PROCEDURE SetFont* (_font: G.tFont); +BEGIN + font := _font; + IF SB.canvas # NIL THEN + setWidth(SB.canvas.width) + END +END SetFont; + + BEGIN SB.canvas := NIL; - font := G.CreateFont(1, "", {}) + font := G.font1 END StatusBar. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/Text.ob07 b/programs/develop/cedit/SRC/Text.ob07 index 17f1dae785..7eed922539 100644 --- a/programs/develop/cedit/SRC/Text.ob07 +++ b/programs/develop/cedit/SRC/Text.ob07 @@ -65,7 +65,8 @@ TYPE cursor, select, select2: pPoint; scroll: tPoint; CurX: INTEGER; - modified*: BOOLEAN; + smallChange: INTEGER; + modified*, smallMove: BOOLEAN; edition*: tGuard; comments, numbers*, guard, search, cs, whole: BOOLEAN; @@ -76,6 +77,7 @@ TYPE foundList: List.tList; foundSel: INTEGER; searchText: tString; + LinesVector: Lines.tVector; chLog*: ChangeLog.tLog; maxLength*: INTEGER; fileName*: RW.tFileName @@ -155,12 +157,6 @@ BEGIN END toggleNumbers; -PROCEDURE toggleCursor*; -BEGIN - drawCursor := ~drawCursor -END toggleCursor; - - PROCEDURE showCursor*; BEGIN drawCursor := TRUE @@ -223,25 +219,63 @@ BEGIN END ProcessComments; +PROCEDURE getLine2 (text: tText; n: INTEGER): tLine; +VAR + item: tLine; +BEGIN + IF (0 <= n) & (n < text.count) THEN + item := Lines.getVectorItem(text.LinesVector, n) + ELSE + item := NIL + END + RETURN item +END getLine2; + + PROCEDURE Comments (text: tText); VAR - line: tLine; - i: INTEGER; + line: tLine; + i, k, cout: INTEGER; BEGIN - line := text.first(tLine); - line.cin := 0; - line.cout := 0; - i := 0; - ProcessComments(line, line.cout, i, -1, line.length - 1, text.lang); - NextLine(line); - WHILE line # NIL DO - line.cin := line.prev(tLine).cout; - line.cout := line.cin; - i := 0; - ProcessComments(line, line.cout, i, -1, line.length - 1, text.lang); - NextLine(line) - END; - text.comments := FALSE + IF text.smallChange = 1 THEN + line := getLine2(text, text.cursor.Y); + IF line.prev # NIL THEN + line.cin := line.prev(tLine).cout + ELSE + line.cin := 0 + END; + cout := line.cout; + line.cout := line.cin; + i := 0; + ProcessComments(line, line.cout, i, -1, line.length - 1, text.lang); + IF line.cout # cout THEN + text.smallChange := 0; + Comments(text) + END + ELSE + Lines.destroyVector(text.LinesVector); + text.LinesVector := Lines.createVector(text.count); + k := 0; + line := text.first(tLine); + Lines.setVectorItem(text.LinesVector, k, line); + INC(k); + line.cin := 0; + line.cout := 0; + i := 0; + ProcessComments(line, line.cout, i, -1, line.length - 1, text.lang); + NextLine(line); + WHILE line # NIL DO + Lines.setVectorItem(text.LinesVector, k, line); + INC(k); + line.cin := line.prev(tLine).cout; + line.cout := line.cin; + i := 0; + ProcessComments(line, line.cout, i, -1, line.length - 1, text.lang); + NextLine(line) + END + END; + text.smallChange := 0; + text.comments := FALSE END Comments; @@ -931,10 +965,10 @@ END resetSelect; PROCEDURE getLine (text: tText; n: INTEGER): tLine; VAR - item: List.tItem; + item: List.tItem; BEGIN - item := List.getItem(text, n); - RETURN item(tLine) + item := List.getItem(text, n) + RETURN item(tLine) END getLine; @@ -1110,6 +1144,7 @@ BEGIN resetSelect(text); curLine := text.curLine; IF text.cursor.X > 0 THEN + INC(text.smallChange); i := text.cursor.X; n := leadingSpaces(curLine); modify(text); @@ -1236,7 +1271,7 @@ VAR BEGIN getSelect(text, selBeg, selEnd); i := selEnd.Y - selBeg.Y + 1; - line := getLine(text, selBeg.Y); + line := getLine2(text, selBeg.Y); modified := incr; WHILE i > 0 DO IF incr THEN @@ -1247,11 +1282,12 @@ BEGIN NextLine(line); DEC(i) END; - line := getLine(text, selEnd.Y); + line := getLine2(text, selEnd.Y); text.select^ := selBeg; text.select.X := 0; SetPos(text, line.length, selEnd.Y); IF modified THEN + INC(text.smallChange); modify(text) END END Indent; @@ -1293,6 +1329,9 @@ VAR BEGIN IF (code >= ORD(SPACE)) & (code # 127) THEN + IF ~selected(text) THEN + INC(text.smallChange) + END; delSelect(text); curLine := text.curLine; Lines.insert(curLine, text.cursor.X, WCHR(code)); @@ -1309,6 +1348,7 @@ BEGIN IF selected(text) THEN Indent(text, TRUE) ELSE + INC(text.smallChange); tab(text) END ELSIF code = 13 THEN @@ -1461,8 +1501,8 @@ VAR BEGIN IF selected(text) THEN getSelect(text, selBeg, selEnd); - first := getLine(text, selBeg.Y); - last := getLine(text, selEnd.Y); + first := getLine2(text, selBeg.Y); + last := getLine2(text, selEnd.Y); lines := selEnd.Y - selBeg.Y + 1; IF lines > 1 THEN @@ -1505,7 +1545,7 @@ VAR BEGIN getSelect(text, selBeg, selEnd); - first := getLine(text, selBeg.Y); + first := getLine2(text, selBeg.Y); line := first; n := selEnd.Y - selBeg.Y; @@ -1697,6 +1737,7 @@ BEGIN END; IF Lines.chCase(line, i + 1, text.cursor.X - 1, upper) THEN + INC(text.smallChange); modify(text) END END changeCase; @@ -1712,7 +1753,7 @@ BEGIN modified := FALSE; IF selected(text) THEN getSelect(text, selBeg, selEnd); - first := getLine(text, selBeg.Y); + first := getLine2(text, selBeg.Y); line := first; cnt := selEnd.Y - selBeg.Y; IF cnt = 0 THEN @@ -1737,6 +1778,7 @@ BEGIN END END; IF modified THEN + INC(text.smallChange); modify(text) END END chCase; @@ -1757,6 +1799,7 @@ END UpDown; PROCEDURE delLine* (text: tText); BEGIN + text.smallChange := 2; resetSelect(text); IF text.curLine.length > 0 THEN Lines.delCharN(text.curLine, 0, text.curLine.length) @@ -1905,6 +1948,9 @@ BEGIN str := "" END END; + IF text.searchText # str THEN + text.smallMove := FALSE + END; IF search(text, str, Lang.isCS(text.lang), TRUE) THEN END END wordSel; @@ -1934,12 +1980,16 @@ END getWordPos; PROCEDURE key* (text: tText; code: INTEGER; shift, ctrl: BOOLEAN); VAR n, wPos: INTEGER; + scrX, scrY: INTEGER; + resSel: BOOLEAN; BEGIN + resSel := FALSE; IF shift THEN setSelect(text) ELSE IF (33 <= code) & (code <= 40) THEN IF ~(((code = 38) OR (code = 40)) & ctrl) THEN + resSel := selected(text); resetSelect(text) END END @@ -1980,6 +2030,8 @@ BEGIN IF (text.cursor.X = 0) & (text.curLine.prev # NIL) THEN SetPos(text, text.curLine.prev(tLine).length, text.cursor.Y - 1) ELSE + scrX := text.scroll.X; + scrY := text.scroll.Y; IF ctrl THEN wPos := 0; REPEAT @@ -1989,7 +2041,8 @@ BEGIN move(text, n - text.cursor.X) ELSE move(text, -1) - END + END; + text.smallMove := (scrX = text.scroll.X) & (scrY = text.scroll.Y) & ~resSel END |38: IF ctrl THEN @@ -2001,11 +2054,14 @@ BEGIN IF (text.cursor.X = text.curLine.length) & (text.curLine.next # NIL) THEN SetPos(text, 0, text.cursor.Y + 1) ELSE + scrX := text.scroll.X; + scrY := text.scroll.Y; IF ctrl THEN move(text, getWordPos(text.curLine, text.cursor.X) - text.cursor.X) ELSE move(text, 1) - END + END; + text.smallMove := (scrX = text.scroll.X) & (scrY = text.scroll.Y) & ~resSel END |40: IF ctrl THEN @@ -2017,6 +2073,9 @@ BEGIN IF ctrl THEN delLine(text) ELSE + IF ~selected(text) & (text.cursor.X < text.curLine.length) THEN + INC(text.smallChange) + END; delete(text); ShowCursor END @@ -2103,21 +2162,23 @@ BEGIN END selectWord; -PROCEDURE cursor (text: tText); +PROCEDURE cursor* (text: tText); VAR x, y1, y2, scrollX, scrollY: INTEGER; cursor: pPoint; BEGIN - cursor := text.cursor; - scrollX := text.scroll.X; - scrollY := text.scroll.Y; - IF ~((scrollY > cursor.Y) OR (scrollY + textsize.Y <= cursor.Y) OR - (scrollX > cursor.X) OR (scrollX + textsize.X <= cursor.X)) THEN - x := (cursor.X - scrollX)*charWidth + padding.left; - y1 := (cursor.Y - scrollY)*charHeight + padding.top + (inter DIV 2 + 1); - y2 := y1 + charHeight - (inter + 2); - G.notVLine(canvas, x, y1, y2); - G.notVLine(canvas, x - 1, y1, y2) + IF drawCursor THEN + cursor := text.cursor; + scrollX := text.scroll.X; + scrollY := text.scroll.Y; + IF ~((scrollY > cursor.Y) OR (scrollY + textsize.Y <= cursor.Y) OR + (scrollX > cursor.X) OR (scrollX + textsize.X <= cursor.X)) THEN + x := (cursor.X - scrollX)*charWidth + padding.left; + y1 := (cursor.Y - scrollY)*charHeight + padding.top + (inter DIV 2 + 1); + y2 := y1 + charHeight - (inter + 2); + G.notVLine(canvas, x, y1, y2); + G.notVLine(canvas, x - 1, y1, y2) + END END END cursor; @@ -2168,7 +2229,7 @@ END setPadding; PROCEDURE draw* (text: tText); VAR - y, n, Len, cnt, i, x: INTEGER; + y, n, cnt, i, x: INTEGER; line, firstLine, lastLine: tLine; selBeg, selEnd: tPoint; s: ARRAY 12 OF WCHAR; @@ -2176,10 +2237,10 @@ VAR p: Search.tPos; guard: tGuard; BEGIN - IF text.search & search(text, text.searchText, text.cs, text.whole) THEN END; - IF (text.lang # Lang.langText) & text.comments THEN + IF text.comments THEN Comments(text) END; + IF text.search & search(text, text.searchText, text.cs, text.whole) THEN END; IF text.guard THEN NEW(guard); List.append(ChangeLog.CL.Log, guard); @@ -2197,7 +2258,9 @@ BEGIN guard.selected := text.select = text.select2; G.SetColor(canvas, colors.back); - G.clear(canvas); + IF ~text.smallMove THEN + G.clear(canvas) + END; wNum := charWidth; IF text.numbers THEN numWidth := U.lg10(text.count) + 2; @@ -2209,9 +2272,19 @@ BEGIN getSelect(text, selBeg, selEnd); y := padding.top + inter DIV 2; n := text.scroll.Y; - line := getLine(text, n); - firstLine := line; - cnt := 0; + firstLine := getLine2(text, n); + IF text.smallMove THEN + line := text.curLine; + cnt := textsize.Y - 1; + y := y + charHeight*(text.cursor.Y - text.scroll.Y); + G.SetColor(canvas, colors.back); + G.FillRect(canvas, padding.left - 2, y - inter DIV 2, size.X - 1, y - inter DIV 2 + charHeight); + n := text.cursor.Y + ELSE + line := firstLine; + cnt := 0 + END; + WHILE (line # NIL) & (cnt < textsize.Y) DO backColor := colors.back; IF (line = text.curLine) & ~selected(text) THEN @@ -2220,26 +2293,28 @@ BEGIN backColor := colors.curline END; SetColor(colors.text, backColor); - Len := MAX(line.length - text.scroll.X, 0); - G.TextOut(canvas, padding.left, y, Lines.getPChar(line, text.scroll.X), MIN(Len, textsize.X + 1), colors.delim); - IF text.lang # Lang.langText THEN - parse(text, line, y, backColor, text.lang) - END; - mark(line, y - inter DIV 2); - IF (selBeg.Y < n) & (n < selEnd.Y) THEN - drawSelect(text, line, 0, line.length, y) - ELSIF (selBeg.Y = n) & (selEnd.Y = n) & (selBeg.X # selEnd.X) THEN + IF (selBeg.Y < n) & (n < selEnd.Y) THEN + drawSelect(text, line, 0, line.length, y) + ELSE + G.TextOut(canvas, padding.left, y, Lines.getPChar(line, text.scroll.X), MIN(MAX(line.length - text.scroll.X, 0), textsize.X + 1), colors.delim); + IF text.lang # Lang.langText THEN + parse(text, line, y, backColor, text.lang) + END + END; + IF (selBeg.Y = n) & (selEnd.Y = n) & (selBeg.X # selEnd.X) THEN drawSelect(text, line, selBeg.X, selEnd.X, y) ELSIF (selBeg.Y = n) & (selEnd.Y # n) THEN drawSelect(text, line, selBeg.X, line.length, y) ELSIF (selBeg.Y # n) & (selEnd.Y = n) THEN drawSelect(text, line, 0, selEnd.X, y) END; + mark(line, y - inter DIV 2); NextLine(line); INC(y, charHeight); INC(n); INC(cnt) END; + G.SetColor(canvas, colors.numback); G.FillRect(canvas, 0, 0, padding.left - pad_left (*+ 1*), size.Y - 1); line := firstLine; @@ -2267,17 +2342,18 @@ BEGIN END; IF text.searchText # "" THEN - cnt := 0; - line := firstLine; - lastLine := line; - WHILE (line # NIL) & (cnt < textsize.Y) DO - lastLine := line; - NextLine(line); - INC(cnt) + IF text.smallMove THEN + firstLine := text.curLine; + lastLine := firstLine + ELSE + lastLine := getLine2(text, text.scroll.Y + textsize.Y - 1) END; p := text.foundList.first(Search.tPos); WHILE p # NIL DO - y := padding.top + inter DIV 2; + y := padding.top + inter DIV 2; + IF text.smallMove THEN + y := y + charHeight*(text.cursor.Y - text.scroll.Y) + END; IF (firstLine.pos <= p.pos) & (p.pos <= lastLine.pos + lastLine.length) THEN line := firstLine; WHILE (line.pos <= p.pos) & (line # lastLine) DO @@ -2296,12 +2372,14 @@ BEGIN END; INC(x); DEC(n) - END; + END END; p := p.next(Search.tPos) END END; + text.smallMove := FALSE; + IF text.foundSel > 0 THEN x := (text.cursor.X - text.scroll.X)*charWidth + padding.left; y := (text.cursor.Y - text.scroll.Y)*charHeight + padding.top + inter DIV 2; @@ -2314,10 +2392,7 @@ BEGIN DEC(n) END END; - - IF drawCursor THEN - cursor(text) - END + cursor(text) END draw; @@ -2346,6 +2421,7 @@ BEGIN setPadding(padding.left, padding.top); text.curLine := NIL; text.modified := FALSE; + text.smallMove := FALSE; text.comments := TRUE; text.search := TRUE; text.cs := FALSE; @@ -2357,7 +2433,9 @@ BEGIN text.searchText := ""; text.foundSel := 0; text.CurX := -1; + text.smallChange := 0; text.lang := Lang.langText; + text.LinesVector := NIL; Lang.setCurLang(Lang.langText); setName(text, fileName); ASSERT(text = List.create(text)) @@ -2408,6 +2486,7 @@ PROCEDURE destroy* (VAR text: tText); BEGIN IF search(text, "", FALSE, FALSE) THEN END; ChangeLog.destroy(text.chLog); + Lines.destroyVector(text.LinesVector); DISPOSE(text.foundList); DISPOSE(text.cursor); DISPOSE(text.select2); @@ -2450,12 +2529,10 @@ BEGIN RW.destroy(file); text.curLine := text.first(tLine); SetPos(text, 0, 0); - resetSelect(text) + resetSelect(text); + Comments(text) ELSE errno := 1 - END; - IF (text # NIL) & (text.lang # Lang.langText) THEN - Comments(text) END RETURN text END open;