diff options
author | iain holmes <iain@xamarin.com> | 2017-03-24 19:19:26 +0300 |
---|---|---|
committer | iain holmes <iain@xamarin.com> | 2017-03-24 19:19:26 +0300 |
commit | bd2451eca9298de8b0952cc4484170584d144efc (patch) | |
tree | 3919b1d6205d379427cb2271763a90be981a3db4 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui | |
parent | 702a941a589d68451c0d8163557fe979eaf0dc1e (diff) | |
parent | 84efb9eaea49a3f4bcaeeae46d1c4e86512dc709 (diff) |
Merge remote-tracking branch 'upstream/master' into a11y
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui')
6 files changed, 42 insertions, 28 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs index d82ef5a3aa..e84e999093 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs @@ -712,13 +712,21 @@ namespace MonoDevelop.Ide.Gui } } } - - protected /*override*/ void OnClosing(object o, Gtk.DeleteEventArgs e) + + bool closing; + protected /*override*/ async void OnClosing(object o, Gtk.DeleteEventArgs e) { - if (Close()) { + // close the window in case DeleteEvent fires again after a successful close + if (closing) + return; + + // don't allow Gtk to close the workspace, in case Close() leaves the synchronization context + // Gtk.Application.Quit () will handle it for us. + e.RetVal = true; + if (await Close ()) { + closing = true; + Destroy (); // default delete action Gtk.Application.Quit (); - } else { - e.RetVal = true; } } @@ -745,7 +753,7 @@ namespace MonoDevelop.Ide.Gui Destroy (); } - public bool Close() + public async Task<bool> Close() { if (!IdeApp.OnExit ()) return false; @@ -770,7 +778,7 @@ namespace MonoDevelop.Ide.Gui } } - if (!IdeApp.Workspace.Close (false, false)) + if (!await IdeApp.Workspace.Close (false, false)) return false; CloseAllViews (); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs index 56481b7d61..cd11281506 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs @@ -60,6 +60,7 @@ using MonoDevelop.Ide.Editor.Extension; using System.Collections.Immutable; using MonoDevelop.Ide.Editor.TextMate; using MonoDevelop.Core.Assemblies; +using Roslyn.Utilities; namespace MonoDevelop.Ide.Gui { @@ -516,9 +517,9 @@ namespace MonoDevelop.Ide.Gui await UpdateParseDocument (); } - public bool Close () + public async Task<bool> Close () { - return ((SdiWorkspaceWindow)Window).CloseWindow (false, true); + return await ((SdiWorkspaceWindow)Window).CloseWindow (false, true); } protected override void OnSaved (EventArgs e) @@ -828,11 +829,11 @@ namespace MonoDevelop.Ide.Gui doc = null; } if (doc != null) - return SpecializedTasks.EmptyTask; + return Task.CompletedTask; } if (Editor == null) { UnsubscibeAnalysisdocument (); - return SpecializedTasks.EmptyTask; + return Task.CompletedTask; } if (Project != null && !IsUnreferencedSharedProject(Project)) { UnsubscribeRoslynWorkspace (); @@ -846,7 +847,7 @@ namespace MonoDevelop.Ide.Gui lock (adhocProjectLock) { var token = analysisDocumentSrc.Token; if (adhocProject != null) { - return SpecializedTasks.EmptyTask; + return Task.CompletedTask; } if (Editor != null) { @@ -887,7 +888,7 @@ namespace MonoDevelop.Ide.Gui } } } - return SpecializedTasks.EmptyTask; + return Task.CompletedTask; } void UnsubscribeRoslynWorkspace () diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/HiddenWorkbenchWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/HiddenWorkbenchWindow.cs index 34d6fef15f..b5e3110a4e 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/HiddenWorkbenchWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/HiddenWorkbenchWindow.cs @@ -26,6 +26,7 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Mono.Addins; namespace MonoDevelop.Ide.Gui @@ -74,9 +75,9 @@ namespace MonoDevelop.Ide.Gui set {} } - public bool CloseWindow (bool force) + public Task<bool> CloseWindow (bool force) { - return true; + return Task.FromResult (true); } public void SelectWindow () @@ -112,7 +113,7 @@ namespace MonoDevelop.Ide.Gui public event EventHandler TitleChanged { add {} remove {} } public event EventHandler DocumentChanged { add {} remove {} } - public event MonoDevelop.Ide.Gui.WorkbenchWindowEventHandler Closing { add {} remove {} } + public event MonoDevelop.Ide.Gui.WorkbenchWindowAsyncEventHandler Closing { add {} remove {} } public event MonoDevelop.Ide.Gui.WorkbenchWindowEventHandler Closed { add {} remove {} } public event MonoDevelop.Ide.Gui.ActiveViewContentEventHandler ActiveViewContentChanged { add {} remove {} } public event EventHandler ViewsChanged { add {} remove {} } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/IWorkbenchWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/IWorkbenchWindow.cs index 8bcc0cde5c..4614f4fe51 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/IWorkbenchWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/IWorkbenchWindow.cs @@ -30,6 +30,7 @@ using System.ComponentModel; using System.Collections.Generic; using Mono.Addins; using MonoDevelop.Components.Docking; +using System.Threading.Tasks; namespace MonoDevelop.Ide.Gui { @@ -53,7 +54,7 @@ namespace MonoDevelop.Ide.Gui void SwitchView (BaseViewContent subViewContent); int FindView <T>(); - bool CloseWindow (bool force); + Task<bool> CloseWindow (bool force); void SelectWindow (); /// <summary> @@ -63,11 +64,12 @@ namespace MonoDevelop.Ide.Gui event EventHandler DocumentChanged; event WorkbenchWindowEventHandler Closed; - event WorkbenchWindowEventHandler Closing; + event WorkbenchWindowAsyncEventHandler Closing; event ActiveViewContentEventHandler ActiveViewContentChanged; event EventHandler ViewsChanged; } + public delegate Task WorkbenchWindowAsyncEventHandler (object o, WorkbenchWindowEventArgs e); public delegate void WorkbenchWindowEventHandler (object o, WorkbenchWindowEventArgs e); public class WorkbenchWindowEventArgs : CancelEventArgs { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs index 3dd6ed980c..e920151871 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs @@ -39,6 +39,7 @@ using MonoDevelop.Components.Commands; using MonoDevelop.Ide.Extensions; using MonoDevelop.Ide.Gui.Content; using MonoDevelop.Components.DockNotebook; +using System.Threading.Tasks; namespace MonoDevelop.Ide.Gui { @@ -445,17 +446,17 @@ namespace MonoDevelop.Ide.Gui } } - public bool CloseWindow (bool force) + public Task<bool> CloseWindow (bool force) { return CloseWindow (force, false); } - public bool CloseWindow (bool force, bool animate) + public async Task<bool> CloseWindow (bool force, bool animate) { bool wasActive = workbench.ActiveWorkbenchWindow == this; WorkbenchWindowEventArgs args = new WorkbenchWindowEventArgs (force, wasActive); args.Cancel = false; - OnClosing (args); + await OnClosing (args); if (args.Cancel) return false; @@ -811,10 +812,11 @@ namespace MonoDevelop.Ide.Gui } } - protected virtual void OnClosing (WorkbenchWindowEventArgs e) + protected virtual async Task OnClosing (WorkbenchWindowEventArgs e) { if (Closing != null) { - Closing (this, e); + foreach (var handler in Closing.GetInvocationList ().Cast<WorkbenchWindowAsyncEventHandler> ()) + await handler (this, e); } } @@ -833,7 +835,7 @@ namespace MonoDevelop.Ide.Gui public event EventHandler TitleChanged; public event WorkbenchWindowEventHandler Closed; - public event WorkbenchWindowEventHandler Closing; + public event WorkbenchWindowAsyncEventHandler Closing; public event ActiveViewContentEventHandler ActiveViewContentChanged; } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs index 324f2fc919..2840b11442 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs @@ -142,9 +142,9 @@ namespace MonoDevelop.Ide.Gui Present (); } - internal bool Close () + internal async Task<bool> Close () { - return workbench.Close(); + return await workbench.Close(); } public ImmutableList<Document> Documents { @@ -584,7 +584,7 @@ namespace MonoDevelop.Ide.Gui } return doc; } else { - if (!doc.Close ()) + if (!await doc.Close ()) return doc; break; } @@ -841,7 +841,7 @@ namespace MonoDevelop.Ide.Gui return pad; } - async void OnWindowClosing (object sender, WorkbenchWindowEventArgs args) + async Task OnWindowClosing (object sender, WorkbenchWindowEventArgs args) { var window = (IWorkbenchWindow) sender; var viewContent = window.ViewContent; |