* fixed bug #10606, F3 finds next/previous occurences of incremental search

git-svn-id: trunk@14925 -
This commit is contained in:
marc 2008-04-21 22:31:46 +00:00
parent 764f3bb7ad
commit 4e1373d30e

View File

@ -527,8 +527,8 @@ type
procedure UpdateActiveEditColors; procedure UpdateActiveEditColors;
procedure SetIncrementalSearchStr(const AValue: string); procedure SetIncrementalSearchStr(const AValue: string);
procedure DoIncrementalSearch; procedure IncrementalSearch(ANext: Boolean; ABackward: Boolean);
// macros // macros
function MacroFuncCol(const s:string; const Data: PtrInt; function MacroFuncCol(const s:string; const Data: PtrInt;
var Abort: boolean): string; var Abort: boolean): string;
@ -1228,11 +1228,15 @@ procedure TSourceEditor.FindNext;
var var
OldOptions: TSynSearchOptions; OldOptions: TSynSearchOptions;
begin begin
if LazFindReplaceDialog.FindText = '' then if snIncrementalFind in FSourceNoteBook.States
then begin
FSourceNoteBook.IncrementalSearch(True, False);
end
else if LazFindReplaceDialog.FindText = ''
then begin
StartFindAndReplace(False) StartFindAndReplace(False)
else if snIncrementalFind in FSourceNoteBook.States then begin end
FSourceNoteBook.fIncrementalSearchStartPos:=FEditor.LogicalCaretXY; else begin
end else begin
OldOptions:=LazFindReplaceDialog.Options; OldOptions:=LazFindReplaceDialog.Options;
LazFindReplaceDialog.Options:=LazFindReplaceDialog.Options LazFindReplaceDialog.Options:=LazFindReplaceDialog.Options
-[ssoEntireScope,ssoReplaceAll]; -[ssoEntireScope,ssoReplaceAll];
@ -1243,20 +1247,27 @@ End;
{---------------------------F I N D P R E V I O U S ------------------------} {---------------------------F I N D P R E V I O U S ------------------------}
procedure TSourceEditor.FindPrevious; procedure TSourceEditor.FindPrevious;
var OldOptions: TSynSearchOptions; var
Begin OldOptions: TSynSearchOptions;
OldOptions:=LazFindReplaceDialog.Options; begin
LazFindReplaceDialog.Options:=LazFindReplaceDialog.Options-[ssoEntireScope]; if snIncrementalFind in FSourceNoteBook.States
if ssoBackwards in LazFindReplaceDialog.Options then then begin
LazFindReplaceDialog.Options:=LazFindReplaceDialog.Options-[ssoBackwards] FSourceNoteBook.IncrementalSearch(True, True);
else end
LazFindReplaceDialog.Options:=LazFindReplaceDialog.Options+[ssoBackwards]; else begin
if LazFindReplaceDialog.FindText = '' then OldOptions:=LazFindReplaceDialog.Options;
StartFindAndReplace(False) LazFindReplaceDialog.Options:=LazFindReplaceDialog.Options-[ssoEntireScope];
else if ssoBackwards in LazFindReplaceDialog.Options then
DoFindAndReplace; LazFindReplaceDialog.Options:=LazFindReplaceDialog.Options-[ssoBackwards]
LazFindReplaceDialog.Options:=OldOptions; else
End; LazFindReplaceDialog.Options:=LazFindReplaceDialog.Options+[ssoBackwards];
if LazFindReplaceDialog.FindText = '' then
StartFindAndReplace(False)
else
DoFindAndReplace;
LazFindReplaceDialog.Options:=OldOptions;
end;
end;
procedure TSourceEditor.FindNextWordOccurrence(DirectionForward: boolean); procedure TSourceEditor.FindNextWordOccurrence(DirectionForward: boolean);
var var
@ -6197,34 +6208,55 @@ procedure TSourceNotebook.SetIncrementalSearchStr(const AValue: string);
begin begin
if FIncrementalSearchStr=AValue then exit; if FIncrementalSearchStr=AValue then exit;
FIncrementalSearchStr:=AValue; FIncrementalSearchStr:=AValue;
DoIncrementalSearch; IncrementalSearch(False, False);
end; end;
procedure TSourceNotebook.DoIncrementalSearch; procedure TSourceNotebook.IncrementalSearch(ANext, ABackward: Boolean);
const
SEARCH_OPTS: array[Boolean] of TSynSearchOptions = ([], [ssoBackwards]);
var var
CurEdit: TSynEdit; CurEdit: TSynEdit;
begin begin
if snIncrementalFind in States then begin if not (snIncrementalFind in States)
Include(States,snIncrementalSearching); then begin
// search string UpdateStatusBar;
CurEdit:=GetActiveSE.EditorComponent; Exit;
CurEdit.BeginUpdate;
if fIncrementalSearchStr<>'' then begin
// search from search start position
CurEdit.LogicalCaretXY:=fIncrementalSearchStartPos;
CurEdit.SearchReplace(fIncrementalSearchStr,'',[]);
CurEdit.LogicalCaretXY:=CurEdit.BlockEnd;
FIncrementalSearchStr:=CurEdit.SelText;
end else begin
// go to start
CurEdit.LogicalCaretXY:=fIncrementalSearchCancelPos;
CurEdit.BlockBegin:=CurEdit.LogicalCaretXY;
CurEdit.BlockEnd:=CurEdit.BlockBegin;
end;
FIncrementalSearchPos:=CurEdit.LogicalCaretXY;
CurEdit.EndUpdate;
Exclude(States,snIncrementalSearching);
end; end;
Include(States,snIncrementalSearching);
// search string
CurEdit:=GetActiveSE.EditorComponent;
CurEdit.BeginUpdate;
if FIncrementalSearchStr<>''
then begin
// search from search start position when not searching for the next
if not ANext
then CurEdit.LogicalCaretXY := FIncrementalSearchStartPos
else if ABackward
then CurEdit.LogicalCaretXY := CurEdit.BlockBegin;
CurEdit.SearchReplace(FIncrementalSearchStr,'', SEARCH_OPTS[ABackward]);
CurEdit.LogicalCaretXY:=CurEdit.BlockEnd;
// searching next resets incremental history
if ANext
then begin
FIncrementalSearchStartPos := CurEdit.BlockBegin;
FIncrementalSearchCancelPos := FIncrementalSearchStartPos;
end;
// MWE:??? is it needed to set the SearchStr again. In theory we just searched it
FIncrementalSearchStr:=CurEdit.SelText;
end
else begin
// go to start
CurEdit.LogicalCaretXY:=fIncrementalSearchCancelPos;
CurEdit.BlockBegin:=CurEdit.LogicalCaretXY;
CurEdit.BlockEnd:=CurEdit.BlockBegin;
end;
FIncrementalSearchPos:=CurEdit.LogicalCaretXY;
CurEdit.EndUpdate;
Exclude(States,snIncrementalSearching);
UpdateStatusBar; UpdateStatusBar;
end; end;