public static ComponentsLibraryNode Build(ComponentLibraryViewModel viewModel)
        {
            ComponentsLibraryNode root = new ComponentsLibraryNode(String.Empty);

            // package references
            ComponentsLibraryNode packageReferencesNode = new ComponentsLibraryNode("Package References");
            root.AddChild(packageReferencesNode);

            if (viewModel.Experiment != null)
            {
                foreach (IPackageReference reference in viewModel.Experiment.References)
                {
                    ComponentsLibraryNode referenceNode = new ComponentsLibraryNode(reference.Name);
                    packageReferencesNode.AddChild(referenceNode);
                }
            }

            // components
            ComponentsLibraryNode allComponentsNode = new ComponentsLibraryNode("All Components");
            root.AddChild(allComponentsNode);
            
            foreach (MetadataDefinition component in viewModel.ComponentsCollection)
            {
                ComponentsLibraryNode componentNode = new ComponentsLibraryNode(component.Label, component);
                allComponentsNode.AddChild(componentNode);
                
                foreach (string qualifiedTag in component.Tags.Values)
                {
                    string[] tags = qualifiedTag.Split(new char[] {'.'});
                    if (tags.Length > 0)
                    {
                        ComponentsLibraryNode node = root;
                        
                        foreach (string tag in tags)
                        {
                            ComponentsLibraryNode childNode = node.GetChild(tag);
                            if (childNode == null)
                            {
                                childNode = new ComponentsLibraryNode(tag);
                                node.AddChild(childNode);
                            }
                            node = childNode;
                        }
                        node.AddChild(componentNode);
                    }
                }
            }
            return root;
        }
 bool FilterNode(ComponentsLibraryNode node, string filter)
 {
     if (node.Label.ToUpper().Contains(filter))
         return true;
     foreach (ComponentsLibraryNode child in node.GetChildren())
         if (FilterNode(child, filter))
             return true;
     
     return false;
 }
 void AddNodeToTreeModel(ComponentsLibraryNode node, TreeStore tree, TreeIter parentNode)
 {
     parentNode = tree.AppendValues(parentNode, node);
     foreach (ComponentsLibraryNode childNode in node)
         AddNodeToTreeModel(childNode, tree, parentNode);
 }
        void AddNodeToTreeModel(ComponentsLibraryNode node, TreeStore tree, TreeIter parentNode)
        {
            parentNode = tree.AppendValues(parentNode, node);
            //foreach (ComponentsLibraryNode childNode in node)
            //    AddNodeToTreeModel(childNode, tree, parentNode);

            // HERZUM SPRINT 3: TLAB-194
            List<ComponentsLibraryNode> listNode = new List<ComponentsLibraryNode> ();
            foreach (ComponentsLibraryNode childNode in node)
                listNode.Add (childNode);
            listNode.Sort ();
            if (listNode.Count>0)
                foreach (ComponentsLibraryNode childNode in listNode)
                    AddNodeToTreeModel(childNode, tree, parentNode);
            // END HERZUM SPRINT 3: TLAB-194
        }