diff --git a/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs new file mode 100644 index 0000000000..db675a83f6 --- /dev/null +++ b/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs @@ -0,0 +1,48 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; + +namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser +{ + /// + /// Description of BaseTypesTreeNode. + /// + public class BaseTypesTreeNode : ModelCollectionTreeNode + { + ITypeDefinitionModel definition; + string text; + + public BaseTypesTreeNode(ITypeDefinitionModel definition) + { + if (definition == null) + throw new ArgumentNullException("definition"); + this.definition = definition; + this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.BaseTypes"); + } + + protected override IModelCollection ModelChildren { + get { + return definition.BaseTypes; + } + } + + protected override System.Collections.Generic.IComparer NodeComparer { + get { + return NodeTextComparer; + } + } + + public override object Text { + get { + return text; + } + } + + public override object Icon { + get { + return SD.ResourceService.GetImageSource("Icons.16x16.OpenFolderBitmap"); + } + } + } +} diff --git a/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs index aaab2f62ac..0ceddedf8b 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs @@ -54,6 +54,12 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser } } + protected override void LoadChildren() + { + base.LoadChildren(); + Children.Insert(0, new BaseTypesTreeNode(definition)); + } + public override void ActivateItem(System.Windows.RoutedEventArgs e) { var target = definition.Resolve(); diff --git a/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs b/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs index 62934f4576..2f6009fd7f 100644 --- a/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs +++ b/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs @@ -17,6 +17,7 @@ namespace ICSharpCode.SharpDevelop.Dom string Namespace { get; } TypeKind TypeKind { get; } IModelCollection NestedTypes { get; } + IModelCollection BaseTypes { get; } IModelCollection Members { get; } IEnumerable GetPartRegions(); diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 91a1577bd1..f55fdd6cfd 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -86,6 +86,7 @@ + diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs index 1c536d2306..af585b8603 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs @@ -149,17 +149,21 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser void AssemblyListCollectionChanged(IReadOnlyCollection removedItems, IReadOnlyCollection addedItems) { - foreach (var assembly in addedItems) { - // Add this assembly to current workspace - if (activeWorkspace != null) { - activeWorkspace.AssemblyFiles.Add(assembly.Context.Location); + if (addedItems != null) { + foreach (var assembly in addedItems) { + // Add this assembly to current workspace + if (activeWorkspace != null) { + activeWorkspace.AssemblyFiles.Add(assembly.Context.Location); + } } } - foreach (var assembly in removedItems) { - // Add this assembly to current workspace - if (activeWorkspace != null) { - activeWorkspace.AssemblyFiles.Remove(assembly.Context.Location); + if (removedItems != null) { + foreach (var assembly in removedItems) { + // Add this assembly to current workspace + if (activeWorkspace != null) { + activeWorkspace.AssemblyFiles.Remove(assembly.Context.Location); + } } } diff --git a/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs b/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs index 20df0cead5..d2aa244ebe 100644 --- a/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs +++ b/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs @@ -270,6 +270,44 @@ namespace ICSharpCode.SharpDevelop.Dom } #endregion + #region Base Types collection + NestedTypeDefinitionModelCollection baseTypes; + + IList GetBaseTypes(IUnresolvedTypeDefinition definition) + { + var compilation = context.GetCompilation(); + if (compilation != null) { + var typeResolveContext = new SimpleTypeResolveContext(compilation.MainAssembly).WithCurrentTypeDefinition(Resolve()); + var baseTypeList = new List(); + foreach (var baseTypeRef in definition.BaseTypes) { + var resolvedTypeDefinition = baseTypeRef.Resolve(typeResolveContext).GetDefinition(); + if (resolvedTypeDefinition != null) { + baseTypeList.Add(resolvedTypeDefinition.Parts[0]); + } + } + + return baseTypeList; + } + + return null; + } + + public IModelCollection BaseTypes { + get { + if (baseTypes == null) { + baseTypes = new NestedTypeDefinitionModelCollection(context); + foreach (var part in parts) { + var baseTypeList = GetBaseTypes(part); + if (baseTypeList != null) { + baseTypes.Update(null, baseTypeList); + } + } + } + return baseTypes; + } + } + #endregion + #region Update /// /// Updates this type definition model by replacing oldPart with newPart. @@ -311,6 +349,9 @@ namespace ICSharpCode.SharpDevelop.Dom if (nestedTypes != null) { nestedTypes.Update(oldPart != null ? oldPart.NestedTypes : null, newPart != null ? newPart.NestedTypes : null); } + if (baseTypes != null) { + baseTypes.Update(oldPart != null ? GetBaseTypes(oldPart) : null, newPart != null ? GetBaseTypes(newPart) : null); + } } #endregion