Browse Source

ClassBrowser: Context menu to edit references of a project.

pull/315/head
Andreas Weizel 12 years ago
parent
commit
3bc1a0473d
  1. 20
      src/Main/Base/Project/Dom/ClassBrowser/AssemblyReferencesTreeNode.cs
  2. 1
      src/Main/Base/Project/Dom/IAssemblyReferenceModel.cs
  3. 10
      src/Main/Base/Project/Dom/IAssemblyReferencesModel.cs
  4. 25
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  5. 12
      src/Main/Base/Project/Parser/ProjectContentContainer.cs
  6. 8
      src/Main/SharpDevelop/Dom/AssemblyReferenceModel.cs
  7. 84
      src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

20
src/Main/Base/Project/Dom/ClassBrowser/AssemblyReferencesTreeNode.cs

@ -3,6 +3,7 @@
using System; using System;
using System.Linq; using System.Linq;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Parser;
@ -13,21 +14,26 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
/// </summary> /// </summary>
public class AssemblyReferencesTreeNode : ModelCollectionTreeNode public class AssemblyReferencesTreeNode : ModelCollectionTreeNode
{ {
private IAssemblyReferencesModel referencesModel; private IAssemblyReferencesModel model;
private string text; private string text;
public AssemblyReferencesTreeNode(IAssemblyReferencesModel referencesModel) public AssemblyReferencesTreeNode(IAssemblyReferencesModel referencesModel)
{ {
if (referencesModel == null) if (referencesModel == null)
throw new ArgumentNullException("referencesModel"); throw new ArgumentNullException("referencesModel");
this.referencesModel = referencesModel; this.model = referencesModel;
this.text = SD.ResourceService.GetString("ICSharpCode.SharpDevelop.Commands.ProjectBrowser.ReferencesNodeText"); this.text = SD.ResourceService.GetString("ICSharpCode.SharpDevelop.Commands.ProjectBrowser.ReferencesNodeText");
} }
protected override object GetModel()
{
return model;
}
protected override IModelCollection<object> ModelChildren protected override IModelCollection<object> ModelChildren
{ {
get { get {
return referencesModel.AssemblyNames; return model.AssemblyNames;
} }
} }
@ -51,5 +57,13 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return SD.ResourceService.GetImageSource("ProjectBrowser.ReferenceFolder.Closed"); return SD.ResourceService.GetImageSource("ProjectBrowser.ReferenceFolder.Closed");
} }
} }
public override void ShowContextMenu()
{
var assemblyReferencesModel = this.Model as IAssemblyReferencesModel;
if (assemblyReferencesModel != null) {
var ctx = MenuService.ShowContextMenu(null, assemblyReferencesModel, "/SharpDevelop/Pads/ClassBrowser/AssemblyReferencesContextMenu");
}
}
} }
} }

1
src/Main/Base/Project/Dom/IAssemblyReferenceModel.cs

@ -2,7 +2,6 @@
// 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.Collections.Generic;
using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom namespace ICSharpCode.SharpDevelop.Dom

10
src/Main/Base/Project/Dom/IAssemblyReferencesModel.cs

@ -2,8 +2,6 @@
// 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.Collections.Generic;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom namespace ICSharpCode.SharpDevelop.Dom
{ {
@ -13,6 +11,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public interface IAssemblyReferencesModel public interface IAssemblyReferencesModel
{ {
IModelCollection<IAssemblyReferenceModel> AssemblyNames { get; } IModelCollection<IAssemblyReferenceModel> AssemblyNames { get; }
IAssemblyModel ParentAssemblyModel { get; }
} }
/// <summary> /// <summary>
@ -30,5 +29,12 @@ namespace ICSharpCode.SharpDevelop.Dom
return EmptyReferenceCollection; return EmptyReferenceCollection;
} }
} }
public IAssemblyModel ParentAssemblyModel
{
get {
return EmptyAssemblyModel.Instance;
}
}
} }
} }

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

@ -1013,19 +1013,21 @@
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.RemoveAssemblyCommand"/> class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.RemoveAssemblyCommand"/>
</Path> </Path>
<Path name = "/SharpDevelop/Pads/ClassBrowser/AssemblyReferencesContextMenu">
<MenuItem id = "AddReference"
label = "${res:ProjectComponent.ContextMenu.AddReference}"
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.AddProjectReferenceCommand"/>
</Path>
<Path name = "/SharpDevelop/Pads/ClassBrowser/AssemblyReferenceContextMenu"> <Path name = "/SharpDevelop/Pads/ClassBrowser/AssemblyReferenceContextMenu">
<MenuItem id = "PermanentlyAddToWorkspace" <MenuItem id = "PermanentlyAddToWorkspace"
label = "${res:MainWindow.Windows.ClassBrowser.AddToWorkspace}" label = "${res:MainWindow.Windows.ClassBrowser.AddToWorkspace}"
icon = "Icons.16x16.AssemblyFromFile" icon = "Icons.16x16.AssemblyFromFile"
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.PermanentlyAddModuleToWorkspaceCommand"/> class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.PermanentlyAddModuleToWorkspaceCommand"/>
</Path> <MenuItem id = "Remove"
label = "${res:Global.RemoveButtonText}"
<Path name="/SharpDevelop/EntityContextMenu"> icon = "Icons.16x16.DeleteIcon"
<MenuItem id="OpenInClassBrowser" class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.RemoveProjectReferenceCommand"/>
icon="ILSpy"
type="Item"
label="${res:MainWindow.Windows.ClassBrowser.OpenInClassBrowser}"
class="ICSharpCode.SharpDevelop.Dom.ClassBrowser.OpenInClassBrowserCommand"/>
</Path> </Path>
<!-- end ClassBrowser --> <!-- end ClassBrowser -->
@ -2017,6 +2019,13 @@
<Path name = "/SharpDevelop/EntityContextMenu"> <Path name = "/SharpDevelop/EntityContextMenu">
<Include id="GotoDefinition" item="/SharpDevelop/Workbench/MainMenu/Search/GotoDefinition" /> <Include id="GotoDefinition" item="/SharpDevelop/Workbench/MainMenu/Search/GotoDefinition" />
<MenuItem id="OpenInClassBrowser"
icon="ILSpy"
type="Item"
label="${res:MainWindow.Windows.ClassBrowser.OpenInClassBrowser}"
class="ICSharpCode.SharpDevelop.Dom.ClassBrowser.OpenInClassBrowserCommand"/>
<MenuItem id="Separator1" type="Separator" />
<Include id="Rename" item="/SharpDevelop/Workbench/MainMenu/Search/Rename" /> <Include id="Rename" item="/SharpDevelop/Workbench/MainMenu/Search/Rename" />
<MenuItem id = "FindReferences" <MenuItem id = "FindReferences"
label = "${res:SharpDevelop.Refactoring.FindReferencesCommand}" label = "${res:SharpDevelop.Refactoring.FindReferencesCommand}"

12
src/Main/Base/Project/Parser/ProjectContentContainer.cs

@ -460,8 +460,10 @@ namespace ICSharpCode.SharpDevelop.Parser
projectContent = projectContent.RemoveAssemblyReferences(this.references).AddAssemblyReferences(newReferences); projectContent = projectContent.RemoveAssemblyReferences(this.references).AddAssemblyReferences(newReferences);
this.references = newReferences.ToArray(); this.references = newReferences.ToArray();
SD.ParserService.InvalidateCurrentSolutionSnapshot(); SD.ParserService.InvalidateCurrentSolutionSnapshot();
assemblyModel.UpdateReferences(projectContent.AssemblyReferences SD.MainThread.InvokeAsyncAndForget(
.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList()); delegate {
assemblyModel.UpdateReferences(projectContent.AssemblyReferences.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList());
});
} }
} }
} }
@ -488,8 +490,10 @@ namespace ICSharpCode.SharpDevelop.Parser
this.references[index] = e.NewAssembly; this.references[index] = e.NewAssembly;
projectContent = projectContent.RemoveAssemblyReferences(e.OldAssembly).AddAssemblyReferences(e.NewAssembly); projectContent = projectContent.RemoveAssemblyReferences(e.OldAssembly).AddAssemblyReferences(e.NewAssembly);
SD.ParserService.InvalidateCurrentSolutionSnapshot(); SD.ParserService.InvalidateCurrentSolutionSnapshot();
assemblyModel.UpdateReferences(projectContent.AssemblyReferences SD.MainThread.InvokeAsyncAndForget(
.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList()); delegate {
assemblyModel.UpdateReferences(projectContent.AssemblyReferences.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList());
});
} }
} }
} }

8
src/Main/SharpDevelop/Dom/AssemblyReferenceModel.cs

@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public class AssemblyReferencesModel : IAssemblyReferencesModel public class AssemblyReferencesModel : IAssemblyReferencesModel
{ {
IAssemblyModel parentAssemblyModel; IAssemblyModel parentAssemblyModel;
private NullSafeSimpleModelCollection<IAssemblyReferenceModel> assemblyNames; NullSafeSimpleModelCollection<IAssemblyReferenceModel> assemblyNames;
public AssemblyReferencesModel(IAssemblyModel parentAssemblyModel) public AssemblyReferencesModel(IAssemblyModel parentAssemblyModel)
{ {
@ -32,6 +32,12 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
public IAssemblyModel ParentAssemblyModel {
get {
return parentAssemblyModel;
}
}
public void Update(IReadOnlyList<DomAssemblyName> references) public void Update(IReadOnlyList<DomAssemblyName> references)
{ {
assemblyNames.Clear(); assemblyNames.Clear();

84
src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

@ -5,11 +5,14 @@ using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Editor.Commands; using ICSharpCode.SharpDevelop.Editor.Commands;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project;
using Microsoft.Win32; using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
@ -163,4 +166,85 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
} }
} }
/// <summary>
/// AddProjectReferenceCommand
/// </summary>
class AddProjectReferenceCommand : SimpleCommand
{
public override bool CanExecute(object parameter)
{
var assemblyReferencesModel = parameter as IAssemblyReferencesModel;
if (assemblyReferencesModel != null) {
IAssemblyModel assemblyModel = assemblyReferencesModel.ParentAssemblyModel;
if ((assemblyModel != null) && (assemblyModel.Context != null)) {
return assemblyModel.Context.Project != null;
}
}
return false;
}
public override void Execute(object parameter)
{
IAssemblyReferencesModel assemblyReferencesModel = parameter as IAssemblyReferencesModel;
if (assemblyReferencesModel != null) {
IAssemblyModel assemblyModel = assemblyReferencesModel.ParentAssemblyModel;
if ((assemblyModel != null) && (assemblyModel.Context != null)) {
IProject project = (parameter != null) ? assemblyModel.Context.Project : ProjectService.CurrentProject;
if (project == null) {
return;
}
using (SelectReferenceDialog selDialog = new SelectReferenceDialog(project)) {
if (selDialog.ShowDialog(SD.WinForms.MainWin32Window) == System.Windows.Forms.DialogResult.OK) {
foreach (ReferenceProjectItem reference in selDialog.ReferenceInformations) {
ProjectService.AddProjectItem(project, reference);
}
project.Save();
}
}
}
}
}
}
/// <summary>
/// RemoveProjectReferenceCommand
/// </summary>
class RemoveProjectReferenceCommand : SimpleCommand
{
public override bool CanExecute(object parameter)
{
var assemblyReferenceModel = parameter as IAssemblyReferenceModel;
if (assemblyReferenceModel != null) {
IAssemblyModel assemblyModel = assemblyReferenceModel.ParentAssemblyModel;
if ((assemblyModel != null) && (assemblyModel.Context != null)) {
return assemblyModel.Context.Project != null;
}
}
return false;
}
public override void Execute(object parameter)
{
IAssemblyReferenceModel assemblyReferenceModel = parameter as IAssemblyReferenceModel;
if (assemblyReferenceModel != null) {
IAssemblyModel assemblyModel = assemblyReferenceModel.ParentAssemblyModel;
if ((assemblyModel != null) && (assemblyModel.Context != null)) {
IProject project = (parameter != null) ? assemblyModel.Context.Project : ProjectService.CurrentProject;
if (project == null) {
return;
}
// TODO Matching item.Include == ShortName fails for interop assemblies, because they are calld "Interop..."
ReferenceProjectItem referenceProjectItem =
project.Items.FirstOrDefault(item => (item.Include == assemblyReferenceModel.AssemblyName.ShortName) && ItemType.ReferenceItemTypes.Contains(item.ItemType)) as ReferenceProjectItem;
if (referenceProjectItem != null) {
ProjectService.RemoveProjectItem(referenceProjectItem.Project, referenceProjectItem);
project.Save();
}
}
}
}
}
} }

Loading…
Cancel
Save