private List <LinkedElementInfo> FindElementMappingNode(TreeViewElementModel parentNode)
        {
            var linkedElements = new List <LinkedElementInfo>();

            try
            {
                foreach (var node in parentNode.ChildrenNodes)
                {
                    if (node.NodeType == TreeViewNodeType.ElementMapping)
                    {
                        if (node.IsChecked == true)
                        {
                            var linkedInfo = node.Tag as LinkedElementInfo;
                            linkedElements.Add(linkedInfo);
                        }
                    }
                    else
                    {
                        var infoList = FindElementMappingNode(node);
                        if (infoList.Count > 0)
                        {
                            linkedElements.AddRange(infoList);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Failed to find mapping node.\n" + ex.Message, "Find Mapping Node", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
            return(linkedElements);
        }
        private void comboBoxLink_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                if (null != comboBoxLink.SelectedItem)
                {
                    selectedLink = (LinkedInstanceProperties)comboBoxLink.SelectedItem;
                    treeViewMapping.ItemsSource = null;
                    treeViewMapping.ItemsSource = TreeViewElementModel.SetTreeView(selectedLink);

                    treeViewFamilyMapping.ItemsSource = null;
                    treeViewFamilyMapping.ItemsSource = TreeViewFamilyModel.SetTreeView(selectedLink);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Failed to select a Revit Link.\n" + ex.Message, "Select a Revit Link", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        }
        public static List <TreeViewElementModel> SetTreeView(LinkedInstanceProperties lip)
        {
            var treeView = new List <TreeViewElementModel>();

            try
            {
                var customCategories = new string[] { "Rooms", "Levels", "Grids", "Scope Boxes" };

                var categories = from linkedElement in lip.LinkedElements.Values select linkedElement.CategoryName;
                if (categories.Count() > 0)
                {
                    var categoryNames = categories.Distinct().ToList(); categoryNames.Sort();
                    foreach (var categoryName in categoryNames)
                    {
                        var categoryNode = new TreeViewElementModel(categoryName);
                        categoryNode.NodeType          = TreeViewNodeType.Category;
                        categoryNode.ToolTipVisibility = Visibility.Hidden;
                        treeView.Add(categoryNode);

                        if (customCategories.Contains(categoryName))
                        {
                            var elements = from linkedElement in lip.LinkedElements.Values
                                           where linkedElement.CategoryName == categoryName
                                           select linkedElement;

                            var linkedElements = elements.OrderBy(o => o.LinkDisplayText).ToList();
                            foreach (var linkInfo in linkedElements)
                            {
                                var elementNode = new TreeViewElementModel(linkInfo.LinkDisplayText);
                                elementNode.Tag               = linkInfo;
                                elementNode.NodeType          = TreeViewNodeType.ElementMapping;
                                elementNode.Matched           = linkInfo.Matched;
                                elementNode.ToolTip           = linkInfo.ToolTipText;
                                elementNode.ToolTipVisibility = Visibility.Visible;

                                categoryNode.ChildrenNodes.Add(elementNode);
                            }
                            continue;
                        }

                        var families = from linkedElement in lip.LinkedElements.Values
                                       where linkedElement.CategoryName == categoryName
                                       select linkedElement.FamilyName;
                        if (families.Count() > 0)
                        {
                            var familyNames = families.Distinct().ToList(); familyNames.Sort();
                            foreach (var familyName in familyNames)
                            {
                                var familyNode = new TreeViewElementModel(familyName);
                                familyNode.NodeType          = TreeViewNodeType.Family;
                                familyNode.ToolTipVisibility = Visibility.Hidden;
                                categoryNode.ChildrenNodes.Add(familyNode);

                                var familyTypes = from linkedElement in lip.LinkedElements.Values
                                                  where linkedElement.CategoryName == categoryName && linkedElement.FamilyName == familyName
                                                  select linkedElement.FamilyTypeName;
                                if (familyTypes.Count() > 0)
                                {
                                    var familyTypeNames = familyTypes.Distinct().ToList(); familyTypeNames.Sort();
                                    foreach (var familyTypeName in familyTypeNames)
                                    {
                                        var familyTypeNode = new TreeViewElementModel(familyTypeName);
                                        familyTypeNode.NodeType          = TreeViewNodeType.FamilyType;
                                        familyTypeNode.ToolTipVisibility = Visibility.Hidden;
                                        familyNode.ChildrenNodes.Add(familyTypeNode);

                                        var mappings = from linkedElement in lip.LinkedElements.Values
                                                       where linkedElement.CategoryName == categoryName && linkedElement.FamilyName == familyName && linkedElement.FamilyTypeName == familyTypeName
                                                       select linkedElement;
                                        if (mappings.Count() > 0)
                                        {
                                            var linkedElements = mappings.OrderBy(o => o.LinkDisplayText).ToList();
                                            foreach (var linkInfo in linkedElements)
                                            {
                                                var elementNode = new TreeViewElementModel(linkInfo.LinkDisplayText);
                                                elementNode.Tag               = linkInfo;
                                                elementNode.NodeType          = TreeViewNodeType.ElementMapping;
                                                elementNode.Matched           = linkInfo.Matched;
                                                elementNode.ToolTip           = linkInfo.ToolTipText;
                                                elementNode.ToolTipVisibility = Visibility.Visible;

                                                familyTypeNode.ChildrenNodes.Add(elementNode);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        categoryNode.Initialize();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Failed to set the tree view.\n" + ex.Message, "Set Tree View", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
            return(treeView);
        }