Index: /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs	(revision 2951)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs	(revision 2952)
@@ -50,5 +50,8 @@
       this.typesGroupBox = new System.Windows.Forms.GroupBox();
       this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.searchLabel = new System.Windows.Forms.Label();
+      this.searchTextBox = new System.Windows.Forms.TextBox();
       this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       this.typesGroupBox.SuspendLayout();
       this.splitContainer.Panel1.SuspendLayout();
@@ -65,10 +68,11 @@
       this.typesTreeView.ImageIndex = 0;
       this.typesTreeView.ImageList = this.imageList;
-      this.typesTreeView.Location = new System.Drawing.Point(3, 3);
+      this.typesTreeView.Location = new System.Drawing.Point(3, 29);
       this.typesTreeView.Name = "typesTreeView";
       this.typesTreeView.SelectedImageIndex = 0;
       this.typesTreeView.ShowNodeToolTips = true;
-      this.typesTreeView.Size = new System.Drawing.Size(291, 192);
-      this.typesTreeView.TabIndex = 0;
+      this.typesTreeView.Size = new System.Drawing.Size(291, 166);
+      this.typesTreeView.TabIndex = 2;
+      this.typesTreeView.VisibleChanged += new System.EventHandler(this.typesTreeView_VisibleChanged);
       this.typesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.typesTreeView_AfterSelect);
       this.typesTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.typesTreeView_ItemDrag);
@@ -100,4 +104,6 @@
       // splitContainer.Panel1
       // 
+      this.splitContainer.Panel1.Controls.Add(this.searchLabel);
+      this.splitContainer.Panel1.Controls.Add(this.searchTextBox);
       this.splitContainer.Panel1.Controls.Add(this.typesTreeView);
       // 
@@ -108,4 +114,24 @@
       this.splitContainer.SplitterDistance = 198;
       this.splitContainer.TabIndex = 2;
+      // 
+      // searchLabel
+      // 
+      this.searchLabel.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Zoom;
+      this.searchLabel.Location = new System.Drawing.Point(3, 3);
+      this.searchLabel.Name = "searchLabel";
+      this.searchLabel.Size = new System.Drawing.Size(20, 20);
+      this.searchLabel.TabIndex = 0;
+      this.toolTip.SetToolTip(this.searchLabel, "Enter string to search for types");
+      // 
+      // searchTextBox
+      // 
+      this.searchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.searchTextBox.Location = new System.Drawing.Point(29, 3);
+      this.searchTextBox.Name = "searchTextBox";
+      this.searchTextBox.Size = new System.Drawing.Size(265, 20);
+      this.searchTextBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.searchTextBox, "Enter string to search for types");
+      this.searchTextBox.TextChanged += new System.EventHandler(this.searchTextBox_TextChanged);
       // 
       // descriptionTextBox
@@ -132,4 +158,5 @@
       this.typesGroupBox.ResumeLayout(false);
       this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel1.PerformLayout();
       this.splitContainer.Panel2.ResumeLayout(false);
       this.splitContainer.Panel2.PerformLayout();
@@ -146,4 +173,7 @@
     protected System.Windows.Forms.TreeView typesTreeView;
     protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.Label searchLabel;
+    protected System.Windows.Forms.TextBox searchTextBox;
+    protected System.Windows.Forms.ToolTip toolTip;
 
   }
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.cs	(revision 2951)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.cs	(revision 2952)
@@ -26,7 +26,11 @@
 using HeuristicLab.Common;
 using HeuristicLab.PluginInfrastructure;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Core.Views { 
   public partial class TypeSelector : UserControl {
+    protected List<TreeNode> treeNodes;
+    protected string currentSearchString;
+
     protected Type baseType;
     public Type BaseType {
@@ -66,4 +70,6 @@
     public TypeSelector() {
       InitializeComponent();
+      treeNodes = new List<TreeNode>();
+      currentSearchString = string.Empty;
       selectedType = null;
     }
@@ -78,5 +84,7 @@
         this.showGenericTypes = showGenericTypes;
 
+        TreeNode selectedNode = typesTreeView.SelectedNode;
         typesTreeView.Nodes.Clear();
+        treeNodes.Clear();
         imageList.Images.Clear();
         imageList.Images.Add(HeuristicLab.Common.Resources.VS2008ImageLibrary.Class);      // default icon
@@ -86,5 +94,4 @@
         imageList.Images.Add(HeuristicLab.Common.Resources.VS2008ImageLibrary.Template);   // generic types
 
-        TreeNode selectedNode = null;
         var plugins = from p in ApplicationManager.Manager.Plugins
                       orderby p.Name, p.Version ascending
@@ -126,21 +133,66 @@
               typeNode.SelectedImageIndex = typeNode.ImageIndex;
               typeNode.Tag = type;
-              if (type == SelectedType) selectedNode = typeNode;
               pluginNode.Nodes.Add(typeNode);
             }
           }
           if (pluginNode.Nodes.Count > 0)
-            typesTreeView.Nodes.Add(pluginNode);
-        }
+            treeNodes.Add(pluginNode);
+        }
+        foreach (TreeNode node in treeNodes)
+          typesTreeView.Nodes.Add((TreeNode)node.Clone());
+        RestoreSelectedNode(selectedNode);
+        Filter(searchTextBox.Text);
+      }
+    }
+
+    public virtual void Filter(string searchString) {
+      if (InvokeRequired)
+        Invoke(new Action<string>(Filter), searchString);
+      else {
+        searchString = searchString.ToLower();
+
+        typesTreeView.BeginUpdate();
+        if (!searchString.Contains(currentSearchString)) {
+          // expand search -> restore all tree nodes
+          TreeNode selectedNode = typesTreeView.SelectedNode;
+          typesTreeView.Nodes.Clear();
+          foreach (TreeNode node in treeNodes)
+            typesTreeView.Nodes.Add((TreeNode)node.Clone());
+          RestoreSelectedNode(selectedNode);
+        }
+
+        // remove nodes
+        int i = 0;
+        while (i < typesTreeView.Nodes.Count) {
+          int j = 0;
+          while (j < typesTreeView.Nodes[i].Nodes.Count) {
+            if (!typesTreeView.Nodes[i].Nodes[j].Text.ToLower().Contains(searchString))
+              typesTreeView.Nodes[i].Nodes[j].Remove();
+            else
+              j++;
+          }
+          if (typesTreeView.Nodes[i].Nodes.Count == 0)
+            typesTreeView.Nodes[i].Remove();
+          else
+            i++;
+        }
+        currentSearchString = searchString;
+
+        // if there is just one type node left, select by default
+        if (typesTreeView.Nodes.Count == 1) {
+          if (typesTreeView.Nodes[0].Nodes.Count == 1) {
+            typesTreeView.SelectedNode = typesTreeView.Nodes[0].Nodes[0];
+          }
+        }
+
         if (typesTreeView.Nodes.Count == 0) {
-          typesTreeView.Nodes.Add("No types of base type \"" + BaseType.GetPrettyName() + "\" found");
+          SelectedType = null;
           typesTreeView.Enabled = false;
-        }
-        if (selectedNode != null) {
-          typesTreeView.SelectedNode = selectedNode;
-          selectedNode.EnsureVisible();
         } else {
-          SelectedType = null;
-        }
+          SetTreeNodeVisibility();
+          typesTreeView.Enabled = true;
+        }
+        UpdateDescription();
+        typesTreeView.EndUpdate();
       }
     }
@@ -178,11 +230,16 @@
             descriptionTextBox.Text = description;
         }
-      }
+      } else if (typesTreeView.Nodes.Count == 0) {
+        descriptionTextBox.Text = "No types found";
+      }
+    }
+
+    protected virtual void searchTextBox_TextChanged(object sender, System.EventArgs e) {
+      Filter(searchTextBox.Text);
     }
 
     protected virtual void typesTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
-      if (typesTreeView.SelectedNode != null) {
-        SelectedType = typesTreeView.SelectedNode.Tag as Type;
-      }
+      if (typesTreeView.SelectedNode == null) SelectedType = null;
+      else SelectedType = typesTreeView.SelectedNode.Tag as Type;
       UpdateDescription();
     }
@@ -202,4 +259,33 @@
       }
     }
+
+    protected virtual void typesTreeView_VisibleChanged(object sender, EventArgs e) {
+      if (Visible) SetTreeNodeVisibility();
+    }
+
+    #region Helpers
+    private void RestoreSelectedNode(TreeNode selectedNode) {
+      if (selectedNode != null) {
+        foreach (TreeNode node in typesTreeView.Nodes) {
+          if (node.Text.Equals(selectedNode.Text)) typesTreeView.SelectedNode = node;
+          foreach (TreeNode child in node.Nodes) {
+            if ((child.Text.Equals(selectedNode.Text)) && (child.Tag == selectedNode.Tag))
+              typesTreeView.SelectedNode = child;
+          }
+        }
+        if (typesTreeView.SelectedNode == null) SelectedType = null;
+      }
+    }
+    private void SetTreeNodeVisibility() {
+      TreeNode selectedNode = typesTreeView.SelectedNode;
+      if (string.IsNullOrEmpty(currentSearchString)) {
+        typesTreeView.CollapseAll();
+        if (selectedNode != null) typesTreeView.SelectedNode = selectedNode;
+      } else {
+        typesTreeView.ExpandAll();
+      }
+      if (selectedNode != null) selectedNode.EnsureVisible();
+    }
+    #endregion
   }
 }
