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; @@ -13,43 +13,17 @@ using ICSharpCode.SharpDevelop.Project;
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()
{
WorkspaceTreeNode root = new WorkspaceTreeNode();
this.workspace = root.Workspace;
ClassBrowserTreeView instance = this;
root.Workspace.AssemblyLists.CollectionChanged += delegate {
instance.ShowRoot = root.Workspace.AssemblyLists.Count > 0;
SD.ClassBrowser.CurrentWorkspace.AssemblyLists.CollectionChanged += delegate {
instance.ShowRoot = SD.ClassBrowser.CurrentWorkspace.AssemblyLists.Count > 0;
};
root.PropertyChanged += delegate {
instance.ShowRoot = root.Workspace.AssemblyLists.Count > 0;
instance.ShowRoot = SD.ClassBrowser.CurrentWorkspace.AssemblyLists.Count > 0;
};
this.Root = root;
}
@ -145,10 +119,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -145,10 +119,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (namespaceChildren == null) {
// Add assembly to workspace (unpinned), if not available in ClassBrowser
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));
if (unpinnedAssemblyModel != null) {
this.UnpinnedAssemblies.Assemblies.Add(unpinnedAssemblyModel);
classBrowser.UnpinnedAssemblies.Assemblies.Add(unpinnedAssemblyModel);
var assemblyTreeNode = FindAssemblyTreeNode(entityAssembly.FullAssemblyName);
if (assemblyTreeNode != null) {
assemblyTreeNode.EnsureLazyChildren();
@ -243,9 +218,4 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -243,9 +218,4 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return false;
}
}
public interface IClassBrowserTreeView : IClassBrowser
{
}
}

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

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

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

@ -34,27 +34,21 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -34,27 +34,21 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
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();
public WorkspaceTreeNode()
{
this.workspace = new WorkspaceModel();
this.workspace.AssemblyLists.CollectionChanged += AssemblyListsCollectionChanged;
SD.ClassBrowser.CurrentWorkspace.AssemblyLists.CollectionChanged += AssemblyListsCollectionChanged;
}
protected override object GetModel()
{
return workspace;
return SD.ClassBrowser.CurrentWorkspace;
}
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 {
@ -63,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -63,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public override object Text {
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 @@ -80,7 +74,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
protected override void InsertSpecialNodes()
{
foreach (var assemblyList in workspace.AssemblyLists) {
foreach (var assemblyList in SD.ClassBrowser.AssemblyLists) {
var treeNode = SD.TreeNodeFactory.CreateTreeNode(assemblyList);
if (treeNode != null)
Children.OrderedInsert(treeNode, ChildNodeComparer);

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

@ -107,27 +107,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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
{
Lazy<ICompilation> compilation;

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

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

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

@ -9,6 +9,7 @@ using System.Threading.Tasks; @@ -9,6 +9,7 @@ using System.Threading.Tasks;
using ICSharpCode.Core;
using ICSharpCode.Core.Implementation;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.ClassBrowser;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.Bookmarks;
using ICSharpCode.SharpDevelop.Gui;
@ -259,5 +260,10 @@ namespace ICSharpCode.SharpDevelop @@ -259,5 +260,10 @@ namespace ICSharpCode.SharpDevelop
public static IOutputPad OutputPad {
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 @@ -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 DefaultWorkspaceName = "<default>";
@ -154,10 +131,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -154,10 +131,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
get { return panel; }
}
public IClassBrowserTreeView TreeView {
get { return treeView; }
}
public bool GoToEntity(IEntity entity)
{
// Activate the pad
@ -176,10 +149,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -176,10 +149,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
void ProjectServiceCurrentSolutionChanged(object sender, EventArgs e)
{
foreach (var node in treeView.AssemblyLists.OfType<ISolutionAssemblyList>().ToArray())
treeView.AssemblyLists.Remove(node);
foreach (var node in SD.ClassBrowser.AssemblyLists.OfType<ISolutionAssemblyList>().ToArray())
SD.ClassBrowser.AssemblyLists.Remove(node);
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)
@ -276,7 +249,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -276,7 +249,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
IAssemblyModel assemblyModel = SafelyCreateAssemblyModelFromFile(assemblyFile);
if (assemblyModel != null) {
MainAssemblyList.Assemblies.Add(assemblyModel);
SD.ClassBrowser.MainAssemblyList.Assemblies.Add(assemblyModel);
}
}
@ -298,9 +271,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -298,9 +271,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
/// </summary>
void UpdateActiveWorkspace()
{
if ((MainAssemblyList != null) && (activeWorkspace != null)) {
var mainAssemblyList = SD.ClassBrowser.MainAssemblyList;
if ((mainAssemblyList != null) && (activeWorkspace != null)) {
// Temporarily detach from event handler
MainAssemblyList.Assemblies.CollectionChanged -= AssemblyListCollectionChanged;
mainAssemblyList.Assemblies.CollectionChanged -= AssemblyListCollectionChanged;
}
activeWorkspace = persistedWorkspaces.FirstOrDefault(w => w.IsActive);
@ -311,7 +285,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -311,7 +285,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
defaultWorkspace.IsActive = true;
}
MainAssemblyList.Assemblies.Clear();
mainAssemblyList.Assemblies.Clear();
if (activeWorkspace != null) {
foreach (string assemblyFile in activeWorkspace.AssemblyFiles) {
AppendAssemblyFileToList(assemblyFile);
@ -319,8 +293,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -319,8 +293,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
}
// Attach to event handler, again.
if (MainAssemblyList != null) {
MainAssemblyList.Assemblies.CollectionChanged += AssemblyListCollectionChanged;
if (mainAssemblyList != null) {
mainAssemblyList.Assemblies.CollectionChanged += AssemblyListCollectionChanged;
}
}
}

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

@ -0,0 +1,57 @@ @@ -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 @@ @@ -108,6 +108,7 @@
</Compile>
<Compile Include="Dom\AssemblyReferenceModel.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserPad.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserServiceImpl.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserTreeNodesFactory.cs" />
<Compile Include="Dom\ClassBrowser\Commands.cs" />
<Compile Include="Dom\ClassBrowser\OpenFromGacDialog.xaml.cs">

Loading…
Cancel
Save