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:
authorVsevolod Kukol <sevoku@microsoft.com>2016-12-09 21:38:18 +0300
committerVsevolod Kukol <sevoku@microsoft.com>2016-12-09 21:38:18 +0300
commit3af85bdf275fba019c5a28f3ee274ea81f4815b6 (patch)
tree17934074407c45bd5f53688a2fbea8511d91bb36 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates
parent40d078b1421c09efb4b04e1bdf8f6ad9cecbc34d (diff)
parent20fa5ab3fbebe2dbc29124758134996212beb168 (diff)
Merge remote-tracking branch 'origin/recent-templates' into vNext
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionTemplate.cs35
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TemplatingService.cs123
2 files changed, 156 insertions, 2 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionTemplate.cs
index e45e0f4e6a..a43f079f77 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionTemplate.cs
@@ -32,7 +32,7 @@ using MonoDevelop.Projects;
namespace MonoDevelop.Ide.Templates
{
- public class SolutionTemplate
+ public class SolutionTemplate : IEquatable<SolutionTemplate>
{
public static readonly string DefaultImageId = "md-project";
@@ -210,6 +210,39 @@ namespace MonoDevelop.Ide.Templates
{
return (Visibility == visibility) || (Visibility == SolutionTemplateVisibility.All);
}
+
+ public static bool operator == (SolutionTemplate template1, SolutionTemplate template2)
+ {
+ if (ReferenceEquals (template1, template2))
+ return true;
+
+ if (((object)template1 == null) || ((object)template2 == null))
+ return false;
+
+ return template1.Equals (template2);
+ }
+
+ public static bool operator != (SolutionTemplate template1, SolutionTemplate template2)
+ {
+ return !(template1 == template2);
+ }
+
+ public bool Equals (SolutionTemplate other)
+ {
+ return other != null && Id == other.Id && Name == other.Name && Category == other.Category;
+ }
+
+ public override bool Equals (object obj)
+ {
+ return Equals (obj as SolutionTemplate);
+ }
+
+ public override int GetHashCode ()
+ {
+ return (Id != null ? Id.GetHashCode () : 0)
+ ^ (Name != null ? Name.GetHashCode () : 0)
+ ^ (Category != null ? Category.GetHashCode () : 0);
+ }
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TemplatingService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TemplatingService.cs
index 4d8b1708c4..575ca442db 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TemplatingService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TemplatingService.cs
@@ -29,7 +29,9 @@ using System.Collections.Generic;
using System.Linq;
using Mono.Addins;
using MonoDevelop.Components;
+using MonoDevelop.Core;
using MonoDevelop.Ide.Codons;
+using MonoDevelop.Ide.Desktop;
using MonoDevelop.Ide.Projects;
using MonoDevelop.Projects;
using Xwt.Drawing;
@@ -45,6 +47,7 @@ namespace MonoDevelop.Ide.Templates
public TemplatingService ()
{
+ RecentTemplates = new RecentTemplates ();
AddinManager.AddExtensionNodeHandler ("/MonoDevelop/Ide/ProjectTemplateCategories", OnTemplateCategoriesChanged);
AddinManager.AddExtensionNodeHandler ("/MonoDevelop/Ide/ProjectTemplatingProviders", OnTemplatingProvidersChanged);
AddinManager.AddExtensionNodeHandler ("/MonoDevelop/Ide/ProjectTemplateWizards", OnProjectTemplateWizardsChanged);
@@ -105,11 +108,43 @@ namespace MonoDevelop.Ide.Templates
return templateCategorizer.GetCategorizedTemplates ();
}
+ internal SolutionTemplate GetTemplate (string templateId)
+ {
+ return GetTemplate (template => template.Id == templateId, category => true, category => true);
+ }
+
+ internal SolutionTemplate GetTemplate (
+ Func<SolutionTemplate, bool> isTemplateMatch,
+ Func<TemplateCategory, bool> isTopLevelCategoryMatch,
+ Func<TemplateCategory, bool> isSecondLevelCategoryMatch)
+ {
+ Predicate<SolutionTemplate> predicate = (t) => isTemplateMatch (t);
+ foreach (TemplateCategory topLevelCategory in GetProjectTemplateCategories ().Where (isTopLevelCategoryMatch)) {
+ foreach (TemplateCategory secondLevelCategory in topLevelCategory.Categories.Where (isSecondLevelCategoryMatch)) {
+ foreach (TemplateCategory thirdLevelCategory in secondLevelCategory.Categories) {
+ foreach (SolutionTemplate template in thirdLevelCategory.Templates) {
+ if (isTemplateMatch (template))
+ return template;
+ else {
+ var groupedTemplate = template.GetTemplate (predicate);
+ if (groupedTemplate != null)
+ return groupedTemplate;
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
public ProcessedTemplateResult ProcessTemplate (SolutionTemplate template, NewProjectConfiguration config, SolutionFolder parentFolder)
{
IProjectTemplatingProvider provider = GetTemplatingProviderForTemplate (template);
if (provider != null) {
- return provider.ProcessTemplate (template, config, parentFolder);
+ var result = provider.ProcessTemplate (template, config, parentFolder);
+ if (result.WorkspaceItems.Any ())
+ RecentTemplates.AddTemplate (template);
+ return result;
}
return null;
}
@@ -133,6 +168,92 @@ namespace MonoDevelop.Ide.Templates
}
return null;
}
+
+ public RecentTemplates RecentTemplates { get; private set; }
+ }
+
+ public class RecentTemplates
+ {
+ RecentFileStorage recentTemplates;
+
+ const string templateUriScheme = "monodevelop+template://";
+ const string templateGroup = "MonoDevelop Templates";
+
+ const int ItemLimit = 25;
+
+ public RecentTemplates () : this (UserProfile.Current.LocalConfigDir.Combine ("RecentlyUsedTemplates.xml"))
+ {
+ }
+
+ public RecentTemplates (string storageFile)
+ {
+ recentTemplates = new RecentFileStorage (storageFile);
+ }
+
+ public event EventHandler Changed {
+ add { recentTemplates.RecentFilesChanged += value; }
+ remove { recentTemplates.RecentFilesChanged -= value; }
+ }
+
+ public IList<SolutionTemplate> GetTemplates ()
+ {
+ try {
+ var gp = recentTemplates.GetItemsInGroup (templateGroup);
+ return gp.Select (FromRecentItem).Where (t => t != null).ToList ();
+ } catch (Exception e) {
+ LoggingService.LogError ("Can't get recent templates list.", e);
+ return new List<SolutionTemplate> ();
+ }
+ }
+
+ public void Clear ()
+ {
+ try {
+ recentTemplates.ClearGroup (templateGroup);
+ } catch (Exception e) {
+ LoggingService.LogError ("Can't clear recent templates list.", e);
+ }
+ }
+
+ public void AddTemplate (SolutionTemplate template)
+ {
+ try {
+ var recentItem = CreateRecentItem (template);
+ recentTemplates.AddWithLimit (recentItem, templateGroup, ItemLimit);
+ } catch (Exception e) {
+ LoggingService.LogError ("Failed to add item to recent templates list.", e);
+ }
+ }
+
+ RecentItem CreateRecentItem (SolutionTemplate template)
+ {
+ var mime = "application/vnd.monodevelop.template";
+ var uri = templateUriScheme ;
+ var categoryPath = template.Category;
+ if (!string.IsNullOrEmpty (categoryPath))
+ uri += categoryPath + "/";
+ uri += template.Id;
+ return new RecentItem (uri, mime, templateGroup) { Private = template.Name };
+ }
+
+ SolutionTemplate FromRecentItem (RecentItem item)
+ {
+ var templatePath = item.Uri.StartsWith (templateUriScheme, StringComparison.Ordinal) ? item.Uri.Substring (templateUriScheme.Length) : item.Uri;
+ var parts = templatePath.Split ('/');
+ var templateId = parts [parts.Length - 1];
+ if (parts.Length > 2) {
+ return IdeApp.Services.TemplatingService.GetTemplate ((template) => template.Id == templateId,
+ (category) => category.Id == parts[0],
+ (category) => category.Id == parts[1]);
+ } else
+ return IdeApp.Services.TemplatingService.GetTemplate (templateId);
+ }
+
+ public void Dispose ()
+ {
+ recentTemplates.Dispose ();
+ recentTemplates = null;
+ }
}
}