Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/12/15 15:35:16 (9 years ago)
Author:
mkommend
Message:

#2276: Merged trunk changes into dataset refactoring branch.

Location:
branches/HeuristicLab.DatasetRefactor/sources
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.DatasetRefactor/sources

  • branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/TypeSelector.cs

    r12031 r12438  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Drawing;
    2425using System.Linq;
    2526using System.Reflection;
     
    177178      else {
    178179        searchString = searchString.ToLower();
     180        TreeNode selectedNode = typesTreeView.SelectedNode;
    179181
    180182        if (!searchString.Contains(currentSearchString)) {
    181183          typesTreeView.BeginUpdate();
    182184          // expand search -> restore all tree nodes
    183           TreeNode selectedNode = typesTreeView.SelectedNode;
    184185          typesTreeView.Nodes.Clear();
    185186          foreach (TreeNode node in treeNodes)
    186187            typesTreeView.Nodes.Add((TreeNode)node.Clone());
    187           RestoreSelectedNode(selectedNode);
    188188          typesTreeView.EndUpdate();
    189189        }
    190 
    191190
    192191        // remove nodes
    193192        typesTreeView.BeginUpdate();
     193        var searchTokens = searchString.Split(' ');
    194194        int i = 0;
    195195        while (i < typesTreeView.Nodes.Count) {
    196           int j = 0;
    197           while (j < typesTreeView.Nodes[i].Nodes.Count) {
    198             if (!typesTreeView.Nodes[i].Nodes[j].Text.ToLower().Contains(searchString)) {
    199               if ((typesTreeView.Nodes[i].Nodes[j].Tag as Type).Equals(selectedType))
    200                 SelectedType = null;
    201               typesTreeView.Nodes[i].Nodes[j].Remove();
    202             } else
    203               j++;
    204           }
    205           if (typesTreeView.Nodes[i].Nodes.Count == 0)
    206             typesTreeView.Nodes[i].Remove();
    207           else
    208             i++;
     196          var node = typesTreeView.Nodes[i];
     197          bool remove = FilterNode(node, searchTokens);
     198          if (remove)
     199            typesTreeView.Nodes.RemoveAt(i);
     200          else i++;
    209201        }
    210202        typesTreeView.EndUpdate();
    211203        currentSearchString = searchString;
    212204
    213         // if there is just one type node left, select by default
    214         if (typesTreeView.Nodes.Count == 1) {
    215           if (typesTreeView.Nodes[0].Nodes.Count == 1) {
    216             typesTreeView.SelectedNode = typesTreeView.Nodes[0].Nodes[0];
    217           }
    218         }
     205        // select first item
     206        typesTreeView.BeginUpdate();
     207        var firstNode = typesTreeView.Nodes.Count > 0 ? typesTreeView.Nodes[0] : null;
     208        while (firstNode != null && !(firstNode.Tag is Type))
     209          firstNode = firstNode.NextVisibleNode;
     210        if (firstNode != null)
     211          typesTreeView.SelectedNode = firstNode;
    219212
    220213        if (typesTreeView.Nodes.Count == 0) {
     
    225218          typesTreeView.Enabled = true;
    226219        }
     220        typesTreeView.EndUpdate();
     221
     222        RestoreSelectedNode(selectedNode);
    227223        UpdateDescription();
    228224      }
     225    }
     226
     227    private bool FilterNode(TreeNode node, string[] searchTokens) {
     228      if (node.Tag is IPluginDescription) { // Plugin node
     229        int i = 0;
     230        while (i < node.Nodes.Count) {
     231          bool remove = FilterNode(node.Nodes[i], searchTokens);
     232          if (remove)
     233            node.Nodes.RemoveAt(i);
     234          else i++;
     235        }
     236        return node.Nodes.Count == 0;
     237      } if (node.Tag is Type) { // Type node
     238        var text = node.Text;
     239        if (searchTokens.Any(searchToken => !text.ToLower().Contains(searchToken))) {
     240          var typeTag = (Type)node.Tag;
     241          if (typeTag == SelectedType) {
     242            SelectedType = null;
     243            typesTreeView.SelectedNode = null;
     244          }
     245          return true;
     246        }
     247        return false;
     248      }
     249      throw new InvalidOperationException("Encountered neither a plugin nor a type node during tree traversal.");
    229250    }
    230251
     
    355376      SetTypeParameter();
    356377    }
     378    private void searchTextBox_KeyDown(object sender, KeyEventArgs e) {
     379      if (typesTreeView.Nodes.Count == 0)
     380        return;
     381
     382      if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) {
     383        var selectedNode = typesTreeView.SelectedNode;
     384
     385        if (selectedNode == null) { // nothing selected => select first
     386          if (e.KeyCode == Keys.Down) typesTreeView.SelectedNode = typesTreeView.Nodes.Count > 0 ? typesTreeView.Nodes[0] : null;
     387        } else {
     388          if (e.KeyCode == Keys.Down && selectedNode.NextVisibleNode != null)
     389            typesTreeView.SelectedNode = selectedNode.NextVisibleNode;
     390          if (e.KeyCode == Keys.Up && selectedNode.PrevVisibleNode != null)
     391            typesTreeView.SelectedNode = selectedNode.PrevVisibleNode;
     392        }
     393        e.Handled = true;
     394      }
     395    }
     396    private void clearSearchButton_Click(object sender, EventArgs e) {
     397      searchTextBox.Text = string.Empty;
     398      searchTextBox.Focus();
     399    }
     400
     401    private TreeNode toolStripMenuNode = null;
     402    private void typesTreeView_MouseDown(object sender, MouseEventArgs e) {
     403      if (e.Button == MouseButtons.Right) {
     404        Point coordinates = typesTreeView.PointToClient(Cursor.Position);
     405        toolStripMenuNode = typesTreeView.GetNodeAt(coordinates);
     406
     407        if (toolStripMenuNode != null && coordinates.X >= toolStripMenuNode.Bounds.Left &&
     408            coordinates.X <= toolStripMenuNode.Bounds.Right) {
     409          typesTreeView.SelectedNode = toolStripMenuNode;
     410
     411          expandToolStripMenuItem.Enabled =
     412            expandToolStripMenuItem.Visible = !toolStripMenuNode.IsExpanded && toolStripMenuNode.Nodes.Count > 0;
     413          collapseToolStripMenuItem.Enabled = collapseToolStripMenuItem.Visible = toolStripMenuNode.IsExpanded;
     414        } else {
     415          expandToolStripMenuItem.Enabled = expandToolStripMenuItem.Visible = false;
     416          collapseToolStripMenuItem.Enabled = collapseToolStripMenuItem.Visible = false;
     417        }
     418        expandAllToolStripMenuItem.Enabled =
     419          expandAllToolStripMenuItem.Visible =
     420            !typesTreeView.Nodes.OfType<TreeNode>().All(x => TreeNodeIsFullyExpanded(x));
     421        collapseAllToolStripMenuItem.Enabled =
     422          collapseAllToolStripMenuItem.Visible = typesTreeView.Nodes.OfType<TreeNode>().Any(x => x.IsExpanded);
     423        if (contextMenuStrip.Items.Cast<ToolStripMenuItem>().Any(item => item.Enabled))
     424          contextMenuStrip.Show(Cursor.Position);
     425      }
     426    }
     427    private bool TreeNodeIsFullyExpanded(TreeNode node) {
     428      return (node.Nodes.Count == 0) || (node.IsExpanded && node.Nodes.OfType<TreeNode>().All(x => TreeNodeIsFullyExpanded(x)));
     429    }
     430    private void expandToolStripMenuItem_Click(object sender, EventArgs e) {
     431      typesTreeView.BeginUpdate();
     432      if (toolStripMenuNode != null) toolStripMenuNode.ExpandAll();
     433      typesTreeView.EndUpdate();
     434    }
     435    private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) {
     436      typesTreeView.BeginUpdate();
     437      typesTreeView.ExpandAll();
     438      typesTreeView.EndUpdate();
     439    }
     440    private void collapseToolStripMenuItem_Click(object sender, EventArgs e) {
     441      typesTreeView.BeginUpdate();
     442      if (toolStripMenuNode != null) toolStripMenuNode.Collapse();
     443      typesTreeView.EndUpdate();
     444    }
     445    private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e) {
     446      typesTreeView.BeginUpdate();
     447      typesTreeView.CollapseAll();
     448      typesTreeView.EndUpdate();
     449    }
    357450    #endregion
    358451
Note: See TracChangeset for help on using the changeset viewer.