📄 grepresultsdlg.pas
字号:
If (Search.Attr And FaDirectory) <> 0 Then Begin
Result := FindNext(Search);
End
Else Begin
Results := Nil;
Searcher.FileName := Dir + Search.Name;
Searcher.Execute;
Application.ProcessMessages;
If SAbort Then Break;
Inc(FileCount);
Result := FindNext(Search);
End;
End;
Finally
FindClose(Search);
End;
End;
Finally
S.Free;
End;
End;
Var
GrepANSI: Boolean;
Begin
//! StH: This code needs some cleanup attention
If Searching Then Begin
MessageDlg(tran.TMsg(SGrepActive), MtInFormation, [MbOK], 0);
Exit;
End;
GrepANSI := False;
If Not (Refresh And GrepSettings.CanRefresh) Then Begin
Dlg := TfrmGrepSearch.Create(Nil);
Try
Edit := frmJediEdit.CurrentEditor;
if Edit <> nil then with Edit do
If Length(SelText) > 1 Then Dlg.cbText.Text := SelText;
If Dlg.ShowModal <> MrOk Then Exit;
// Save Dialog settings to local vars
GrepSettings.NoComments := Dlg.chkNoComments.Checked;
GrepSettings.NoCase := Dlg.chkNoCase.Checked;
GrepSettings.WholeWord := Dlg.chkWholeWord.Checked;
GrepSettings.Regex := Dlg.chkRegEx.Checked;
GrepSettings.Pattern := Dlg.cbText.Text;
If GrepSettings.Pattern = '' Then Exit;
GrepSettings.IncludeSubdirs := Dlg.chkInclude.Checked;
If Dlg.rbAllFiles.Checked Then
GrepSettings.GrepAction := gaAllFilesGrep
Else If Dlg.rbCurrentOnly.Checked Then
GrepSettings.GrepAction := gaCurrentOnlyGrep
Else If Dlg.rbOpenFiles.Checked Then
GrepSettings.GrepAction := gaOpenFilesGrep
Else Begin
GrepSettings.Directory := Dlg.cbDirectory.Text;
If GrepSettings.Directory = '' Then Exit;
GrepSettings.Mask := Dlg.cbMasks.Text;
GrepSettings.GrepAction := gaDirGrep;
End;
GrepSettings.CanRefresh := True;
GrepANSI := Dlg.chkGrepANSI.Checked;
Finally
Dlg.Free;
End;
End;
Try
Searching := True;
BringToFront;
Total := 0;
FileCount := 0;
SAbort := False;
OpenFiles := False;
sbSearch.Enabled := False;
sbRefresh.Enabled := False;
sbPrint.Enabled := False;
sbGoto.Enabled := False;
sbExpand.Enabled := False;
sbContract.Enabled := False;
sbFont.Enabled := False;
sbAbort.Enabled := True;
//IdeDockManager.ShowForm(Self);
SStart := GetTickCount;
Self.Cursor := CrHourGlass;
Searcher := TSearcher.Create('');
Try
Searcher.BufSize := 30000;
Searcher.OnFound := FoundIt;
Searcher.OnStartSearch := StartSearch;
Searcher.NoComments := GrepSettings.NoComments;
If GrepSettings.NoCase Then Searcher.SearchOptions := [soCaseSensitive];
If GrepSettings.WholeWord Then Searcher.SearchOptions := Searcher.SearchOptions + [soWholeWord];
If GrepSettings.Regex Then Searcher.SearchOptions := Searcher.SearchOptions + [soRegEx];
Searcher.ANSICompatible := GrepANSI;
lbResults.Clear;
Searcher.Setpattern(GrepSettings.Pattern);
Application.ProcessMessages;
Case GrepSettings.GrepAction Of
gaAllFilesGrep: AllFilesGrep;
gaCurrentOnlyGrep: CurrentOnlyGrep;
gaOpenFilesGrep: Begin
OpenFiles := True;
AllFilesGrep;
End;
gaDirGrep: Begin
If Length(Trim(GrepSettings.Mask)) = 0 Then
DirGrep(GrepSettings.Directory, '*.pas')
Else
DirGrep(GrepSettings.Directory, UpperCase(GrepSettings.Mask));
End;
End; // end case
Finally
Searching := False;
Send := GetTickCount;
Searcher.Free;
Self.Cursor := CrDefault;
StatusBar.Panels.Items[0].Text := Format(tran.TMsg(SGrepStatistics), [FileCount, (Send - SStart) / 1000]);
lbResults.Refresh;
lbResults.Sorted := True;
lbResults.Sorted := False;
If lbResults.Items.Count = 1 Then Begin
lbResults.ItemIndex := 0;
sbExpandClick(sbExpand);
End;
End;
Finally
sbPrint.Enabled := True;
sbSearch.Enabled := True;
sbRefresh.Enabled := True;
sbExpand.Enabled := True;
sbContract.Enabled := True;
sbFont.Enabled := True;
sbGoto.Enabled := True;
sbAbort.Enabled := False;
End;
StatusBar.Panels.Items[1].Text := IntToStr(Total) + tran.TMsg(SMatches);
If Not Visible Then Begin
{if frmJediEdit.DockClientCount > 0 then
for SStart := 0 to frmJediEdit.DockClientCount - 1 do
if frmJediEdit.DockClients[SStart] is TfrmGrepResults then
begin
Show;
exit;
end;}
Visible := True;
frmGrepResults.ManualDock(frmJediEdit.pnlBottomDockSite);
End;
End;
Procedure TfrmGrepResults.lbResultsMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Var
i: Integer;
Begin
//Make sure mouse has moved at least 10 pixels before starting drag ...
If (DragPoint.X = -1) Or ((Shift <> [SsLeft]) And (Shift <> [SsRight])) Or
((Abs(DragPoint.X - X) < 10) And (Abs(DragPoint.Y - Y) < 10)) Then Exit;
i := lbResults.ItemAtPos(Point(X, Y), True);
If (i > -1) Then Begin
DragSource.Files.Clear;
If lbResults.Items.Objects[i] Is TSearchResults Then
DragSource.Files.Add(TSearchResults(lbResults.Items.Objects[i]).FFileName)
Else If lbResults.Items.Objects[i] Is TSearchResult Then
DragSource.Files.Add(TSearchResults(TSearchResult(lbResults.Items.Objects[i]).Collection).FFileName);
If DragSource.Files.Count > 0 Then
DragSource.Execute;
End;
End;
Procedure TfrmGrepResults.lbResultsMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
DragPoint := Point(X, Y);
End;
Procedure TfrmGrepResults.BtnNewClick(Sender: TObject);
Begin
Execute(False);
End;
Procedure TfrmGrepResults.sbGotoClick(Sender: TObject);
Var
Result: TSearchResult;
CurrentFileName: String;
R: TPoint;
Begin
If (lbResults.ItemIndex < 0) Then
Exit;
If (lbResults.Items.Objects[lbResults.ItemIndex] Is TSearchResults) Then Begin
ExpandContract(lbResults.ItemIndex);
Exit;
End;
{$IFOPT D+}SendDebug('Getting selected result object index: ' + IntToStr(lbResults.ItemIndex));
{$ENDIF}
Result := TSearchResult(lbResults.Items.Objects[lbResults.ItemIndex]);
{$IFOPT D+}SendDebug('Set Result variable');
{$ENDIF}
If Result = Nil Then Exit;
With TSearchResults(Result.Collection) Do Begin
CurrentFileName := FileName;
End; //with
{$IFOPT D+}SendDebug('FileName: ' + CurrentFileName);
{$ENDIF}
frmJediEdit.OpenFilePos(CurrentFileName, Result.SPos, Result.LineNo, [], '');
R.X := Result.SPos;
R.Y := Result.LineNo;
frmJediEdit.CurrentEditor.BlockBegin := R;
R.X := Result.EPos + 1;
R.Y := Result.LineNo;
frmJediEdit.CurrentEditor.BlockEnd := R;
End;
Procedure TfrmGrepResults.FormResize(Sender: TObject);
Begin
StatusBar.Panels.Items[0].Width := StatusBar.Width - 100;
InValidate;
End;
Procedure TfrmGrepResults.sbContractClick(Sender: TObject);
Var
i: Integer;
Begin
Self.Enabled := False;
lbResults.Items.BeginUpdate;
Try
i := 0;
While i <= lbResults.Items.Count - 1 Do
If lbResults.Items.Objects[i] Is TSearchResult Then Begin
lbResults.Items.Delete(i);
End
Else Begin
TSearchResults(lbResults.Items.Objects[i]).Expanded := False;
Inc(i);
End;
Finally
lbResults.Items.EndUpdate;
Self.Enabled := True;
End;
End;
Procedure TfrmGrepResults.sbExpandClick(Sender: TObject);
Function Expand(n: Integer): Integer;
Var
Results: TSearchResults;
t: Integer;
Begin
Results := TSearchResults(lbResults.Items.Objects[n]);
For t := Results.Count - 1 Downto 0 Do
lbResults.Items.InsertObject(n + 1, Results.Items[t].Line, Results.Items[t]);
Results.Expanded := True;
Result := n + Results.Count - 1;
End;
Var
i: Integer;
Begin
Self.Enabled := False;
lbResults.Items.BeginUpdate;
Try
i := 0;
While i <= lbResults.Items.Count - 1 Do
If lbResults.Items.Objects[i] Is TSearchResults Then Begin
If Not TSearchResults(lbResults.Items.Objects[i]).Expanded Then
i := Expand(i);
Inc(i);
End
Else
Inc(i);
Finally
lbResults.Items.EndUpdate;
Self.Enabled := True;
End;
End;
Procedure TfrmGrepResults.sbAbortClick(Sender: TObject);
Begin
sAbort := True;
End;
Procedure TfrmGrepResults.FormDestroy(Sender: TObject);
Begin
SaveSettings;
frmGrepResults := Nil;
SAbort := True;
DragSource.Free;
DragSource := Nil;
Inherited;
End;
Procedure TfrmGrepResults.mnuContractClick(Sender: TObject);
Begin
If sbContract.Enabled Then
sbContractClick(Self);
End;
Procedure TfrmGrepResults.mnuExpandClick(Sender: TObject);
Begin
If sbExpand.Enabled Then
sbExpandClick(Self);
End;
Procedure TfrmGrepResults.mnuSearchClick(Sender: TObject);
Begin
If sbSearch.Enabled Then
Execute(False);
End;
Procedure TfrmGrepResults.mnuPrintClick(Sender: TObject);
Begin
If sbPrint.Enabled Then
sbPrintClick(Self);
End;
Procedure TfrmGrepResults.mnuExitClick(Sender: TObject);
Begin
Close;
End;
Procedure TfrmGrepResults.mnuFontClick(Sender: TObject);
Begin
If sbFont.Enabled Then
sbFontClick(Self);
End;
Procedure TfrmGrepResults.mnuAbortClick(Sender: TObject);
Begin
If sbAbort.Enabled Then
sbAbort.Click;
End;
Procedure TfrmGrepResults.mnuGotoSelectedClick(Sender: TObject);
Begin
If sbGoto.Enabled Then
sbGoto.Click;
End;
Procedure TfrmGrepResults.mnuTopClick(Sender: TObject);
Begin
mnuSearch.Enabled := sbSearch.Enabled;
mnuRefresh.Enabled := sbRefresh.Enabled;
mnuPrint.Enabled := sbPrint.Enabled;
mnuAbort.Enabled := sbAbort.Enabled;
mnuGotoSelected.Enabled := sbGoto.Enabled;
mnuExpand.Enabled := sbExpand.Enabled;
mnuContract.Enabled := sbContract.Enabled;
mnuFont.Enabled := sbFont.Enabled;
End;
Procedure TfrmGrepResults.SaveSettings;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -