From 085615181a48db2d31ff955bdf87c253cabaf729 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 5 Jul 2013 17:16:18 +0200 Subject: [PATCH] fix TreeNode implementation --- .../Dom/ClassBrowser/WorkspaceTreeNode.cs | 30 +++++++++++++++++++ .../Base/Project/Dom/KeyedModelCollection.cs | 7 +++++ .../SharpDevelop/Dom/ProjectAssemblyModel.cs | 29 ++++++++++-------- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs index 440c9c0624..0d5546d742 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs @@ -24,6 +24,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser this.workspace = workspace; } + protected override object GetModel() + { + return workspace; + } + protected override IModelCollection ModelChildren { get { return workspace.LoadedAssemblies; } } @@ -62,6 +67,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser this.solution = solution; } + protected override object GetModel() + { + return solution; + } + public override object Text { get { return "Solution " + solution.Name; } } @@ -90,6 +100,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser this.project = project; } + protected override object GetModel() + { + return project; + } + public override object Text { get { return project.Name; } } @@ -118,6 +133,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser this.model = model; } + protected override object GetModel() + { + return model; + } + protected override IComparer NodeComparer { get { return NodeTextComparer; } } @@ -138,6 +158,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser this.model = model; } + protected override object GetModel() + { + return model; + } + protected override IComparer NodeComparer { get { return NodeTextComparer; } } @@ -166,6 +191,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser this.definition = definition; } + protected override object GetModel() + { + return definition; + } + public override object Icon { // TODO why do I have to resolve this? get { return ClassBrowserIconService.GetIcon(definition.Resolve()).ImageSource; } diff --git a/src/Main/Base/Project/Dom/KeyedModelCollection.cs b/src/Main/Base/Project/Dom/KeyedModelCollection.cs index 905362c191..46bdf86214 100644 --- a/src/Main/Base/Project/Dom/KeyedModelCollection.cs +++ b/src/Main/Base/Project/Dom/KeyedModelCollection.cs @@ -32,6 +32,13 @@ namespace ICSharpCode.SharpDevelop.Dom dict.Remove(getKeyForValue(item)); } + protected override void ValidateItem(TValue item) + { + base.ValidateItem(item); + if (dict.ContainsKey(getKeyForValue(item))) + throw new ArgumentException("An item with the same key has already been added to the collection."); + } + public TValue this[TKey key] { get { return dict[key]; } } diff --git a/src/Main/SharpDevelop/Dom/ProjectAssemblyModel.cs b/src/Main/SharpDevelop/Dom/ProjectAssemblyModel.cs index d89e2de8bc..1503e7b008 100644 --- a/src/Main/SharpDevelop/Dom/ProjectAssemblyModel.cs +++ b/src/Main/SharpDevelop/Dom/ProjectAssemblyModel.cs @@ -61,16 +61,6 @@ namespace ICSharpCode.SharpDevelop.Dom void TypeDeclarationsCollectionChanged(IReadOnlyCollection removedItems, IReadOnlyCollection addedItems) { NamespaceModel ns; - foreach (ITypeDefinitionModel removedItem in removedItems) { - if (namespaces.TryGetValue(removedItem.Namespace, out ns)) { - ns.Types.Remove(removedItem); - while (ns.ParentNamespace != null && ns.Types.Count == 0 && ns.ChildNamespaces.Count == 0) { - ((NamespaceModel)ns.ParentNamespace).ChildNamespaces.Remove(ns); - namespaces.Remove(ns); - ns = (NamespaceModel)ns.ParentNamespace; - } - } - } foreach (ITypeDefinitionModel addedItem in addedItems) { if (!namespaces.TryGetValue(addedItem.Namespace, out ns)) { string[] parts = addedItem.Namespace.Split('.'); @@ -84,13 +74,28 @@ namespace ICSharpCode.SharpDevelop.Dom level++; } while (level < parts.Length) { - ns = new NamespaceModel(context, ns, parts[level]); - namespaces.Add(ns); + var child = new NamespaceModel(context, ns, parts[level]); + ns.ChildNamespaces.Add(child); + ns = child; level++; } + if (!namespaces.Contains(ns)) + namespaces.Add(ns); ns.Types.Add(addedItem); } } + foreach (ITypeDefinitionModel removedItem in removedItems) { + if (namespaces.TryGetValue(removedItem.Namespace, out ns)) { + ns.Types.Remove(removedItem); + if (ns.Types.Count == 0) + namespaces.Remove(ns); + while (ns.ParentNamespace != null) { + if (ns.ChildNamespaces.Count == 0 && ns.Types.Count == 0) + ((NamespaceModel)ns.ParentNamespace).ChildNamespaces.Remove(ns); + ns = (NamespaceModel)ns.ParentNamespace; + } + } + } } } }