public static void ExpandAll(NodeItem node)
 {
     node.IsExpanded = true;
     foreach (var item in node.Children)
     {
         ExpandAll(item);
     }
 }
        private static NodeItem CreatePropNode(string name, string parentName, string classificationName)
        {
            NodeItem node = new NodeItem();

            node.Name               = name;
            node.Type               = NodeItemType.Property;
            node.ParentName         = parentName;
            node.ClassificationName = classificationName;
            return(node);
        }
        public static NodeItem CopyNode(NodeItem node, bool withChildren = true)
        {
            NodeItem newNode = new NodeItem();

            newNode.Name               = node.Name;
            newNode.Type               = node.Type;
            newNode.RefIfcEntity       = node.RefIfcEntity;
            newNode.ParentName         = node.ParentName;
            newNode.ClassificationName = node.ClassificationName;
            newNode.IsExpanded         = node.IsExpanded;
            newNode.IsSelected         = node.IsSelected;
            newNode.ExistCount         = node.ExistCount;
            newNode.ClassEntity        = node.ClassEntity;
            if (withChildren)
            {
                foreach (var item in node.Children)
                {
                    newNode.Children.Add(CopyNode(item));
                }
            }
            return(newNode);
        }
 private void GetChildrenNode()
 {
     if (ClassEntity.ClassificationProperties != null)
     {
         List <NodeItem> propSetNodes = new List <NodeItem>();
         foreach (var item in ClassEntity.ClassificationProperties)
         {
             if (!string.IsNullOrEmpty(item.PropertySet))
             {
                 NodeItem newPropSet = CreatePropSetNode(item.PropertySet, Name, Name);
                 if (!Children.Any(o => o.Name == newPropSet.Name))
                 {
                     Children.Add(newPropSet);
                 }
                 NodeItem propSet = Children.Where(o => o.Name == item.PropertySet).FirstOrDefault();
                 if (propSet != null)
                 {
                     propSet.Children.Add(CreatePropNode(item.Name, propSet.Name, Name));
                 }
             }
             else
             {
                 NodeItem newPropSet = CreatePropSetNode(LocalData.UndefinedPset, Name, Name);
                 if (!Children.Any(o => o.Name == newPropSet.Name))
                 {
                     Children.Add(newPropSet);
                 }
                 NodeItem propSet = Children.Where(o => o.Name == LocalData.UndefinedPset).FirstOrDefault();
                 if (propSet != null)
                 {
                     propSet.Children.Add(CreatePropNode(item.Name, propSet.Name, Name));
                 }
             }
         }
     }
 }
        public static List <NodeItem> RestructureFlatNodes(List <NodeItem> allNodes, IList <NodeItem> selected)
        {
            List <NodeItem> restructedClasses = new List <NodeItem>();
            List <NodeItem> restructedPropSet = new List <NodeItem>();

            // Classification selected - clear all subnodes
            foreach (var item in selected)
            {
                if (item.Type == NodeItemType.Classification)
                {
                    restructedClasses.Add(item);
                }
            }
            foreach (var item in restructedClasses)
            {
                foreach (var node in selected.Where(x => x.Type == NodeItemType.Classification).ToList())
                {
                    selected.Remove(node);
                }
                foreach (var node in selected.Where(x => x.ClassificationName == item.Name).ToList())
                {
                    selected.Remove(node);
                }
            }
            // PropertySet selected - clear all subnodes
            foreach (var item in selected)
            {
                if (item.Type == NodeItemType.PropertySet)
                {
                    restructedPropSet.Add(item);
                }
            }
            foreach (var item in restructedPropSet)
            {
                foreach (var node in selected.Where(x => x.Type == NodeItemType.PropertySet).ToList())
                {
                    selected.Remove(node);
                }
                foreach (var node in selected.Where(x => x.ClassificationName == item.ClassificationName && x.ParentName == item.Name).ToList())
                {
                    selected.Remove(node);
                }
            }
            // Add Property in PropertySet
            foreach (var prop in selected)
            {
                if (prop.Type == NodeItemType.Property)
                {
                    foreach (var node in allNodes)
                    {
                        NodeItem propSetNode = node.Children.Where(ps => ps.Name == prop.ParentName && ps.ClassificationName == prop.ClassificationName).FirstOrDefault();
                        if (propSetNode != null)
                        {
                            if (!restructedPropSet.Any(ps => ps.Name == propSetNode.Name && ps.ClassificationName == propSetNode.ClassificationName))
                            {
                                restructedPropSet.Add(CopyNode(propSetNode, false));
                            }
                        }
                    }
                    NodeItem newPropSetNode = restructedPropSet.Where(ps => ps.Name == prop.ParentName && ps.ClassificationName == prop.ClassificationName).FirstOrDefault();
                    if (newPropSetNode != null)
                    {
                        newPropSetNode.Children.Add(prop);
                    }
                }
            }
            // Add PropertySet in Classifications
            foreach (var item in restructedPropSet)
            {
                NodeItem classNode = allNodes.Where(x => x.Name == item.ClassificationName).FirstOrDefault();
                if (classNode != null)
                {
                    if (!restructedClasses.Any(x => x.Name == classNode.Name))
                    {
                        restructedClasses.Add(CopyNode(classNode, false));
                    }
                }
                NodeItem newClassNode = restructedClasses.Where(x => x.Name == item.ClassificationName).FirstOrDefault();
                if (newClassNode != null)
                {
                    newClassNode.Children.Add(item);
                }
            }
            return(restructedClasses);
        }