From ef91a5b13e9c3c453cea9b0ad59a340b10c31f31 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 28 Jul 2013 14:15:35 +0200 Subject: [PATCH 1/3] Support for "Base Types" node in ClassBrowser, but retrieving base types not working right now. --- .../Dom/ClassBrowser/BaseTypesTreeNode.cs | 48 +++++++++++++++++++ .../ClassBrowser/TypeDefinitionTreeNode.cs | 6 +++ .../Base/Project/Dom/ITypeDefinitionModel.cs | 1 + .../Project/ICSharpCode.SharpDevelop.csproj | 1 + .../Dom/ClassBrowser/ClassBrowserPad.cs | 20 ++++---- .../SharpDevelop/Dom/TypeDefinitionModel.cs | 41 ++++++++++++++++ 6 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs 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 From 133358a9f8b91799059a333432dd1257d4acdf99 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Tue, 30 Jul 2013 23:16:29 +0200 Subject: [PATCH 2/3] Base types in ClassBrowser now shown, but only if defined in same project or in one of added custom assemblies. --- .../Dom/ClassBrowser/BaseTypesTreeNode.cs | 47 ++++++++++++++++++- .../ClassBrowser/TypeDefinitionTreeNode.cs | 3 +- .../Base/Project/Dom/ITypeDefinitionModel.cs | 3 +- .../SharpDevelop/Dom/TypeDefinitionModel.cs | 44 ++--------------- 4 files changed, 54 insertions(+), 43 deletions(-) diff --git a/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs index db675a83f6..e663588ad0 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using ICSharpCode.NRefactory.TypeSystem; namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser { @@ -12,20 +13,64 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser { ITypeDefinitionModel definition; string text; + SimpleModelCollection baseTypes; public BaseTypesTreeNode(ITypeDefinitionModel definition) { if (definition == null) throw new ArgumentNullException("definition"); this.definition = definition; + this.definition.Updated += (sender, e) => UpdateBaseTypes(); this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.BaseTypes"); + baseTypes = new SimpleModelCollection(); } protected override IModelCollection ModelChildren { get { - return definition.BaseTypes; + return baseTypes; } } + + protected override void LoadChildren() + { + UpdateBaseTypes(); + base.LoadChildren(); + } + + void UpdateBaseTypes() + { + baseTypes.Clear(); + ITypeDefinition currentTypeDef = definition.Resolve(); + if (currentTypeDef != null) { + foreach (var baseType in currentTypeDef.DirectBaseTypes) { + ITypeDefinition baseTypeDef = baseType.GetDefinition(); + if (baseTypeDef != null) { + ITypeDefinitionModel baseTypeModel = GetTypeDefinitionModel(baseTypeDef); + if (baseTypeModel != null) + baseTypes.Add(baseTypeModel); + } + } + } + } + + ITypeDefinitionModel GetTypeDefinitionModel(ITypeDefinition definition) + { + ITypeDefinitionModel model = definition.GetModel(); + if (model == null) { + // Try to get model from ClassBrowser's assembly list + var classBrowser = SD.GetService(); + if (classBrowser != null) { + foreach (var assemblyModel in classBrowser.AssemblyList.Assemblies) { + model = assemblyModel.TopLevelTypeDefinitions[definition.FullTypeName]; + if (model != null) { + return model; + } + } + } + } + + return model; + } protected override System.Collections.Generic.IComparer NodeComparer { get { diff --git a/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs index 0ceddedf8b..4a0fcf4def 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs @@ -57,7 +57,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser protected override void LoadChildren() { base.LoadChildren(); - Children.Insert(0, new BaseTypesTreeNode(definition)); + var baseTypesTreeNode = new BaseTypesTreeNode(definition); + Children.Insert(0, baseTypesTreeNode); } public override void ActivateItem(System.Windows.RoutedEventArgs e) diff --git a/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs b/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs index 2f6009fd7f..795bde6c4a 100644 --- a/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs +++ b/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs @@ -13,11 +13,12 @@ namespace ICSharpCode.SharpDevelop.Dom /// public interface ITypeDefinitionModel : IEntityModel { + event EventHandler Updated; + FullTypeName FullTypeName { get; } string Namespace { get; } TypeKind TypeKind { get; } IModelCollection NestedTypes { get; } - IModelCollection BaseTypes { get; } IModelCollection Members { get; } IEnumerable GetPartRegions(); diff --git a/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs b/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs index d2aa244ebe..d3c260052f 100644 --- a/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs +++ b/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs @@ -19,6 +19,8 @@ namespace ICSharpCode.SharpDevelop.Dom /// sealed class TypeDefinitionModel : ITypeDefinitionModel { + public event EventHandler Updated; + readonly IEntityModelContext context; readonly FullTypeName fullTypeName; List parts = new List(); @@ -270,44 +272,6 @@ 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. @@ -349,8 +313,8 @@ 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); + if (Updated != null) { + Updated(this, new EventArgs()); } } #endregion From 2b67452b13767f139bfa199aaa86b08e158209cf Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 10 Aug 2013 15:04:20 +0200 Subject: [PATCH 3/3] Localized some menu items added with ClassBrowser and updated string resources. --- data/resources/StringResources.de.resx | 17 ++++++++++++++++- data/resources/StringResources.resx | 18 ++++++++++++++++++ .../Debugger.AddIn/Debugger.AddIn.addin | 2 +- .../Dom/ClassBrowser/WorkspaceTreeNode.cs | 2 +- .../Project/ICSharpCode.SharpDevelop.addin | 6 +++--- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/data/resources/StringResources.de.resx b/data/resources/StringResources.de.resx index 12895dac1a..1c700d2ec0 100644 --- a/data/resources/StringResources.de.resx +++ b/data/resources/StringResources.de.resx @@ -2496,7 +2496,7 @@ Wollen Sie die neue Datei zum Projekt ${CurrentProjectName} hinzufügen? Referenzpfade - Pfad hinzufügem + Pfad hinzufügen Immer @@ -4769,6 +4769,9 @@ Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension< Lesezeichen + + Zum Arbeitsbereich hinzufügen + Zurück @@ -4808,9 +4811,21 @@ Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension< Keine Suchergebnisse gefunden. + + Assembly öffnen + + + Assembly aus Datei öffnen... + + + Assembly aus GAC öffnen... + Suche nach Klassenname + + Arbeitsbereich {0} + Klassen diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index b2468ce9ed..97b07ab78c 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -4891,6 +4891,9 @@ Unable to find 'WelcomeDialogId' in Dialogs.wxs Visual Studio Extension + + WPF Designer Thumbnail View + Copy @@ -5222,6 +5225,9 @@ Unable to find 'WelcomeDialogId' in Dialogs.wxs Bookmarks + + Add to workspace + Back @@ -5261,9 +5267,21 @@ Unable to find 'WelcomeDialogId' in Dialogs.wxs No search results found. + + Open assembly + + + Open assembly from file... + + + Open assembly from GAC... + Class View Search + + Workspace {0} + Classes diff --git a/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin b/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin index 5115ddb504..ce4ae66e32 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin +++ b/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin @@ -165,7 +165,7 @@ diff --git a/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs index 0a7117eb12..cf40c2ceb4 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs @@ -64,7 +64,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser public override object Text { get { - return "Workspace " + AssemblyList.Name; + return String.Format(SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.Workspace"), AssemblyList.Name); } } diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index c0e4e577fd..cdd9bf4c90 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -924,14 +924,14 @@ + tooltip = "${res:MainWindow.Windows.ClassBrowser.OpenAssemblyButton.ToolTip}">