public IconSelectorTreeView()
        {
            ImageList = new ImageList();
            // we need all the icons (to show them as open, too)
            // but we only iterate through the closed ones

            TreeNode firstWordNode = new TreeNode("just avoiding a null pointer exception");

            // we need a sorted set
            List<NamedIconSet> sortedList = new List<NamedIconSet>(IconList.Instance.icons.Values);
            sortedList.Sort();

            int i = 0;
            foreach (NamedIconSet set in sortedList)
            {
                string fancyName;
                NamedImage image = set.ImageUnselected;
                fancyName = image.FancyName;
                string lastPartOfFancyName = fancyName.Substring(fancyName.IndexOf(" "));
                TreeNode node = new TreeNodeIconSelector(lastPartOfFancyName, set);

                node.ImageIndex = i++;
                ImageList.Images.Add(set.ImageUnselected.image);

                node.SelectedImageIndex = i++;
                ImageList.Images.Add(set.ImageSelected.image);

                // now create the node where we'll put it if necessary
                string firstWord = fancyName.Substring(0, fancyName.IndexOf(" "));
                if (!firstWord.Equals(firstWordNode.Text))
                {
                    firstWordNode = new TreeNode(firstWord);
                    firstWordNode.ImageIndex = i - 2;
                    Nodes.Add(firstWordNode);
                }

                firstWordNode.Nodes.Add(node);
            }
            initializing = true;
        }
 protected override void OnAfterSelect(TreeViewEventArgs e)
 {
     base.OnAfterSelect(e);
     if (initializing)
         initializing = false;
     else
     {
         SelectedNodeCached = SelectedNode as TreeNodeIconSelector;
         this.FindForm().Close();
     }
 }