SynEdit: new swbWordSmart boundary for Prev/NextWordLogicalPos

git-svn-id: trunk@57873 -
This commit is contained in:
ondrej 2018-05-09 14:47:21 +00:00
parent dcc5f5b47a
commit e8025d5af5

View File

@ -421,7 +421,8 @@ type
swbWordEnd, swbWordEnd,
swbTokenBegin, swbTokenBegin,
swbTokenEnd, swbTokenEnd,
swbCaseChange swbCaseChange,
swbWordSmart // begin or end of word with smart gaps (1 char)
); );
{ TCustomSynEdit } { TCustomSynEdit }
@ -4052,6 +4053,16 @@ begin
CX := WordBreaker.NextWordEnd(Line, CX); CX := WordBreaker.NextWordEnd(Line, CX);
if (CX <= 0) then CX := LineLen + 1; if (CX <= 0) then CX := LineLen + 1;
end; end;
swbWordSmart: begin
NX := WordBreaker.NextWordEnd(Line, CX);
if (NX <= 0) then NX := LineLen + 1;
CX := WordBreaker.NextWordStart(Line, CX, InclCurrent);
if (CX <= 0) and not InclCurrent then CX := LineLen + 1;
if (CX <= 0) and InclCurrent then CX := 1;
if (NX<CX-1) then // step over 1 char gap
CX := NX;
end;
swbTokenBegin: begin swbTokenBegin: begin
if not ( InclCurrent and if not ( InclCurrent and
((CX <= 1) or (Line[CX-1] in FWordBreaker.WhiteChars)) and ((CX <= 1) or (Line[CX-1] in FWordBreaker.WhiteChars)) and
@ -4156,6 +4167,23 @@ begin
CX := WordBreaker.PrevWordEnd(Line, Min(CX, Length(Line) + 1)); CX := WordBreaker.PrevWordEnd(Line, Min(CX, Length(Line) + 1));
CheckLineStart(CX, CY); CheckLineStart(CX, CY);
end; end;
swbWordSmart: begin
{if CX=1 then
begin
CX := -1;
CheckLineStart(CX, CY);
end else}
begin
if CX>1 then // step over 1 char gap
Dec(CX);
NX := WordBreaker.PrevWordStart(Line, Min(CX, Length(Line) + 1));
CX := WordBreaker.PrevWordEnd(Line, Min(CX, Length(Line) + 1));
if (NX>CX-1) then // select the nearest
CX := NX;
CheckLineStart(CX, CY);
end;
end;
swbTokenBegin: begin swbTokenBegin: begin
CX := WordBreaker.PrevBoundary(Line, Min(CX, Length(Line) + 1)); CX := WordBreaker.PrevBoundary(Line, Min(CX, Length(Line) + 1));
if (CX > 0) and (Line[CX] in FWordBreaker.WhiteChars) then if (CX > 0) and (Line[CX] in FWordBreaker.WhiteChars) then