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 @@ @@ -3,6 +3,7 @@
using System;
using System.Linq;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Parser;
@ -13,21 +14,26 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -13,21 +14,26 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
/// </summary>
public class AssemblyReferencesTreeNode : ModelCollectionTreeNode
{
private IAssemblyReferencesModel referencesModel;
private IAssemblyReferencesModel model;
private string text;
public AssemblyReferencesTreeNode(IAssemblyReferencesModel referencesModel)
{
if (referencesModel == null)
throw new ArgumentNullException("referencesModel");
this.referencesModel = referencesModel;
this.model = referencesModel;
this.text = SD.ResourceService.GetString("ICSharpCode.SharpDevelop.Commands.ProjectBrowser.ReferencesNodeText");
}
protected override object GetModel()
{
return model;
}
protected override IModelCollection<object> ModelChildren
{
get {
return referencesModel.AssemblyNames;
return model.AssemblyNames;
}
}
@ -51,5 +57,13 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -51,5 +57,13 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
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 @@ @@ -2,7 +2,6 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom

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

@ -2,8 +2,6 @@ @@ -2,8 +2,6 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom
{
@ -13,6 +11,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -13,6 +11,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public interface IAssemblyReferencesModel
{
IModelCollection<IAssemblyReferenceModel> AssemblyNames { get; }
IAssemblyModel ParentAssemblyModel { get; }
}
/// <summary>
@ -30,5 +29,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -30,5 +29,12 @@ namespace ICSharpCode.SharpDevelop.Dom
return EmptyReferenceCollection;
}
}
public IAssemblyModel ParentAssemblyModel
{
get {
return EmptyAssemblyModel.Instance;
}
}
}
}

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

@ -1013,19 +1013,21 @@ @@ -1013,19 +1013,21 @@
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.RemoveAssemblyCommand"/>
</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">
<MenuItem id = "PermanentlyAddToWorkspace"
label = "${res:MainWindow.Windows.ClassBrowser.AddToWorkspace}"
icon = "Icons.16x16.AssemblyFromFile"
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.PermanentlyAddModuleToWorkspaceCommand"/>
</Path>
<Path name="/SharpDevelop/EntityContextMenu">
<MenuItem id="OpenInClassBrowser"
icon="ILSpy"
type="Item"
label="${res:MainWindow.Windows.ClassBrowser.OpenInClassBrowser}"
class="ICSharpCode.SharpDevelop.Dom.ClassBrowser.OpenInClassBrowserCommand"/>
<MenuItem id = "Remove"
label = "${res:Global.RemoveButtonText}"
icon = "Icons.16x16.DeleteIcon"
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.RemoveProjectReferenceCommand"/>
</Path>
<!-- end ClassBrowser -->
@ -2017,6 +2019,13 @@ @@ -2017,6 +2019,13 @@
<Path name = "/SharpDevelop/EntityContextMenu">
<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" />
<MenuItem id = "FindReferences"
label = "${res:SharpDevelop.Refactoring.FindReferencesCommand}"

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

@ -460,8 +460,10 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -460,8 +460,10 @@ namespace ICSharpCode.SharpDevelop.Parser
projectContent = projectContent.RemoveAssemblyReferences(this.references).AddAssemblyReferences(newReferences);
this.references = newReferences.ToArray();
SD.ParserService.InvalidateCurrentSolutionSnapshot();
assemblyModel.UpdateReferences(projectContent.AssemblyReferences
.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList());
SD.MainThread.InvokeAsyncAndForget(
delegate {
assemblyModel.UpdateReferences(projectContent.AssemblyReferences.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList());
});
}
}
}
@ -488,8 +490,10 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -488,8 +490,10 @@ namespace ICSharpCode.SharpDevelop.Parser
this.references[index] = e.NewAssembly;
projectContent = projectContent.RemoveAssemblyReferences(e.OldAssembly).AddAssemblyReferences(e.NewAssembly);
SD.ParserService.InvalidateCurrentSolutionSnapshot();
assemblyModel.UpdateReferences(projectContent.AssemblyReferences
.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList());
SD.MainThread.InvokeAsyncAndForget(
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 @@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public class AssemblyReferencesModel : IAssemblyReferencesModel
{
IAssemblyModel parentAssemblyModel;
private NullSafeSimpleModelCollection<IAssemblyReferenceModel> assemblyNames;
NullSafeSimpleModelCollection<IAssemblyReferenceModel> assemblyNames;
public AssemblyReferencesModel(IAssemblyModel parentAssemblyModel)
{
@ -32,6 +32,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -32,6 +32,12 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public IAssemblyModel ParentAssemblyModel {
get {
return parentAssemblyModel;
}
}
public void Update(IReadOnlyList<DomAssemblyName> references)
{
assemblyNames.Clear();

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

@ -5,11 +5,14 @@ using System; @@ -5,11 +5,14 @@ using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Editor.Commands;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project;
using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
@ -163,4 +166,85 @@ 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