Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs')
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs47
1 files changed, 40 insertions, 7 deletions
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
index 7739ce1084..4484afcad9 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
@@ -46,6 +46,8 @@ namespace MonoDevelop.CSharp
{
IdeApp.Workspace.FileAddedToProject -= HandleProjectChanged;
IdeApp.Workspace.FileRemovedFromProject -= HandleProjectChanged;
+ IdeApp.Workspace.WorkspaceItemUnloaded -= HandleWorkspaceItemUnloaded;
+ IdeApp.Workspace.WorkspaceItemLoaded -= HandleWorkspaceItemLoaded;;
if (caret != null) {
caret.PositionChanged -= UpdatePath;
@@ -65,20 +67,46 @@ namespace MonoDevelop.CSharp
Mono.TextEditor.Caret caret;
CSharpCompletionTextEditorExtension ext;
- List<DotNetProject> ownerProjects;
+ List<DotNetProject> ownerProjects = new List<DotNetProject> ();
public override void Initialize ()
{
CurrentPath = new PathEntry[] { new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = null } };
isPathSet = false;
- UpdateOwnerProjects ();
- UpdatePath (null, null);
+ // Delay the execution of UpdateOwnerProjects since it may end calling Document.AttachToProject,
+ // which shouldn't be called while the extension chain is being initialized.
+ Gtk.Application.Invoke (delegate {
+ UpdateOwnerProjects ();
+ UpdatePath (null, null);
+ });
caret = Document.Editor.Caret;
caret.PositionChanged += UpdatePath;
ext = Document.GetContent<CSharpCompletionTextEditorExtension> ();
ext.TypeSegmentTreeUpdated += HandleTypeSegmentTreeUpdated;
IdeApp.Workspace.FileAddedToProject += HandleProjectChanged;
IdeApp.Workspace.FileRemovedFromProject += HandleProjectChanged;
+ IdeApp.Workspace.WorkspaceItemUnloaded += HandleWorkspaceItemUnloaded;
+ IdeApp.Workspace.WorkspaceItemLoaded += HandleWorkspaceItemLoaded;;
+ }
+
+ void HandleWorkspaceItemLoaded (object sender, WorkspaceItemEventArgs e)
+ {
+ if (ownerProjects != null)
+ return;
+ UpdateOwnerProjects (e.Item.GetAllItems<DotNetProject> ());
+ }
+
+ void HandleWorkspaceItemUnloaded (object sender, WorkspaceItemEventArgs e)
+ {
+ if (ownerProjects == null)
+ return;
+ foreach (var p in e.Item.GetAllItems<DotNetProject> ()) {
+ ownerProjects.Remove (p);
+ }
+ if (ownerProjects.Count == 0) {
+ ownerProjects = null;
+ Document.AttachToProject (null);
+ }
}
void HandleProjectChanged (object sender, ProjectFileEventArgs e)
@@ -92,9 +120,9 @@ namespace MonoDevelop.CSharp
UpdatePath (null, null);
}
- void UpdateOwnerProjects ()
+ void UpdateOwnerProjects (IEnumerable<DotNetProject> allProjects)
{
- var projects = new HashSet<DotNetProject> (IdeApp.Workspace.GetAllSolutionItems<DotNetProject> ().Where (p => p.IsFileInProject (Document.FileName)));
+ var projects = new HashSet<DotNetProject> (allProjects.Where (p => p.IsFileInProject (Document.FileName)));
if (ownerProjects == null || !projects.SetEquals (ownerProjects)) {
ownerProjects = projects.OrderBy (p => p.Name).ToList ();
var dnp = Document.Project as DotNetProject;
@@ -106,6 +134,11 @@ namespace MonoDevelop.CSharp
Document.AttachToProject (pp);
}
}
+ }
+
+ void UpdateOwnerProjects ()
+ {
+ UpdateOwnerProjects (IdeApp.Workspace.GetAllItems<DotNetProject> ());
if (Document.Project == null && ownerProjects.Count > 0)
Document.AttachToProject (ownerProjects[0]);
}
@@ -481,7 +514,7 @@ namespace MonoDevelop.CSharp
var curType = (EntityDeclaration)unit.GetNodeAt (loc, n => n is TypeDeclaration || n is DelegateDeclaration);
- var curProject = ownerProjects.Count > 1 ? Document.Project : null;
+ var curProject = ownerProjects != null && ownerProjects.Count > 1 ? Document.Project : null;
var segMember = compExt.GetMemberAt (caretOffset);
if (segMember != null) {
@@ -512,7 +545,7 @@ namespace MonoDevelop.CSharp
var result = new List<PathEntry> ();
- if (ownerProjects.Count > 1) {
+ if (ownerProjects != null && ownerProjects.Count > 1) {
// Current project if there is more than one
result.Add (new PathEntry (ImageService.GetIcon (Document.Project.StockIcon, Gtk.IconSize.Menu), GLib.Markup.EscapeText (Document.Project.Name)) { Tag = Document.Project });
}