fixed ecDeleteLastChar on unindent

git-svn-id: trunk@6551 -
This commit is contained in:
mattias 2005-01-12 01:09:36 +00:00
parent f92f516967
commit add79711d3
3 changed files with 62 additions and 23 deletions

View File

@ -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),

View File

@ -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:='';

View File

@ -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;