Browse Source

Hide NewProjectDialog behind IUIService.

pull/32/merge
Daniel Grunwald 13 years ago
parent
commit
aecdac2308
  1. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  2. 4
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  3. 14
      src/Main/Base/Project/Services/IUIService.cs
  4. 4
      src/Main/Base/Project/Src/Commands/FileMenuCommands.cs
  5. 2
      src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/BooleanTypeConverter.cs
  6. 2
      src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/TemplateTypeConverter.cs
  7. 6
      src/Main/Base/Project/Src/Gui/Dialogs/NewProjectDialog.cs
  8. 13
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs
  9. 2
      src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs
  10. 6
      src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs
  11. 2
      src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs
  12. 2
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs
  13. 2
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs
  14. 2
      src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs
  15. 6
      src/Main/Base/Project/Templates/FileTemplate.cs
  16. 23
      src/Main/Base/Project/Templates/ITemplateService.cs
  17. 9
      src/Main/Base/Project/Templates/ProjectTemplate.cs
  18. 16
      src/Main/Base/Project/Templates/ProjectTemplateResult.cs
  19. 19
      src/Main/Base/Project/Templates/TemplateBase.cs
  20. 4
      src/Main/Core/Project/Src/AddInTree/CoreStartup.cs
  21. 4
      src/Main/Core/Project/Src/Services/PropertyService/IPropertyService.cs
  22. 4
      src/Main/Core/Project/Src/Services/PropertyService/PropertyService.cs
  23. 10
      src/Main/Core/Project/Src/Services/PropertyService/PropertyServiceImpl.cs
  24. 20
      src/Main/SharpDevelop/Services/UIService.cs
  25. 2
      src/Main/SharpDevelop/SharpDevelop.csproj
  26. 55
      src/Main/SharpDevelop/Templates/TemplateService.cs

2
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -74,6 +74,8 @@ @@ -74,6 +74,8 @@
class="ICSharpCode.SharpDevelop.ClipboardWrapper"/>
<Service id="ICSharpCode.SharpDevelop.IFileSystem"
class="ICSharpCode.SharpDevelop.FileSystem"/>
<Service id="ICSharpCode.SharpDevelop.Templates.ITemplateService"
class="ICSharpCode.SharpDevelop.Templates.TemplateService"/>
<Service id="ICSharpCode.SharpDevelop.Project.IBuildService"
class="ICSharpCode.SharpDevelop.Project.BuildService"/>
<Service id="ICSharpCode.SharpDevelop.Project.IProjectService"

4
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -239,6 +239,9 @@ @@ -239,6 +239,9 @@
<Compile Include="Templates\FileTemplateOptions.cs" />
<Compile Include="Templates\FileTemplateResult.cs" />
<Compile Include="Templates\ITemplateService.cs" />
<Compile Include="Templates\ProjectTemplate.cs" />
<Compile Include="Templates\ProjectTemplateResult.cs" />
<Compile Include="Templates\TemplateBase.cs" />
<Compile Include="Templates\TemplateLoadException.cs" />
<Compile Include="Util\AtomicBoolean.cs" />
<Compile Include="Util\ChrootFileSystem.cs" />
@ -464,7 +467,6 @@ @@ -464,7 +467,6 @@
<Compile Include="Src\Internal\Templates\File\FileDescriptionTemplate.cs" />
<Compile Include="Src\Internal\Templates\File\FileTemplate.cs" />
<Compile Include="Src\Internal\Templates\TextTemplate.cs" />
<Compile Include="Src\Internal\Templates\File\INewFileCreator.cs" />
<Compile Include="Src\Project\BeforeBuildCustomToolFileNameFilter.cs" />
<Compile Include="Src\Project\BeforeBuildCustomToolProjectItems.cs" />
<Compile Include="Src\Project\BeforeBuildCustomToolRunner.cs" />

14
src/Main/Base/Project/Services/IUIService.cs

@ -30,9 +30,17 @@ namespace ICSharpCode.SharpDevelop @@ -30,9 +30,17 @@ namespace ICSharpCode.SharpDevelop
/// May be <c>null</c> to create an untitled file.</param>
/// <param name="templates">The list of templates that are available in the dialog.
/// Pass <c>null</c> to use the default list (<see cref="ITemplateService.FileTemplates"/>)</param>
/// <returns>
/// Returns the FileTemplateResult; or null if no file was created.
/// </returns>
/// <returns>Returns a <see cref="FileTemplateResult"/>; or null if no file was created.</returns>
FileTemplateResult ShowNewFileDialog(IProject project, DirectoryName directory, IEnumerable<FileTemplate> templates = null);
/// <summary>
/// Show the 'New Project' dialog.
/// </summary>
/// <param name="solutionFolder">The parent solution folder to which the new project should be added.
/// May be <c>null</c> to create a new solution.</param>
/// <param name="templates">The list of templates that are available in the dialog.
/// Pass <c>null</c> to use the default list (<see cref="ITemplateService.ProjectTemplates"/>)</param>
/// <returns>Returns a <see cref="ProjectTemplateResult"/>; or null if no project was created.</returns>
ProjectTemplateResult ShowNewProjectDialog(ISolutionFolder solutionFolder, IEnumerable<ProjectTemplate> templates = null);
}
}

4
src/Main/Base/Project/Src/Commands/FileMenuCommands.cs

@ -13,9 +13,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -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);
}
}

2
src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/BooleanTypeConverter.cs

@ -9,7 +9,7 @@ using ICSharpCode.Core; @@ -9,7 +9,7 @@ using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Gui
{
public class BooleanTypeConverter : TypeConverter
internal class BooleanTypeConverter : TypeConverter
{
string True {
get {

2
src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/CustomTypeConverter/TemplateTypeConverter.cs

@ -10,7 +10,7 @@ using ICSharpCode.SharpDevelop.Internal.Templates; @@ -10,7 +10,7 @@ using ICSharpCode.SharpDevelop.Internal.Templates;
namespace ICSharpCode.SharpDevelop.Gui
{
public class CustomTypeConverter : TypeConverter
internal class CustomTypeConverter : TypeConverter
{
TemplateType templateType;

6
src/Main/Base/Project/Src/Gui/Dialogs/NewProjectDialog.cs

@ -16,7 +16,7 @@ using Microsoft.Build.Exceptions; @@ -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<TemplateItem> alltemplates = new List<TemplateItem>();
protected List<Category> categories = new List<Category>();
@ -276,7 +276,7 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs @@ -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 @@ -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();
}

13
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs

@ -19,18 +19,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -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);
}
}

2
src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs

@ -13,7 +13,7 @@ using ICSharpCode.SharpDevelop.Templates; @@ -13,7 +13,7 @@ using ICSharpCode.SharpDevelop.Templates;
namespace ICSharpCode.SharpDevelop.Internal.Templates
{
public class FileDescriptionTemplate
internal class FileDescriptionTemplate
{
string name;
string language;

6
src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs

@ -16,7 +16,7 @@ using ICSharpCode.SharpDevelop.Templates; @@ -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 @@ -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 @@ -101,7 +101,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
/// <summary>
/// This class defines and holds the new file templates.
/// </summary>
public class FileTemplate : IComparable
internal class FileTemplate : IComparable
{
public static List<FileTemplate> FileTemplates = new List<FileTemplate>();

2
src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs

@ -13,7 +13,7 @@ using ICSharpCode.Core; @@ -13,7 +13,7 @@ using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Internal.Templates
{
public class ScriptRunner
internal class ScriptRunner
{
FileTemplate item;
FileDescriptionTemplate file;

2
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs

@ -23,7 +23,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -23,7 +23,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
/// <summary>
/// This class is used inside the solution templates for projects.
/// </summary>
public sealed class ProjectDescriptor
internal sealed class ProjectDescriptor
{
private class ProjectProperty
{

2
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -39,7 +39,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
/// <summary>
/// This class defines and holds the new project templates.
/// </summary>
public class ProjectTemplate : IComparable
internal class ProjectTemplate : IComparable
{
static List<ProjectTemplate> projectTemplates;

2
src/Main/Base/Project/Src/Internal/Templates/Project/SolutionDescriptor.cs

@ -11,7 +11,7 @@ using ICSharpCode.SharpDevelop.Project; @@ -11,7 +11,7 @@ using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Internal.Templates
{
public class SolutionDescriptor
internal class SolutionDescriptor
{
SolutionFolderDescriptor mainFolder = new SolutionFolderDescriptor("");

6
src/Main/Base/Project/Templates/FileTemplate.cs

@ -9,12 +9,6 @@ namespace ICSharpCode.SharpDevelop.Templates @@ -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; }
/// <summary>
/// Gets whether this template is available for the specified project.
/// </summary>

23
src/Main/Base/Project/Templates/ITemplateService.cs

@ -17,8 +17,27 @@ namespace ICSharpCode.SharpDevelop.Templates @@ -17,8 +17,27 @@ namespace ICSharpCode.SharpDevelop.Templates
IEnumerable<FileTemplate> FileTemplates { get; }
/// <summary>
/// Loads a file template (.xft file) from a stream.
/// Gets the list of project templates that are available in the 'new project' dialog.
/// </summary>
FileTemplate LoadFileTemplate(Stream stream);
IEnumerable<ProjectTemplate> ProjectTemplates { get; }
/// <summary>
/// Loads a file template (.xft or .xpt file) from disk.
/// </summary>
/// <returns><see cref="FileTemplate"/> or <see cref="ProjectTemplate"/> instance.</returns>
TemplateBase LoadTemplate(FileName fileName);
/// <summary>
/// Loads a file template (.xft or .xpt file) from a text reader.
/// </summary>
/// <param name="stream">The stream containing the .xft/.xpt file.</param>
/// <param name="fileSystem">File system used to open referenced input files.
/// This should usually be a <see cref="ReadOnlyChrootFileSystem"/> 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.
/// </param>
/// <returns><see cref="FileTemplate"/> or <see cref="ProjectTemplate"/> instance.</returns>
TemplateBase LoadTemplate(TextReader textReader, IReadOnlyFileSystem fileSystem);
}
}

9
src/Main/Base/Project/Src/Internal/Templates/File/INewFileCreator.cs → src/Main/Base/Project/Templates/ProjectTemplate.cs

@ -3,7 +3,12 @@ @@ -3,7 +3,12 @@
using System;
namespace ICSharpCode.SharpDevelop.Internal.Templates
namespace ICSharpCode.SharpDevelop.Templates
{
public abstract class ProjectTemplate : TemplateBase
{
public ProjectTemplate()
{
}
}
}

16
src/Main/Base/Project/Templates/ProjectTemplateResult.cs

@ -0,0 +1,16 @@ @@ -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
{
/// <summary>
/// Represents the result of creating new projects using a project template.
/// </summary>
public class ProjectTemplateResult
{
}
}

19
src/Main/Base/Project/Templates/TemplateBase.cs

@ -0,0 +1,19 @@ @@ -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
{
/// <summary>
/// Common base class for <see cref="FileTemplate"/> and <see cref="ProjectTemplate"/>.
/// </summary>
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; }
}
}

4
src/Main/Core/Project/Src/AddInTree/CoreStartup.cs

@ -205,8 +205,8 @@ namespace ICSharpCode.Core @@ -205,8 +205,8 @@ namespace ICSharpCode.Core
applicationName);
var container = ServiceSingleton.GetRequiredService<IServiceContainer>();
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);

4
src/Main/Core/Project/Src/Services/PropertyService/IPropertyService.cs

@ -18,13 +18,13 @@ namespace ICSharpCode.Core @@ -18,13 +18,13 @@ namespace ICSharpCode.Core
/// Gets the configuration directory. (usually "%ApplicationData%\%ApplicationName%")
/// </summary>
/// <seealso cref="CoreStartup.ConfigDirectory"/>
string ConfigDirectory { get; }
DirectoryName ConfigDirectory { get; }
/// <summary>
/// Gets the data directory (usually "ApplicationRootPath\data")
/// </summary>
/// <seealso cref="CoreStartup.DataDirectory"/>
string DataDirectory { get; }
DirectoryName DataDirectory { get; }
/// <summary>
/// Gets the main properties container for this property service.

4
src/Main/Core/Project/Src/Services/PropertyService/PropertyService.cs

@ -26,11 +26,11 @@ namespace ICSharpCode.Core @@ -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; }
}

10
src/Main/Core/Project/Src/Services/PropertyService/PropertyServiceImpl.cs

@ -16,8 +16,8 @@ namespace ICSharpCode.Core @@ -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 @@ -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 @@ -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;
}

20
src/Main/SharpDevelop/Services/UIService.cs

@ -5,10 +5,13 @@ using System; @@ -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 @@ -48,5 +51,22 @@ namespace ICSharpCode.SharpDevelop
return result;
}
}
public ProjectTemplateResult ShowNewProjectDialog(ISolutionFolder solutionFolder, IEnumerable<ICSharpCode.SharpDevelop.Templates.ProjectTemplate> 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;
}
}
}
}
}

2
src/Main/SharpDevelop/SharpDevelop.csproj

@ -150,6 +150,7 @@ @@ -150,6 +150,7 @@
<Compile Include="Startup\App.xaml.cs" />
<Compile Include="Startup\SharpDevelopMain.cs" />
<Compile Include="Startup\SplashScreen.cs" />
<Compile Include="Templates\TemplateService.cs" />
<Compile Include="WinForms\SDWindowsFormsHost.cs" />
<Compile Include="WinForms\WinFormsMenuService.cs" />
<Compile Include="WinForms\WinFormsService.cs" />
@ -283,6 +284,7 @@ @@ -283,6 +284,7 @@
<Folder Include="Dom" />
<Folder Include="Editor" />
<Folder Include="Editor\Bookmarks" />
<Folder Include="Templates" />
<Folder Include="Project" />
<Folder Include="Project\Build" />
<Folder Include="Project\Build\MSBuildEngine" />

55
src/Main/SharpDevelop/Templates/TemplateService.cs

@ -0,0 +1,55 @@ @@ -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<IReadOnlyList<TemplateBase>> allTemplates;
public TemplateService()
{
allTemplates = new Lazy<IReadOnlyList<TemplateBase>>(LoadTemplates);
}
public IEnumerable<FileTemplate> FileTemplates {
get { return allTemplates.Value.OfType<FileTemplate>(); }
}
public IEnumerable<ProjectTemplate> ProjectTemplates {
get { return allTemplates.Value.OfType<ProjectTemplate>(); }
}
IReadOnlyList<TemplateBase> LoadTemplates()
{
return SD.AddInTree.BuildItems<TemplateBase>(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);
}
}
}
}
Loading…
Cancel
Save