From aecdac23089f28a277726238c9e728480bc88779 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 3 Apr 2013 02:21:02 +0200 Subject: [PATCH] Hide NewProjectDialog behind IUIService. --- .../Project/ICSharpCode.SharpDevelop.addin | 2 + .../Project/ICSharpCode.SharpDevelop.csproj | 4 +- src/Main/Base/Project/Services/IUIService.cs | 14 ++++- .../Project/Src/Commands/FileMenuCommands.cs | 4 +- .../BooleanTypeConverter.cs | 2 +- .../TemplateTypeConverter.cs | 2 +- .../Src/Gui/Dialogs/NewProjectDialog.cs | 6 +- .../Commands/SolutionNodeCommands.cs | 13 +---- .../Templates/File/FileDescriptionTemplate.cs | 2 +- .../Internal/Templates/File/FileTemplate.cs | 6 +- .../Internal/Templates/File/ScriptRunner.cs | 2 +- .../Templates/Project/ProjectDescriptor.cs | 2 +- .../Templates/Project/ProjectTemplate.cs | 2 +- .../Templates/Project/SolutionDescriptor.cs | 2 +- .../Base/Project/Templates/FileTemplate.cs | 6 -- .../Project/Templates/ITemplateService.cs | 23 +++++++- .../ProjectTemplate.cs} | 9 ++- .../Templates/ProjectTemplateResult.cs | 16 ++++++ .../Base/Project/Templates/TemplateBase.cs | 19 +++++++ .../Core/Project/Src/AddInTree/CoreStartup.cs | 4 +- .../PropertyService/IPropertyService.cs | 4 +- .../PropertyService/PropertyService.cs | 4 +- .../PropertyService/PropertyServiceImpl.cs | 10 ++-- src/Main/SharpDevelop/Services/UIService.cs | 20 +++++++ src/Main/SharpDevelop/SharpDevelop.csproj | 2 + .../SharpDevelop/Templates/TemplateService.cs | 55 +++++++++++++++++++ 26 files changed, 182 insertions(+), 53 deletions(-) rename src/Main/Base/Project/{Src/Internal/Templates/File/INewFileCreator.cs => Templates/ProjectTemplate.cs} (60%) create mode 100644 src/Main/Base/Project/Templates/ProjectTemplateResult.cs create mode 100644 src/Main/Base/Project/Templates/TemplateBase.cs create mode 100644 src/Main/SharpDevelop/Templates/TemplateService.cs diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index c97016aea3..dc91146e20 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -74,6 +74,8 @@ class="ICSharpCode.SharpDevelop.ClipboardWrapper"/> + + + + @@ -464,7 +467,6 @@ - diff --git a/src/Main/Base/Project/Services/IUIService.cs b/src/Main/Base/Project/Services/IUIService.cs index e9a4fc436f..bdd9d9bba9 100644 --- a/src/Main/Base/Project/Services/IUIService.cs +++ b/src/Main/Base/Project/Services/IUIService.cs @@ -30,9 +30,17 @@ namespace ICSharpCode.SharpDevelop /// May be null to create an untitled file. /// The list of templates that are available in the dialog. /// Pass null to use the default list () - /// - /// Returns the FileTemplateResult; or null if no file was created. - /// + /// Returns a ; or null if no file was created. FileTemplateResult ShowNewFileDialog(IProject project, DirectoryName directory, IEnumerable templates = null); + + /// + /// Show the 'New Project' dialog. + /// + /// The parent solution folder to which the new project should be added. + /// May be null to create a new solution. + /// The list of templates that are available in the dialog. + /// Pass null to use the default list () + /// Returns a ; or null if no project was created. + ProjectTemplateResult ShowNewProjectDialog(ISolutionFolder solutionFolder, IEnumerable templates = null); } } diff --git a/src/Main/Base/Project/Src/Commands/FileMenuCommands.cs b/src/Main/Base/Project/Src/Commands/FileMenuCommands.cs index 2d0b0540fe..f3acbb2699 100644 --- a/src/Main/Base/Project/Src/Commands/FileMenuCommands.cs +++ b/src/Main/Base/Project/Src/Commands/FileMenuCommands.cs @@ -13,9 +13,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { public override void Run() { - using (NewProjectDialog npdlg = new NewProjectDialog(true)) { - npdlg.ShowDialog(SD.WinForms.MainWin32Window); - } + SD.UIService.ShowNewProjectDialog(null); } } diff --git a/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/BooleanTypeConverter.cs b/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/BooleanTypeConverter.cs index 8e3ff497a4..bcda9b2920 100644 --- a/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/BooleanTypeConverter.cs +++ b/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/BooleanTypeConverter.cs @@ -9,7 +9,7 @@ using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop.Gui { - public class BooleanTypeConverter : TypeConverter + internal class BooleanTypeConverter : TypeConverter { string True { get { diff --git a/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/TemplateTypeConverter.cs b/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/TemplateTypeConverter.cs index d66eb4ab5a..8987dcbc80 100644 --- a/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/TemplateTypeConverter.cs +++ b/src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/TemplateTypeConverter.cs @@ -10,7 +10,7 @@ using ICSharpCode.SharpDevelop.Internal.Templates; namespace ICSharpCode.SharpDevelop.Gui { - public class CustomTypeConverter : TypeConverter + internal class CustomTypeConverter : TypeConverter { TemplateType templateType; diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/NewProjectDialog.cs b/src/Main/Base/Project/Src/Gui/Dialogs/NewProjectDialog.cs index dc92980afd..b36f9c9fd6 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/NewProjectDialog.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/NewProjectDialog.cs @@ -16,7 +16,7 @@ using Microsoft.Build.Exceptions; namespace ICSharpCode.SharpDevelop.Project.Dialogs { - public partial class NewProjectDialog : Form + internal partial class NewProjectDialog : Form { protected List alltemplates = new List(); protected List categories = new List(); @@ -276,7 +276,7 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs public FileName NewProjectLocation; public FileName NewSolutionLocation; - public ISolutionFolderNode SolutionFolderNode { get; set; } + public ISolutionFolder SolutionFolder; string CheckProjectName(string solution, string name, string location) { @@ -366,7 +366,7 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs } else { IProject project = item.Template.CreateProject(SD.ProjectService.CurrentSolution, cinfo); NewProjectLocation = project.FileName; - SolutionFolderNode.Folder.Items.Add(project); + SolutionFolder.Items.Add(project); ProjectService.SaveSolution(); } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs index fb036ec9cd..978f99af5c 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs @@ -19,18 +19,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands node = node.Parent; ISolutionFolderNode solutionFolderNode = node as ISolutionFolderNode; if (solutionFolderNode != null) { - using (NewProjectDialog npdlg = new NewProjectDialog(false)) { - npdlg.SolutionFolderNode = solutionFolderNode; - npdlg.InitialProjectLocationDirectory = GetInitialDirectorySuggestion(solutionFolderNode.Folder); - - // show the dialog to request project type and name - if (npdlg.ShowDialog(SD.WinForms.MainWin32Window) == DialogResult.OK) { - if (npdlg.NewProjectLocation == null) { - MessageService.ShowError("No project has been created, there is nothing to add."); - return; - } - } - } + SD.UIService.ShowNewProjectDialog(solutionFolderNode.Folder); } } diff --git a/src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs b/src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs index 94e9290c6f..9bb346f8e5 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs @@ -13,7 +13,7 @@ using ICSharpCode.SharpDevelop.Templates; namespace ICSharpCode.SharpDevelop.Internal.Templates { - public class FileDescriptionTemplate + internal class FileDescriptionTemplate { string name; string language; diff --git a/src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs b/src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs index 6e31131660..9fa407e787 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs @@ -16,7 +16,7 @@ using ICSharpCode.SharpDevelop.Templates; namespace ICSharpCode.SharpDevelop.Internal.Templates { - public class TemplateProperty + internal class TemplateProperty { string name; string localizedName; @@ -72,7 +72,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates } } - public class TemplateType + internal class TemplateType { string name; Hashtable pairs = new Hashtable(); @@ -101,7 +101,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates /// /// This class defines and holds the new file templates. /// - public class FileTemplate : IComparable + internal class FileTemplate : IComparable { public static List FileTemplates = new List(); diff --git a/src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs b/src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs index b4d2452403..ebc99dd9ed 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs @@ -13,7 +13,7 @@ using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop.Internal.Templates { - public class ScriptRunner + internal class ScriptRunner { FileTemplate item; FileDescriptionTemplate file; diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs index 541c88e123..d60a036dd1 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs @@ -23,7 +23,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates /// /// This class is used inside the solution templates for projects. /// - public sealed class ProjectDescriptor + internal sealed class ProjectDescriptor { private class ProjectProperty { diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs index bf4b0c0575..24a7a856b8 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs @@ -39,7 +39,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates /// /// This class defines and holds the new project templates. /// - public class ProjectTemplate : IComparable + internal class ProjectTemplate : IComparable { static List projectTemplates; diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs index 6eb0b2435f..4bd78d0022 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs @@ -11,7 +11,7 @@ using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.SharpDevelop.Internal.Templates { - public class SolutionDescriptor + internal class SolutionDescriptor { SolutionFolderDescriptor mainFolder = new SolutionFolderDescriptor(""); diff --git a/src/Main/Base/Project/Templates/FileTemplate.cs b/src/Main/Base/Project/Templates/FileTemplate.cs index 0802ed11a2..6c15daf47f 100644 --- a/src/Main/Base/Project/Templates/FileTemplate.cs +++ b/src/Main/Base/Project/Templates/FileTemplate.cs @@ -9,12 +9,6 @@ namespace ICSharpCode.SharpDevelop.Templates { public abstract class FileTemplate { - public abstract string Name { get; } - public abstract string Category { get; } - public abstract string Subcategory { get; } - public abstract string Description { get; } - public abstract IImage Icon { get; } - /// /// Gets whether this template is available for the specified project. /// diff --git a/src/Main/Base/Project/Templates/ITemplateService.cs b/src/Main/Base/Project/Templates/ITemplateService.cs index 13d0f0dda6..9f866d1201 100644 --- a/src/Main/Base/Project/Templates/ITemplateService.cs +++ b/src/Main/Base/Project/Templates/ITemplateService.cs @@ -17,8 +17,27 @@ namespace ICSharpCode.SharpDevelop.Templates IEnumerable FileTemplates { get; } /// - /// Loads a file template (.xft file) from a stream. + /// Gets the list of project templates that are available in the 'new project' dialog. /// - FileTemplate LoadFileTemplate(Stream stream); + IEnumerable ProjectTemplates { get; } + + /// + /// Loads a file template (.xft or .xpt file) from disk. + /// + /// or instance. + TemplateBase LoadTemplate(FileName fileName); + + /// + /// Loads a file template (.xft or .xpt file) from a text reader. + /// + /// The stream containing the .xft/.xpt file. + /// File system used to open referenced input files. + /// This should usually be a so that the file template + /// can use relative paths. + /// The template will keep a reference to the file system instance and use it when it is used to create + /// files/projects. + /// + /// or instance. + TemplateBase LoadTemplate(TextReader textReader, IReadOnlyFileSystem fileSystem); } } diff --git a/src/Main/Base/Project/Src/Internal/Templates/File/INewFileCreator.cs b/src/Main/Base/Project/Templates/ProjectTemplate.cs similarity index 60% rename from src/Main/Base/Project/Src/Internal/Templates/File/INewFileCreator.cs rename to src/Main/Base/Project/Templates/ProjectTemplate.cs index 5823136b72..e0732558df 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/File/INewFileCreator.cs +++ b/src/Main/Base/Project/Templates/ProjectTemplate.cs @@ -3,7 +3,12 @@ using System; -namespace ICSharpCode.SharpDevelop.Internal.Templates +namespace ICSharpCode.SharpDevelop.Templates { - + public abstract class ProjectTemplate : TemplateBase + { + public ProjectTemplate() + { + } + } } diff --git a/src/Main/Base/Project/Templates/ProjectTemplateResult.cs b/src/Main/Base/Project/Templates/ProjectTemplateResult.cs new file mode 100644 index 0000000000..0e0f6f5452 --- /dev/null +++ b/src/Main/Base/Project/Templates/ProjectTemplateResult.cs @@ -0,0 +1,16 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.SharpDevelop.Templates +{ + /// + /// Represents the result of creating new projects using a project template. + /// + public class ProjectTemplateResult + { + } +} diff --git a/src/Main/Base/Project/Templates/TemplateBase.cs b/src/Main/Base/Project/Templates/TemplateBase.cs new file mode 100644 index 0000000000..c6511af9ea --- /dev/null +++ b/src/Main/Base/Project/Templates/TemplateBase.cs @@ -0,0 +1,19 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; + +namespace ICSharpCode.SharpDevelop.Templates +{ + /// + /// Common base class for and . + /// + public abstract class TemplateBase + { + public abstract string Name { get; } + public abstract string Category { get; } + public abstract string Subcategory { get; } + public abstract string Description { get; } + public abstract IImage Icon { get; } + } +} diff --git a/src/Main/Core/Project/Src/AddInTree/CoreStartup.cs b/src/Main/Core/Project/Src/AddInTree/CoreStartup.cs index 72eb68fd97..23325b3f0b 100644 --- a/src/Main/Core/Project/Src/AddInTree/CoreStartup.cs +++ b/src/Main/Core/Project/Src/AddInTree/CoreStartup.cs @@ -205,8 +205,8 @@ namespace ICSharpCode.Core applicationName); var container = ServiceSingleton.GetRequiredService(); var propertyService = new PropertyServiceImpl( - configDirectory, - dataDirectory ?? Path.Combine(FileUtility.ApplicationRootPath, "data"), + DirectoryName.Create(configDirectory), + DirectoryName.Create(dataDirectory ?? Path.Combine(FileUtility.ApplicationRootPath, "data")), propertiesName); var applicationStateInfoService = new ApplicationStateInfoService(); addInTree = new AddInTreeImpl(applicationStateInfoService); diff --git a/src/Main/Core/Project/Src/Services/PropertyService/IPropertyService.cs b/src/Main/Core/Project/Src/Services/PropertyService/IPropertyService.cs index 6120e23f1a..2a5ceeee05 100644 --- a/src/Main/Core/Project/Src/Services/PropertyService/IPropertyService.cs +++ b/src/Main/Core/Project/Src/Services/PropertyService/IPropertyService.cs @@ -18,13 +18,13 @@ namespace ICSharpCode.Core /// Gets the configuration directory. (usually "%ApplicationData%\%ApplicationName%") /// /// - string ConfigDirectory { get; } + DirectoryName ConfigDirectory { get; } /// /// Gets the data directory (usually "ApplicationRootPath\data") /// /// - string DataDirectory { get; } + DirectoryName DataDirectory { get; } /// /// Gets the main properties container for this property service. diff --git a/src/Main/Core/Project/Src/Services/PropertyService/PropertyService.cs b/src/Main/Core/Project/Src/Services/PropertyService/PropertyService.cs index ee1d756634..f1dd00aa17 100644 --- a/src/Main/Core/Project/Src/Services/PropertyService/PropertyService.cs +++ b/src/Main/Core/Project/Src/Services/PropertyService/PropertyService.cs @@ -26,11 +26,11 @@ namespace ICSharpCode.Core get { return Service.MainPropertiesContainer; } } - public static string ConfigDirectory { + public static DirectoryName ConfigDirectory { get { return Service.ConfigDirectory; } } - public static string DataDirectory { + public static DirectoryName DataDirectory { get { return Service.DataDirectory; } } diff --git a/src/Main/Core/Project/Src/Services/PropertyService/PropertyServiceImpl.cs b/src/Main/Core/Project/Src/Services/PropertyService/PropertyServiceImpl.cs index 172d118243..01529fcc2c 100644 --- a/src/Main/Core/Project/Src/Services/PropertyService/PropertyServiceImpl.cs +++ b/src/Main/Core/Project/Src/Services/PropertyService/PropertyServiceImpl.cs @@ -16,8 +16,8 @@ namespace ICSharpCode.Core { string propertyFileName; - string configDirectory; - string dataDirectory; + DirectoryName configDirectory; + DirectoryName dataDirectory; Properties properties; @@ -30,7 +30,7 @@ namespace ICSharpCode.Core properties = new Properties(); } - public PropertyServiceImpl(string configDirectory, string dataDirectory, string propertiesName) + public PropertyServiceImpl(DirectoryName configDirectory, DirectoryName dataDirectory, string propertiesName) { this.configDirectory = configDirectory; this.dataDirectory = dataDirectory; @@ -39,13 +39,13 @@ namespace ICSharpCode.Core LoadPropertiesFromStream(FileName.Create(Path.Combine(configDirectory, propertyFileName))); } - public string ConfigDirectory { + public DirectoryName ConfigDirectory { get { return configDirectory; } } - public string DataDirectory { + public DirectoryName DataDirectory { get { return dataDirectory; } diff --git a/src/Main/SharpDevelop/Services/UIService.cs b/src/Main/SharpDevelop/Services/UIService.cs index 9f078875e0..36072159c4 100644 --- a/src/Main/SharpDevelop/Services/UIService.cs +++ b/src/Main/SharpDevelop/Services/UIService.cs @@ -5,10 +5,13 @@ using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; + using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Internal.Templates; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Project.Commands; +using ICSharpCode.SharpDevelop.Project.Dialogs; using ICSharpCode.SharpDevelop.Templates; namespace ICSharpCode.SharpDevelop @@ -48,5 +51,22 @@ namespace ICSharpCode.SharpDevelop return result; } } + + public ProjectTemplateResult ShowNewProjectDialog(ISolutionFolder solutionFolder, IEnumerable templates) + { + using (NewProjectDialog npdlg = new NewProjectDialog(createNewSolution: solutionFolder == null)) { + npdlg.SolutionFolder = solutionFolder; + if (solutionFolder != null) { + npdlg.InitialProjectLocationDirectory = AddNewProjectToSolution.GetInitialDirectorySuggestion(solutionFolder); + } + + // show the dialog to request project type and name + if (npdlg.ShowDialog(SD.WinForms.MainWin32Window) == DialogResult.OK) { + return new ProjectTemplateResult(); + } else { + return null; + } + } + } } } diff --git a/src/Main/SharpDevelop/SharpDevelop.csproj b/src/Main/SharpDevelop/SharpDevelop.csproj index 345efdfff5..bc7248d076 100644 --- a/src/Main/SharpDevelop/SharpDevelop.csproj +++ b/src/Main/SharpDevelop/SharpDevelop.csproj @@ -150,6 +150,7 @@ + @@ -283,6 +284,7 @@ + diff --git a/src/Main/SharpDevelop/Templates/TemplateService.cs b/src/Main/SharpDevelop/Templates/TemplateService.cs new file mode 100644 index 0000000000..36dc0cc63f --- /dev/null +++ b/src/Main/SharpDevelop/Templates/TemplateService.cs @@ -0,0 +1,55 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml; + +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.Templates +{ + sealed class TemplateService : ITemplateService + { + const string TemplatePath = "/SharpDevelop/BackendBindings/Templates"; + + Lazy> allTemplates; + + public TemplateService() + { + allTemplates = new Lazy>(LoadTemplates); + } + + public IEnumerable FileTemplates { + get { return allTemplates.Value.OfType(); } + } + + public IEnumerable ProjectTemplates { + get { return allTemplates.Value.OfType(); } + } + + IReadOnlyList LoadTemplates() + { + return SD.AddInTree.BuildItems(TemplatePath, this, false); + } + + public TemplateBase LoadTemplate(FileName fileName) + { + var fileSystem = SD.FileSystem; + using (TextReader reader = fileSystem.OpenText(fileName)) { + return LoadTemplate(reader, new ReadOnlyChrootFileSystem(fileSystem, fileName.GetParentDirectory())); + } + } + + public TemplateBase LoadTemplate(TextReader textReader, IReadOnlyFileSystem fileSystem) + { + try { + throw new NotImplementedException(); + } catch (XmlException ex) { + throw new TemplateLoadException(ex.Message, ex); + } + } + } +}