SynEdit: Refactored search replace / Combined many small if blocks (regex) into one big / moved calculation for first iteration out of the loop (FirstLine)

git-svn-id: trunk@47506 -
This commit is contained in:
martin 2015-01-24 17:13:16 +00:00
parent ea99a9bc11
commit 928215038f

View File

@ -815,36 +815,29 @@ begin
// multi line pattern forward, multi line pattern backward // multi line pattern forward, multi line pattern backward
// regex case insensitive, regex multi line forward, // regex case insensitive, regex multi line forward,
// regex multi line whole word // regex multi line whole word
repeat
if fRegExpr then begin
// ************ RegExp ************
// prepare for firs iteration
LineStr:=Lines[y]; LineStr:=Lines[y];
if ASupportUnicodeCase and (not fSensitive) and (not fRegExpr) then LineStr := UTF8LowerCase(LineStr);
LineLen:=length(LineStr); LineLen:=length(LineStr);
Line:=PChar(LineStr); Line:=PChar(LineStr);
if not IsFirstLine then begin if IsFirstLine then begin
if FBackwards then begin if FBackwards then
if fRegExpr then x:=EndPos.X-2
x:=LineLen-1 else
else
x:=LineLen-SearchLen;
end else
x:=0;
end else begin
IsFirstLine:=false;
if FBackwards then begin
if fRegExpr then
x:=EndPos.X-2
else
x:=EndPos.X-SearchLen-1;
end else begin
x:=StartPos.X-1; x:=StartPos.X-1;
end; end else begin
if FBackwards then
x:=LineLen-1
else
x:=0;
end; end;
x:=MinMax(x,0,LineLen-1); x:=MinMax(x,0,LineLen-1);
//DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]); //DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]);
// search in the line repeat
if fRegExpr then begin // search in the line
// regular expression
if SearchRegExprInLine(Max(1,x+1),LineStr) then begin if SearchRegExprInLine(Max(1,x+1),LineStr) then begin
//DebugLn(['TSynEditSearch.FindNextOne Found RegExpr']); //DebugLn(['TSynEditSearch.FindNextOne Found RegExpr']);
FoundStartPos:=Point(RegExprEngine.MatchPos[0],y+1); FoundStartPos:=Point(RegExprEngine.MatchPos[0],y+1);
@ -856,8 +849,48 @@ begin
fRegExprReplace:=RegExprEngine.Substitute(Replacement); fRegExprReplace:=RegExprEngine.Substitute(Replacement);
exit; exit;
end; end;
// next line
if FBackwards then
dec(y)
else
inc(y);
LineStr:=Lines[y];
LineLen:=length(LineStr);
Line:=PChar(LineStr);
if FBackwards then
x:=LineLen-1
else
x:=0;
x:=MinMax(x,0,LineLen-1);
//DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]);
until (y<MinY) or (y>MaxY);
end // fRegExpr
else begin
// ************ NOT RegExp ************
// prepare for firs iteration
LineStr:=Lines[y];
if ASupportUnicodeCase and (not fSensitive) then LineStr := UTF8LowerCase(LineStr);
LineLen:=length(LineStr);
Line:=PChar(LineStr);
if IsFirstLine then begin
if FBackwards then
x:=EndPos.X-SearchLen-1
else
x:=StartPos.X-1;
end else begin end else begin
// normal search if FBackwards then
x:=LineLen-SearchLen
else
x:=0;
end;
x:=MinMax(x,0,LineLen-1);
//DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]);
repeat
// search in the line
MaxPos:=LineLen-SearchLen; MaxPos:=LineLen-SearchLen;
if (SearchLen=0) and ((LineLen=0) or IsMultiLinePattern) then if (SearchLen=0) and ((LineLen=0) or IsMultiLinePattern) then
begin begin
@ -912,13 +945,26 @@ begin
inc(x,xStep); inc(x,xStep);
end; end;
end; end;
end;
// next line // next line
if FBackwards then if FBackwards then
dec(y) dec(y)
else else
inc(y); inc(y);
until (y<MinY) or (y>MaxY);
LineStr:=Lines[y];
if ASupportUnicodeCase and (not fSensitive) then LineStr := UTF8LowerCase(LineStr);
LineLen:=length(LineStr);
Line:=PChar(LineStr);
if FBackwards then
x:=LineLen-SearchLen
else
x:=0;
x:=MinMax(x,0,LineLen-1);
//DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]);
until (y<MinY) or (y>MaxY);
end; // NOT RegExp
end; end;
destructor TSynEditSearch.Destroy; destructor TSynEditSearch.Destroy;