wip II
[sdk] / ide / src / dialogs / FindInFilesDialog.ec
index 46c2ef0..c0f8e0f 100644 (file)
@@ -14,7 +14,6 @@ class FindInFilesDialog : Window
    tabCycle = true;
    size = { 440, 208 };
    autoCreate = false;
-   stayOnTop = true;
    
 public:
    property char * searchString { set { findContent.contents = value; } get { return findContent.contents; } };
@@ -143,7 +142,7 @@ public:
          DataRow row;
          sprintf(label, $"%s Project", project.name);
          row = findIn.AddString(label);
-         row.tag = (uint)project;
+         row.tag = (int64)project;
       }
    }
 
@@ -166,7 +165,7 @@ public:
    void Show()
    {
       if(!created)
-         Create();
+         Modal();
       else
          Activate();
    }
@@ -180,9 +179,10 @@ private:
    DataRow inDirectoryRow;
    DataRow inWorkspaceRow;
    FindInFilesMode lastSelectionMode;
-   Project lastSelectionProject;
-   ProjectNode lastSelectionProjectNode;
+   String lastSelectionProject;
+   String lastSelectionProjectNode;
    bool replaceMode;
+   SelectorButton starDir;
 
    FindInFilesDialog()
    {
@@ -250,16 +250,23 @@ private:
          {
             Project prj;
             lastSelectionMode = mode;
-            lastSelectionProject = prj = lastSelectionMode == project ? (Project)row.tag : null;
+            prj = lastSelectionMode == project ? (Project)row.tag : null;
+            delete lastSelectionProject;
             if(prj)
             {
                DataRow r = null;
                ProjectNode node = prj.topNode;
+               char filePath[MAX_LOCATION];
+               prj.topNode.GetFullFilePath(filePath);
+               lastSelectionProject = CopyString(filePath);
                findWherePrjNode.Clear();
                ListProjectNodeFolders(node, null);
 
-               if(lastSelectionProjectNode && lastSelectionProjectNode.project == prj)
-                  node = lastSelectionProjectNode;
+               if(lastSelectionProjectNode && !(node = prj.topNode.FindByFullPath(lastSelectionProjectNode, false)))
+               {
+                  node = prj.topNode;
+                  delete lastSelectionProjectNode;
+               }
 
                for(r = findWherePrjNode.firstRow; r; r = r.next)
                   if((ProjectNode)r.tag == node)
@@ -279,7 +286,7 @@ private:
          row = findWherePrjNode/*parentRow*/.AddRow();
       else
          row = findWherePrjNode.AddRow();
-      row.tag = (int)node;
+      row.tag = (int64)node;
       row.SetData(null, node);
       if(node.files)
       {
@@ -303,7 +310,16 @@ private:
       bool NotifySelect(DropBox control, DataRow row, Modifiers mods)
       {
          if(row)
-            lastSelectionProjectNode = (ProjectNode)row.tag;
+         {
+            ProjectNode node = (ProjectNode)row.tag;
+            delete lastSelectionProjectNode;
+            if(node)
+            {
+               char filePath[MAX_LOCATION];
+               node.GetFullFilePath(filePath);
+               lastSelectionProjectNode = CopyString(filePath);
+            }
+         }
          return true;
       }
    };
@@ -322,7 +338,7 @@ private:
 
       bool NotifySelect(DropBox control, DataRow row, Modifiers mods)
       {
-         fileFilter = row ? row.tag : 0;
+         fileFilter = (int)(row ? row.tag : 0);
          //ListFiles();
          return true;
       }
@@ -444,12 +460,20 @@ private:
          if(lastSelectionProject)
          {
             for(row = findIn.firstRow; row; row = row.next)
-               if((Project)row.tag == lastSelectionProject)
-                  break;
+            {
+               char filePath[MAX_LOCATION];
+               Project p = (Project)row.tag;
+               if(p)
+               {
+                  p.topNode.GetFullFilePath(filePath);
+                  if(!fstrcmp(filePath, lastSelectionProject))
+                     break;
+               }
+            }
             if(row)
                findIn.SelectRow(row);
             else
-               lastSelectionProject = null;
+               delete lastSelectionProject;
          }
          if(!lastSelectionProject)
          {
@@ -570,7 +594,7 @@ private:
 
    bool OnKeyHit(Key key, unichar ch)
    {
-      if(ch)
+      if(ch && !key.alt && !key.ctrl && !key.shift && (contentMatchCase.active || contentWholeWord.active))
       {
          findContent.Activate();
          return findContent.OnKeyHit(key, ch);
@@ -623,10 +647,11 @@ private:
 
    unsigned int Main()
    {
+      const int stackSize = 1024;
       int frame, treeTop = 0;
-      int globalFindCount = 0, filesSearchedCount = 0, filesMatchedCount = 0;
+      int globalFindCount = 0, filesSearchedCount = 0, filesMatchedCount = 0, dirsMatchedCount = 0;
       //double lastTime = GetTime();
-      SearchStackFrame stack[1024];
+      SearchStackFrame stack[stackSize];
       FindInFilesMode mode = this.mode;
       
       EditBox replaceEdit = null;
@@ -637,27 +662,42 @@ private:
       app.Lock();
          {
             char substring[512];
+            char containing[512];
+            char * and;
+            char * filterName;
+            if(!strcmp(filter.name, "All files"))
+               filterName = "files";
+            else
+               filterName = filter.name;
             if(nameCriteria[0])
                sprintf(substring, $" with file name matching \"%s\"", nameCriteria);
             else
                substring[0] = '\0';
+            if(contentCriteria && contentCriteria[0])
+               sprintf(containing, $" containing \"%s\"", contentCriteria);
+            else
+               containing[0] = '\0';
+            if(substring[0] && containing[0])
+               and = " and";
+            else
+               and = "";
             if(mode == directory)
             {
                char * s;
                ide.outputView.findBox.Logf(
-                     $"Searching \"%s\"%s for %s%s%s containing \"%s\"\n\n",
+                     $"Searching \"%s\"%s for %s%s%s%s\n\n",
                      (s = CopySystemPath(dir)), subDirs ? $" and its sub directories" : "",
-                     filter.name, substring, substring[0] ? $" and" : "", contentCriteria);
+                     filterName, substring, and, containing);
                delete s;
             }
             else if(mode == workspace)
                ide.outputView.findBox.Logf(
-                     $"Searching workspace files for files%s%s containing \"%s\"\n\n",
-                     substring, substring[0] ? $" and" : "", contentCriteria);
+                     $"Searching workspace files for %s%s%s%s\n\n",
+                     filterName, substring, and, containing);
             else if(mode == project)
                ide.outputView.findBox.Logf(
-                     $"Searching project %s files for files%s%s containing \"%s\"\n\n",
-                     project.name, substring, substring[0] ? $" and" : "", contentCriteria);
+                     $"Searching project %s files for %s%s%s%s\n\n",
+                     project.name, filterName, substring, and, containing);
          }
       app.Unlock();
       
@@ -666,7 +706,7 @@ private:
          replaceEdit = EditBox
          {
             multiLine = true,textHorzScroll = true,textVertScroll = true, 
-            text = $"Replacing Editbox", size = Size { 640,480 },maxLineSize = 65536
+            text = $"Replacing Editbox", size = Size { 640,480 }/*,maxLineSize = 65536*/
          };
       }
 
@@ -675,14 +715,21 @@ private:
          strcpy(stack[0].path, dir);
          stack[0].fileList = FileListing { dir, extensions = filter.extensions };  // there should be a sorted = true/false 
 
-         for(frame = 0; frame >= 0 && !abort; )
+         for(frame = 0; frame >= 0 && frame < stackSize && !abort; )
          {
             if(stack[frame].fileList.Find())
             {
+               bool match = true;
+               if(nameCriteria[0])
+               {
+                  char name[MAX_LOCATION];
+                  GetLastDirectory(stack[frame].fileList.path, name);
+                  if(!(bool)SearchString(name, 0, nameCriteria, false, false))
+                     match = false;
+               }
                if(!stack[frame].fileList.stats.attribs.isDirectory)
                {
                   bool relative = false;
-                  bool match = true;
                   char fileRelative[MAX_LOCATION];
                   if(filter.ValidateFileName(stack[frame].fileList.name))
                   {
@@ -690,13 +737,6 @@ private:
                      relative = true;
                      
                      filesSearchedCount++;
-                     if(nameCriteria[0])
-                     {
-                        char name[MAX_LOCATION];
-                        GetLastDirectory(stack[frame].fileList.path, name);
-                        if(!(bool)SearchString(name, 0, nameCriteria, false, false))
-                           match = false;
-                     }
                      if(match && contentCriteria[0])
                      {
                         int ret;
@@ -721,7 +761,7 @@ private:
                         filesMatchedCount++;
                         app.Lock();
                            ide.outputView.findBox.Logf(
-                                 $"%s matches the file name criteria\n",
+                                 "%s\n",
                                  relative ? fileRelative : stack[frame].fileList.path);
                         app.Unlock();
                      }
@@ -734,12 +774,19 @@ private:
                   MakePathRelative(stack[frame].fileList.path, dir, fileRelative);
                   relative = true;
                   app.Lock();
+                     if(match && nameCriteria[0])
+                     {
+                        dirsMatchedCount++;
+                        ide.outputView.findBox.Logf(
+                              "%s\n",
+                              relative ? fileRelative : stack[frame].fileList.path);
+                     }
                      ide.outputView.findBox.Tellf(
                            $"Searching %s", relative ? fileRelative : stack[frame].fileList.path);
                   app.Unlock();
                }
 
-               if(subDirs && stack[frame].fileList.stats.attribs.isDirectory)
+               if(subDirs && stack[frame].fileList.stats.attribs.isDirectory && strcmp(stack[frame].fileList.name, ".git"))
                {
                   int lastFrame = frame;
                   /*double thisTime = GetTime();
@@ -800,10 +847,12 @@ private:
                      bool relative = true;
                      char fileRelative[MAX_LOCATION];
                      char filePath[MAX_LOCATION];
-                     strcpy(filePath, prj.topNode.path);
+                     filePath[0] = '\0';
+                     PathCat(filePath, prj.topNode.path);
                      PathCat(filePath, stack[frame].path);
                      PathCat(filePath, stack[frame].name);
-                     strcpy(fileRelative, stack[frame].path);
+                     fileRelative[0] = '\0';
+                     PathCat(fileRelative, stack[frame].path);
                      PathCat(fileRelative, stack[frame].name);
                      if(relative && mode == workspace && prj != ide.project)
                      {
@@ -842,7 +891,6 @@ private:
                               app.Lock();
                                  ide.outputView.findBox.Logf(
                                        "%s\n", relative ? fileRelative : filePath);
-                                       /*" matches the file name criteria"*/
                               app.Unlock();
                            }
                         }
@@ -851,6 +899,29 @@ private:
                      break;
                   }
                   case folder:
+                  {
+                     bool relative = true;
+                     char fileRelative[MAX_LOCATION];
+                     char filePath[MAX_LOCATION];
+                     filePath[0] = '\0';
+                     PathCat(filePath, prj.topNode.path);
+                     PathCat(filePath, stack[frame].path);
+                     fileRelative[0] = '\0';
+                     PathCat(fileRelative, stack[frame].path);
+                     if(relative && mode == workspace && prj != ide.project)
+                     {
+                        char special[MAX_LOCATION];
+                        sprintf(special, "(%s)%s", prj.name, fileRelative);
+                        strcpy(fileRelative, special);
+                     }
+                     if(nameCriteria[0] && (bool)SearchString(stack[frame].name, 0, nameCriteria, false, false))
+                     {
+                        dirsMatchedCount++;
+                        app.Lock();
+                           ide.outputView.findBox.Logf(
+                                 "%s\n", relative ? fileRelative : filePath);
+                        app.Unlock();
+                     }
                      if((subDirs || firtIteration) && stack[frame].files && stack[frame].files.count)
                      {
                         int lastFrame = frame;
@@ -861,6 +932,7 @@ private:
                      else
                         stack[frame] = stack[frame].next;
                      break;
+                  }
                   case resources:
                      stack[frame] = stack[frame].next;
                      break;
@@ -889,6 +961,8 @@ private:
       app.Lock();
          if(filesSearchedCount)
          {
+            if(!contentCriteria[0] && (filesMatchedCount || dirsMatchedCount))
+               ide.outputView.findBox.Logf("\n");
             if(globalFindCount)
                ide.outputView.findBox.Logf(
                      $"%s search %s a total of %d match%s in %d out of the %d file%s searched\n",
@@ -962,6 +1036,14 @@ private:
                f.Seek(-strlen(contentCriteria), current);*/
          }
          delete f;
+         if(findCount)
+         {
+            app.Lock();
+               ide.outputView.findBox.Logf(
+                     $"Found %d match%s in \"%s\"%s\n\n", findCount, (findCount > 1) ? "es" : "",
+                     relative ? fileRelative : filePath, abortNow ? $" before search was aborted" : "");
+            app.Unlock();
+         }
       }
       else
       {
@@ -969,14 +1051,6 @@ private:
             ide.outputView.findBox.Logf($"Unable to open file %s\n\n", filePath);
          app.Unlock();
       }
-      if(findCount)
-      {
-         app.Lock();
-            ide.outputView.findBox.Logf(
-                  $"Found %d match%s in \"%s\"%s\n\n", findCount, (findCount > 1) ? "es" : "",
-                  relative ? fileRelative : filePath, abortNow ? $" before search was aborted" : "");
-         app.Unlock();
-      }
       return findCount;
    }
 
@@ -1048,6 +1122,14 @@ private:
                
          }
          delete f;
+         if(replaceCount)
+         {
+            app.Lock();
+               ide.outputView.findBox.Logf(
+                     $"Replaced %d match%s in \"%s\"%s\n\n", replaceCount, (replaceCount > 1) ? $"es" : "",
+                     relative ? fileRelative : filePath, abortNow ? $" before search was aborted" : "");
+            app.Unlock();
+         }
       }
       else
       {
@@ -1055,14 +1137,6 @@ private:
             ide.outputView.findBox.Logf($"Unable to open file %s\n\n", filePath);
          app.Unlock();
       }
-      if(replaceCount)
-      {
-         app.Lock();
-            ide.outputView.findBox.Logf(
-                  $"Replaced %d match%s in \"%s\"%s\n\n", replaceCount, (replaceCount > 1) ? $"es" : "",
-                  relative ? fileRelative : filePath, abortNow ? $" before search was aborted" : "");
-         app.Unlock();
-      }
       return replaceCount;
    }
 }