diff options
author | Rodrigo Moya <rodrigo.moya@xamarin.com> | 2018-10-20 21:55:31 +0300 |
---|---|---|
committer | Rodrigo Moya <rodrigo.moya@xamarin.com> | 2018-11-27 21:27:19 +0300 |
commit | 7643be8596460949631a561900f0ec5bc87a28cb (patch) | |
tree | 4b7b0fa59a68c0ea2d387b6d918e128dc4a1664a /main | |
parent | 6af5f52d0794092a0d96bf014e398fca9a6470c6 (diff) |
[Ide] Add support for Welcome dialog providers
If there's a dialog provider for the welcome page, prefer that, and only use
Widget version of it as a fallback. And when so, give control to that
window, hiding the main window.
Diffstat (limited to 'main')
13 files changed, 143 insertions, 43 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs index 4e9b56c683..034e335011 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs @@ -132,7 +132,7 @@ namespace MonoDevelop.Ide.Commands { protected override void Run () { - IdeApp.ProjectOperations.NewSolution (); + IdeApp.ProjectOperations.NewSolution ().Ignore (); } } @@ -141,7 +141,7 @@ namespace MonoDevelop.Ide.Commands { protected override void Run () { - IdeApp.ProjectOperations.NewSolution ("MonoDevelop.Workspace"); + IdeApp.ProjectOperations.NewSolution ("MonoDevelop.Workspace").Ignore (); } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Extensions/IdeCustomizer.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Extensions/IdeCustomizer.cs index 70d187388a..ad13837725 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Extensions/IdeCustomizer.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Extensions/IdeCustomizer.cs @@ -54,7 +54,7 @@ namespace MonoDevelop.Ide.Extensions /// <summary> /// Called when the Ide has been initialized /// </summary> - internal protected virtual void OnIdeInitialized () + internal protected virtual void OnIdeInitialized (bool hideWelcomePage) { } 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 9c52e25224..36f1a59736 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs @@ -840,7 +840,7 @@ namespace MonoDevelop.Ide.Gui if (lastActive == ActiveWorkbenchWindow) return; - WelcomePage.WelcomePageService.HideWelcomePage (); + WelcomePage.WelcomePageService.HideWelcomePageOrWindow (); if (lastActive != null) ((SdiWorkspaceWindow)lastActive).OnDeactivated (); @@ -1421,7 +1421,7 @@ namespace MonoDevelop.Ide.Gui public void ActivatePad (PadCodon padContent, bool giveFocus) { - WelcomePage.WelcomePageService.HideWelcomePage (); + WelcomePage.WelcomePageService.HideWelcomePageOrWindow (); DockItem item = GetDockItem (padContent); if (item != null) 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 4921a6b4ea..464a5d38b7 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs @@ -758,7 +758,7 @@ namespace MonoDevelop.Ide.Gui public void ShowGlobalPreferencesDialog (Window parentWindow, string panelId, Action<OptionsDialog> configurationAction = null) { - if (parentWindow == null) + if (parentWindow == null && IdeApp.Workbench.RootWindow.Visible) parentWindow = IdeApp.Workbench.RootWindow; OptionsDialog ops = new OptionsDialog ( diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/GtkNewProjectDialogBackend.UI.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/GtkNewProjectDialogBackend.UI.cs index 86c9a4e153..2406ebf41f 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/GtkNewProjectDialogBackend.UI.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/GtkNewProjectDialogBackend.UI.cs @@ -107,7 +107,9 @@ namespace MonoDevelop.Ide.Projects Name = "wizard_dialog";
Title = GettextCatalog.GetString ("New Project");
WindowPosition = WindowPosition.CenterOnParent;
- TransientFor = IdeApp.Workbench.RootWindow;
+ if (IdeApp.Workbench.RootWindow.Visible) { + TransientFor = IdeApp.Workbench.RootWindow; + }
projectConfigurationWidget = new GtkProjectConfigurationWidget ();
projectConfigurationWidget.Name = "projectConfigurationWidget";
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/IWelcomeWindowProvider.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/IWelcomeWindowProvider.cs new file mode 100644 index 0000000000..4214dc7afc --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/IWelcomeWindowProvider.cs @@ -0,0 +1,39 @@ +// +// IWelcomeDialogProvider.cs +// +// Author: +// Rodrigo Moya <rodrigo.moya@xamarin.com> +// +// Copyright (c) 2018 Microsoft Inc. (http://microsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using MonoDevelop.Components; +using Mono.Addins; + +namespace MonoDevelop.Ide.WelcomePage +{ + [TypeExtensionPoint] + public interface IWelcomeWindowProvider + { + Window CreateWindow (); + void ShowWindow (Window window); + void HideWindow (Window window); + } +} diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageCommands.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageCommands.cs index 8ad65a3ebf..6c7d3ddc20 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageCommands.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageCommands.cs @@ -39,7 +39,7 @@ namespace MonoDevelop.Ide.WelcomePage { public static void Show () { - WelcomePageService.ShowWelcomePage (true); + WelcomePageService.ShowWelcomePageOrWindow (); } protected override void Run() @@ -49,6 +49,7 @@ namespace MonoDevelop.Ide.WelcomePage protected override void Update (CommandInfo info) { + info.Text = WelcomePageService.HasWindowImplementation ? GettextCatalog.GetString ("Start Window") : GettextCatalog.GetString ("Welcome Page"); base.Update (info); } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs index 5e6f1a2a0b..4ee9199bf4 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs @@ -27,6 +27,7 @@ using System; using MonoDevelop.Ide.Gui; using Mono.Addins; using System.Linq; +using MonoDevelop.Components; namespace MonoDevelop.Ide.WelcomePage { @@ -34,29 +35,60 @@ namespace MonoDevelop.Ide.WelcomePage { static bool visible; static WelcomePageFrame welcomePage; + static IWelcomeWindowProvider welcomeWindowProvider; + static Window welcomeWindow; public static event EventHandler WelcomePageShown; public static event EventHandler WelcomePageHidden; internal static void Initialize () { + IdeApp.Workbench.RootWindow.Hidden += (sender, e) => { + if (!IdeApp.IsExiting && HasWindowImplementation) { + ShowWelcomeWindow (); + } + }; IdeApp.Workspace.FirstWorkspaceItemOpened += delegate { - HideWelcomePage (); + HideWelcomePageOrWindow (); }; IdeApp.Workspace.LastWorkspaceItemClosed += delegate { - ShowWelcomePage (); + if (!IdeApp.IsExiting && !IdeApp.Workspace.WorkspaceItemIsOpening) { + ShowWelcomePageOrWindow (); + } }; IdeApp.Workbench.DocumentOpened += delegate { - HideWelcomePage (); + HideWelcomePageOrWindow (); }; IdeApp.Workbench.DocumentClosed += delegate { - if (IdeApp.Workbench.Documents.Count == 0 && !IdeApp.Workspace.IsOpen) - ShowWelcomePage (); + if (!IdeApp.IsExiting && IdeApp.Workbench.Documents.Count == 0 && !IdeApp.Workspace.IsOpen) { + ShowWelcomePageOrWindow (); + } }; } - public static bool WelcomePageVisible { - get { return visible; } + public static bool WelcomePageVisible => visible; + + public static bool WelcomeWindowVisible => welcomeWindow != null && visible; + + public static bool HasWindowImplementation => AddinManager.GetExtensionObjects<IWelcomeWindowProvider> ().Any (); + + public static void ShowWelcomePageOrWindow (bool animate = false) + { + // Try to get a dialog version of the "welcome screen" first + if (!ShowWelcomeWindow ()) { + ShowWelcomePage (); + } + } + + public static void HideWelcomePageOrWindow (bool animate = false) + { + if (HasWindowImplementation && welcomeWindowProvider != null && welcomeWindow != null) { + welcomeWindowProvider.HideWindow (welcomeWindow); + } else { + HideWelcomePage (animate); + } + + visible = false; } public static void ShowWelcomePage (bool animate = false) @@ -84,6 +116,26 @@ namespace MonoDevelop.Ide.WelcomePage } WelcomePageHidden?.Invoke (welcomePage, EventArgs.Empty); } + + public static bool ShowWelcomeWindow () + { + if (welcomeWindowProvider == null) { + welcomeWindowProvider = AddinManager.GetExtensionObjects<IWelcomeWindowProvider> ().FirstOrDefault (); + if (welcomeWindowProvider == null) + return false; + } + + if (welcomeWindow == null) { + welcomeWindow = welcomeWindowProvider.CreateWindow (); + if (welcomeWindow == null) + return false; + } + + welcomeWindowProvider.ShowWindow (welcomeWindow); + visible = true; + + return true; + } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj index 49c37ff669..dca5464845 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj @@ -4224,6 +4224,7 @@ <Compile Include="MonoDevelop.Ide.RoslynServices\RoslynLogger.cs" /> <Compile Include="MonoDevelop.Ide.RoslynServices\RoslynFileLogger.cs" /> <Compile Include="MonoDevelop.Components\Mac\KeyCodes.cs" /> + <Compile Include="MonoDevelop.Ide.WelcomePage\IWelcomeWindowProvider.cs" /> </ItemGroup> <ItemGroup> <Data Include="options\DefaultEditingLayout.xml" /> diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs index a0e395733b..2387be797b 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs @@ -78,14 +78,14 @@ namespace MonoDevelop.Ide static EventHandler initializedEvent; public static event EventHandler Initialized { add { - Runtime.RunInMainThread (() => {
- if (isInitialized) value (null, EventArgs.Empty);
+ Runtime.RunInMainThread (() => { + if (isInitialized) value (null, EventArgs.Empty); else initializedEvent += value; }); } - remove {
- Runtime.RunInMainThread (() => {
- initializedEvent -= value;
+ remove { + Runtime.RunInMainThread (() => { + initializedEvent -= value; }); } } @@ -265,7 +265,7 @@ namespace MonoDevelop.Ide commandService.EnableIdleUpdate = true; if (Customizer != null) - Customizer.OnIdeInitialized (); + Customizer.OnIdeInitialized (hideWelcomePage); // Startup commands Counters.Initialization.Trace ("Running Startup Commands"); @@ -465,16 +465,20 @@ namespace MonoDevelop.Ide get { return isMainRunning; } } + public static bool IsExiting { get; private set; } + /// <summary> /// Exits MonoDevelop. Returns false if the user cancels exiting. /// </summary> public static async Task<bool> Exit () { + IsExiting = true; if (await workbench.Close ()) { Gtk.Application.Quit (); isMainRunning = false; return true; } + IsExiting = false; return false; } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/IdeStartup.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/IdeStartup.cs index 99e8e6bda6..8414c56497 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/IdeStartup.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/IdeStartup.cs @@ -465,12 +465,12 @@ namespace MonoDevelop.Ide Composition.CompositionManager.InitializeAsync ().Ignore (); // OpenDocuments appears when the app is idle. - if (!hideWelcomePage) { + if (!hideWelcomePage && !WelcomePage.WelcomePageService.HasWindowImplementation) { WelcomePage.WelcomePageService.ShowWelcomePage (); Counters.Initialization.Trace ("Showed welcome page"); + IdeApp.Workbench.Show (); } - IdeApp.Workbench.Show (); return false; } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/MessageService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/MessageService.cs index 1dba998a37..bb489bf7e6 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/MessageService.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/MessageService.cs @@ -310,17 +310,6 @@ namespace MonoDevelop.Ide { // if dialog is modal, make sure it's parented on any existing modal dialog Gtk.Dialog dialog = dlg; - if (dialog.Modal) { - parent = GetDefaultModalParent (); - } - - //ensure the dialog has a parent - if (parent == null) { - parent = dialog.TransientFor ?? RootWindow; - } - - dialog.TransientFor = parent; - dialog.DestroyWithParent = true; MonoDevelop.Components.IdeTheme.ApplyTheme (dialog); if (dialog.Title == null) @@ -335,6 +324,18 @@ namespace MonoDevelop.Ide else PlaceDialog (dialog, parent); }).Wait (); + #else + if (dialog.Modal) { + parent = GetDefaultModalParent (); + } + + //ensure the dialog has a parent + if (parent == null) { + parent = dialog.TransientFor ?? RootWindow; + } + + dialog.TransientFor = parent; + dialog.DestroyWithParent = true; #endif try { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs index d57bfed022..a95c85d240 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs @@ -692,27 +692,27 @@ namespace MonoDevelop.Ide } } } - - public void NewSolution () + + public Task<bool> NewSolution () { - NewSolution (null); + return NewSolution (null); } - - public void NewSolution (string defaultTemplate) + + public Task<bool> NewSolution (string defaultTemplate) { - NewSolution (defaultTemplate, true); + return NewSolution (defaultTemplate, true); } - public async void NewSolution (string defaultTemplate, bool showTemplateSelection) + public async Task<bool> NewSolution (string defaultTemplate, bool showTemplateSelection) { if (!await IdeApp.Workbench.SaveAllDirtyFiles ()) - return; + return false; var newProjectDialog = new NewProjectDialogController (); newProjectDialog.OpenSolution = true; newProjectDialog.SelectedTemplateId = defaultTemplate; newProjectDialog.ShowTemplateSelection = showTemplateSelection; - newProjectDialog.Show (); + return newProjectDialog.Show (); } public Task<WorkspaceItem> AddNewWorkspaceItem (Workspace parentWorkspace) |