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

📄 grepresultsdlg.pas

📁 此软件支持多文档打开
💻 PAS
📖 第 1 页 / 共 3 页
字号:
{***************************************************************
 *
 * Unit Name   : GrepResultsDlg
 * Date        :
 * Purpose     : Grep Search Result Dialog
 * History     :
 *       2000-02-19 16:38:08
 *         + MBCS Support
 *
 ****************************************************************}

Unit GrepResultsDlg;

//! StH: This unit has been completely prepared for localization
//! StH: This unit is fully compatible with C++Builder

Interface

Uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  ExtCtrls,
  SearchFile,
  Buttons,
  ComCtrls,
  AppUtils,
  Menus,
  DropSource,
  vgNLS,
  MainEdit,
  IniFiles,
  JediLocalStr;

Type
  TGrepAction = (gaAllFilesGrep, gaCurrentOnlyGrep, gaOpenFilesGrep, gaDirGrep);

  TSearchResult = Class(TCollectionItem)
  Private
    FLine: String;
    FLineNo: Integer;
    FSPos: Integer;
    FEPos: Integer;
  Published
    Property Line: String Read FLine Write FLine;
    Property LineNo: Integer Read FLineNo Write FLineNo;
    Property SPos: Integer Read FSPos Write FSPos;
    Property EPos: Integer Read FEPos Write FEPos;
  End;

  TSearchResults = Class(TCollection)
  Private
    FExpanded: Boolean;
    FFileName: String;
    Function GetItem(Index: Integer): TSearchResult;
    Procedure SetItem(Index: Integer; Value: TSearchResult);
  Public
    Constructor Create;
    Function Add: TSearchResult;
    Property Expanded: Boolean Read FExpanded Write FExpanded;
    Property FileName: String Read FFileName Write FFileName;
    Property Items[Index: Integer]: TSearchResult Read GetItem Write SetItem; Default;
  End;

  // Saved grep settings (used for refresh)
  TGrepSettings = Packed Record
    NoComments,
      NoCase,
      WholeWord,
      Regex,
      IncludeSubdirs: Boolean;
    Directory,
      Mask,
      Pattern: String;
    GrepAction: TGrepAction;
    CanRefresh: Boolean;
  End;

  TfrmGrepResults = Class(TForm)
    pnlToolbar: TPanel;
    StatusBar: TStatusBar;
    sbSearch: TSpeedButton;
    sbGoto: TSpeedButton;
    sbContract: TSpeedButton;
    sbExpand: TSpeedButton;
    sbAbort: TSpeedButton;
    sbHelp: TSpeedButton;
    sbFont: TSpeedButton;
    dlgGrepFont: TFontDialog;
    lbResults: TListBox;
    sbPrint: TSpeedButton;
    MainMenu: TMainMenu;
    mnuFile: TMenuItem;
    mnuSearch: TMenuItem;
    mnuExit: TMenuItem;
    mnuFileSep: TMenuItem;
    mnuPrint: TMenuItem;
    mnuList: TMenuItem;
    mnuContract: TMenuItem;
    mnuExpand: TMenuItem;
    mnuHelp: TMenuItem;
    mnuFont: TMenuItem;
    mnuHelpHelp: TMenuItem;
    mnuHelpAbout: TMenuItem;
    mnuAbort: TMenuItem;
    mnuGotoSelected: TMenuItem;
    mnuRefresh: TMenuItem;
    sbRefresh: TSpeedButton;
    mnuOnTop: TMenuItem;
    sbOnTopUp: TSpeedButton;
    sbOnTopDown: TSpeedButton;
    sbReplace: TSpeedButton;
    Procedure BtnCloseClick(Sender: TObject);
    Procedure BtnNewClick(Sender: TObject);
    Procedure sbGotoClick(Sender: TObject);
    Procedure FormResize(Sender: TObject);
    Procedure sbContractClick(Sender: TObject);
    Procedure sbExpandClick(Sender: TObject);
    Procedure sbAbortClick(Sender: TObject);
    Procedure FormDestroy(Sender: TObject);
    Procedure FormCreate(Sender: TObject);
    Procedure FormShow(Sender: TObject);
    Procedure lbResultsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Procedure lbResultsKeyPress(Sender: TObject; Var Key: Char);
    Procedure FormKeyPress(Sender: TObject; Var Key: Char);
    Procedure sbFontClick(Sender: TObject);
    Procedure lbResultsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
    Procedure sbPrintClick(Sender: TObject);
    Procedure mnuContractClick(Sender: TObject);
    Procedure mnuExpandClick(Sender: TObject);
    Procedure mnuSearchClick(Sender: TObject);
    Procedure mnuPrintClick(Sender: TObject);
    Procedure mnuExitClick(Sender: TObject);
    Procedure mnuFontClick(Sender: TObject);
    Procedure mnuAbortClick(Sender: TObject);
    Procedure mnuGotoSelectedClick(Sender: TObject);
    Procedure mnuTopClick(Sender: TObject);
    Procedure lbResultsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Procedure lbResultsMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    Procedure mnuRefreshClick(Sender: TObject);
    Procedure mnuOnTopClick(Sender: TObject);
    Procedure sbOnTopClick(Sender: TObject);
    Procedure sbRefreshClick(Sender: TObject);
    Procedure sbReplaceClick(Sender: TObject);
    Procedure FormClose(Sender: TObject; Var Action: TCloseAction);
  Private
    Total: Integer;
    DragSource: TDropFileSource;
    DragPoint: TPoint;
    tran: TvgTranslator;
    Procedure FoundIt(Sender: TObject; LineNo: Integer; Line: String; SPos, EPos: Integer);
    Procedure StartSearch(Sender: TObject);
    Procedure SaveSettings;
    Procedure LoadSettings;
    Procedure ExpandContract(n: Integer);
    Procedure ResizeListBox;
  Protected
    Function GetOnTop: Boolean;
    Procedure SetOnTop(Value: Boolean);
    Procedure WMExitSizeMove(Var Message: TMessage); Message WM_EXITSIZEMOVE;
  Public
    GrepSettings: TGrepSettings;
    SAbort: Boolean;
    Searching: Boolean;
    OpenFiles: Boolean;
    Results: TSearchResults;
    Searcher: TSearcher;
    FileCount: Integer;
    IsDocked: Boolean;
    Procedure Execute(Refresh: Boolean);
    Property OnTop: Boolean Read GetOnTop Write SetOnTop;
  End;

Var
  frmGrepResults: TfrmGrepResults = Nil;

Const
  secGrepResult = 'GrepResult';

Procedure SaveFont(Ini: TIniFile; Const Key: String; Font: TFont);
Procedure LoadFont(Ini: TIniFile; Const Key: String; Font: TFont);

Implementation

{$R *.DFM}

Uses
  {$IFOPT D+}
  DbugIntf,
  {$ENDIF D+}
  GrepSearchDlg,
  ReplaceDialog,
  SynEdit,
  ShellAPI;

Procedure SaveFont(Ini: TIniFile; Const Key: String; Font: TFont);
Begin
  With Ini Do Begin
    // Do not localize any of the following strings
    WriteString(Key, 'Name', Font.Name);
    WriteInteger(Key, 'Size', Font.Size);
    WriteBool(Key, 'Bold', (FsBOld In Font.Style));
    WriteBool(Key, 'Italic', (FsItalic In Font.Style));
    WriteBool(Key, 'Underline', (FsUnderLine In Font.Style));
  End;
End;

Procedure LoadFont(Ini: TIniFile; Const Key: String; Font: TFont);
Begin
  With Ini Do Begin
    // Do not localize any of the following strings
    Font.Name := ReadString(Key, 'Name', Font.Name);
    Font.Size := ReadInteger(Key, 'Size', Font.Size);
    If ReadBool(Key, 'Bold', (FsBOld In Font.Style)) Then
      Font.Style := Font.Style + [FsBOld];
    If ReadBool(Key, 'Italic', (FsItalic In Font.Style)) Then
      Font.Style := Font.Style + [FsItalic];
    If ReadBool(Key, 'Underline', (FsUnderLine In Font.Style)) Then
      Font.Style := Font.Style + [FsUnderLine];
  End;
End;

Function MyTrim(Var st: String): Integer;
Begin
  Result := 0;
  While (Length(st) > 0) And (st[1] In [#9, #32]) Do Begin
    Delete(st, 1, 1);
    Inc(Result);
  End;
End;

Constructor TSearchResults.Create;
Begin
  Inherited Create(TSearchResult);
End;

Function TSearchResults.Add: TSearchResult;
Begin
  Result := TSearchResult(Inherited Add);
End;

Function TSearchResults.GetItem(Index: Integer): TSearchResult;
Begin
  Result := TSearchResult(Inherited GetItem(Index));
End;

Procedure TSearchResults.SetItem(Index: Integer; Value: TSearchResult);
Begin
  Inherited SetItem(Index, Value);
End;

Procedure TfrmGrepResults.BtnCloseClick(Sender: TObject);
Begin
  Close;
End;

Procedure TfrmGrepResults.StartSearch(Sender: TObject);
Begin
  StatusBar.Panels.Items[0].Text := tran.TMsg(SProcessing) + Searcher.FileName;
  StatusBar.Repaint;
End;

Procedure TfrmGrepResults.FoundIt(Sender: TObject; LineNo: Integer; Line: String; SPos, EPos: Integer);
Var
  AResult: TSearchResult;
Begin
  Application.ProcessMessages;
  Inc(Total);
  If (Results = Nil) Or (Results.FileName <> Searcher.FileName) Then Begin
    Results := TSearchResults.Create;
    Results.FileName := Searcher.FileName;
    lbResults.Items.AddObject(Searcher.FileName, Results);
  End;
  AResult := Results.Add;
  AResult.Line := Line;
  AResult.LineNo := LineNo;
  AResult.SPos := SPos;
  AResult.EPos := EPos;
End;

Procedure TfrmGrepResults.Execute(Refresh: Boolean);
Var
  Dlg: TfrmGrepSearch;
  SStart: Integer;
  Send: Integer;
  Edit: TSynEdit;

  Procedure CurrentOnlyGrep;
  Var
    CurrentFile: String;
  Begin
    Results := Nil;
    CurrentFile := '';
    CurrentFile := frmJediEdit.CurrentEditor.FileName;
    If CurrentFile <> '' Then Begin
      Searcher.FileName := CurrentFile;
      Searcher.Execute;
      Inc(FileCount);
    End Else MessageDlg(tran.TMsg(SNoFileOpen), MtError, [MbOK], 0);
  End;

  Procedure AllFilesGrep;
  Var
    I: Integer;
  Begin
    If OpenFiles Then With frmJediEdit Do Begin //Current Open Files in Editor.
        For i := 0 To EditorCount - 1 Do Begin
          Searcher.FileName := '';
          Searcher.FileName := Editor[i].FileName;
          Searcher.Execute;
          Inc(FileCount);
          If SAbort Then Break;
        End; //for
      End
    Else Begin // All files in the project File(.dpr or .bpr)
      // Not implemented yet!
    End;
  End;

  Procedure DirGrep(Dir, Mask: String);
  Var
    Search: TSearchRec;
    Result: Integer;
    S: TStringList;
    i: Integer;
  Begin
    //{$IFOPT D+}SendDebug('DirSearch on:' +Dir+' Mask: '+Mask);{$ENDIF}
    If Dir[Length(Dir)] <> '\' Then Dir := Dir + '\';
    //{$IFOPT D+}SendDebug('Slashed DirSearch on:' +Dir);{$ENDIF}
    S := TStringList.Create;
    Try
      For i := 1 To Length(Mask) Do
        If Mask[i] In [';', ','] Then
          Mask[i] := #13;

      S.Text := Mask;

      { First do sub-directories if option is selected }
      If GrepSettings.IncludeSubdirs Then Begin
        Result := FindFirst(Dir + '*.*', FaAnyFile, Search);
        Try
          While Result = 0 Do Begin
            If (Search.Attr And FaDirectory) <> 0 Then Begin
              If (Search.Name <> '.') And (Search.Name <> '..') Then
                DirGrep(Dir + Search.Name, Mask);
            End;
            Result := FindNext(Search);
          End;
        Finally
          FindClose(Search);
        End;
      End;

      For i := 0 To S.Count - 1 Do Begin
        Result := FindFirst(Dir + Trim(S.Strings[i]), FaAnyFile, Search);
        Try
          While Result = 0 Do Begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -