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
path: root/main
diff options
context:
space:
mode:
authorRodrigo Moya <rodrigo.moya@xamarin.com>2018-10-20 21:55:31 +0300
committerRodrigo Moya <rodrigo.moya@xamarin.com>2018-11-27 21:27:19 +0300
commit7643be8596460949631a561900f0ec5bc87a28cb (patch)
tree4b7b0fa59a68c0ea2d387b6d918e128dc4a1664a /main
parent6af5f52d0794092a0d96bf014e398fca9a6470c6 (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')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/FileCommands.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Extensions/IdeCustomizer.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Workbench.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects/GtkNewProjectDialogBackend.UI.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/IWelcomeWindowProvider.cs39
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageCommands.cs3
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs66
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/Ide.cs16
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/IdeStartup.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/MessageService.cs23
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ProjectOperations.cs18
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)