Răsfoiți Sursa

Bug fix: Using directory exclude mask on Find dialog caused all non excluded folder to be unintentionally included in the search results + Bug 1819: It is not possible to recursively search for a folder

Source commit: f45ba0b86a601db55940cac36a90a0c0b09a0f9c
Martin Prikryl 5 ani în urmă
părinte
comite
ea5a4e8ddc
3 a modificat fișierele cu 14 adăugiri și 2 ștergeri
  1. 8 2
      source/core/FileMasks.cpp
  2. 4 0
      source/core/FileMasks.h
  3. 2 0
      source/core/Terminal.cpp

+ 8 - 2
source/core/FileMasks.cpp

@@ -248,6 +248,8 @@ __fastcall TFileMasks::TFileMasks(const TFileMasks & Source)
 {
   Init();
   FForceDirectoryMasks = Source.FForceDirectoryMasks;
+  FNoImplicitMatchWithDirExcludeMask = Source.FNoImplicitMatchWithDirExcludeMask;
+  FAllDirsAreImplicitlyIncluded = Source.FAllDirsAreImplicitlyIncluded;
   SetStr(Source.Masks, false);
 }
 //---------------------------------------------------------------------------
@@ -265,6 +267,8 @@ __fastcall TFileMasks::~TFileMasks()
 void __fastcall TFileMasks::Init()
 {
   FForceDirectoryMasks = -1;
+  FNoImplicitMatchWithDirExcludeMask = false;
+  FAllDirsAreImplicitlyIncluded = false;
 
   DoInit(false);
 }
@@ -420,14 +424,14 @@ bool __fastcall TFileMasks::Matches(const UnicodeString FileName, bool Directory
   const UnicodeString Path, const TParams * Params,
   bool RecurseInclude, bool & ImplicitMatch) const
 {
-  bool ImplicitIncludeMatch = FMasks[MASK_INDEX(Directory, true)].empty();
+  bool ImplicitIncludeMatch = (FAllDirsAreImplicitlyIncluded && Directory) || FMasks[MASK_INDEX(Directory, true)].empty();
   bool ExplicitIncludeMatch = MatchesMasks(FileName, Directory, Path, Params, FMasks[MASK_INDEX(Directory, true)], RecurseInclude);
   bool Result =
     (ImplicitIncludeMatch || ExplicitIncludeMatch) &&
     !MatchesMasks(FileName, Directory, Path, Params, FMasks[MASK_INDEX(Directory, false)], false);
   ImplicitMatch =
     Result && ImplicitIncludeMatch && !ExplicitIncludeMatch &&
-    FMasks[MASK_INDEX(Directory, false)].empty();
+    ((Directory && FNoImplicitMatchWithDirExcludeMask) || FMasks[MASK_INDEX(Directory, false)].empty());
   return Result;
 }
 //---------------------------------------------------------------------------
@@ -475,6 +479,8 @@ TFileMasks & __fastcall TFileMasks::operator =(const UnicodeString & rhs)
 TFileMasks & __fastcall TFileMasks::operator =(const TFileMasks & rhm)
 {
   FForceDirectoryMasks = rhm.FForceDirectoryMasks;
+  FNoImplicitMatchWithDirExcludeMask = rhm.FNoImplicitMatchWithDirExcludeMask;
+  FAllDirsAreImplicitlyIncluded = rhm.FAllDirsAreImplicitlyIncluded;
   Masks = rhm.Masks;
   return *this;
 }

+ 4 - 0
source/core/FileMasks.h

@@ -58,6 +58,8 @@ public:
     const TParams * Params, bool RecurseInclude, bool & ImplicitMatch) const;
 
   __property UnicodeString Masks = { read = FStr, write = SetMasks };
+  __property bool NoImplicitMatchWithDirExcludeMask = { read = FNoImplicitMatchWithDirExcludeMask, write = FNoImplicitMatchWithDirExcludeMask };
+  __property bool AllDirsAreImplicitlyIncluded = { read = FAllDirsAreImplicitlyIncluded, write = FAllDirsAreImplicitlyIncluded };
 
   __property TStrings * IncludeFileMasksStr = { read = GetMasksStr, index = MASK_INDEX(false, true) };
   __property TStrings * ExcludeFileMasksStr = { read = GetMasksStr, index = MASK_INDEX(false, false) };
@@ -67,6 +69,8 @@ public:
 private:
   int FForceDirectoryMasks;
   UnicodeString FStr;
+  bool FNoImplicitMatchWithDirExcludeMask;
+  bool FAllDirsAreImplicitlyIncluded;
 
   struct TMaskMask
   {

+ 2 - 0
source/core/Terminal.cpp

@@ -6400,6 +6400,8 @@ void __fastcall TTerminal::FilesFind(UnicodeString Directory, const TFileMasks &
 {
   TFilesFindParams Params;
   Params.FileMask = FileMask;
+  Params.FileMask.NoImplicitMatchWithDirExcludeMask = true;
+  Params.FileMask.AllDirsAreImplicitlyIncluded = true;
   Params.OnFileFound = OnFileFound;
   Params.OnFindingFile = OnFindingFile;
   Params.Cancel = false;