diff options
-rw-r--r-- | prototypes/textedit/demo_textedit.lpi | 7 | ||||
-rw-r--r-- | prototypes/textedit/extrafpc.cfg | 2 | ||||
-rw-r--r-- | prototypes/textedit/fpg_textedit.pas | 187 | ||||
-rw-r--r-- | src/corelib/fpg_main.pas | 1 |
4 files changed, 156 insertions, 41 deletions
diff --git a/prototypes/textedit/demo_textedit.lpi b/prototypes/textedit/demo_textedit.lpi index 6b541e19..11639711 100644 --- a/prototypes/textedit/demo_textedit.lpi +++ b/prototypes/textedit/demo_textedit.lpi @@ -67,13 +67,6 @@ <CustomOptions Value="-FUunits "/> <CompilerPath Value="$(CompPath)"/> - <ExecuteBefore> - <CompileReasons Compile="False" Build="False" Run="False"/> - </ExecuteBefore> - <ExecuteAfter> - <CompileReasons Compile="False" Build="False" Run="False"/> - </ExecuteAfter> </Other> - <CompileReasons Compile="False" Build="False" Run="False"/> </CompilerOptions> </CONFIG> diff --git a/prototypes/textedit/extrafpc.cfg b/prototypes/textedit/extrafpc.cfg index 775d592f..2799d91e 100644 --- a/prototypes/textedit/extrafpc.cfg +++ b/prototypes/textedit/extrafpc.cfg @@ -1,5 +1,5 @@ -FUunits --Fu../../../lib/$fpctarget +-Fu../../lib/$fpctarget -Xs -XX -CX diff --git a/prototypes/textedit/fpg_textedit.pas b/prototypes/textedit/fpg_textedit.pas index 78b91083..d076f056 100644 --- a/prototypes/textedit/fpg_textedit.pas +++ b/prototypes/textedit/fpg_textedit.pas @@ -76,7 +76,10 @@ type FVisLines: Integer; FVisCols: Integer; StartNo, EndNo, StartOffs, EndOffs: Integer; - FSelStartNo, FSelEndNo, FSelStartOffs, FSelEndOffs: Integer; + // Selection start and end line number + FSelStartNo, FSelEndNo: Integer; + // Selection start and end column + FSelStartOffs, FSelEndOffs: Integer; FTabWidth: Integer; HPos, VPos, XSize, YSize: Integer; FMaxScrollH: Integer; @@ -169,6 +172,41 @@ implementation uses fpg_dialogs{, fpg_constants}, fpg_stringutils, fpg_utils; + +function GetNextWord(SLine: TfpgString; var PosX: Integer): Boolean; +const + ValidChars = ['a'..'z', 'A'..'Z', '0'..'9', '#']; +var + I, RetX: Integer; + FindNext: Boolean; + c: TfpgChar; +begin + Result := False; + if PosX > UTF8Length(SLine) then Exit; + FindNext := False; + RetX := 0; + for I := PosX to UTF8Length(SLine) do + begin + c := fpgCharAt(SLine, I); + { TODO -cUnicode Error : We need to fix c[i] usage. Also improve ValidChars definition. } + if not FindNext and not (c[1] in ValidChars) then + begin + FindNext := True; + Continue; + end; + if FindNext and (c[1] in ValidChars) then + begin + RetX := I; + Result := True; + Break; + end; + end; + if RetX < 1 then + Result := False; + PosX := RetX; +end; + + { TfpgGutter } procedure TfpgGutter.SetDigits(const AValue: Integer); @@ -577,8 +615,43 @@ procedure TfpgBaseTextEdit.KeyboardCaretNav(const ShiftState: TShiftState; const end; end; + procedure CtrlKeyRightKey; + var + S: TfpgString; + I: Integer; + NotFindIt: Boolean; + begin + if CaretPos.Y <= pred(FLines.Count) then + begin + NotFindIt := True; + while NotFindIt do + begin + S := FLines[CaretPos.Y]; + I := CaretPos.X; + if GetNextWord(S, I) then + begin + CaretPos.X := I - 1; + NotFindIt := False; + end + else + begin + CaretPos.Y := CaretPos.Y + 1; + CaretPos.X := 0; + NotFindIt := False; + end; + if CaretPos.Y > pred(FLines.Count) then + begin + NotFindIt := False; + CaretPos.X := 0; + end; + end; + end + else + CaretPos.X := 0; + end; + begin - writeln('>> KeyboardCaretNav'); + writeln('DEBUG: TfpgBaseTextEdit.KeyboardCaretNav >>'); case AKeyCode of keyLeft: begin @@ -589,10 +662,6 @@ begin begin if CaretPos.Y <= pred(FLines.Count) then begin - writeln('********'); - //GliphY := (CaretPos.Y - FTopLine) * FChrH; - //DrawLine(Canvas, CaretPos.Y, GliphY); - //DrawCaret(CaretPos.X, CaretPos.Y + 1, False); if (ssCtrl in ShiftState) and (CaretPos.Y > 0) then begin CaretPos.Y := CaretPos.Y - 1; @@ -601,36 +670,18 @@ begin begin FSelEndNo := CaretPos.Y; FSelEndOffs := CaretPos.X; -// DrawVisible; end; Exit; end; end; CaretPos.Y := CaretPos.Y - 1; CaretPos.X := Length(FLines[CaretPos.Y]); - //if not FSelected then - //begin - //GliphY := (CaretPos.Y - FTopLine) * FChrH; - //DrawLine(Canvas, CaretPos.X, GliphY); - //end else - //DrawVisible; end else begin CaretPos.X := 0; - //GliphY := (CaretPos.Y - FTopLine) * FChrH; - //if not FSelected then - //DrawLine(Canvas, CaretPos.Y, GliphY) - //else - //DrawVisible; end; end; - //else - //begin - //GliphY := (CaretPos.Y - FTopLine) * FChrH; - //DrawLine(Canvas, CaretPos.Y, GliphY); - //DrawCaret(CaretPos.X, CaretPos.Y, True); - //end; if ssShift in ShiftState then begin if not FSelected then @@ -646,7 +697,8 @@ begin CtrlKeyLeftKey else FSelEndOffs := CaretPos.X; - end else + end + else begin FSelEndNo := CaretPos.Y; if ssCtrl in ShiftState then @@ -660,27 +712,23 @@ begin FSelEndOffs := Length(FLines[FSelEndNo]) - 1; CaretPos.X := FSelEndOffs; end; - end else + end + else begin FSelEndOffs := 0; CaretPos.X := 0; end; end; FSelected := (FSelStartNo <> FSelEndNo) or (FSelStartOffs <> FSelEndOffs); - //DrawVisible; Exit; end; if FSelected then begin FSelected := False; - //DrawVisible; - //DrawCaret(CaretPos.X, CaretPos.Y, True); end; if ssCtrl in ShiftState then begin CtrlKeyLeftKey; - //DrawVisible; - //DrawCaret(CaretPos.X, CaretPos.Y, True); end; FSelStartNo := CaretPos.Y; FSelStartOffs := CaretPos.X; @@ -688,10 +736,85 @@ begin keyRight: begin + writeln('DEBUG: TfpgBaseTextEdit.KeyboardCaretNav >>> keyRight'); + CaretPos.X := CaretPos.X + 1; + if CaretPos.X > FMaxScrollH then + begin + FMaxScrollH := FMaxScrollH + 2; + UpdateScrollBars; + end; + if ssShift in ShiftState then + begin + if not FSelected then + begin + FSelected := True; + FSelStartNo := CaretPos.Y; + FSelStartOffs := CaretPos.X - 1; + if ssCtrl in ShiftState then + CtrlKeyRightKey; + FSelEndNo := CaretPos.Y; + FSelEndOffs := CaretPos.X; + end + else + begin + if ssCtrl in ShiftState then + CtrlKeyRightKey; + FSelEndNo := CaretPos.Y; + FSelEndOffs := CaretPos.X; + end; + FSelected := (FSelStartNo <> FSelEndNo) or (FSelStartOffs <> FSelEndOffs); + Exit; + end; + if FSelected then + begin + FSelected := False; + end; + if ssCtrl in ShiftState then + begin + CtrlKeyRightKey; + end; + FSelStartNo := CaretPos.Y; + FSelStartOffs := CaretPos.X; end; keyUp: begin + if CaretPos.x = 0 then Exit; + if not (ssShift in ShiftState) and not (ssCtrl in ShiftState) then + begin + CaretPos.Y := CaretPos.Y - 1; + if FSelected then + begin + FSelected := False; + Exit; + end; + FSelStartNo := CaretPos.Y; + Exit; + end; + if (ssCtrl in ShiftState) and not (ssShift in ShiftState) then + begin + CaretPos.Y := CaretPos.Y - 1; + UpdateScrollBars; + FSelStartNo := CaretPos.Y; + Exit; + end; + if not (ssCtrl in ShiftState) and (ssShift in ShiftState) then + begin + CaretPos.Y := CaretPos.Y - 1; + if not FSelected then + begin + FSelStartNo := CaretPos.Y + 1; + FSelStartOffs := CaretPos.X; + FSelEndNo := CaretPos.X; + FSelEndOffs := CaretPos.X; + FSelected := True; + end else + begin + FSelEndNo := CaretPos.Y; + FSelEndOffs := CaretPos.X; + FSelected := (FSelStartNo <> FSelEndNo) or (FSelStartOffs <> FSelEndOffs); + end; + end; end; keyDown: @@ -710,7 +833,7 @@ begin begin end; end; - writeln('<< KeyboardCaretNav'); + writeln('DEBUG: TfpgBaseTextEdit.KeyboardCaretNav <<'); end; procedure TfpgBaseTextEdit.InitMemoObjects; diff --git a/src/corelib/fpg_main.pas b/src/corelib/fpg_main.pas index b49006e5..c0209f08 100644 --- a/src/corelib/fpg_main.pas +++ b/src/corelib/fpg_main.pas @@ -400,7 +400,6 @@ uses fpg_hint, fpg_extgraphics, fpg_utils, - fpg_stringutils, fpg_cmdlineparams; var |