* Fixed some keyboard issues

This commit is contained in:
sg 1999-12-30 21:10:24 +00:00
parent 7878572843
commit d3eee8c9f4

View File

@ -1,22 +1,15 @@
{ {
$Id$ $Id$
"shedit" - Text editor with syntax highlighting "SHEdit" - Text editor with syntax highlighting
Copyright (C) 1999 Sebastian Guenther (sguenther@gmx.de) Copyright (C) 1999 Sebastian Guenther (sg@freepascal.org)
This program is free software; you can redistribute it and/or modify See the file COPYING.FPC, included in this distribution,
it under the terms of the GNU General Public License as published by for details about the copyright.
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
} }
@ -55,32 +48,25 @@ end;
procedure TSHTextEdit.AdjustCursorToRange; procedure TSHTextEdit.AdjustCursorToRange;
begin begin
if FCursorY<Renderer.VertPos then if FCursorY < FWidget.VertPos then begin
begin HideCursor;
HideCursor; FCursorY := FWidget.VertPos;
FCursorY:=Renderer.VertPos; ShowCursor;
ShowCursor; end else if FCursorY > FWidget.VertPos + FWidget.PageHeight then begin
end HideCursor;
else FCursorY := FWidget.VertPos + FWidget.PageHeight - 1;
if FCursorY>Renderer.VertPos+Renderer.PageHeight then ShowCursor;
begin end;
HideCursor;
FCursorY:=Renderer.VertPos+Renderer.PageHeight-1; if FCursorX < FWidget.HorzPos then begin
ShowCursor; HideCursor;
end; FCursorX := FWidget.HorzPos;
if FCursorX<Renderer.HorzPos then ShowCursor;
begin end else if FCursorX > FWidget.HorzPos + FWidget.PageWidth then begin
HideCursor; HideCursor;
FCursorX:=Renderer.HorzPos; FCursorX := FWidget.HorzPos + FWidget.PageWidth - 1;
ShowCursor; ShowCursor;
end end;
else
if FCursorX>Renderer.HorzPos+Renderer.PageWidth then
begin
HideCursor;
FCursorX:=Renderer.HorzPos+Renderer.PageWidth-1;
ShowCursor;
end;
end; end;
@ -88,28 +74,24 @@ procedure TSHTextEdit.AdjustRangeToCursor;
var var
py : integer; py : integer;
begin begin
if FCursorY< Renderer.VertPos then if FCursorY < FWidget.VertPos then
Renderer.VertPos:=FCursorY FWidget.VertPos := FCursorY
else else if FCursorY >= FWidget.VertPos + FWidget.PageHeight then begin
if FCursorY>=Renderer.VertPos+Renderer.PageHeight then py := FCursorY - FWidget.PageHeight + 1;
begin if py < 0 then
py := FCursorY - Renderer.PageHeight + 1; FWidget.VertPos:=0
if py < 0 then else
Renderer.VertPos:=0 FWidget.VertPos:=py;
else end;
Renderer.VertPos:=py; if FCursorX < FWidget.HorzPos then
end; FWidget.HorzPos := FCursorX
if FCursorX<Renderer.HorzPos then else if FCursorX >= FWidget.HorzPos + FWidget.PageWidth then begin
Renderer.HorzPos:=FCursorX py := FCursorX - FWidget.PageWidth + 1;
else if py < 0 then
if FCursorX>=Renderer.HorzPos+Renderer.PageWidth then FWidget.HorzPos := 0
begin else
py := FCursorX - Renderer.PageWidth +1; FWidget.HorzPos := py;
if py < 0 then end;
Renderer.HorzPos:=0
else
Renderer.HorzPos:=py;
end;
end; end;
@ -185,18 +167,18 @@ end;
procedure TSHTextEdit.CursorPageUp; procedure TSHTextEdit.CursorPageUp;
begin begin
dec(FCursorY,Renderer.PageHeight); Dec(FCursorY, FWidget.PageHeight);
if FCursorY<0 then if FCursorY<0 then
FCursorY:=0; FCursorY:=0;
AdjustRangeToCursor; AdjustRangeToCursor;
end; end;
procedure TSHTextEdit.CursorPageDown; procedure TSHTextEdit.CursorPageDown;
begin begin
inc(FCursorY,Renderer.PageHeight); Inc(FCursorY, FWidget.PageHeight);
if FCursorY>FDoc.LineCount-1 then if FCursorY > FDoc.LineCount-1 then
FCursorY:=FDoc.LineCount-1; FCursorY:=FDoc.LineCount-1;
AdjustRangeToCursor; AdjustRangeToCursor;
end; end;
@ -317,15 +299,14 @@ begin
cbtext := cbtext + Copy(FDoc.LineText[FSel.OEndY], 1, FSel.OEndX); cbtext := cbtext + Copy(FDoc.LineText[FSel.OEndY], 1, FSel.OEndX);
end; end;
Renderer.SetClipboard(cbtext); FWidget.SetClipboard(cbtext);
end; end;
procedure TSHTextEdit.ClipboardPaste; procedure TSHTextEdit.ClipboardPaste;
var var
cbtext: String; cbtext: String;
begin begin
cbtext := Renderer.GetClipboard; cbtext := FWidget.GetClipboard;
ExecKeys(cbtext, True); ExecKeys(cbtext, True);
end; end;
@ -473,70 +454,65 @@ procedure TSHTextEdit.KeyPressed(KeyCode: LongWord; ShiftState: TShiftState);
begin begin
// WriteLn('Redraw: ', x1, '/', y1, ' - ', x2, '/', y2); // WriteLn('Redraw: ', x1, '/', y1, ' - ', x2, '/', y2);
if y1 = y2 then if y1 = y2 then
Renderer.InvalidateRect(x1,y1,x2,y2) FWidget.InvalidateRect(x1, y1, x2, y2)
else else begin
begin FWidget.InvalidateRect(x1, y1, x1 + FWidget.PageWidth, y1);
Renderer.InvalidateRect(x1,y1,x1+Renderer.PageWidth,y1); if y1 < y2 - 1 then
if y1 < y2 - 1 then FWidget.InvalidateRect(0, y1+1, FWidget.PageWidth, y2 - 1);
Renderer.InvalidateRect(0,y1+1,Renderer.PageWidth,y2 - 1); FWidget.InvalidateRect(0, y2, x2, y2+1);
Renderer.InvalidateRect(0,y2,x2,y2+1); end;
end;
end; end;
var var
i: Integer; i: Integer;
shortcut: TShortcut; shortcut: TShortcut;
AssignmentMatched, OldSelValid: Boolean; ShortcutFound, OldSelValid: Boolean;
OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY: Integer; OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY: Integer;
begin begin
// WriteLn('Text Widget: Key pressed: "', Key, '" ', KeyCode); // WriteLn('TSHTextEdit: Key pressed: ', KeyCode);
HideCursor; HideCursor;
LastCursorX := FCursorX; LastCursorX := FCursorX;
LastCursorY := FCursorY; LastCursorY := FCursorY;
OldSelValid := FSel.IsValid; OldSelValid := FSel.IsValid;
if OldSelValid then if OldSelValid then begin
begin OldSelStartX := FSel.OStartX;
OldSelStartX := FSel.OStartX; OldSelStartY := FSel.OStartY;
OldSelStartY := FSel.OStartY; OldSelEndX := FSel.OEndX;
OldSelEndX := FSel.OEndX; OldSelEndY := FSel.OEndY;
OldSelEndY := FSel.OEndY; end;
end;
// Check for keyboard shortcuts // Check for keyboard shortcuts
AssignmentMatched := False; ShortcutFound := False;
for i := 0 to Shortcuts.Count - 1 do for i := 0 to Shortcuts.Count - 1 do begin
begin shortcut := TShortcut(Shortcuts.Items[i]);
shortcut := TShortcut(Shortcuts.Items[i]); if (KeyCode = shortcut.KeyCode) and
if (KeyCode = shortcut.KeyCode) and (ShiftState * [ssShift, ssCtrl, ssAlt] = shortcut.ShiftState) then begin
(ShiftState * [ssShift, ssCtrl, ssAlt] = shortcut.ShiftState) then ShortcutFound := True;
begin break;
shortcut.Action.Method; end;
// Handle the selection extending end;
case shortcut.Action.SelectionAction of
selNothing : ;
selExtend :
begin
if not FSel.IsValid then
begin
FSel.StartX:=LastCursorX;
FSel.StartY:=LastCursorY;
end;
FSel.EndX:=FCursorX;
FSel.EndY:=FCursorY;
end;
selClear :
begin
FSel.Clear;
end;
end;
AssignmentMatched := True;
break;
end;
end;
if (not AssignmentMatched) and (ShiftState * [ssCtrl, ssAlt] = []) then if ShortcutFound then begin
ExecKey(Chr(KeyCode), False); // WriteLn(shortcut.Action.Descr);
shortcut.Action.Method; // Execute associated action
// Handle the selection extending
case shortcut.Action.SelectionAction of
selNothing: ;
selExtend: begin
if not FSel.IsValid then begin
FSel.StartX:=LastCursorX;
FSel.StartY:=LastCursorY;
end;
FSel.EndX:=FCursorX;
FSel.EndY:=FCursorY;
end;
selClear:
FSel.Clear;
end;
end else
if (KeyCode <= 255) and (ShiftState * [ssCtrl, ssAlt] = []) then
ExecKey(Chr(KeyCode), False);
// Check selection // Check selection
if FSel.IsValid and (FSel.StartX = FSel.EndX) and (FSel.StartY = FSel.EndY) then if FSel.IsValid and (FSel.StartX = FSel.EndX) and (FSel.StartY = FSel.EndY) then
@ -547,42 +523,36 @@ begin
else WriteLn;} else WriteLn;}
// Handle the rewriting of selections // Handle the rewriting of selections
if not OldSelValid then if not OldSelValid then begin
begin if FSel.IsValid then
if FSel.IsValid then
RedrawArea(FSel.OStartX, FSel.OStartY, FSel.OEndX, FSel.OEndY); RedrawArea(FSel.OStartX, FSel.OStartY, FSel.OEndX, FSel.OEndY);
end end else begin
else if not FSel.IsValid then
begin
if not FSel.IsValid then
RedrawArea(OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY) RedrawArea(OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY)
else else begin
// Do OldSel and FSel intersect?
if (OldSelEndY < FSel.OStartY) or (OldSelStartY > FSel.OEndY) or
((OldSelEndY = FSel.OStartY) and (OldSelEndX <= FSel.OStartX)) or
((OldSelStartY = FSel.OEndY) and (OldSelStartX >= FSel.OEndX)) then
begin begin
// Do OldSel and FSel intersect? RedrawArea(OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY);
if (OldSelEndY < FSel.OStartY) or (OldSelStartY > FSel.OEndY) or RedrawArea(FSel.OStartX, FSel.OStartY, FSel.OEndX, FSel.OEndY);
((OldSelEndY = FSel.OStartY) and (OldSelEndX <= FSel.OStartX)) or end else begin
((OldSelStartY = FSel.OEndY) and (OldSelStartX >= FSel.OEndX)) then // Intersection => determine smallest possible area(s) to redraw
begin // 1. Check if the start position has changed
RedrawArea(OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY); if (OldSelStartX <> FSel.OStartX) or (OldSelStartY <> FSel.OStartY) then
RedrawArea(FSel.OStartX, FSel.OStartY, FSel.OEndX, FSel.OEndY); if (OldSelStartY < FSel.OStartY) or ((OldSelStartY = FSel.OStartY) and
end (OldSelStartX < FSel.OStartX)) then
else RedrawArea(OldSelStartX, OldSelStartY, FSel.OStartX, FSel.OStartY)
begin else
// Intersection => determine smallest possible area(s) to redraw RedrawArea(FSel.OStartX, FSel.OStartY, OldSelStartX, OldSelStartY);
// 1. Check if the start position has changed // 2. Check if end position has changed
if (OldSelStartX <> FSel.OStartX) or (OldSelStartY <> FSel.OStartY) then if (OldSelEndX <> FSel.OEndX) or (OldSelEndY <> FSel.OEndY) then
if (OldSelStartY < FSel.OStartY) or ((OldSelStartY = FSel.OStartY) and
(OldSelStartX < FSel.OStartX)) then
RedrawArea(OldSelStartX, OldSelStartY, FSel.OStartX, FSel.OStartY)
else
RedrawArea(FSel.OStartX, FSel.OStartY, OldSelStartX, OldSelStartY);
// 2. Check if end position has changed
if (OldSelEndX <> FSel.OEndX) or (OldSelEndY <> FSel.OEndY) then
if (OldSelEndY < FSel.OEndY) or ((OldSelEndY = FSel.OEndY) and if (OldSelEndY < FSel.OEndY) or ((OldSelEndY = FSel.OEndY) and
(OldSelEndX < FSel.OEndX)) then (OldSelEndX < FSel.OEndX)) then
RedrawArea(OldSelEndX, OldSelEndY, FSel.OEndX, FSel.OEndY) RedrawArea(OldSelEndX, OldSelEndY, FSel.OEndX, FSel.OEndY)
else else
RedrawArea(FSel.OEndX, FSel.OEndY, OldSelEndX, OldSelEndY); RedrawArea(FSel.OEndX, FSel.OEndY, OldSelEndX, OldSelEndY);
end; end;
end; end;
end; end;
@ -592,9 +562,8 @@ end;
{ {
$Log$ $Log$
Revision 1.6 1999-12-12 17:50:50 sg Revision 1.7 1999-12-30 21:10:24 sg
* Fixed drawing of selection * Fixed some keyboard issues
* Several small corrections (removed superfluous local variables etc.)
Revision 1.5 1999/12/10 15:01:02 peter Revision 1.5 1999/12/10 15:01:02 peter
* first things for selection * first things for selection