mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-08 09:38:29 +02:00
fixed ecDeleteLastChar on unindent
git-svn-id: trunk@6551 -
This commit is contained in:
parent
f92f516967
commit
add79711d3
@ -297,6 +297,8 @@ type
|
|||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TCustomSynEdit }
|
||||||
|
|
||||||
TCustomSynEdit = class(TCustomControl)
|
TCustomSynEdit = class(TCustomControl)
|
||||||
private
|
private
|
||||||
procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;
|
procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;
|
||||||
@ -434,6 +436,7 @@ type
|
|||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
function GetCharLen(const Line: string; CharStartPos: integer): integer;
|
function GetCharLen(const Line: string; CharStartPos: integer): integer;
|
||||||
function AdjustBytePosToCharacterStart(Line: integer; BytePos: integer): integer;
|
function AdjustBytePosToCharacterStart(Line: integer; BytePos: integer): integer;
|
||||||
|
function AdjustPhysPosToCharacterStart(Line: integer; PhysPos: integer): integer;
|
||||||
function GetLogicalCaretXY: TPoint;
|
function GetLogicalCaretXY: TPoint;
|
||||||
procedure SetLogicalCaretXY(const NewLogCaretXY: TPoint);
|
procedure SetLogicalCaretXY(const NewLogCaretXY: TPoint);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -1262,7 +1265,7 @@ begin
|
|||||||
fLastCtrlMouseLinkY := -1;
|
fLastCtrlMouseLinkY := -1;
|
||||||
fLastControlIsPressed := false;
|
fLastControlIsPressed := false;
|
||||||
fBlockIndent := 2;
|
fBlockIndent := 2;
|
||||||
FTabChar := ' ';
|
FTabChar := {$IFDEF DebugShowTabs}'%'{$ELSE}' '{$ENDIF};
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
Color := clWindow;
|
Color := clWindow;
|
||||||
fFontDummy.Name := 'Courier New';
|
fFontDummy.Name := 'Courier New';
|
||||||
@ -1481,8 +1484,23 @@ begin
|
|||||||
s:=Lines[Line-1];
|
s:=Lines[Line-1];
|
||||||
if (Result<=length(s)) and UseUTF8 then
|
if (Result<=length(s)) and UseUTF8 then
|
||||||
Result:=UTF8FindNearestCharStart(PChar(s),length(s),Result);
|
Result:=UTF8FindNearestCharStart(PChar(s),length(s),Result);
|
||||||
end else
|
end;
|
||||||
Result:=1;
|
end;
|
||||||
|
|
||||||
|
function TCustomSynEdit.AdjustPhysPosToCharacterStart(Line: integer;
|
||||||
|
PhysPos: integer): integer;
|
||||||
|
var
|
||||||
|
s: string;
|
||||||
|
BytePos: LongInt;
|
||||||
|
begin
|
||||||
|
Result:=PhysPos;
|
||||||
|
if Result<1 then
|
||||||
|
Result:=1
|
||||||
|
else if (Line>=1) and (Line<=Lines.Count) then begin
|
||||||
|
s:=Lines[Line-1];
|
||||||
|
BytePos:=PhysicalToLogicalCol(s,Result);
|
||||||
|
Result:=LogicalToPhysicalCol(s,BytePos);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomSynEdit.GetLogicalCaretXY: TPoint;
|
function TCustomSynEdit.GetLogicalCaretXY: TPoint;
|
||||||
@ -6802,6 +6820,7 @@ var
|
|||||||
InsDelta: integer;
|
InsDelta: integer;
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
LogCaretXY: TPoint;
|
LogCaretXY: TPoint;
|
||||||
|
LogCaret: TPoint;
|
||||||
LogSpacePos: integer;
|
LogSpacePos: integer;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
@ -6991,6 +7010,7 @@ begin
|
|||||||
{begin} //mh 2000-10-30
|
{begin} //mh 2000-10-30
|
||||||
ecDeleteLastChar:
|
ecDeleteLastChar:
|
||||||
if not ReadOnly then begin
|
if not ReadOnly then begin
|
||||||
|
//debugln('ecDeleteLastChar A');
|
||||||
if SelAvail then
|
if SelAvail then
|
||||||
SetSelectedTextEmpty
|
SetSelectedTextEmpty
|
||||||
else begin
|
else begin
|
||||||
@ -6998,9 +7018,10 @@ begin
|
|||||||
Len := Length(Temp);
|
Len := Length(Temp);
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
LogCaretXY:=PhysicalToLogicalPos(CaretXY);
|
LogCaretXY:=PhysicalToLogicalPos(CaretXY);
|
||||||
{$ELSE}
|
LogCaret:=LogCaretXY;
|
||||||
Caret := CaretXY;
|
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
Caret := CaretXY;
|
||||||
|
//debugln('ecDeleteLastChar B Temp="',DbgStr(Temp),'" CaretX=',dbgs(CaretX),' LogCaretXY=',dbgs(LogCaretXY));
|
||||||
if {$IFDEF SYN_LAZARUS}LogCaretXY.X{$ELSE}CaretX{$ENDIF} > Len +1
|
if {$IFDEF SYN_LAZARUS}LogCaretXY.X{$ELSE}CaretX{$ENDIF} > Len +1
|
||||||
then begin
|
then begin
|
||||||
// only move caret one column
|
// only move caret one column
|
||||||
@ -7027,7 +7048,12 @@ begin
|
|||||||
// delete text before the caret
|
// delete text before the caret
|
||||||
SpaceCount1 := LeftSpaces(Temp{$IFDEF SYN_LAZARUS},true{$ENDIF});
|
SpaceCount1 := LeftSpaces(Temp{$IFDEF SYN_LAZARUS},true{$ENDIF});
|
||||||
SpaceCount2 := 0;
|
SpaceCount2 := 0;
|
||||||
|
//debugln('ecDeleteLastChar C SpaceCount1=',dbgs(SpaceCount1),' Temp[LogCaretXY.X-1]=',DbgStr(Temp[LogCaretXY.X-1]));
|
||||||
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
if (Temp[LogCaretXY.X-1] <= #32) and (SpaceCount1 = CaretX - 1) then
|
||||||
|
{$ELSE}
|
||||||
if (Temp[CaretX-1] <= #32) and (SpaceCount1 = CaretX - 1) then
|
if (Temp[CaretX-1] <= #32) and (SpaceCount1 = CaretX - 1) then
|
||||||
|
{$ENDIF}
|
||||||
begin
|
begin
|
||||||
// unindent
|
// unindent
|
||||||
if SpaceCount1 > 0 then begin
|
if SpaceCount1 > 0 then begin
|
||||||
@ -7043,7 +7069,13 @@ begin
|
|||||||
if SpaceCount2 = SpaceCount1 then
|
if SpaceCount2 = SpaceCount1 then
|
||||||
SpaceCount2 := 0;
|
SpaceCount2 := 0;
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
// remove visible spaces
|
||||||
LogSpacePos:=PhysicalToLogicalCol(Temp,SpaceCount2+1);
|
LogSpacePos:=PhysicalToLogicalCol(Temp,SpaceCount2+1);
|
||||||
|
//debugln('ecDeleteLastChar LogSpacePos=',dbgs(LogSpacePos),
|
||||||
|
// ' SpaceCount1=',dbgs(SpaceCount1),
|
||||||
|
// ' SpaceCount2=',dbgs(SpaceCount2),
|
||||||
|
// ' LogCaretXY.X=',dbgs(LogCaretXY.X),
|
||||||
|
// ' Temp="',DbgStr(Temp),'"');
|
||||||
Temp:=copy(Temp,1,LogSpacePos-1)+copy(Temp,LogCaretXY.X,MaxInt);
|
Temp:=copy(Temp,1,LogSpacePos-1)+copy(Temp,LogCaretXY.X,MaxInt);
|
||||||
TrimmedSetLine(CaretY - 1, Temp);
|
TrimmedSetLine(CaretY - 1, Temp);
|
||||||
fCaretX := LogicalToPhysicalCol(Temp,LogSpacePos);
|
fCaretX := LogicalToPhysicalCol(Temp,LogSpacePos);
|
||||||
@ -7058,27 +7090,35 @@ begin
|
|||||||
end else begin
|
end else begin
|
||||||
// delete char
|
// delete char
|
||||||
counter := 1;
|
counter := 1;
|
||||||
|
{$IFDEF SYN_LAZARUS}
|
||||||
|
{$IFDEF USE_UTF8BIDI_LCL}
|
||||||
|
CaretX := CaretX - counter;
|
||||||
|
Helper := Copy(Temp, CaretX, counter);
|
||||||
|
VDelete(Temp, CaretX, counter, drLTR);
|
||||||
|
{$ELSE USE_UTF8BIDI_LCL}
|
||||||
|
LogCaretXY.X:=PhysicalToLogicalCol(Temp,CaretX-counter);
|
||||||
|
CaretX := LogicalToPhysicalCol(Temp,LogCaretXY.X);
|
||||||
|
Helper := Copy(Temp, LogCaretXY.X, counter);
|
||||||
|
System.Delete(Temp, LogCaretXY.X, counter);
|
||||||
|
//debugln('ecDeleteLastChar delete char CaretX=',dbgs(CaretX),
|
||||||
|
// ' Helper="',DbgStr(Helper),'" Temp="',DbgStr(Temp),'"');
|
||||||
|
{$ENDIF USE_UTF8BIDI_LCL}
|
||||||
|
{$ELSE}
|
||||||
{$IFDEF SYN_MBCSSUPPORT}
|
{$IFDEF SYN_MBCSSUPPORT}
|
||||||
if ByteType(Temp, CaretX - 2) = mbLeadByte then
|
if ByteType(Temp, CaretX - 2) = mbLeadByte then
|
||||||
Inc(counter);
|
Inc(counter);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
CaretX := CaretX - counter;
|
CaretX := CaretX - counter;
|
||||||
Helper := Copy(Temp, CaretX, counter);
|
Helper := Copy(Temp, CaretX, counter);
|
||||||
{$IFDEF USE_UTF8BIDI_LCL}
|
|
||||||
VDelete(Temp, CaretX, counter, drLTR);
|
|
||||||
{$ELSE USE_UTF8BIDI_LCL}
|
|
||||||
{$IFDEF SYN_LAZARUS}
|
|
||||||
counter:=LogCaretXY.X-PhysicalToLogicalCol(Temp,CaretX);
|
|
||||||
{$ENDIF}
|
|
||||||
Delete(Temp, CaretX, counter);
|
Delete(Temp, CaretX, counter);
|
||||||
{$ENDIF USE_UTF8BIDI_LCL}
|
{$ENDIF}
|
||||||
TrimmedSetLine(CaretY - 1, Temp);
|
TrimmedSetLine(CaretY - 1, Temp);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
if (Caret.X <> CaretX) or (Caret.Y <> CaretY) then begin
|
if (Caret.X <> CaretX) or (Caret.Y <> CaretY) then begin
|
||||||
fUndoList.AddChange(crSilentDelete,
|
fUndoList.AddChange(crSilentDelete,
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
PhysicalToLogicalPos(CaretXY), PhysicalToLogicalPos(Caret),
|
PhysicalToLogicalPos(CaretXY), LogCaret,
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
CaretXY, Caret,
|
CaretXY, Caret,
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -7100,8 +7140,6 @@ begin
|
|||||||
begin
|
begin
|
||||||
// delete char
|
// delete char
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
LogCaretXY.X:=
|
|
||||||
AdjustBytePosToCharacterStart(LogCaretXY.Y,LogCaretXY.X);
|
|
||||||
Counter:=GetCharLen(Temp,LogCaretXY.X);
|
Counter:=GetCharLen(Temp,LogCaretXY.X);
|
||||||
Helper := Copy(Temp, LogCaretXY.X, Counter);
|
Helper := Copy(Temp, LogCaretXY.X, Counter);
|
||||||
Caret.X := LogicalToPhysicalCol(Temp,LogCaretXY.X+Counter);
|
Caret.X := LogicalToPhysicalCol(Temp,LogCaretXY.X+Counter);
|
||||||
@ -7415,7 +7453,6 @@ begin
|
|||||||
// cause problems unless eoTrimTrailingSpaces is set.
|
// cause problems unless eoTrimTrailingSpaces is set.
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
LogCaretXY:=PhysicalToLogicalPos(CaretXY);
|
LogCaretXY:=PhysicalToLogicalPos(CaretXY);
|
||||||
LogCaretXY.X:=AdjustBytePosToCharacterStart(LogCaretXY.Y,LogCaretXY.X);
|
|
||||||
{debugln('ecChar CaretXY=',dbgs(CaretXY),
|
{debugln('ecChar CaretXY=',dbgs(CaretXY),
|
||||||
' LogCaretXY=',dbgs(PhysicalToLogicalPos(CaretXY)),
|
' LogCaretXY=',dbgs(PhysicalToLogicalPos(CaretXY)),
|
||||||
' Adjusted LogCaretXY=',dbgs(LogCaretXY),
|
' Adjusted LogCaretXY=',dbgs(LogCaretXY),
|
||||||
|
@ -2622,6 +2622,7 @@ var
|
|||||||
NewCaretXY: TPoint;
|
NewCaretXY: TPoint;
|
||||||
CursorToLeft: integer;
|
CursorToLeft: integer;
|
||||||
NewValue: String;
|
NewValue: String;
|
||||||
|
Editor: TSynEdit;
|
||||||
Begin
|
Begin
|
||||||
if CurCompletionControl=nil then exit;
|
if CurCompletionControl=nil then exit;
|
||||||
case CurrentCompletionType of
|
case CurrentCompletionType of
|
||||||
@ -2635,12 +2636,13 @@ Begin
|
|||||||
NewValue:=GetIdentCompletionValue(aCompletion,ValueType,CursorToLeft);
|
NewValue:=GetIdentCompletionValue(aCompletion,ValueType,CursorToLeft);
|
||||||
// insert value plus special chars like brackets, semicolons, ...
|
// insert value plus special chars like brackets, semicolons, ...
|
||||||
SrcEdit:=GetActiveSE;
|
SrcEdit:=GetActiveSE;
|
||||||
SrcEdit.EditorComponent.SelText:=NewValue;
|
Editor:=SrcEdit.EditorComponent;
|
||||||
|
Editor.SelText:=NewValue;
|
||||||
if CursorToLeft>0 then
|
if CursorToLeft>0 then
|
||||||
begin
|
begin
|
||||||
NewCaretXY:=SrcEdit.EditorComponent.BlockEnd;
|
NewCaretXY:=Editor.LogicalToPhysicalPos(Editor.BlockEnd);
|
||||||
dec(NewCaretXY.X,CursorToLeft);
|
dec(NewCaretXY.X,CursorToLeft);
|
||||||
SrcEdit.EditorComponent.LogicalCaretXY:=NewCaretXY;
|
Editor.CaretXY:=NewCaretXY;
|
||||||
end;
|
end;
|
||||||
ccSelection := '';
|
ccSelection := '';
|
||||||
Value:='';
|
Value:='';
|
||||||
|
@ -1016,7 +1016,7 @@ end;
|
|||||||
|
|
||||||
function DbgS(const p: TPoint): string;
|
function DbgS(const p: TPoint): string;
|
||||||
begin
|
begin
|
||||||
Result:=' x='+IntToStr(p.x)+',y='+IntToStr(p.y);
|
Result:='(x='+IntToStr(p.x)+',y='+IntToStr(p.y)+')';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function DbgS(const p: pointer): string;
|
function DbgS(const p: pointer): string;
|
||||||
|
Loading…
Reference in New Issue
Block a user