private void OnItemsLoaded(IEnumerable <ITypeDefinitionTreeViewItem> items, TreeViewItemsBag itemsBag)
        {
            foreach (ITypeDefinitionTreeViewItem treeViewItem in items)
            {
                ITypeDefinition typeDefinition = treeViewItem.TypeDefinition;

                if (HasMatchingType(typeDefinition))
                {
                    itemsBag.AddNewEntry(treeViewItem);
                }
            }
        }
        private void LoadInheritedTypes()
        {
            Task.Factory.StartNew(() =>
            {
                var searchAssemblies = new Dictionary <IAssemblyDefinitionTreeViewItem, List <string> >();

                int typesCount = 0;

                foreach (IAssemblyDefinitionTreeViewItem assemblyDefinitionTreeViewItem in this.treeViewItems.OfType <IAssemblyDefinitionTreeViewItem>())
                {
                    IModuleDefinition moduleDefinition = assemblyDefinitionTreeViewItem.AssemblyDefinition.MainModule;

                    if (moduleDefinition.AssemblyReferences.Any(a => a.FullName == selectedTypeDefinition.Module.Assembly.FullName) ||
                        moduleDefinition.FilePath == selectedTypeDefinition.Module.FilePath)
                    {
                        foreach (ITypeDefinition typeDefinition in moduleDefinition.Types)
                        {
                            if (HasMatchingType(typeDefinition))
                            {
                                typesCount++;

                                if (searchAssemblies.ContainsKey(assemblyDefinitionTreeViewItem))
                                {
                                    searchAssemblies[assemblyDefinitionTreeViewItem].Add(typeDefinition.Namespace);
                                }
                                else
                                {
                                    searchAssemblies.Add(assemblyDefinitionTreeViewItem, new List <string> {
                                        typeDefinition.Namespace
                                    });
                                }
                            }
                        }
                    }
                }
                var treeViewItemsBag = new TreeViewItemsBag(OnItemsLoaded, typesCount);

                if (typesCount == 0)
                {
                    treeViewItemsBag.Completed();
                }
                foreach (KeyValuePair <IAssemblyDefinitionTreeViewItem, List <string> > item in searchAssemblies)
                {
                    IList <string> namespaces = item.Value;

                    item.Key.Expand(t => OnItemsLoaded(namespaces, t, treeViewItemsBag));
                }
            });
            progressWindow = new ProgressWindow();

            progressWindow.ShowDialog();
        }
 private void OnItemsLoaded(IList <string> namespaces, IEnumerable <ITreeViewItem> items, TreeViewItemsBag itemsBag)
 {
     foreach (ITreeViewItem treeViewItem in items)
     {
         if (treeViewItem.TreeNodeType == TreeNodeType.AssemblyModuleDefinition)
         {
             treeViewItem.Expand(r => OnItemsLoaded(namespaces, r, itemsBag));
         }
         else if (treeViewItem.TreeNodeType == TreeNodeType.AssemblyNamespace &&
                  namespaces.Any(n => n.Equals(((INamespaceTreeViewItem)treeViewItem).Namespace, StringComparison.OrdinalIgnoreCase)))
         {
             treeViewItem.Expand(r => OnItemsLoaded(r.OfType <ITypeDefinitionTreeViewItem>(), itemsBag));
         }
     }
 }