Changeset 12217


Ignore:
Timestamp:
03/17/15 16:33:01 (7 years ago)
Author:
pfleck
Message:

#2025 Adapted search and node restoration to hierarchy structure.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NewItemDialog/HeuristicLab.Optimizer/3.3/NewItemDialog.cs

    r12215 r12217  
    3131namespace HeuristicLab.Optimizer {
    3232  internal partial class NewItemDialog : Form {
    33     private const string RootMarker = "<ROOT>";
    34 
    3533    private bool isInitialized;
    3634
     
    9391      imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Namespace);  // plugins
    9492
    95       var rootNode = new TreeNode(RootMarker) { Name = RootMarker, Tag = RootMarker };
     93      var rootNode = new TreeNode();
    9694
    9795      foreach (var category in categories) {
    98         var categoryFullName = category.Key;
    99         var categoryTokens = categoryFullName.Split('#');
    100         var categoryName = categoryTokens.Last();
    101         var parentCategories = categoryTokens.Take(categoryTokens.Length - 1);
    102 
    103         var categoryNode = new TreeNode(categoryName, 1, 1) {
    104           Name = categoryName,
    105           Tag = categoryName
     96        var fullName = category.Key;
     97        var tokens = fullName.Split('#');
     98        var name = tokens.Last();
     99        var parents = tokens.Take(tokens.Length - 1);
     100
     101        var categoryNode = new TreeNode(name, 1, 1) {
     102          Name = fullName,
     103          Tag = fullName
    106104        };
    107105
    108         var parentNode = FindOrCreateParentNode(rootNode, parentCategories);
     106        var parentNode = FindOrCreateParentNode(rootNode, parents);
    109107        if (parentNode != null)
    110108          parentNode.Nodes.Add(categoryNode);
     
    117115    private TreeNode FindOrCreateParentNode(TreeNode node, IEnumerable<string> parentCategories) {
    118116      TreeNode parentNode = null;
     117      string fullName = null;
    119118      foreach (string parentCategory in parentCategories) {
    120         parentNode = node.Nodes.Find(parentCategory, searchAllChildren: false).SingleOrDefault();
     119        fullName = fullName == null ? parentCategory : fullName + "#" + parentCategory;
     120        parentNode = node.Nodes.Find(fullName, searchAllChildren: false).SingleOrDefault();
    121121        if (parentNode == null) {
    122122          parentNode = new TreeNode(parentCategory, 1, 1) {
    123             Name = parentCategory,
    124             Tag = parentCategory
     123            Name = fullName,
     124            Tag = fullName
    125125          };
    126126          node.Nodes.Add(parentNode);
     
    133133    private void CreateItemNodes(TreeNode node, IEnumerable<IGrouping<string, Type>> categories) {
    134134      foreach (var category in categories) {
    135         var categoryNode = FindCategoryNode(node, category.Key);
     135        var categoryNode = node.Nodes.Find(category.Key, searchAllChildren: true).Single();
    136136        foreach (var creatable in category) {
    137137          var itemNode = CreateItemNode(creatable);
     138          itemNode.Name = itemNode.Name + ":" + category.Key;
    138139          categoryNode.Nodes.Add(itemNode);
    139140        }
    140141      }
    141     }
    142     private TreeNode FindCategoryNode(TreeNode node, string fullCategoryName) {
    143       var categories = fullCategoryName.Split('#');
    144       foreach (string category in categories)
    145         node = node.Nodes.Find(category, searchAllChildren: false).Single();
    146       return node;
    147142    }
    148143
     
    152147      var itemNode = new TreeNode(name) {
    153148        ImageIndex = 0,
    154         Tag = creatable
     149        Tag = creatable,
     150        Name = name
    155151      };
    156152
     
    189185        // remove nodes
    190186        typesTreeView.BeginUpdate();
     187        var searchTokens = searchString.Split(' ');
     188
    191189        int i = 0;
    192         var searchTokens = searchString.Split(' ');
    193190        while (i < typesTreeView.Nodes.Count) {
    194           int j = 0;
    195           while (j < typesTreeView.Nodes[i].Nodes.Count) {
    196             if (searchTokens.Any(searchToken => !typesTreeView.Nodes[i].Nodes[j].Text.ToLower().Contains(searchToken))) {
    197               var node = typesTreeView.Nodes[i].Nodes[j];
    198               if (node != null && node.Tag is Type && (node.Tag as Type).Equals(SelectedType))
    199                 SelectedType = null;
    200               typesTreeView.Nodes[i].Nodes[j].Remove();
    201             } else
    202               j++;
    203           }
    204           if (typesTreeView.Nodes[i].Nodes.Count == 0)
    205             typesTreeView.Nodes[i].Remove();
    206           else
    207             i++;
     191          var categoryNode = typesTreeView.Nodes[i];
     192          bool remove = FilterNode(categoryNode, searchTokens);
     193          if (remove)
     194            typesTreeView.Nodes.RemoveAt(i);
     195          else i++;
    208196        }
    209197        typesTreeView.EndUpdate();
     
    225213        }
    226214        UpdateDescription();
     215      }
     216    }
     217
     218    private bool FilterNode(TreeNode node, string[] searchTokens) {
     219      if (node.Tag is string) {
     220        int i = 0;
     221        while (i < node.Nodes.Count) {
     222          bool remove = FilterNode(node.Nodes[i], searchTokens);
     223          if (remove)
     224            node.Nodes.RemoveAt(i);
     225          else i++;
     226        }
     227        return node.Nodes.Count == 0;
     228      } else if (node.Tag is Type) {
     229        var text = node.Text;
     230        if (searchTokens.Any(searchToken => !text.ToLower().Contains(searchToken))) {
     231          var typeTag = (Type)node.Tag;
     232          if (typeTag.Equals(SelectedType))
     233            SelectedType = null;
     234          return true;
     235        }
     236        return false;
     237      } else {
     238        return true;
    227239      }
    228240    }
     
    284296    private void RestoreSelectedNode(TreeNode selectedNode) {
    285297      if (selectedNode != null) {
    286         foreach (TreeNode node in typesTreeView.Nodes) {
    287           if (node.Text.Equals(selectedNode.Text)) typesTreeView.SelectedNode = node;
    288           foreach (TreeNode child in node.Nodes) {
    289             if ((child.Text.Equals(selectedNode.Text)) && (child.Tag == selectedNode.Tag))
    290               typesTreeView.SelectedNode = child;
    291           }
    292         }
     298        var node = typesTreeView.Nodes.Find(selectedNode.Name, searchAllChildren: true).SingleOrDefault();
     299        typesTreeView.SelectedNode = node;
    293300        if (typesTreeView.SelectedNode == null) SelectedType = null;
    294301      }
Note: See TracChangeset for help on using the changeset viewer.