View Issue Details

IDProjectCategoryView StatusLast Update
0000559Double CommanderLogicpublic2014-01-14 09:02
Reporterpktfag Assigned ToAlexx2000  
PrioritynormalSeverityfeatureReproducibilityalways
Status closedResolutionfixed 
ProjectionnoneETAnone 
Fixed in Version0.5.5 
Summary0000559: Search in the selected files and directories
DescriptionVery handy feature in totalcmd: search the selected files and directories.
I made the patch: findsel.patch
TagsNo tags attached.
Attached Files
findsel.patch (11,289 bytes)   
Index: language/doublecmd.po
===================================================================
--- language/doublecmd.po	(revision 4952)
+++ language/doublecmd.po	(working copy)
@@ -1864,6 +1864,10 @@
 msgid "Re&place by"
 msgstr ""
 
+#: tfrmfinddlg.cbselectedfiles.caption
+msgid "Selected directories and &files"
+msgstr ""
+
 #: tfrmfinddlg.cbtimefrom.caption
 msgid "Time from:"
 msgstr ""
Index: language/doublecmd.ru.po
===================================================================
--- language/doublecmd.ru.po	(revision 4952)
+++ language/doublecmd.ru.po	(working copy)
@@ -1890,6 +1890,10 @@
 msgid "Re&place by"
 msgstr "Заменить текст"
 
+#: tfrmfinddlg.cbselectedfiles.caption
+msgid "Selected directories and &files"
+msgstr "&Выбранные файлы и каталоги"
+
 #: tfrmfinddlg.cbtimefrom.caption
 msgid "Time from:"
 msgstr "Время от:"
Index: src/fFindDlg.lfm
===================================================================
--- src/fFindDlg.lfm	(revision 4952)
+++ src/fFindDlg.lfm	(working copy)
@@ -170,6 +170,20 @@
               TabOrder = 0
             end
           end
+          object cbSelectedFiles: TCheckBox
+            AnchorSideTop.Side = asrBottom
+            AnchorSideRight.Control = cbFollowSymLinks
+            AnchorSideBottom.Control = cbFollowSymLinks
+            AnchorSideBottom.Side = asrBottom
+            Left = 428
+            Height = 19
+            Top = 0
+            Width = 169
+            Anchors = [akRight, akBottom]
+            Caption = 'Selected directories and &files'
+            OnChange = cbSelectedFilesChange
+            TabOrder = 4
+          end
         end
         object gbFiles: TGroupBox
           AnchorSideLeft.Control = tsStandard
Index: src/fFindDlg.lrt
===================================================================
--- src/fFindDlg.lrt	(revision 4952)
+++ src/fFindDlg.lrt	(working copy)
@@ -6,6 +6,7 @@
 TFRMFINDDLG.LBLEXCLUDEDIRECTORIES.CAPTION=E&xclude subdirectories
 TFRMFINDDLG.CMBEXCLUDEDIRECTORIES.HINT=Enter directories names that should be excluded from search separated with ";"
 TFRMFINDDLG.LBLSEARCHDEPTH.CAPTION=Search su&bdirectories:
+TFRMFINDDLG.CBSELECTEDFILES.CAPTION=Selected directories and &files
 TFRMFINDDLG.GBFILES.CAPTION=Files
 TFRMFINDDLG.LBLFINDFILEMASK.CAPTION=&File mask
 TFRMFINDDLG.CMBFINDFILEMASK.HINT=Enter files names separated with ";"
Index: src/fFindDlg.pas
===================================================================
--- src/fFindDlg.pas	(revision 4952)
+++ src/fFindDlg.pas	(working copy)
@@ -33,7 +33,7 @@
   Graphics, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ComCtrls,
   ExtCtrls, Menus, EditBtn, Spin, Buttons, ZVDateTimePicker, KASComboBox,
   fAttributesEdit, uDsxModule, DsxPlugin, uFindThread, uFindFiles,
-  uSearchTemplate;
+  uSearchTemplate, uFileView;
 
 type
 
@@ -71,6 +71,7 @@
     cbPartialNameSearch: TCheckBox;
     cbFollowSymLinks: TCheckBox;
     cbUsePlugin: TCheckBox;
+    cbSelectedFiles: TCheckBox;
     cmbExcludeDirectories: TComboBoxWithDelItems;
     cmbNotOlderThanUnit: TComboBox;
     cmbFileSizeUnit: TComboBox;
@@ -142,6 +143,7 @@
     procedure cbDateToChange(Sender: TObject);
     procedure cbPartialNameSearchChange(Sender: TObject);
     procedure cbRegExpChange(Sender: TObject);
+    procedure cbSelectedFilesChange(Sender: TObject);
     procedure cmbEncodingSelect(Sender: TObject);
     procedure cbFindTextChange(Sender: TObject);
     procedure cbUsePluginChange(Sender: TObject);
@@ -185,6 +187,9 @@
     procedure ZVTimeFromChange(Sender: TObject);
     procedure ZVTimeToChange(Sender: TObject);
   private
+    FFileView: TFileView;
+    FSelectedFiles: TStringList;
+
     FFindThread:TFindThread;
     DsxPlugins: TDSXModuleList;
     FSearchingActive: Boolean;
@@ -218,7 +223,7 @@
 var
   FoundedStringCopy: TStringlist = nil;
 
-procedure ShowFindDlg(const sActPath: UTF8String);
+procedure ShowFindDlg(FileView: TFileView);
 function ShowDefineTemplateDlg(var TemplateName: UTF8String): Boolean;
 function ShowUseTemplateDlg(var Template: TSearchTemplate): Boolean;
 
@@ -230,7 +235,7 @@
   LCLProc, LCLType, LConvEncoding, StrUtils, HelpIntfs, fViewer, fMain,
   uLng, uGlobs, uShowForm, uDCUtils,
   uSearchResultFileSource, uFile, uFileSystemFileSource,
-  uFileViewNotebook, uFileView, uColumnsFileView, uKeyboard,
+  uFileViewNotebook, uColumnsFileView, uKeyboard,
   DCOSUtils;
 
 const
@@ -271,14 +276,15 @@
   Application.ProcessMessages;
 end;
 
-procedure ShowFindDlg(const sActPath: UTF8String);
+procedure ShowFindDlg(FileView: TFileView);
 begin
   with TfrmFindDlg.Instance do
   begin
     // Prepare window for search files
     ClearFilter;
+    FFileView := FileView;
     Caption := rsFindSearchFiles;
-    edtFindPathStart.Text := sActPath;
+    edtFindPathStart.Text := FileView.CurrentPath;
     ShowOnTop;
   end;
 end;
@@ -417,6 +423,8 @@
   edtFindPathStart.ShowHidden := gShowSystemFiles;
   cbPartialNameSearch.Checked:= gPartialNameSearch;
 
+  FSelectedFiles := TStringList.Create;
+
   InitPropStorage(Self);
 end;
 
@@ -449,6 +457,7 @@
 destructor TfrmFindDlg.Destroy;
 begin
   inherited Destroy;
+  FSelectedFiles.Free;
   FLastSearchTemplate.Free;
 end;
 
@@ -602,6 +611,11 @@
   if cbRegExp.Checked then cbPartialNameSearch.Checked:=False;
 end;
 
+procedure TfrmFindDlg.cbSelectedFilesChange(Sender: TObject);
+begin
+  edtFindPathStart.Enabled := not cbSelectedFiles.Checked;
+end;
+
 procedure TfrmFindDlg.btnSelDirClick(Sender: TObject);
 var
   s:String;
@@ -809,6 +823,7 @@
   sPath : UTF8String;
   sr: TDsxSearchRecord;
   SearchTemplate, TmpTemplate: TSearchTemplateRec;
+  I: Integer;
 begin
   sTemp:= edtFindPathStart.Text;
   repeat
@@ -866,6 +881,16 @@
   TmpTemplate.StartPath := ''; // Don't remember starting path.
   FLastSearchTemplate.SearchRecord := TmpTemplate;
 
+  FSelectedFiles.Clear;
+  if cbSelectedFiles.Checked then begin
+    for I := 0 to FFileView.DisplayFiles.Count - 1 do begin
+      if FFileView.DisplayFiles[i].Selected then begin
+        sTemp := FFileView.DisplayFiles[I].FSFile.FullPath;
+        FSelectedFiles.Add(sTemp);
+      end;
+    end;
+  end;
+
   try
     if (cbUsePlugin.Checked) and (cmbPlugin.ItemIndex<>-1) then
       begin
@@ -880,7 +905,7 @@
       end
     else
       begin
-        FFindThread := TFindThread.Create(SearchTemplate);
+        FFindThread := TFindThread.Create(SearchTemplate, FSelectedFiles);
         with FFindThread do
         begin
           Items := FoundedStringCopy;
@@ -1109,6 +1134,9 @@
   if pgcSearch.ActivePage = tsStandard then
     if cmbFindFileMask.CanFocus then
       cmbFindFileMask.SetFocus;
+
+  cbSelectedFiles.Checked := FFileView.HasSelectedFiles;
+  cbSelectedFiles.Enabled := FFileView.HasSelectedFiles;
 end;
 
 procedure TfrmFindDlg.gbDirectoriesResize(Sender: TObject);
Index: src/ufindthread.pas
===================================================================
--- src/ufindthread.pas	(revision 4952)
+++ src/ufindthread.pas	(working copy)
@@ -47,6 +47,7 @@
     FFoundFile:String;
     FCurrentDepth: Integer;
     FSearchTemplate: TSearchTemplateRec;
+    FSelectedFiles: TStringList;
     FFileChecks: TFindFileChecks;
     FLinkTargets: TStringList;  // A list of encountered directories (for detecting cycles)
 
@@ -57,9 +58,10 @@
   protected
     procedure Execute; override;
   public
-    constructor Create(const AFindOptions: TSearchTemplateRec);
+    constructor Create(const AFindOptions: TSearchTemplateRec; SelectedFiles: TStringList);
     destructor Destroy; override;
     procedure AddFile;
+    procedure DoFile(const sNewDir:String; const sr : TSearchRecEx);
     procedure WalkAdr(const sNewDir:String);
     procedure UpDateProgress;
     function IsAborting: Boolean;
@@ -79,12 +81,13 @@
 
 { TFindThread }
 
-constructor TFindThread.Create(const AFindOptions: TSearchTemplateRec);
+constructor TFindThread.Create(const AFindOptions: TSearchTemplateRec; SelectedFiles: TStringList);
 begin
   inherited Create(True);
 
   FLinkTargets := TStringList.Create;
   FSearchTemplate := AFindOptions;
+  FSelectedFiles := SelectedFiles;
 
   with FSearchTemplate do
   begin
@@ -114,6 +117,7 @@
 procedure TFindThread.Execute;
 var
   sTemp, sPath: UTF8String;
+  I: Integer;
 begin
   FreeOnTerminate := True;
 
@@ -121,15 +125,24 @@
     Assert(Assigned(FItems),'assert:FItems is empty');
     Synchronize(@UpDateProgress);
     FCurrentDepth:= -1;
-    sTemp:= FSearchTemplate.StartPath;
-    while sTemp <> EmptyStr do
+    if FSelectedFiles.Count = 0 then
+    begin
+      sTemp:= FSearchTemplate.StartPath;
+      while sTemp <> EmptyStr do
+        begin
+          sPath:= Copy2SymbDel(sTemp, ';');
+          sPath:= ExcludeBackPathDelimiter(sPath);
+          WalkAdr(sPath);
+        end;
+      FCurrentDir:= rsOperFinished;
+      Synchronize(@UpDateProgress);
+    end else
+    begin
+      for I := 0 to FSelectedFiles.Count - 1 do
       begin
-        sPath:= Copy2SymbDel(sTemp, ';');
-        sPath:= ExcludeBackPathDelimiter(sPath);
-        WalkAdr(sPath);
+        WalkAdr(FSelectedFiles[I]);
       end;
-    FCurrentDir:= rsOperFinished;
-    Synchronize(@UpDateProgress);
+    end;
   except
     on E:Exception do
       msgError(Self, E.Message);
@@ -327,6 +340,19 @@
    end;
 end;
 
+procedure TFindThread.DoFile(const sNewDir:String; const sr : TSearchRecEx);
+begin
+  if CheckFile(sNewDir, sr) then
+  begin
+    FFoundFile := sNewDir + PathDelim + sr.Name;
+    Synchronize(@AddFile);
+    Inc(FFilesFound);
+  end;
+
+  Inc(FFilesScanned);
+  Synchronize(@UpDateProgress);
+end;
+
 procedure TFindThread.WalkAdr(const sNewDir:String);
 var
   sr: TSearchRecEx;
@@ -343,20 +369,17 @@
   Path := sNewDir + PathDelim + '*';
 
   if FindFirstEx(Path, faAnyFile, sr) = 0 then
-  repeat
-    if not FPS_ISDIR(sr.Attr) then
-    begin
-      if CheckFile(sNewDir, sr) then
-      begin
-        FFoundFile := sNewDir + PathDelim + sr.Name;
-        Synchronize(@AddFile);
-        Inc(FFilesFound);
-      end;
-
-      Inc(FFilesScanned);
-      Synchronize(@UpDateProgress);
-    end;
-  until (FindNextEx(sr)<>0) or Terminated;
+  begin
+    repeat
+      if not FPS_ISDIR(sr.Attr) then
+        DoFile(sNewDir, sr)
+    until (FindNextEx(sr)<>0) or Terminated;
+  end else
+  begin
+    Path := sNewDir;
+    if FindFirstEx(Path, faAnyFile, sr) = 0 then
+      DoFile(ExtractFileDir(Path), sr);
+  end;
   FindCloseEx(sr);
   Synchronize(@UpDateProgress);
 
@@ -365,7 +388,7 @@
   begin
     if FindFirstEx(Path, faDirectory, sr) = 0 then
       repeat
-        if CheckDirectory(sNewDir, sr.Name) then
+        if FPS_ISDIR(sr.Attr) and CheckDirectory(sNewDir, sr.Name) then
         begin
           SubPath := sNewDir + PathDelim + sr.Name;
           IsLink := FPS_ISLNK(sr.Attr);
Index: src/umaincommands.pas
===================================================================
--- src/umaincommands.pas	(revision 4952)
+++ src/umaincommands.pas	(working copy)
@@ -2007,7 +2007,7 @@
 
 procedure TMainCommands.cm_Search(const Params: array of string);
 begin
-  ShowFindDlg(frmMain.ActiveFrame.CurrentPath);
+  ShowFindDlg(frmMain.ActiveFrame);
 end;
 
 
findsel.patch (11,289 bytes)   
findsel4956.patch (11,293 bytes)   
Index: language/doublecmd.po
===================================================================
--- language/doublecmd.po	(revision 4956)
+++ language/doublecmd.po	(working copy)
@@ -1871,6 +1871,10 @@
 msgid "Re&place by"
 msgstr ""
 
+#: tfrmfinddlg.cbselectedfiles.caption
+msgid "Selected directories and &files"
+msgstr ""
+
 #: tfrmfinddlg.cbtimefrom.caption
 msgid "&Time from:"
 msgstr ""
Index: language/doublecmd.ru.po
===================================================================
--- language/doublecmd.ru.po	(revision 4956)
+++ language/doublecmd.ru.po	(working copy)
@@ -1889,6 +1889,10 @@
 msgid "Re&place by"
 msgstr "З&аменить текст"
 
+#: tfrmfinddlg.cbselectedfiles.caption
+msgid "Selected directories and &files"
+msgstr "&Выбранные файлы и каталоги"
+
 #: tfrmfinddlg.cbtimefrom.caption
 msgid "&Time from:"
 msgstr "&Время от:"
Index: src/fFindDlg.lfm
===================================================================
--- src/fFindDlg.lfm	(revision 4956)
+++ src/fFindDlg.lfm	(working copy)
@@ -170,6 +170,20 @@
               TabOrder = 0
             end
           end
+          object cbSelectedFiles: TCheckBox
+            AnchorSideTop.Side = asrBottom
+            AnchorSideRight.Control = cbFollowSymLinks
+            AnchorSideBottom.Control = cbFollowSymLinks
+            AnchorSideBottom.Side = asrBottom
+            Left = 428
+            Height = 19
+            Top = 0
+            Width = 169
+            Anchors = [akRight, akBottom]
+            Caption = 'Selected directories and &files'
+            OnChange = cbSelectedFilesChange
+            TabOrder = 4
+          end
         end
         object gbFiles: TGroupBox
           AnchorSideLeft.Control = tsStandard
Index: src/fFindDlg.lrt
===================================================================
--- src/fFindDlg.lrt	(revision 4956)
+++ src/fFindDlg.lrt	(working copy)
@@ -6,6 +6,7 @@
 TFRMFINDDLG.LBLEXCLUDEDIRECTORIES.CAPTION=E&xclude subdirectories
 TFRMFINDDLG.CMBEXCLUDEDIRECTORIES.HINT=Enter directories names that should be excluded from search separated with ";"
 TFRMFINDDLG.LBLSEARCHDEPTH.CAPTION=Search su&bdirectories:
+TFRMFINDDLG.CBSELECTEDFILES.CAPTION=Selected directories and &files
 TFRMFINDDLG.GBFILES.CAPTION=Files
 TFRMFINDDLG.LBLFINDFILEMASK.CAPTION=&File mask
 TFRMFINDDLG.CMBFINDFILEMASK.HINT=Enter files names separated with ";"
Index: src/fFindDlg.pas
===================================================================
--- src/fFindDlg.pas	(revision 4956)
+++ src/fFindDlg.pas	(working copy)
@@ -33,7 +33,7 @@
   Graphics, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ComCtrls,
   ExtCtrls, Menus, EditBtn, Spin, Buttons, ZVDateTimePicker, KASComboBox,
   fAttributesEdit, uDsxModule, DsxPlugin, uFindThread, uFindFiles,
-  uSearchTemplate;
+  uSearchTemplate, uFileView;
 
 type
 
@@ -71,6 +71,7 @@
     cbPartialNameSearch: TCheckBox;
     cbFollowSymLinks: TCheckBox;
     cbUsePlugin: TCheckBox;
+    cbSelectedFiles: TCheckBox;
     cmbExcludeDirectories: TComboBoxWithDelItems;
     cmbNotOlderThanUnit: TComboBox;
     cmbFileSizeUnit: TComboBox;
@@ -142,6 +143,7 @@
     procedure cbDateToChange(Sender: TObject);
     procedure cbPartialNameSearchChange(Sender: TObject);
     procedure cbRegExpChange(Sender: TObject);
+    procedure cbSelectedFilesChange(Sender: TObject);
     procedure cmbEncodingSelect(Sender: TObject);
     procedure cbFindTextChange(Sender: TObject);
     procedure cbUsePluginChange(Sender: TObject);
@@ -185,6 +187,9 @@
     procedure ZVTimeFromChange(Sender: TObject);
     procedure ZVTimeToChange(Sender: TObject);
   private
+    FFileView: TFileView;
+    FSelectedFiles: TStringList;
+
     FFindThread:TFindThread;
     DsxPlugins: TDSXModuleList;
     FSearchingActive: Boolean;
@@ -218,7 +223,7 @@
 var
   FoundedStringCopy: TStringlist = nil;
 
-procedure ShowFindDlg(const sActPath: UTF8String);
+procedure ShowFindDlg(FileView: TFileView);
 function ShowDefineTemplateDlg(var TemplateName: UTF8String): Boolean;
 function ShowUseTemplateDlg(var Template: TSearchTemplate): Boolean;
 
@@ -230,7 +235,7 @@
   LCLProc, LCLType, LConvEncoding, StrUtils, HelpIntfs, fViewer, fMain,
   uLng, uGlobs, uShowForm, uDCUtils,
   uSearchResultFileSource, uFile, uFileSystemFileSource,
-  uFileViewNotebook, uFileView, uColumnsFileView, uKeyboard,
+  uFileViewNotebook, uColumnsFileView, uKeyboard,
   DCOSUtils;
 
 const
@@ -271,14 +276,15 @@
   Application.ProcessMessages;
 end;
 
-procedure ShowFindDlg(const sActPath: UTF8String);
+procedure ShowFindDlg(FileView: TFileView);
 begin
   with TfrmFindDlg.Instance do
   begin
     // Prepare window for search files
     ClearFilter;
+    FFileView := FileView;
     Caption := rsFindSearchFiles;
-    edtFindPathStart.Text := sActPath;
+    edtFindPathStart.Text := FileView.CurrentPath;
     ShowOnTop;
   end;
 end;
@@ -417,6 +423,8 @@
   edtFindPathStart.ShowHidden := gShowSystemFiles;
   cbPartialNameSearch.Checked:= gPartialNameSearch;
 
+  FSelectedFiles := TStringList.Create;
+
   InitPropStorage(Self);
 end;
 
@@ -449,6 +457,7 @@
 destructor TfrmFindDlg.Destroy;
 begin
   inherited Destroy;
+  FSelectedFiles.Free;
   FLastSearchTemplate.Free;
 end;
 
@@ -602,6 +611,11 @@
   if cbRegExp.Checked then cbPartialNameSearch.Checked:=False;
 end;
 
+procedure TfrmFindDlg.cbSelectedFilesChange(Sender: TObject);
+begin
+  edtFindPathStart.Enabled := not cbSelectedFiles.Checked;
+end;
+
 procedure TfrmFindDlg.btnSelDirClick(Sender: TObject);
 var
   s:String;
@@ -809,6 +823,7 @@
   sPath : UTF8String;
   sr: TDsxSearchRecord;
   SearchTemplate, TmpTemplate: TSearchTemplateRec;
+  I: Integer;
 begin
   sTemp:= edtFindPathStart.Text;
   repeat
@@ -866,6 +881,16 @@
   TmpTemplate.StartPath := ''; // Don't remember starting path.
   FLastSearchTemplate.SearchRecord := TmpTemplate;
 
+  FSelectedFiles.Clear;
+  if cbSelectedFiles.Checked then begin
+    for I := 0 to FFileView.DisplayFiles.Count - 1 do begin
+      if FFileView.DisplayFiles[i].Selected then begin
+        sTemp := FFileView.DisplayFiles[I].FSFile.FullPath;
+        FSelectedFiles.Add(sTemp);
+      end;
+    end;
+  end;
+
   try
     if (cbUsePlugin.Checked) and (cmbPlugin.ItemIndex<>-1) then
       begin
@@ -880,7 +905,7 @@
       end
     else
       begin
-        FFindThread := TFindThread.Create(SearchTemplate);
+        FFindThread := TFindThread.Create(SearchTemplate, FSelectedFiles);
         with FFindThread do
         begin
           Items := FoundedStringCopy;
@@ -1109,6 +1134,9 @@
   if pgcSearch.ActivePage = tsStandard then
     if cmbFindFileMask.CanFocus then
       cmbFindFileMask.SetFocus;
+
+  cbSelectedFiles.Checked := FFileView.HasSelectedFiles;
+  cbSelectedFiles.Enabled := FFileView.HasSelectedFiles;
 end;
 
 procedure TfrmFindDlg.gbDirectoriesResize(Sender: TObject);
Index: src/ufindthread.pas
===================================================================
--- src/ufindthread.pas	(revision 4956)
+++ src/ufindthread.pas	(working copy)
@@ -47,6 +47,7 @@
     FFoundFile:String;
     FCurrentDepth: Integer;
     FSearchTemplate: TSearchTemplateRec;
+    FSelectedFiles: TStringList;
     FFileChecks: TFindFileChecks;
     FLinkTargets: TStringList;  // A list of encountered directories (for detecting cycles)
 
@@ -57,9 +58,10 @@
   protected
     procedure Execute; override;
   public
-    constructor Create(const AFindOptions: TSearchTemplateRec);
+    constructor Create(const AFindOptions: TSearchTemplateRec; SelectedFiles: TStringList);
     destructor Destroy; override;
     procedure AddFile;
+    procedure DoFile(const sNewDir:String; const sr : TSearchRecEx);
     procedure WalkAdr(const sNewDir:String);
     procedure UpDateProgress;
     function IsAborting: Boolean;
@@ -79,12 +81,13 @@
 
 { TFindThread }
 
-constructor TFindThread.Create(const AFindOptions: TSearchTemplateRec);
+constructor TFindThread.Create(const AFindOptions: TSearchTemplateRec; SelectedFiles: TStringList);
 begin
   inherited Create(True);
 
   FLinkTargets := TStringList.Create;
   FSearchTemplate := AFindOptions;
+  FSelectedFiles := SelectedFiles;
 
   with FSearchTemplate do
   begin
@@ -114,6 +117,7 @@
 procedure TFindThread.Execute;
 var
   sTemp, sPath: UTF8String;
+  I: Integer;
 begin
   FreeOnTerminate := True;
 
@@ -121,15 +125,24 @@
     Assert(Assigned(FItems),'assert:FItems is empty');
     Synchronize(@UpDateProgress);
     FCurrentDepth:= -1;
-    sTemp:= FSearchTemplate.StartPath;
-    while sTemp <> EmptyStr do
+    if FSelectedFiles.Count = 0 then
+    begin
+      sTemp:= FSearchTemplate.StartPath;
+      while sTemp <> EmptyStr do
+        begin
+          sPath:= Copy2SymbDel(sTemp, ';');
+          sPath:= ExcludeBackPathDelimiter(sPath);
+          WalkAdr(sPath);
+        end;
+      FCurrentDir:= rsOperFinished;
+      Synchronize(@UpDateProgress);
+    end else
+    begin
+      for I := 0 to FSelectedFiles.Count - 1 do
       begin
-        sPath:= Copy2SymbDel(sTemp, ';');
-        sPath:= ExcludeBackPathDelimiter(sPath);
-        WalkAdr(sPath);
+        WalkAdr(FSelectedFiles[I]);
       end;
-    FCurrentDir:= rsOperFinished;
-    Synchronize(@UpDateProgress);
+    end;
   except
     on E:Exception do
       msgError(Self, E.Message);
@@ -327,6 +340,19 @@
    end;
 end;
 
+procedure TFindThread.DoFile(const sNewDir:String; const sr : TSearchRecEx);
+begin
+  if CheckFile(sNewDir, sr) then
+  begin
+    FFoundFile := sNewDir + PathDelim + sr.Name;
+    Synchronize(@AddFile);
+    Inc(FFilesFound);
+  end;
+
+  Inc(FFilesScanned);
+  Synchronize(@UpDateProgress);
+end;
+
 procedure TFindThread.WalkAdr(const sNewDir:String);
 var
   sr: TSearchRecEx;
@@ -343,20 +369,17 @@
   Path := sNewDir + PathDelim + '*';
 
   if FindFirstEx(Path, faAnyFile, sr) = 0 then
-  repeat
-    if not FPS_ISDIR(sr.Attr) then
-    begin
-      if CheckFile(sNewDir, sr) then
-      begin
-        FFoundFile := sNewDir + PathDelim + sr.Name;
-        Synchronize(@AddFile);
-        Inc(FFilesFound);
-      end;
-
-      Inc(FFilesScanned);
-      Synchronize(@UpDateProgress);
-    end;
-  until (FindNextEx(sr)<>0) or Terminated;
+  begin
+    repeat
+      if not FPS_ISDIR(sr.Attr) then
+        DoFile(sNewDir, sr)
+    until (FindNextEx(sr)<>0) or Terminated;
+  end else
+  begin
+    Path := sNewDir;
+    if FindFirstEx(Path, faAnyFile, sr) = 0 then
+      DoFile(ExtractFileDir(Path), sr);
+  end;
   FindCloseEx(sr);
   Synchronize(@UpDateProgress);
 
@@ -365,7 +388,7 @@
   begin
     if FindFirstEx(Path, faDirectory, sr) = 0 then
       repeat
-        if CheckDirectory(sNewDir, sr.Name) then
+        if FPS_ISDIR(sr.Attr) and CheckDirectory(sNewDir, sr.Name) then
         begin
           SubPath := sNewDir + PathDelim + sr.Name;
           IsLink := FPS_ISLNK(sr.Attr);
Index: src/umaincommands.pas
===================================================================
--- src/umaincommands.pas	(revision 4956)
+++ src/umaincommands.pas	(working copy)
@@ -2007,7 +2007,7 @@
 
 procedure TMainCommands.cm_Search(const Params: array of string);
 begin
-  ShowFindDlg(frmMain.ActiveFrame.CurrentPath);
+  ShowFindDlg(frmMain.ActiveFrame);
 end;
 
 
findsel4956.patch (11,293 bytes)   
Fixed in Revision4967,4968
Operating system
Widgetset
Architecture

Activities

pktfag

2012-09-09 14:32

reporter   ~0000882

patch updated to 4956r

Alexx2000

2012-09-15 15:11

administrator   ~0000917

Имеется небольшая логическая проблема, какие выделенные файлы использовать:
- файлы выделенные на момент открытия диалога поиска
- файлы выделенные на момент старта поиска

Мне кажется более правильным первый вариант, но в этом случае надо создавать список выделенных файлов при открытии поиска, а не в момент его старта как сейчас.

Alexx2000

2012-09-16 19:49

administrator   ~0000918

Применил с некоторыми доработками (как мне показалось немного оптимальнее).

Issue History

Date Modified Username Field Change
2012-09-08 21:52 pktfag New Issue
2012-09-08 21:52 pktfag File Added: findsel.patch
2012-09-09 14:32 pktfag Note Added: 0000882
2012-09-09 14:33 pktfag File Added: findsel4956.patch
2012-09-15 14:19 Alexx2000 Assigned To => Alexx2000
2012-09-15 14:19 Alexx2000 Status new => assigned
2012-09-15 15:11 Alexx2000 Note Added: 0000917
2012-09-16 19:49 Alexx2000 Fixed in Revision => 4967,4968
2012-09-16 19:49 Alexx2000 Note Added: 0000918
2012-09-16 19:49 Alexx2000 Status assigned => resolved
2012-09-16 19:49 Alexx2000 Fixed in Version => 0.5.5
2012-09-16 19:49 Alexx2000 Resolution open => fixed
2014-01-14 09:02 Alexx2000 Status resolved => closed