summaryrefslogtreecommitdiff
path: root/prototypes/textedit
diff options
context:
space:
mode:
authorGraeme Geldenhuys <graemeg@gmail.com>2010-06-12 18:05:32 +0200
committerGraeme Geldenhuys <graemeg@gmail.com>2010-06-12 18:05:32 +0200
commit410356c2355554b9c3e3086747981a6019997d13 (patch)
tree5cc80bf6c0d8a1ae269a447f9aa38f9c78af542a /prototypes/textedit
parenta2967c466283ea099c2a00f655ec3caa5b186ff9 (diff)
downloadfpGUI-410356c2355554b9c3e3086747981a6019997d13.tar.xz
TextEdit: Implemented text selection via keyboard.
Diffstat (limited to 'prototypes/textedit')
-rw-r--r--prototypes/textedit/fpg_textedit.pas51
1 files changed, 47 insertions, 4 deletions
diff --git a/prototypes/textedit/fpg_textedit.pas b/prototypes/textedit/fpg_textedit.pas
index b0e3bfe1..6ccd2e2c 100644
--- a/prototypes/textedit/fpg_textedit.pas
+++ b/prototypes/textedit/fpg_textedit.pas
@@ -836,7 +836,7 @@ begin
begin
FSelStartNo := CaretPos.Y + 1;
FSelStartOffs := CaretPos.X;
- FSelEndNo := CaretPos.X;
+ FSelEndNo := CaretPos.Y;
FSelEndOffs := CaretPos.X;
FSelected := True;
end
@@ -1424,7 +1424,7 @@ var
begin
if FLines.Count = 0 then
Exit; //==>
- if (I < 0) or (I > Pred(FLines.Count)) then
+ if (I < 0) or (I > FLines.Count-1) then
Exit; //==>
S := FLines[I];
if Pos(#9, S) > 0 then
@@ -1451,10 +1451,53 @@ begin
FOnDrawLine(self, S, I, Canvas, R, AllowDraw);
{ Draw simple text line... }
if AllowDraw then
+ begin
Canvas.DrawText(R, S);
+ if FSelected then
+ begin
+ if (I > StartNo) and (I < EndNo) then // whole line is selected
+ begin
+ R.SetRect(X, Y, UTF8Length(S) * FChrW, FChrH);
+ Canvas.XORFillRectangle(fpgColorToRGB(clSelection) xor $FFFFFF, R);
+ end
+ else
+ begin
+ Ei := EndOffs;
+ Si := StartOffs;
+ if (I = StartNo) and (I = EndNo) then // start/end selection on same line
+ begin
+ SS := UTF8Copy(S, Si + 1, UTF8Length(S) - Si);
+ if Ei > UTF8Length(S) then
+ SS := UTF8Copy(S, Si + 1, UTF8Length(S) - Si)
+ else
+ SS := UTF8Copy(S, Si + 1, Ei - Si);
+ R.SetRect(X+(Si * FChrW), Y, (UTF8Length(SS) * FChrW), FChrH);
+ Canvas.XORFillRectangle(fpgColorToRGB(clSelection) xor $FFFFFF, R);
+ end
+ else
+ begin
+ if (I = StartNo) and (I < EndNo) then
+ begin
+ SS := UTF8Copy(S, Si + 1, UTF8Length(S) - Si);
+ R.SetRect(X+(Si * FChrW), Y, (UTF8Length(SS) * FChrW), FChrH);
+ Canvas.XORFillRectangle(fpgColorToRGB(clSelection) xor $FFFFFF, R);
+ end
+ else
+ begin
+ if (I > StartNo) and (I = EndNo) then
+ begin
+ if Ei > UTF8Length(S) then
+ Ei := UTF8Length(S);
+ SS := UTF8Copy(S, 1, Ei);
+ R.SetRect(X, Y, (UTF8Length(SS) * FChrW), FChrH);
+ Canvas.XORFillRectangle(fpgColorToRGB(clSelection) xor $FFFFFF, R);
+ end;
+ end;
+ end;
+ end;
+ end; { if FSelected... }
+ end; { if AllowDraw... }
- { todo: Do other formatting here. }
- { todo: Do selection painting here. }
if UTF8Length(S) > FMaxScrollH then
begin
FMaxScrollH := UTF8Length(S);