⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grepresultsdlg.pas

📁 此软件支持多文档打开
💻 PAS
📖 第 1 页 / 共 3 页
字号:
            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 + -