public void LibraryTreeItemsHostVisibilityConverterTest() { var converter = new LibraryTreeItemsHostVisibilityConverter(); var result = converter.Convert(null, null, null, null); Assert.AreEqual(Visibility.Visible, result); var NcVM = new NodeCategoryViewModel(""); result = converter.Convert(NcVM, null, null, null); Assert.AreEqual(Visibility.Visible, result); var RncVM = new ClassesNodeCategoryViewModel(NcVM); result = converter.Convert(RncVM, null, null, null); Assert.AreEqual(Visibility.Collapsed, result); }
public void BrowserInternalElementToBoolConverterTest() { var converter = new NodeCategoryVMToBoolConverter(); var NcVM = new NodeCategoryViewModel(""); var RncVM = new RootNodeCategoryViewModel(""); var CncVM = new ClassesNodeCategoryViewModel(RncVM); object result; //1. Element is null. //2. Element is NodeCategoryViewModel. //2. Element is RootNodeCategoryViewModel. //2. Element is ClassesNodeCategoryViewModel. // 1 case result = converter.Convert(null, null, null, null); Assert.AreEqual(false, result); // 2 case result = converter.Convert(NcVM, null, null, null); Assert.AreEqual(true, result); // 3 case result = converter.Convert(RncVM, null, null, null); Assert.AreEqual(false, result); // 4 case result = converter.Convert(CncVM, null, null, null); Assert.AreEqual(false, result); }
public void ElementTypeToBoolConverterTest() { var converter = new ElementTypeToBoolConverter(); var NseVM = new NodeSearchElementViewModel( new NodeModelSearchElement(new TypeLoadData(typeof(Nodes.Symbol))), null); var NcVM = new NodeCategoryViewModel(""); var RncVM = new RootNodeCategoryViewModel(""); var CncVM = new ClassesNodeCategoryViewModel(RncVM); object result; //1. Element is null. //2. Element is NodeSearchElement. //3. Element is NodeCategoryViewModel. //4. Element is RootNodeCategoryViewModel. //5. Element is RootNodeCategoryViewModel with ClassesNodeCategoryViewModel. // 1 case result = converter.Convert(null, null, null, null); Assert.AreEqual(false, result); // 2 case result = converter.Convert(NseVM, null, null, null); Assert.AreEqual(false, result); // 3 case result = converter.Convert(NcVM, null, null, null); Assert.AreEqual(true, result); // 4 case result = converter.Convert(RncVM, null, null, null); Assert.AreEqual(true, result); // 5 case RncVM.SubCategories.Add(CncVM); result = converter.Convert(RncVM, null, null, null); Assert.AreEqual(false, result); }
private void InsertEntryIntoNewCategory( NodeCategoryViewModel category, NodeSearchElementViewModel entry, IEnumerable<string> categoryNames) { if (!categoryNames.Any()) { AddEntryToExistingCategory(category, entry); return; } // With the example of 'MyAssembly.MyNamespace.MyClass.Foo', 'path' would have been // set to 'MyAssembly' here. The Select statement below would store two entries into // 'newTargets' variable: // // NodeCategoryViewModel("MyAssembly.MyNamespace") // NodeCategoryViewModel("MyAssembly.MyNamespace.MyClass") // var path = category.FullCategoryName; var newTargets = categoryNames.Select(name => { path = MakeFullyQualifiedName(path, name); var cat = new NodeCategoryViewModel(name); cat.FullCategoryName = path; cat.Assembly = entry.Assembly; return cat; }).ToList(); // The last entry 'NodeCategoryViewModel' represents a class. For our example the // entries in 'newTargets' are: // // NodeCategoryViewModel("MyAssembly.MyNamespace") // NodeCategoryViewModel("MyAssembly.MyNamespace.MyClass") // // Since all class entries are contained under a 'ClassesNodeCategoryViewModel', // we need to create a new 'ClassesNodeCategoryViewModel' instance, and insert it // right before the class entry itself to get the following list: // // NodeCategoryViewModel("MyAssembly.MyNamespace") // ClassesNodeCategoryViewModel("Classes") // NodeCategoryViewModel("MyAssembly.MyNamespace.MyClass") // int indexToInsertClass = newTargets.Count - 1; var classParent = indexToInsertClass > 0 ? newTargets[indexToInsertClass - 1] : category; var newClass = new ClassesNodeCategoryViewModel(classParent); newTargets.Insert(indexToInsertClass, newClass); // Here, all the entries in 'newTargets' are added under 'MyAssembly' recursively, // resulting in the following hierarchical structure: // // NodeCategoryViewModel("MyAssembly") // NodeCategoryViewModel("MyAssembly.MyNamespace") // ClassesNodeCategoryViewModel("Classes") // NodeCategoryViewModel("MyAssembly.MyNamespace.MyClass") // foreach (var newTarget in newTargets) { category.SubCategories.Add(newTarget); category = newTarget; } AddEntryToExistingCategory(category, entry); }
/// <summary> /// Insert a new search element under the category. /// </summary> /// <param name="entry">This could represent a function of a given /// class. For example, 'MyAssembly.MyNamespace.MyClass.Foo'.</param> /// <param name="categoryNames">A list of entries that make up the fully qualified /// class name that contains function 'Foo', e.g. 'MyAssembly.MyNamespace.MyClass'. /// </param> internal void InsertEntry(NodeSearchElementViewModel entry, IEnumerable<string> categoryNames) { var nameStack = new Stack<string>(categoryNames.Reverse()); var target = libraryRoot; string fullyQualifiedCategoryName = ""; ClassesNodeCategoryViewModel targetClass = null; while (nameStack.Any()) { var next = nameStack.Pop(); fullyQualifiedCategoryName = MakeFullyQualifiedName(fullyQualifiedCategoryName, next); var categories = target.SubCategories; NodeCategoryViewModel targetClassSuccessor = null; var newTarget = categories.FirstOrDefault(c => { // Each path has one class. We should find and save it. if (c is ClassesNodeCategoryViewModel) { targetClass = c as ClassesNodeCategoryViewModel; // As soon as ClassesNodeCategoryViewModel is found we should search // through all it classes and save result. targetClassSuccessor = c.SubCategories.FirstOrDefault(c2 => c2.Name == next); return targetClassSuccessor != null; } return c.Name == next; }); if (newTarget == null) { // For the first iteration, this would be 'MyAssembly', and the second iteration 'MyNamespace'. var targetIsRoot = target == libraryRoot; newTarget = targetIsRoot ? new RootNodeCategoryViewModel(next) : new NodeCategoryViewModel(next); newTarget.FullCategoryName = fullyQualifiedCategoryName; newTarget.Assembly = entry.Assembly; // Situation when we to add only one new category and item as it child. // New category should be added to existing ClassesNodeCategoryViewModel. // Make notice: ClassesNodeCategoryViewModel is always first item in // all subcategories. if (nameStack.Count == 0 && !target.IsClassButton && target.SubCategories[0] is ClassesNodeCategoryViewModel) { target.SubCategories[0].SubCategories.Add(newTarget); AddEntryToExistingCategory(newTarget, entry); return; } // We are here when target is the class. New category should be added // as child of it. So class will turn into usual category. // Here we are take class, remove it from ClassesNodeCategoryViewModel // and attach to it parrent. if (targetClass != null) { if (targetClass.SubCategories.Remove(target)) targetClass.Parent.SubCategories.Add(target); // Delete empty classes container. if (targetClass.IsClassButton) targetClass.Parent.SubCategories.RemoveAt(0); targetClass.Dispose(); } // Situation when we need to add only one new category and item. // Before adding of it we need create new ClassesNodeCategoryViewModel // as soon as new category will be a class. if (nameStack.Count == 0 && !targetIsRoot) { targetClass = new ClassesNodeCategoryViewModel(target); target.SubCategories.Insert(0,targetClass); target.SubCategories[0].SubCategories.Add(newTarget); AddEntryToExistingCategory(newTarget, entry); return; } target.InsertSubCategory(newTarget); // Proceed to insert the new entry under 'newTarget' category with the remaining // name stack. In the first iteration this would have been 'MyNamespace.MyClass'. InsertEntryIntoNewCategory(newTarget, entry, nameStack); return; } // If we meet ClassesNodecategoryViewModel during the search of newTarget, // next newTarget is specified in targetClassSuccessor. if (targetClassSuccessor != null) target = targetClassSuccessor; else target = newTarget; } AddEntryToExistingCategory(target, entry); }
private static void InsertClassesIntoTree(ObservableCollection<NodeCategoryViewModel> tree) { foreach (var item in tree) { var classes = item.SubCategories.Where(cat => cat.IsClassButton).ToList(); foreach (var item2 in classes) item.SubCategories.Remove(item2); InsertClassesIntoTree(item.SubCategories); if (classes.Count == 0) continue; var container = new ClassesNodeCategoryViewModel(item); container.SubCategories.AddRange(classes); item.SubCategories.Insert(0, container); } }