Browse Source

add ClassBrowserServiceImpl class to decouple the ClassBrowser service from the pad UI

pull/315/head
Siegfried Pammer 12 years ago
parent
commit
20c191a021
  1. 44
      src/Main/Base/Project/Dom/ClassBrowser/ClassBrowserTreeView.cs
  2. 1
      src/Main/Base/Project/Dom/ClassBrowser/IClassBrowser.cs
  3. 16
      src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs
  4. 21
      src/Main/Base/Project/Dom/IEntityModelContext.cs
  5. 4
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  6. 6
      src/Main/Base/Project/Services/SD.cs
  7. 48
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
  8. 57
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserServiceImpl.cs
  9. 1
      src/Main/SharpDevelop/SharpDevelop.csproj

44
src/Main/Base/Project/Dom/ClassBrowser/ClassBrowserTreeView.cs

@ -13,43 +13,17 @@ using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
public class ClassBrowserTreeView : SharpTreeView, IClassBrowserTreeView public class ClassBrowserTreeView : SharpTreeView
{ {
#region IClassBrowser implementation
WorkspaceModel workspace;
public ICollection<IAssemblyList> AssemblyLists {
get { return workspace.AssemblyLists; }
}
public IAssemblyList MainAssemblyList {
get { return workspace.MainAssemblyList; }
set { workspace.MainAssemblyList = value; }
}
public IAssemblyList UnpinnedAssemblies {
get { return workspace.UnpinnedAssemblies; }
set { workspace.UnpinnedAssemblies = value; }
}
public IAssemblyModel FindAssemblyModel(FileName fileName)
{
return workspace.FindAssemblyModel(fileName);
}
#endregion
public ClassBrowserTreeView() public ClassBrowserTreeView()
{ {
WorkspaceTreeNode root = new WorkspaceTreeNode(); WorkspaceTreeNode root = new WorkspaceTreeNode();
this.workspace = root.Workspace;
ClassBrowserTreeView instance = this; ClassBrowserTreeView instance = this;
root.Workspace.AssemblyLists.CollectionChanged += delegate { SD.ClassBrowser.CurrentWorkspace.AssemblyLists.CollectionChanged += delegate {
instance.ShowRoot = root.Workspace.AssemblyLists.Count > 0; instance.ShowRoot = SD.ClassBrowser.CurrentWorkspace.AssemblyLists.Count > 0;
}; };
root.PropertyChanged += delegate { root.PropertyChanged += delegate {
instance.ShowRoot = root.Workspace.AssemblyLists.Count > 0; instance.ShowRoot = SD.ClassBrowser.CurrentWorkspace.AssemblyLists.Count > 0;
}; };
this.Root = root; this.Root = root;
} }
@ -145,10 +119,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (namespaceChildren == null) { if (namespaceChildren == null) {
// Add assembly to workspace (unpinned), if not available in ClassBrowser // Add assembly to workspace (unpinned), if not available in ClassBrowser
IAssemblyParserService assemblyParser = SD.GetService<IAssemblyParserService>(); IAssemblyParserService assemblyParser = SD.GetService<IAssemblyParserService>();
if (assemblyParser != null) { IClassBrowser classBrowser = SD.GetService<IClassBrowser>();
if (assemblyParser != null && classBrowser != null) {
IAssemblyModel unpinnedAssemblyModel = assemblyParser.GetAssemblyModel(new FileName(entityAssembly.UnresolvedAssembly.Location)); IAssemblyModel unpinnedAssemblyModel = assemblyParser.GetAssemblyModel(new FileName(entityAssembly.UnresolvedAssembly.Location));
if (unpinnedAssemblyModel != null) { if (unpinnedAssemblyModel != null) {
this.UnpinnedAssemblies.Assemblies.Add(unpinnedAssemblyModel); classBrowser.UnpinnedAssemblies.Assemblies.Add(unpinnedAssemblyModel);
var assemblyTreeNode = FindAssemblyTreeNode(entityAssembly.FullAssemblyName); var assemblyTreeNode = FindAssemblyTreeNode(entityAssembly.FullAssemblyName);
if (assemblyTreeNode != null) { if (assemblyTreeNode != null) {
assemblyTreeNode.EnsureLazyChildren(); assemblyTreeNode.EnsureLazyChildren();
@ -243,9 +218,4 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return false; return false;
} }
} }
public interface IClassBrowserTreeView : IClassBrowser
{
}
} }

1
src/Main/Base/Project/Dom/ClassBrowser/IClassBrowser.cs

@ -10,6 +10,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
public interface IClassBrowser public interface IClassBrowser
{ {
WorkspaceModel CurrentWorkspace { get; }
IAssemblyList MainAssemblyList { get; set; } IAssemblyList MainAssemblyList { get; set; }
IAssemblyList UnpinnedAssemblies { get; set; } IAssemblyList UnpinnedAssemblies { get; set; }
ICollection<IAssemblyList> AssemblyLists { get; } ICollection<IAssemblyList> AssemblyLists { get; }

16
src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs

@ -34,27 +34,21 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return stringComparer.Compare(x.Text.ToString(), y.Text.ToString()); return stringComparer.Compare(x.Text.ToString(), y.Text.ToString());
} }
} }
WorkspaceModel workspace;
public WorkspaceModel Workspace {
get { return workspace; }
}
protected static readonly IComparer<SharpTreeNode> ChildNodeComparer = new WorkspaceChildComparer(); protected static readonly IComparer<SharpTreeNode> ChildNodeComparer = new WorkspaceChildComparer();
public WorkspaceTreeNode() public WorkspaceTreeNode()
{ {
this.workspace = new WorkspaceModel(); SD.ClassBrowser.CurrentWorkspace.AssemblyLists.CollectionChanged += AssemblyListsCollectionChanged;
this.workspace.AssemblyLists.CollectionChanged += AssemblyListsCollectionChanged;
} }
protected override object GetModel() protected override object GetModel()
{ {
return workspace; return SD.ClassBrowser.CurrentWorkspace;
} }
protected override IModelCollection<object> ModelChildren { protected override IModelCollection<object> ModelChildren {
get { return workspace.MainAssemblyList.Assemblies.Concat(workspace.UnpinnedAssemblies.Assemblies); } get { return SD.ClassBrowser.MainAssemblyList.Assemblies.Concat(SD.ClassBrowser.UnpinnedAssemblies.Assemblies); }
} }
protected override IComparer<SharpTreeNode> NodeComparer { protected override IComparer<SharpTreeNode> NodeComparer {
@ -63,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public override object Text { public override object Text {
get { get {
return String.Format(SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.Workspace"), Workspace.MainAssemblyList.Name); return String.Format(SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.Workspace"), SD.ClassBrowser.MainAssemblyList.Name);
} }
} }
@ -80,7 +74,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
protected override void InsertSpecialNodes() protected override void InsertSpecialNodes()
{ {
foreach (var assemblyList in workspace.AssemblyLists) { foreach (var assemblyList in SD.ClassBrowser.AssemblyLists) {
var treeNode = SD.TreeNodeFactory.CreateTreeNode(assemblyList); var treeNode = SD.TreeNodeFactory.CreateTreeNode(assemblyList);
if (treeNode != null) if (treeNode != null)
Children.OrderedInsert(treeNode, ChildNodeComparer); Children.OrderedInsert(treeNode, ChildNodeComparer);

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

@ -107,27 +107,6 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
public class DomAssemblyNameReference : IAssemblyReference
{
DomAssemblyName name;
IAssemblySearcher searcher;
public DomAssemblyNameReference(DomAssemblyName name, IAssemblySearcher searcher)
{
if (name == null)
throw new ArgumentNullException("name");
if (searcher == null)
throw new ArgumentNullException("searcher");
this.name = name;
this.searcher = searcher;
}
public IAssembly Resolve(ITypeResolveContext context)
{
return SD.AssemblyParserService.GetAssembly(searcher.FindAssembly(name), true).Resolve(context);
}
}
public class AssemblyEntityModelContext : IEntityModelContext public class AssemblyEntityModelContext : IEntityModelContext
{ {
Lazy<ICompilation> compilation; Lazy<ICompilation> compilation;

4
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -93,7 +93,8 @@
class="ICSharpCode.SharpDevelop.Editor.Bookmarks.BookmarkManager"/> class="ICSharpCode.SharpDevelop.Editor.Bookmarks.BookmarkManager"/>
<Service id="ICSharpCode.SharpDevelop.IUIService" <Service id="ICSharpCode.SharpDevelop.IUIService"
class="ICSharpCode.SharpDevelop.UIService"/> class="ICSharpCode.SharpDevelop.UIService"/>
<Service id="ICSharpCode.SharpDevelop.Dom.ClassBrowser.IClassBrowser"
class="ICSharpCode.SharpDevelop.Dom.ClassBrowser.ClassBrowserServiceImpl"/>
<Service id="ICSharpCode.SharpDevelop.WinForms.IWinFormsService" <Service id="ICSharpCode.SharpDevelop.WinForms.IWinFormsService"
class="ICSharpCode.SharpDevelop.WinForms.WinFormsService"/> class="ICSharpCode.SharpDevelop.WinForms.WinFormsService"/>
<Service id="ICSharpCode.SharpDevelop.WinForms.IWinFormsMenuService" <Service id="ICSharpCode.SharpDevelop.WinForms.IWinFormsMenuService"
@ -136,7 +137,6 @@
title = "${res:MainWindow.Windows.ClassScoutLabel}" title = "${res:MainWindow.Windows.ClassScoutLabel}"
icon = "PadIcons.ClassBrowser" icon = "PadIcons.ClassBrowser"
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.ClassBrowserPad" class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.ClassBrowserPad"
serviceInterface = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.IClassBrowser"
defaultPosition = "Right" /> defaultPosition = "Right" />
<Pad id = "SideBar" <Pad id = "SideBar"

6
src/Main/Base/Project/Services/SD.cs

@ -9,6 +9,7 @@ using System.Threading.Tasks;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.Implementation; using ICSharpCode.Core.Implementation;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.ClassBrowser;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.Bookmarks; using ICSharpCode.SharpDevelop.Editor.Bookmarks;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
@ -259,5 +260,10 @@ namespace ICSharpCode.SharpDevelop
public static IOutputPad OutputPad { public static IOutputPad OutputPad {
get { return GetRequiredService<IOutputPad>(); } get { return GetRequiredService<IOutputPad>(); }
} }
/// <inheritdoc see="IClassBrowser"/>
public static IClassBrowser ClassBrowser {
get { return GetRequiredService<IClassBrowser>(); }
}
} }
} }

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

@ -83,31 +83,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
} }
class ClassBrowserPad : AbstractPadContent, IClassBrowser class ClassBrowserPad : AbstractPadContent
{ {
#region IClassBrowser implementation
public ICollection<IAssemblyList> AssemblyLists {
get { return treeView.AssemblyLists; }
}
public IAssemblyList MainAssemblyList {
get { return treeView.MainAssemblyList; }
set { treeView.MainAssemblyList = value; }
}
public IAssemblyList UnpinnedAssemblies {
get { return treeView.UnpinnedAssemblies; }
set { treeView.UnpinnedAssemblies = value; }
}
public IAssemblyModel FindAssemblyModel(FileName fileName)
{
return treeView.FindAssemblyModel(fileName);
}
#endregion
const string PersistedWorkspaceSetting = "ClassBrowser.Workspaces"; const string PersistedWorkspaceSetting = "ClassBrowser.Workspaces";
const string DefaultWorkspaceName = "<default>"; const string DefaultWorkspaceName = "<default>";
@ -154,10 +131,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
get { return panel; } get { return panel; }
} }
public IClassBrowserTreeView TreeView {
get { return treeView; }
}
public bool GoToEntity(IEntity entity) public bool GoToEntity(IEntity entity)
{ {
// Activate the pad // Activate the pad
@ -176,10 +149,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
void ProjectServiceCurrentSolutionChanged(object sender, EventArgs e) void ProjectServiceCurrentSolutionChanged(object sender, EventArgs e)
{ {
foreach (var node in treeView.AssemblyLists.OfType<ISolutionAssemblyList>().ToArray()) foreach (var node in SD.ClassBrowser.AssemblyLists.OfType<ISolutionAssemblyList>().ToArray())
treeView.AssemblyLists.Remove(node); SD.ClassBrowser.AssemblyLists.Remove(node);
if (projectService.CurrentSolution != null) if (projectService.CurrentSolution != null)
treeView.AssemblyLists.Add(new SolutionAssemblyList(projectService.CurrentSolution)); SD.ClassBrowser.AssemblyLists.Add(new SolutionAssemblyList(projectService.CurrentSolution));
} }
void AssemblyListCollectionChanged(IReadOnlyCollection<IAssemblyModel> removedItems, IReadOnlyCollection<IAssemblyModel> addedItems) void AssemblyListCollectionChanged(IReadOnlyCollection<IAssemblyModel> removedItems, IReadOnlyCollection<IAssemblyModel> addedItems)
@ -276,7 +249,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
IAssemblyModel assemblyModel = SafelyCreateAssemblyModelFromFile(assemblyFile); IAssemblyModel assemblyModel = SafelyCreateAssemblyModelFromFile(assemblyFile);
if (assemblyModel != null) { if (assemblyModel != null) {
MainAssemblyList.Assemblies.Add(assemblyModel); SD.ClassBrowser.MainAssemblyList.Assemblies.Add(assemblyModel);
} }
} }
@ -298,9 +271,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
/// </summary> /// </summary>
void UpdateActiveWorkspace() void UpdateActiveWorkspace()
{ {
if ((MainAssemblyList != null) && (activeWorkspace != null)) { var mainAssemblyList = SD.ClassBrowser.MainAssemblyList;
if ((mainAssemblyList != null) && (activeWorkspace != null)) {
// Temporarily detach from event handler // Temporarily detach from event handler
MainAssemblyList.Assemblies.CollectionChanged -= AssemblyListCollectionChanged; mainAssemblyList.Assemblies.CollectionChanged -= AssemblyListCollectionChanged;
} }
activeWorkspace = persistedWorkspaces.FirstOrDefault(w => w.IsActive); activeWorkspace = persistedWorkspaces.FirstOrDefault(w => w.IsActive);
@ -311,7 +285,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
defaultWorkspace.IsActive = true; defaultWorkspace.IsActive = true;
} }
MainAssemblyList.Assemblies.Clear(); mainAssemblyList.Assemblies.Clear();
if (activeWorkspace != null) { if (activeWorkspace != null) {
foreach (string assemblyFile in activeWorkspace.AssemblyFiles) { foreach (string assemblyFile in activeWorkspace.AssemblyFiles) {
AppendAssemblyFileToList(assemblyFile); AppendAssemblyFileToList(assemblyFile);
@ -319,8 +293,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
// Attach to event handler, again. // Attach to event handler, again.
if (MainAssemblyList != null) { if (mainAssemblyList != null) {
MainAssemblyList.Assemblies.CollectionChanged += AssemblyListCollectionChanged; mainAssemblyList.Assemblies.CollectionChanged += AssemblyListCollectionChanged;
} }
} }
} }

57
src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserServiceImpl.cs

@ -0,0 +1,57 @@
// 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.Collections.Generic;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
/// <summary>
/// Description of ClassBrowserServiceImpl.
/// </summary>
[SDService("SD.ClassBrowser")]
class ClassBrowserServiceImpl : IClassBrowser
{
readonly WorkspaceModel workspace = new WorkspaceModel();
public WorkspaceModel CurrentWorkspace {
get { return workspace; }
}
public ICollection<IAssemblyList> AssemblyLists {
get { return workspace.AssemblyLists; }
}
public IAssemblyList MainAssemblyList {
get { return workspace.MainAssemblyList; }
set { workspace.MainAssemblyList = value; }
}
public IAssemblyList UnpinnedAssemblies {
get { return workspace.UnpinnedAssemblies; }
set { workspace.UnpinnedAssemblies = value; }
}
public IAssemblyModel FindAssemblyModel(FileName fileName)
{
return workspace.FindAssemblyModel(fileName);
}
public bool GoToEntity(ICSharpCode.NRefactory.TypeSystem.IEntity entity)
{
var pad = SD.Workbench.GetPad(typeof(ClassBrowserPad));
pad.BringPadToFront();
var content = (ClassBrowserPad)pad.PadContent;
return content.GoToEntity(entity);
}
public bool GotoAssemblyModel(IAssemblyModel assemblyModel)
{
var pad = SD.Workbench.GetPad(typeof(ClassBrowserPad));
pad.BringPadToFront();
var content = (ClassBrowserPad)pad.PadContent;
return content.GotoAssemblyModel(assemblyModel);
}
}
}

1
src/Main/SharpDevelop/SharpDevelop.csproj

@ -108,6 +108,7 @@
</Compile> </Compile>
<Compile Include="Dom\AssemblyReferenceModel.cs" /> <Compile Include="Dom\AssemblyReferenceModel.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserPad.cs" /> <Compile Include="Dom\ClassBrowser\ClassBrowserPad.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserServiceImpl.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserTreeNodesFactory.cs" /> <Compile Include="Dom\ClassBrowser\ClassBrowserTreeNodesFactory.cs" />
<Compile Include="Dom\ClassBrowser\Commands.cs" /> <Compile Include="Dom\ClassBrowser\Commands.cs" />
<Compile Include="Dom\ClassBrowser\OpenFromGacDialog.xaml.cs"> <Compile Include="Dom\ClassBrowser\OpenFromGacDialog.xaml.cs">

Loading…
Cancel
Save