Browse Source

Adding AddIns to ClassBrowser, persistence and restoring of ClassBrowser workspace in config.

newNRILSpyDebugger
Andreas Weizel 12 years ago
parent
commit
8b55c77771
  1. 11
      src/Main/Base/Project/Dom/IAssemblyModel.cs
  2. 18
      src/Main/Base/Project/Dom/IEntityModelContext.cs
  3. 6
      src/Main/SharpDevelop/Dom/AssemblyModel.cs
  4. 148
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
  5. 4
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserTreeNodesFactory.cs
  6. 16
      src/Main/SharpDevelop/Dom/ClassBrowser/OpenAssemblyCommand.cs

11
src/Main/Base/Project/Dom/IAssemblyModel.cs

@ -42,6 +42,11 @@ namespace ICSharpCode.SharpDevelop.Dom
/// This always is the namespace without a name - it's unrelated to the 'root namespace' project setting. /// This always is the namespace without a name - it's unrelated to the 'root namespace' project setting.
/// </remarks> /// </remarks>
INamespaceModel RootNamespace { get; } INamespaceModel RootNamespace { get; }
/// <summary>
/// Gets the <see cref="IEntityModelContext"/> of this assembly model.
/// </summary>
IEntityModelContext Context { get; }
} }
/// <summary> /// <summary>
@ -92,6 +97,12 @@ namespace ICSharpCode.SharpDevelop.Dom
public INamespaceModel RootNamespace { public INamespaceModel RootNamespace {
get { return EmptyNamespaceModel.Instance; } get { return EmptyNamespaceModel.Instance; }
} }
public IEntityModelContext Context {
get {
return null;
}
}
} }
} }

18
src/Main/Base/Project/Dom/IEntityModelContext.cs

@ -34,6 +34,16 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Returns true if part1 is considered a better candidate for the primary part than part2. /// Returns true if part1 is considered a better candidate for the primary part than part2.
/// </summary> /// </summary>
bool IsBetterPart(IUnresolvedTypeDefinition part1, IUnresolvedTypeDefinition part2); bool IsBetterPart(IUnresolvedTypeDefinition part1, IUnresolvedTypeDefinition part2);
/// <summary>
/// Short name of current assembly.
/// </summary>
string AssemblyName { get; }
/// <summary>
/// Full path and file name of the assembly. Output assembly for projects.
/// </summary>
string Location { get; }
} }
public class ProjectEntityModelContext : IEntityModelContext public class ProjectEntityModelContext : IEntityModelContext
@ -53,6 +63,10 @@ namespace ICSharpCode.SharpDevelop.Dom
get { return project.AssemblyName; } get { return project.AssemblyName; }
} }
public string Location {
get { return project.OutputAssemblyFullPath; }
}
public IProject Project { public IProject Project {
get { return project; } get { return project; }
} }
@ -88,6 +102,10 @@ namespace ICSharpCode.SharpDevelop.Dom
get { return mainAssembly.AssemblyName; } get { return mainAssembly.AssemblyName; }
} }
public string Location {
get { return mainAssembly.Location; }
}
public ICompilation GetCompilation() public ICompilation GetCompilation()
{ {
return compilation; return compilation;

6
src/Main/SharpDevelop/Dom/AssemblyModel.cs

@ -50,6 +50,12 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
public IEntityModelContext Context {
get {
return context;
}
}
public void Update(IUnresolvedFile oldFile, IUnresolvedFile newFile) public void Update(IUnresolvedFile oldFile, IUnresolvedFile newFile)
{ {
IList<IUnresolvedTypeDefinition> old = EmptyList<IUnresolvedTypeDefinition>.Instance; IList<IUnresolvedTypeDefinition> old = EmptyList<IUnresolvedTypeDefinition>.Instance;

148
src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs

@ -7,12 +7,26 @@ using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Windows.Controls; using System.Windows.Controls;
using ICSharpCode.Core.Presentation; using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.TreeView; using ICSharpCode.TreeView;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Workbench; using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
public class PersistedWorkspace
{
public PersistedWorkspace()
{
AssemblyFiles = new List<string>();
}
public string Name { get; set; }
public List<String> AssemblyFiles { get; set; }
public bool IsActive { get; set; }
}
class ClassBrowserPad : AbstractPadContent, IClassBrowser class ClassBrowserPad : AbstractPadContent, IClassBrowser
{ {
#region IClassBrowser implementation #region IClassBrowser implementation
@ -25,13 +39,19 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
get { return treeView.AssemblyList; } get { return treeView.AssemblyList; }
set { treeView.AssemblyList = value; } set { treeView.AssemblyList = value; }
} }
#endregion #endregion
const string PersistedWorkspaceSetting = "ClassBrowser.Workspaces";
const string DefaultWorkspaceName = "<default>";
IProjectService projectService; IProjectService projectService;
ClassBrowserTreeView treeView; ClassBrowserTreeView treeView;
DockPanel panel; DockPanel panel;
ToolBar toolBar; ToolBar toolBar;
List<PersistedWorkspace> persistedWorkspaces;
PersistedWorkspace activeWorkspace;
public ClassBrowserPad() public ClassBrowserPad()
: this(SD.GetRequiredService<IProjectService>()) : this(SD.GetRequiredService<IProjectService>())
@ -53,6 +73,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
//treeView.ContextMenu = CreateContextMenu("/SharpDevelop/Pads/UnitTestsPad/ContextMenu"); //treeView.ContextMenu = CreateContextMenu("/SharpDevelop/Pads/UnitTestsPad/ContextMenu");
projectService.CurrentSolutionChanged += ProjectServiceCurrentSolutionChanged; projectService.CurrentSolutionChanged += ProjectServiceCurrentSolutionChanged;
ProjectServiceCurrentSolutionChanged(null, null); ProjectServiceCurrentSolutionChanged(null, null);
// Load workspaces from configuration
LoadWorkspaces();
} }
public override void Dispose() public override void Dispose()
@ -77,6 +100,26 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
treeView.SpecialNodes.Add(new SolutionTreeNode(projectService.CurrentSolution)); treeView.SpecialNodes.Add(new SolutionTreeNode(projectService.CurrentSolution));
} }
void AssemblyListCollectionChanged(IReadOnlyCollection<IAssemblyModel> removedItems, IReadOnlyCollection<IAssemblyModel> addedItems)
{
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);
}
}
// Update workspace list in configuration
SaveWorkspaces();
}
/// <summary> /// <summary>
/// Virtual method so we can override this method and return /// Virtual method so we can override this method and return
/// a dummy ToolBar when testing. /// a dummy ToolBar when testing.
@ -96,5 +139,108 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
Debug.Assert(treeView != null); Debug.Assert(treeView != null);
return MenuService.CreateContextMenu(treeView, name); return MenuService.CreateContextMenu(treeView, name);
} }
/// <summary>
/// Loads persisted workspaces from configuration.
/// </summary>
void LoadWorkspaces()
{
persistedWorkspaces = SD.PropertyService.GetList<PersistedWorkspace>(PersistedWorkspaceSetting).ToList();
if (!persistedWorkspaces.Any())
{
// Add at least default workspace
persistedWorkspaces = new List<PersistedWorkspace>();
persistedWorkspaces.Add(new PersistedWorkspace()
{
Name = DefaultWorkspaceName
});
}
// Load all assemblies (for now always from default workspace)
PersistedWorkspace defaultWorkspace = persistedWorkspaces.FirstOrDefault(w => w.Name == DefaultWorkspaceName);
ActivateWorkspace(defaultWorkspace);
}
/// <summary>
/// Stores currently saved workspaces in configuration.
/// </summary>
void SaveWorkspaces()
{
SD.PropertyService.SetList<PersistedWorkspace>(PersistedWorkspaceSetting, persistedWorkspaces);
}
public static IAssemblyModel CreateAssemblyModelFromFile(string fileName)
{
// TODO References?
var loader = new CecilLoader();
loader.IncludeInternalMembers = true;
loader.LazyLoad = true;
var assembly = loader.LoadAssemblyFile(fileName);
IEntityModelContext context = new AssemblyEntityModelContext(assembly);
IAssemblyModel model = SD.GetRequiredService<IModelFactory>().CreateAssemblyModel(context);
if (model is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel)model).Update(EmptyList<IUnresolvedTypeDefinition>.Instance, assembly.TopLevelTypeDefinitions.ToList());
((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName;
}
return model;
}
void AppendAssemblyFileToList(string assemblyFile)
{
IAssemblyModel assemblyModel = CreateAssemblyModelFromFile(assemblyFile);
if (assemblyModel != null) {
AssemblyList.Assemblies.Add(assemblyModel);
} else {
// TODO Throw exception?
}
}
/// <summary>
/// Activates the specified workspace.
/// </summary>
void ActivateWorkspace(PersistedWorkspace workspace)
{
// Update the activation flags in workspace list
foreach (var workspaceElement in persistedWorkspaces) {
workspaceElement.IsActive = (workspaceElement == workspace);
}
UpdateActiveWorkspace();
}
/// <summary>
/// Updates active workspace and AssemblyList according to <see cref="PersistedWorkspace.IsActive"/> flags.
/// </summary>
void UpdateActiveWorkspace()
{
if ((AssemblyList != null) && (activeWorkspace != null)) {
// Temporarily detach from event handler
AssemblyList.Assemblies.CollectionChanged -= AssemblyListCollectionChanged;
}
activeWorkspace = persistedWorkspaces.FirstOrDefault(w => w.IsActive);
if (activeWorkspace == null) {
// If no workspace is active, activate default
var defaultWorkspace = persistedWorkspaces.FirstOrDefault(w => w.Name == DefaultWorkspaceName);
activeWorkspace = defaultWorkspace;
defaultWorkspace.IsActive = true;
}
AssemblyList.Assemblies.Clear();
if (activeWorkspace != null) {
foreach (string assemblyFile in activeWorkspace.AssemblyFiles) {
AppendAssemblyFileToList(assemblyFile);
}
}
// Attach to event handler, again.
if (AssemblyList != null) {
AssemblyList.Assemblies.CollectionChanged += AssemblyListCollectionChanged;
}
}
} }
} }

4
src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserTreeNodesFactory.cs

@ -21,6 +21,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return typeof(ITypeDefinitionModel); return typeof(ITypeDefinitionModel);
if (model is IMemberModel) if (model is IMemberModel)
return typeof(IMemberModel); return typeof(IMemberModel);
if (model is IAssemblyModel)
return typeof(IAssemblyModel);
return null; return null;
} }
@ -36,6 +38,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return new TypeDefinitionTreeNode((ITypeDefinitionModel)model); return new TypeDefinitionTreeNode((ITypeDefinitionModel)model);
if (model is IMemberModel) if (model is IMemberModel)
return new MemberTreeNode((IMemberModel)model); return new MemberTreeNode((IMemberModel)model);
if (model is IAssemblyModel)
return new AssemblyTreeNode((IAssemblyModel) model);
return null; return null;
} }
} }

16
src/Main/SharpDevelop/Dom/ClassBrowser/OpenAssemblyCommand.cs

@ -2,6 +2,10 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Linq;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem;
using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
@ -12,7 +16,17 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
throw new NotImplementedException(); var classBrowser = SD.GetService<IClassBrowser>();
if (classBrowser != null) {
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Assembly files (*.exe, *.dll)|*.exe;*.dll";
openFileDialog.CheckFileExists = true;
openFileDialog.CheckPathExists = true;
if (openFileDialog.ShowDialog() ?? false)
{
classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName));
}
}
} }
} }

Loading…
Cancel
Save