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