libede:FileSystemBox: fixed FileSystemBox::Find couldn't find root (/) node.
[ede] / libede / src / FileSystemBox.ec
index aa2d304..a4bfd34 100644 (file)
@@ -229,16 +229,75 @@ public:
       }
    }
 
+   FileSystemNode SelectLocation(char * location)
+   {
+      int c;
+      char * temp;
+      char step[MAX_LOCATION];
+
+      //StringArray steps { growingFactor = 4 };
+      Array<String> steps { };
+      FileSystemNode result = null;
+      FileSystemNode node = null;
+
+      temp = CopyString(location);
+      while(temp[0])
+      {
+         GetLastDirectory(temp, step);
+         StripLastDirectory(temp, temp);
+         steps.Add(CopyString(step));
+      }
+
+      for(c = steps.count - 1; c >= 0; c--)
+      {
+         char * t = steps[c];
+         node = Find(steps[c], node);
+         if(!node)
+            break;
+         //Select(node);
+      }
+      if(node)
+      {
+         result = node;
+         Select(result);
+      }
+
+      steps.Free();
+      delete temp;
+      delete steps;
+
+      return result;
+   }
+
    FileSystemNode Find(const char * name, FileSystemNode parent)
    {
-      FileSystemNode node;
-      FileSystemNode start = parent ? parent : root;
-      if(!start.loaded || !start.childrenLoaded)
-         LoadTreeNode(start);
-      for(node = start.children.first; node; node = node.next)
-         if(node.name && !strcmpi(node.name, name))
-            return node;
-      return null;
+      FileSystemNode node = null;
+      FileSystemNode result = null;
+      if(!parent/* && !strcmp(name, "/")*/)
+      {
+         DataRow row;
+         for(row = list.firstRow; row; row = row.next)
+         {
+            node = (FileSystemNode)row.tag;
+            if(node.name && !fstrcmp(node.name, name))
+               break;
+         }
+         if(node)
+            result = node;
+         //result = root;
+      }
+      else
+      {
+         FileSystemNode start = parent ? parent : root;
+         if(!start.loaded || !start.childrenLoaded)
+            LoadTreeNode(start);
+         for(node = start.children.first; node; node = node.next)
+            if(node.name && !fstrcmp(node.name, name))
+               break;
+         if(node)
+            result = node;
+      }
+      return result;
    }
 
    void Refresh()
@@ -600,7 +659,7 @@ private:
       if(isRoot)
       {
          root.type = computer;
-         root.name = rootName;
+         root.label = rootName;
       }
 
       list.Sort(nameField, 1);
@@ -1784,6 +1843,7 @@ public:
    int indent;
    char * path;
    char * name;
+   char * label;
    char * extension;
    char * info;
    DataRow row;
@@ -1800,7 +1860,8 @@ public:
       FileSystemNode up;
       if(parent)
       {
-         strcpy(outputPath, name);
+         if(name)
+            strcpy(outputPath, name);
          for(up = parent; up; up = up.parent)
          {
             char temp[MAX_LOCATION];
@@ -1871,6 +1932,7 @@ public:
       }
       //if(name)
       delete name;
+      delete label;
       delete info;
    }
 
@@ -1889,7 +1951,7 @@ public:
       int len;
       int w, h;
       //int textOffset;
-      char label[MAX_FILENAME];
+      char string[MAX_FILENAME];
 
       Bitmap icon;
 
@@ -1904,10 +1966,10 @@ public:
          return;
 
       if(info)
-         sprintf(label, "%s [%s]", name, info);
+         sprintf(string, "%s [%s]", label ? label : name, info);
       else
-         strcpy(label, name);
-      len = strlen(label);
+         strcpy(string, label ? label : name);
+      len = strlen(string);
       
       if(!icon)
       {
@@ -1919,7 +1981,7 @@ public:
       //textOffset = indent * indentSize + (icon ? (icon.width + 4) : 0);
       
       surface.TextOpacity(false);
-      surface.TextExtent(label, len, &w, &h);
+      surface.TextExtent(string, len, &w, &h);
       h = Max(h, 16);
     
       // Draw the current row stipple
@@ -1929,7 +1991,7 @@ public:
          surface.Area(xStart - 3, y, xStart + w + 1, y + h - 1);
       
       //surface.WriteTextDots(alignment, x + textOffset, y + 2, width - textOffset, name, strlen(name));
-      surface.WriteTextDots(alignment, xStart, y + 2, width, label, len);
+      surface.WriteTextDots(alignment, xStart, y + 2, width, string, len);
 
       if(!guiApp.textMode)
       {