Browse Source

Introduced "Derived types" nodes in ClassBrowser.

pull/80/head
Andreas Weizel 12 years ago
parent
commit
5958247228
  1. 6
      src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs
  2. 134
      src/Main/Base/Project/Dom/ClassBrowser/DerivedTypesTreeNode.cs
  3. 10
      src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs
  4. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

6
src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs

@ -13,7 +13,7 @@ using ICSharpCode.SharpDevelop.Project; @@ -13,7 +13,7 @@ using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
/// <summary>
/// Description of BaseTypesTreeNode.
/// Represents the "Base types" sub-node of type nodes in ClassBrowser tree.
/// </summary>
public class BaseTypesTreeNode : ModelCollectionTreeNode
{
@ -72,7 +72,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -72,7 +72,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
IAssemblyModel assemblyModel = null;
try {
// Try to get AssemblyModel
// Try to get AssemblyModel from project list
IProjectService projectService = SD.GetRequiredService<IProjectService>();
if (projectService.CurrentSolution != null) {
var projectOfAssembly = projectService.CurrentSolution.Projects.FirstOrDefault(p => p.AssemblyModel.Location == assemblyFileName);
@ -92,7 +92,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -92,7 +92,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
}
if (assemblyModel != null) {
// Look in the type's AssemblyModel
// Nothing in projects, load from assembly file
resolveTypeDefModel = assemblyModel.TopLevelTypeDefinitions[baseTypeDefinition.FullTypeName];
if (resolveTypeDefModel != null) {
return resolveTypeDefModel;

134
src/Main/Base/Project/Dom/ClassBrowser/DerivedTypesTreeNode.cs

@ -0,0 +1,134 @@ @@ -0,0 +1,134 @@
// 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;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.TreeView;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
/// <summary>
/// Represents the "Derived types" sub-node of type nodes in ClassBrowser tree.
/// </summary>
public class DerivedTypesTreeNode : ModelCollectionTreeNode
{
ITypeDefinitionModel definition;
string text;
SimpleModelCollection<ITypeDefinitionModel> derivedTypes;
public DerivedTypesTreeNode(ITypeDefinitionModel definition)
{
if (definition == null)
throw new ArgumentNullException("definition");
this.definition = definition;
this.definition.Updated += (sender, e) => UpdateDerivedTypes();
this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.DerivedTypes");
derivedTypes = new SimpleModelCollection<ITypeDefinitionModel>();
UpdateDerivedTypes();
}
protected override IModelCollection<object> ModelChildren {
get {
return derivedTypes;
}
}
public override SharpTreeNode FindChildNodeRecursively(Func<SharpTreeNode, bool> predicate)
{
// Don't search children of this node, because they are repeating type nodes from elsewhere
return null;
}
public bool HasDerivedTypes()
{
return derivedTypes.Count > 0;
}
void UpdateDerivedTypes()
{
derivedTypes.Clear();
ITypeDefinition currentTypeDef = definition.Resolve();
if (currentTypeDef != null) {
foreach (var derivedType in FindReferenceService.FindDerivedTypes(currentTypeDef, true)) {
ITypeDefinitionModel derivedTypeModel = GetTypeDefinitionModel(currentTypeDef, derivedType);
if (derivedTypeModel != null)
derivedTypes.Add(derivedTypeModel);
}
// foreach (var baseType in currentTypeDef.DirectBaseTypes) {
// ITypeDefinition baseTypeDef = baseType.GetDefinition();
// if ((baseTypeDef != null) && (baseTypeDef.FullName != "System.Object")) {
// ITypeDefinitionModel baseTypeModel = GetTypeDefinitionModel(currentTypeDef, baseTypeDef);
// if (baseTypeModel != null)
// derivedTypes.Add(baseTypeModel);
// }
// }
}
}
ITypeDefinitionModel GetTypeDefinitionModel(ITypeDefinition mainTypeDefinition, ITypeDefinition derivedTypeDefinition)
{
ITypeDefinitionModel resolveTypeDefModel = null;
var assemblyFileName = mainTypeDefinition.ParentAssembly.GetRuntimeAssemblyLocation();
IAssemblyModel assemblyModel = null;
try {
// Try to get AssemblyModel from project list
IProjectService projectService = SD.GetRequiredService<IProjectService>();
if (projectService.CurrentSolution != null) {
var projectOfAssembly = projectService.CurrentSolution.Projects.FirstOrDefault(p => p.AssemblyModel.Location == assemblyFileName);
if (projectOfAssembly != null) {
// We automatically have an AssemblyModel from project
assemblyModel = projectOfAssembly.AssemblyModel;
}
}
if (assemblyModel == null) {
// Nothing in projects, load from assembly file
var assemblyParserService = SD.GetService<IAssemblyParserService>();
if (assemblyParserService != null) {
if (assemblyFileName != null) {
assemblyModel = assemblyParserService.GetAssemblyModel(assemblyFileName);
}
}
}
if (assemblyModel != null) {
// Look in found AssemblyModel
resolveTypeDefModel = assemblyModel.TopLevelTypeDefinitions[derivedTypeDefinition.FullTypeName];
if (resolveTypeDefModel != null) {
return resolveTypeDefModel;
}
}
} catch (Exception) {
// TODO Can't load the type, what to do?
}
return resolveTypeDefModel;
}
protected override System.Collections.Generic.IComparer<ICSharpCode.TreeView.SharpTreeNode> NodeComparer {
get {
return NodeTextComparer;
}
}
public override object Text {
get {
return text;
}
}
public override object Icon {
get {
return SD.ResourceService.GetImageSource("Icons.16x16.OpenFolderBitmap");
}
}
}
}

10
src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs

@ -59,6 +59,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -59,6 +59,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
protected override void LoadChildren()
{
base.LoadChildren();
// Since following both methods set their entries to the top, "Base types" must come last to get them on top
UpdateDerivedTypesNode();
UpdateBaseTypesNode();
}
@ -70,6 +72,14 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -70,6 +72,14 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
Children.Insert(0, baseTypesTreeNode);
}
void UpdateDerivedTypesNode()
{
this.Children.RemoveAll(n => n is DerivedTypesTreeNode);
var derivedTypesTreeNode = new DerivedTypesTreeNode(definition);
if (derivedTypesTreeNode.HasDerivedTypes())
Children.Insert(0, derivedTypesTreeNode);
}
public override void ActivateItem(System.Windows.RoutedEventArgs e)
{
var target = definition.Resolve();

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -88,6 +88,7 @@ @@ -88,6 +88,7 @@
<Compile Include="Dom\ClassBrowser\AssemblyTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\BaseTypesTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserTreeView.cs" />
<Compile Include="Dom\ClassBrowser\DerivedTypesTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\IClassBrowser.cs" />
<Compile Include="Dom\ClassBrowser\MemberTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\NamespaceTreeNode.cs" />

Loading…
Cancel
Save