You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.0 KiB

15 years ago
15 years ago
15 years ago
  1. // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
  2. // This code is distributed under MIT X11 license (for details please see \doc\license.txt)
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Collections.ObjectModel;
  6. using System.Windows.Media;
  7. using ICSharpCode.TreeView;
  8. using Mono.Cecil;
  9. namespace ICSharpCode.ILSpy
  10. {
  11. sealed class TypeTreeNode : SharpTreeNode
  12. {
  13. readonly TypeDefinition type;
  14. public TypeTreeNode(TypeDefinition type)
  15. {
  16. if (type == null)
  17. throw new ArgumentNullException("type");
  18. this.type = type;
  19. this.LazyLoading = true;
  20. }
  21. public string Name {
  22. get { return type.Name; }
  23. }
  24. public string Namespace {
  25. get { return type.Namespace; }
  26. }
  27. public override object Text {
  28. get { return type.Name; }
  29. }
  30. public TypeAttributes Visibility {
  31. get {
  32. return type.Attributes & TypeAttributes.VisibilityMask;
  33. }
  34. }
  35. public bool IsPublicAPI {
  36. get {
  37. switch (this.Visibility) {
  38. case TypeAttributes.Public:
  39. case TypeAttributes.NestedPublic:
  40. case TypeAttributes.NestedFamily:
  41. case TypeAttributes.NestedFamORAssem:
  42. return true;
  43. default:
  44. return false;
  45. }
  46. }
  47. }
  48. protected override void LoadChildren()
  49. {
  50. foreach (TypeDefinition nestedType in type.NestedTypes) {
  51. this.Children.Add(new TypeTreeNode(nestedType));
  52. }
  53. foreach (FieldDefinition field in type.Fields) {
  54. this.Children.Add(new FieldTreeNode(field));
  55. }
  56. foreach (MethodDefinition method in type.Methods) {
  57. this.Children.Add(new MethodTreeNode(method));
  58. }
  59. }
  60. #region Icon
  61. enum ClassType
  62. {
  63. Class,
  64. Enum,
  65. Struct,
  66. Interface,
  67. Delegate
  68. }
  69. ClassType GetClassType()
  70. {
  71. if (type.IsValueType) {
  72. if (type.IsEnum)
  73. return ClassType.Enum;
  74. else
  75. return ClassType.Struct;
  76. } else {
  77. if (type.IsInterface)
  78. return ClassType.Interface;
  79. else if (type.BaseType != null && type.BaseType.FullName == typeof(MulticastDelegate).FullName)
  80. return ClassType.Delegate;
  81. else
  82. return ClassType.Class;
  83. }
  84. }
  85. public override object Icon {
  86. get {
  87. switch (this.Visibility) {
  88. case TypeAttributes.Public:
  89. case TypeAttributes.NestedPublic:
  90. switch (this.GetClassType()) {
  91. case ClassType.Delegate: return Images.Delegate;
  92. case ClassType.Enum: return Images.Enum;
  93. case ClassType.Interface: return Images.Interface;
  94. case ClassType.Struct: return Images.Struct;
  95. default: return Images.Class;
  96. }
  97. case TypeAttributes.NotPublic:
  98. case TypeAttributes.NestedAssembly:
  99. case TypeAttributes.NestedFamANDAssem:
  100. switch (this.GetClassType()) {
  101. case ClassType.Delegate: return Images.InternalDelegate;
  102. case ClassType.Enum: return Images.InternalEnum;
  103. case ClassType.Interface: return Images.InternalInterface;
  104. case ClassType.Struct: return Images.InternalStruct;
  105. default: return Images.InternalClass;
  106. }
  107. case TypeAttributes.NestedFamily:
  108. case TypeAttributes.NestedFamORAssem:
  109. switch (this.GetClassType()) {
  110. case ClassType.Delegate: return Images.ProtectedDelegate;
  111. case ClassType.Enum: return Images.ProtectedEnum;
  112. case ClassType.Interface: return Images.ProtectedInterface;
  113. case ClassType.Struct: return Images.ProtectedStruct;
  114. default: return Images.ProtectedClass;
  115. }
  116. case TypeAttributes.NestedPrivate:
  117. switch (this.GetClassType()) {
  118. case ClassType.Delegate: return Images.PrivateDelegate;
  119. case ClassType.Enum: return Images.PrivateEnum;
  120. case ClassType.Interface: return Images.PrivateInterface;
  121. case ClassType.Struct: return Images.PrivateStruct;
  122. default: return Images.PrivateClass;
  123. }
  124. default:
  125. throw new NotSupportedException(this.Visibility.ToString());
  126. }
  127. }
  128. }
  129. #endregion
  130. }
  131. }