diff --git a/src/AddIns/Misc/TextTemplating/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/TextTemplating/Project/Configuration/AssemblyInfo.cs
new file mode 100644
index 0000000000..13702edfba
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Configuration/AssemblyInfo.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.Reflection;
+
+// Information about this assembly is defined by the following
+// attributes.
+//
+// change them to the information which is associated with the assembly
+// you compile.
+
+[assembly: AssemblyTitle("TextTemplating")]
+[assembly: AssemblyDescription("Text Templating (T4) Addin for SharpDevelop")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomain.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomain.cs
new file mode 100644
index 0000000000..662c86e088
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomain.cs
@@ -0,0 +1,12 @@
+// 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.TextTemplating
+{
+ public interface ITextTemplatingAppDomain : IDisposable
+ {
+ AppDomain AppDomain { get; }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomainFactory.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomainFactory.cs
new file mode 100644
index 0000000000..a6fde56036
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomainFactory.cs
@@ -0,0 +1,12 @@
+// 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.TextTemplating
+{
+ public interface ITextTemplatingAppDomainFactory
+ {
+ ITextTemplatingAppDomain CreateTextTemplatingAppDomain(string applicationBase);
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs
new file mode 100644
index 0000000000..f7f8c94501
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs
@@ -0,0 +1,13 @@
+// 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 ICSharpCode.SharpDevelop.Project;
+
+namespace ICSharpCode.TextTemplating
+{
+ public interface ITextTemplatingCustomToolContext
+ {
+ FileProjectItem EnsureOutputFileIsInProject(FileProjectItem baseItem, string outputFileName);
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingFileGenerator.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingFileGenerator.cs
new file mode 100644
index 0000000000..6b123995ff
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingFileGenerator.cs
@@ -0,0 +1,12 @@
+// 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.TextTemplating
+{
+ public interface ITextTemplatingFileGenerator : IDisposable
+ {
+ void ProcessTemplate();
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingHost.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingHost.cs
new file mode 100644
index 0000000000..ce47ed5177
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingHost.cs
@@ -0,0 +1,13 @@
+// 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.TextTemplating
+{
+ public interface ITextTemplatingHost : IDisposable
+ {
+ bool ProcessTemplate(string inputFile, string outputFile);
+ string OutputFile { get; }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomain.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomain.cs
new file mode 100644
index 0000000000..cb4da2fb43
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomain.cs
@@ -0,0 +1,34 @@
+// 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.IO;
+using System.Reflection;
+
+namespace ICSharpCode.TextTemplating
+{
+ [Serializable]
+ public class TextTemplatingAppDomain : ITextTemplatingAppDomain
+ {
+ AppDomain appDomain;
+
+ public TextTemplatingAppDomain(string applicationBase)
+ {
+ AppDomainSetup setupInfo = new AppDomainSetup();
+ setupInfo.ApplicationBase = applicationBase;
+ this.appDomain = AppDomain.CreateDomain("TextTemplatingAppDomain", null, setupInfo);
+ }
+
+ public AppDomain AppDomain {
+ get { return this.appDomain; }
+ }
+
+ public void Dispose()
+ {
+ if (this.appDomain != null) {
+ AppDomain.Unload(this.appDomain);
+ this.appDomain = null;
+ }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomainFactory.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomainFactory.cs
new file mode 100644
index 0000000000..b400557915
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomainFactory.cs
@@ -0,0 +1,15 @@
+// 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.TextTemplating
+{
+ public class TextTemplatingAppDomainFactory : ITextTemplatingAppDomainFactory
+ {
+ public ITextTemplatingAppDomain CreateTextTemplatingAppDomain(string applicationBase)
+ {
+ return new TextTemplatingAppDomain(applicationBase);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs
new file mode 100644
index 0000000000..b483b79751
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs
@@ -0,0 +1,23 @@
+// 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 ICSharpCode.SharpDevelop.Project;
+
+namespace ICSharpCode.TextTemplating
+{
+ public class TextTemplatingCustomToolContext : ITextTemplatingCustomToolContext
+ {
+ CustomToolContext context;
+
+ public TextTemplatingCustomToolContext(CustomToolContext context)
+ {
+ this.context = context;
+ }
+
+ public FileProjectItem EnsureOutputFileIsInProject(FileProjectItem baseItem, string outputFileName)
+ {
+ return context.EnsureOutputFileIsInProject(baseItem, outputFileName);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs
new file mode 100644
index 0000000000..dde2ec5fa2
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs
@@ -0,0 +1,69 @@
+// 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.IO;
+using ICSharpCode.SharpDevelop.Project;
+
+namespace ICSharpCode.TextTemplating
+{
+ public class TextTemplatingFileGenerator : ITextTemplatingFileGenerator
+ {
+ ITextTemplatingHost host;
+ FileProjectItem projectFile;
+ ITextTemplatingCustomToolContext context;
+
+ public TextTemplatingFileGenerator(
+ ITextTemplatingHost host,
+ FileProjectItem projectFile,
+ ITextTemplatingCustomToolContext context)
+ {
+ this.host = host;
+ this.projectFile = projectFile;
+ this.context = context;
+ }
+
+ public void Dispose()
+ {
+ host.Dispose();
+ }
+
+ public void ProcessTemplate()
+ {
+ GenerateOutputFileForTemplate();
+ AddOutputFileToProjectIfRequired();
+ }
+
+ void GenerateOutputFileForTemplate()
+ {
+ string inputFileName = projectFile.FileName;
+ string outputFileName = GetOutputFileName(inputFileName);
+ host.ProcessTemplate(inputFileName, outputFileName);
+ }
+
+ string GetOutputFileName(string inputFileName)
+ {
+ return Path.ChangeExtension(inputFileName, ".cs");
+ }
+
+ void AddOutputFileToProjectIfRequired()
+ {
+ context.EnsureOutputFileIsInProject(projectFile, host.OutputFile);
+ }
+
+
+// internal static void LogicalSetData (string name, object value,
+// System.CodeDom.Compiler.CompilerErrorCollection errors)
+// {
+// //FIXME: CallContext.LogicalSetData not implemented in Mono
+// try {
+// System.Runtime.Remoting.Messaging.CallContext.LogicalSetData (name, value);
+// } catch (NotImplementedException) {
+// errors.Add (new System.CodeDom.Compiler.CompilerError (
+// null, -1, -1, null,
+// "Could not set " + name + " - CallContext.LogicalSetData not implemented in this Mono version"
+// ) { IsWarning = true });
+// }
+// }
+ }
+}
\ No newline at end of file
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGeneratorCustomTool.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGeneratorCustomTool.cs
new file mode 100644
index 0000000000..f0a0cd7a92
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGeneratorCustomTool.cs
@@ -0,0 +1,38 @@
+// 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.CodeDom.Compiler;
+using System.IO;
+using ICSharpCode.SharpDevelop.Project;
+
+namespace ICSharpCode.TextTemplating
+{
+ public class TextTemplatingFileGeneratorCustomTool : ICustomTool
+ {
+ public void GenerateCode(FileProjectItem item, CustomToolContext context)
+ {
+ using (var generator = CreateTextTemplatingFileGenerator(item, context)) {
+ generator.ProcessTemplate();
+ }
+ }
+
+ protected virtual ITextTemplatingFileGenerator CreateTextTemplatingFileGenerator(
+ FileProjectItem projectFile,
+ CustomToolContext context)
+ {
+ var appDomainFactory = new TextTemplatingAppDomainFactory();
+ string applicationBase = GetAssemblyBaseLocation();
+ var host = new TextTemplatingHost(appDomainFactory, applicationBase);
+ var textTemplatingCustomToolContext = new TextTemplatingCustomToolContext(context);
+
+ return new TextTemplatingFileGenerator(host, projectFile, textTemplatingCustomToolContext);
+ }
+
+ string GetAssemblyBaseLocation()
+ {
+ string location = GetType().Assembly.Location;
+ return Path.GetDirectoryName(location);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs
new file mode 100644
index 0000000000..05cf8fd02e
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs
@@ -0,0 +1,42 @@
+// 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 Mono.TextTemplating;
+
+namespace ICSharpCode.TextTemplating
+{
+ public class TextTemplatingHost : TemplateGenerator, ITextTemplatingHost
+ {
+ ITextTemplatingAppDomainFactory appDomainFactory;
+ ITextTemplatingAppDomain templatingAppDomain;
+ string applicationBase;
+
+ public TextTemplatingHost(ITextTemplatingAppDomainFactory appDomainFactory, string applicationBase)
+ {
+ this.appDomainFactory = appDomainFactory;
+ this.applicationBase = applicationBase;
+ }
+
+ public void Dispose()
+ {
+ if (templatingAppDomain != null) {
+ templatingAppDomain.Dispose();
+ templatingAppDomain = null;
+ }
+ }
+
+ public override AppDomain ProvideTemplatingAppDomain(string content)
+ {
+ if (templatingAppDomain == null) {
+ CreateAppDomain();
+ }
+ return templatingAppDomain.AppDomain;
+ }
+
+ void CreateAppDomain()
+ {
+ templatingAppDomain = appDomainFactory.CreateTextTemplatingAppDomain(applicationBase);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Project/TextTemplating.addin b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.addin
new file mode 100644
index 0000000000..489c34a8f1
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.addin
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj
new file mode 100644
index 0000000000..a0e5eafc90
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj
@@ -0,0 +1,84 @@
+
+
+
+ {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}
+ Debug
+ x86
+ Library
+ ICSharpCode.TextTemplating
+ TextTemplating
+ v4.0
+ False
+ False
+ 4
+ false
+ ..\..\..\..\..\AddIns\Misc\TextTemplating\
+
+
+ x86
+ False
+ Auto
+ 4194304
+ 4096
+
+
+ true
+ Full
+ False
+ True
+ DEBUG;TRACE
+ Project
+
+
+ false
+ None
+ True
+ False
+ TRACE
+
+
+
+ lib\Mono.TextTemplating.dll
+
+
+
+ 3.5
+
+
+
+
+
+ Configuration\GlobalAssemblyInfo.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Always
+
+
+
+
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}
+ ICSharpCode.SharpDevelop
+ False
+
+
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
+ ICSharpCode.Core
+ False
+
+
+
+
\ No newline at end of file
diff --git a/src/AddIns/Misc/TextTemplating/Project/lib/Mono.TextTemplating.dll b/src/AddIns/Misc/TextTemplating/Project/lib/Mono.TextTemplating.dll
new file mode 100644
index 0000000000..7d4c082510
Binary files /dev/null and b/src/AddIns/Misc/TextTemplating/Project/lib/Mono.TextTemplating.dll differ
diff --git a/src/AddIns/Misc/TextTemplating/Test/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/TextTemplating/Test/Configuration/AssemblyInfo.cs
new file mode 100644
index 0000000000..052d3702c1
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Configuration/AssemblyInfo.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.Reflection;
+
+// Information about this assembly is defined by the following
+// attributes.
+//
+// change them to the information which is associated with the assembly
+// you compile.
+
+[assembly: AssemblyTitle("TextTemplating.Tests")]
+[assembly: AssemblyDescription("Text Templating (T4) Addin Tests")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomain.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomain.cs
new file mode 100644
index 0000000000..ba6c783124
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomain.cs
@@ -0,0 +1,20 @@
+// 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 ICSharpCode.TextTemplating;
+
+namespace TextTemplating.Tests.Helpers
+{
+ public class FakeTextTemplatingAppDomain : ITextTemplatingAppDomain
+ {
+ public bool IsDisposeCalled;
+
+ public AppDomain AppDomain { get; set; }
+
+ public void Dispose()
+ {
+ IsDisposeCalled = true;
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomainFactory.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomainFactory.cs
new file mode 100644
index 0000000000..297aca7985
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomainFactory.cs
@@ -0,0 +1,22 @@
+// 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 ICSharpCode.TextTemplating;
+
+namespace TextTemplating.Tests.Helpers
+{
+ public class FakeTextTemplatingAppDomainFactory : ITextTemplatingAppDomainFactory
+ {
+ public FakeTextTemplatingAppDomain FakeTextTemplatingAppDomain = new FakeTextTemplatingAppDomain();
+ public int CreateTextTemplatingAppDomainCallCount;
+ public string ApplicationBasePassedToCreateTextTemplatingAppDomain;
+
+ public ITextTemplatingAppDomain CreateTextTemplatingAppDomain(string applicationBase)
+ {
+ ApplicationBasePassedToCreateTextTemplatingAppDomain = applicationBase;
+ CreateTextTemplatingAppDomainCallCount++;
+ return FakeTextTemplatingAppDomain;
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs
new file mode 100644
index 0000000000..59a26fd62f
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs
@@ -0,0 +1,24 @@
+// 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 ICSharpCode.SharpDevelop.Project;
+using ICSharpCode.TextTemplating;
+
+namespace TextTemplating.Tests.Helpers
+{
+ public class FakeTextTemplatingCustomToolContext : ITextTemplatingCustomToolContext
+ {
+ public FileProjectItem BaseItemPassedToEnsureOutputFileIsInProject;
+ public string OutputFileNamePassedToEnsureOutputFileIsInProject;
+ public TestableFileProjectItem EnsureOutputFileIsInProjectReturnValue = new TestableFileProjectItem(@"d:\Projects\MyProject\template.tt");
+
+ public FileProjectItem EnsureOutputFileIsInProject(FileProjectItem baseItem, string outputFileName)
+ {
+ BaseItemPassedToEnsureOutputFileIsInProject = baseItem;
+ OutputFileNamePassedToEnsureOutputFileIsInProject = outputFileName;
+
+ return EnsureOutputFileIsInProjectReturnValue;
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingFileGenerator.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingFileGenerator.cs
new file mode 100644
index 0000000000..f42fd98597
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingFileGenerator.cs
@@ -0,0 +1,24 @@
+// 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 ICSharpCode.TextTemplating;
+
+namespace TextTemplating.Tests.Helpers
+{
+ public class FakeTextTemplatingFileGenerator : ITextTemplatingFileGenerator
+ {
+ public bool IsProcessTemplateCalled;
+ public bool IsDisposeCalledAfterTemplateProcessed;
+
+ public void ProcessTemplate()
+ {
+ IsProcessTemplateCalled = true;
+ }
+
+ public void Dispose()
+ {
+ IsDisposeCalledAfterTemplateProcessed = IsProcessTemplateCalled;
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingHost.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingHost.cs
new file mode 100644
index 0000000000..eb76391a25
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingHost.cs
@@ -0,0 +1,30 @@
+// 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 ICSharpCode.TextTemplating;
+
+namespace TextTemplating.Tests.Helpers
+{
+ public class FakeTextTemplatingHost : ITextTemplatingHost
+ {
+ public string InputFilePassedToProcessTemplate;
+ public string OutputFilePassedToProcessTemplate;
+ public bool ProcessTemplateReturnValue = true;
+ public bool IsDisposeCalled;
+
+ public bool ProcessTemplate(string inputFile, string outputFile)
+ {
+ InputFilePassedToProcessTemplate = inputFile;
+ OutputFilePassedToProcessTemplate = outputFile;
+ return ProcessTemplateReturnValue;
+ }
+
+ public void Dispose()
+ {
+ IsDisposeCalled = true;
+ }
+
+ public string OutputFile { get; set; }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs
new file mode 100644
index 0000000000..2f5d839e78
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs
@@ -0,0 +1,24 @@
+// 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 ICSharpCode.SharpDevelop.Project;
+
+namespace TextTemplating.Tests.Helpers
+{
+ public class TestableFileProjectItem : FileProjectItem
+ {
+ string fileName;
+
+ public TestableFileProjectItem(string fileName)
+ : base(null, ItemType.None)
+ {
+ this.fileName = fileName;
+ }
+
+ public override string FileName {
+ get { return fileName; }
+ set { fileName = value; }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingFileGeneratorCustomTool.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingFileGeneratorCustomTool.cs
new file mode 100644
index 0000000000..9a0eda541e
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingFileGeneratorCustomTool.cs
@@ -0,0 +1,26 @@
+// 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 ICSharpCode.SharpDevelop.Project;
+using ICSharpCode.TextTemplating;
+
+namespace TextTemplating.Tests.Helpers
+{
+ public class TestableTextTemplatingFileGeneratorCustomTool : TextTemplatingFileGeneratorCustomTool
+ {
+ public FileProjectItem ProjectFilePassedToCreateTextTemplatingFileGenerator;
+ public CustomToolContext ContextPassedToCreateTextTemplatingFileGenerator;
+ public FakeTextTemplatingFileGenerator FakeTextTemplatingFileGenerator = new FakeTextTemplatingFileGenerator();
+
+ protected override ITextTemplatingFileGenerator CreateTextTemplatingFileGenerator(
+ FileProjectItem projectFile,
+ CustomToolContext context)
+ {
+ ProjectFilePassedToCreateTextTemplatingFileGenerator = projectFile;
+ ContextPassedToCreateTextTemplatingFileGenerator = context;
+
+ return FakeTextTemplatingFileGenerator;
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs
new file mode 100644
index 0000000000..e0f0555d0a
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs
@@ -0,0 +1,73 @@
+// 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 ICSharpCode.SharpDevelop.Internal.Templates;
+using ICSharpCode.SharpDevelop.Project;
+using ICSharpCode.TextTemplating;
+using NUnit.Framework;
+using TextTemplating.Tests.Helpers;
+
+namespace TextTemplating.Tests
+{
+ [TestFixture]
+ public class TextTemplatingFileGeneratorCustomToolTests
+ {
+ TestableTextTemplatingFileGeneratorCustomTool customTool;
+
+ void CreateCustomTool()
+ {
+ customTool = new TestableTextTemplatingFileGeneratorCustomTool();
+ }
+
+ IProject CreateProject()
+ {
+ return new MSBuildFileProject(@"d:\projects\test.csproj", "test");
+ }
+
+ FileProjectItem GenerateCodeWithProjectFile()
+ {
+ var file = new TestableFileProjectItem("test.tt");
+ customTool.GenerateCode(file, null);
+ return file;
+ }
+
+ [Test]
+ public void GenerateCode_ProjectFilePassed_ProjectFileUsedToCreateTextTemplatingFileGenerator()
+ {
+ CreateCustomTool();
+ var file = GenerateCodeWithProjectFile();
+
+ Assert.AreEqual(file, customTool.ProjectFilePassedToCreateTextTemplatingFileGenerator);
+ }
+
+ [Test]
+ public void GenerateCode_CustomToolContextPassed_CustomToolContextUsedToCreateTextTemplatingFileGenerator()
+ {
+ CreateCustomTool();
+ IProject project = CreateProject();
+ var context = new CustomToolContext(project);
+ customTool.GenerateCode(null, context);
+
+ Assert.AreEqual(context, customTool.ContextPassedToCreateTextTemplatingFileGenerator);
+ }
+
+ [Test]
+ public void GenerateCode_ProjectFilePassed_TemplateIsProcessed()
+ {
+ CreateCustomTool();
+ GenerateCodeWithProjectFile();
+
+ Assert.IsTrue(customTool.FakeTextTemplatingFileGenerator.IsProcessTemplateCalled);
+ }
+
+ [Test]
+ public void GenerateCode_ProjectFilePassed_TextTemplatingFileGeneratorIsDisposedAfterTemplateIsProcessed()
+ {
+ CreateCustomTool();
+ GenerateCodeWithProjectFile();
+
+ Assert.IsTrue(customTool.FakeTextTemplatingFileGenerator.IsDisposeCalledAfterTemplateProcessed);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs
new file mode 100644
index 0000000000..37e7018555
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs
@@ -0,0 +1,83 @@
+// 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 ICSharpCode.SharpDevelop.Project;
+using ICSharpCode.TextTemplating;
+using NUnit.Framework;
+using TextTemplating.Tests.Helpers;
+
+namespace TextTemplating.Tests
+{
+ [TestFixture]
+ public class TextTemplatingFileGeneratorTests
+ {
+ TextTemplatingFileGenerator generator;
+ FakeTextTemplatingHost templatingHost;
+ FakeTextTemplatingCustomToolContext customToolContext;
+
+ FileProjectItem ProcessTemplate(string fileName)
+ {
+ var projectFile = CreateGenerator(fileName);
+ generator.ProcessTemplate();
+
+ return projectFile;
+ }
+
+ FileProjectItem CreateGenerator(string fileName)
+ {
+ templatingHost = new FakeTextTemplatingHost();
+ var projectFile = new TestableFileProjectItem(fileName);
+ customToolContext = new FakeTextTemplatingCustomToolContext();
+
+ generator = new TextTemplatingFileGenerator(templatingHost, projectFile, customToolContext);
+
+ return projectFile;
+ }
+
+ [Test]
+ public void ProcessTemplate_TemplateFileInProjectPassed_TemplatingHostProcessesFile()
+ {
+ string fileName = @"d:\projects\MyProject\template.tt";
+ ProcessTemplate(fileName);
+
+ Assert.AreEqual(fileName, templatingHost.InputFilePassedToProcessTemplate);
+ }
+
+ [Test]
+ public void ProcessTemplate_TemplateFileInProjectPassed_OutputFileNamePassedIsInputFileWithFileExtensionChangedToCSharpFileExtension()
+ {
+ ProcessTemplate(@"d:\projects\MyProject\template.tt");
+
+ string expectedOutputFileName = @"d:\projects\MyProject\template.cs";
+ Assert.AreEqual(expectedOutputFileName, templatingHost.OutputFilePassedToProcessTemplate);
+ }
+
+ [Test]
+ public void Dispose_TemplateHostUsedToCreateFileGenerator_TemplateHostIsDisposed()
+ {
+ CreateGenerator(@"d:\template.tt");
+ generator.Dispose();
+
+ Assert.IsTrue(templatingHost.IsDisposeCalled);
+ }
+
+ [Test]
+ public void ProcessTemplate_TemplateFileInProjectPassed_TemplateFileInProjectUsedWhenCheckingIfOutputFileExistsInProject()
+ {
+ var file = ProcessTemplate(@"d:\template.tt");
+
+ Assert.AreEqual(file, customToolContext.BaseItemPassedToEnsureOutputFileIsInProject);
+ }
+
+ [Test]
+ public void ProcessTemplate_OutputFileNameChangedWhenTemplateProcessed_NewOutputFileNameIsUsedWhenCheckingIfOutputFileExistsInProject()
+ {
+ CreateGenerator(@"d:\template.tt");
+ templatingHost.OutputFile = @"d:\changed-output.test";
+ generator.ProcessTemplate();
+
+ Assert.AreEqual(@"d:\changed-output.test", customToolContext.OutputFileNamePassedToEnsureOutputFileIsInProject);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs
new file mode 100644
index 0000000000..bc66d42de3
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs
@@ -0,0 +1,94 @@
+// 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.IO;
+using ICSharpCode.TextTemplating;
+using NUnit.Framework;
+using TextTemplating.Tests.Helpers;
+
+namespace TextTemplating.Tests
+{
+ [TestFixture]
+ public class TextTemplatingHostTests
+ {
+ TextTemplatingHost host;
+ FakeTextTemplatingAppDomainFactory textTemplatingAppDomainFactory;
+ FakeTextTemplatingAppDomain textTemplatingAppDomain;
+
+ void CreateHost()
+ {
+ CreateHost(String.Empty);
+ }
+
+ void CreateHost(string applicationBase)
+ {
+ textTemplatingAppDomainFactory = new FakeTextTemplatingAppDomainFactory();
+ textTemplatingAppDomain = textTemplatingAppDomainFactory.FakeTextTemplatingAppDomain;
+ host = new TextTemplatingHost(textTemplatingAppDomainFactory, applicationBase);
+ }
+
+ [Test]
+ public void ProvideTemplatingAppDomain_PassedContentName_ReturnsDomainFromTextTemplatingAppDomainFactory()
+ {
+ CreateHost();
+ AppDomain expectedAppDomain = AppDomain.CreateDomain("TextTemplatingHostTests");
+ textTemplatingAppDomain.AppDomain = expectedAppDomain;
+
+ AppDomain actualAppDomain = host.ProvideTemplatingAppDomain("test");
+
+ Assert.AreEqual(expectedAppDomain, actualAppDomain);
+ }
+
+ [Test]
+ public void Dispose_DisposingHostAfterProvideTemplatingAppDomainCalled_DisposesTemplatingAppDomain()
+ {
+ CreateHost();
+ host.ProvideTemplatingAppDomain("test");
+ host.Dispose();
+
+ Assert.IsTrue(textTemplatingAppDomain.IsDisposeCalled);
+ }
+
+ [Test]
+ public void Dispose_DisposingHostWhenProvideTemplatingAppDomainIsNotCalled_DoesNotThrowNullReferenceException()
+ {
+ CreateHost();
+ Assert.DoesNotThrow(() => host.Dispose());
+ }
+
+ [Test]
+ public void ProvideTemplatingAppDomain_MethodCalledTwice_AppDomainCreatedOnce()
+ {
+ CreateHost();
+ host.ProvideTemplatingAppDomain("test");
+ host.ProvideTemplatingAppDomain("test");
+
+ Assert.AreEqual(1, textTemplatingAppDomainFactory.CreateTextTemplatingAppDomainCallCount);
+ }
+
+ [Test]
+ public void Dispose_DisposeCalledTwiceHostAfterProvideTemplatingAppDomainCalled_DisposesTemplatingAppDomainOnce()
+ {
+ CreateHost();
+ host.ProvideTemplatingAppDomain("test");
+ host.Dispose();
+
+ textTemplatingAppDomain.IsDisposeCalled = false;
+ host.Dispose();
+
+ Assert.IsFalse(textTemplatingAppDomain.IsDisposeCalled);
+ }
+
+ [Test]
+ public void ProvideTemplatingAppDomain_PassedContentName_HostApplicationBaseIsUsedAsAppDomainSetupApplicationBase()
+ {
+ string applicationBase = @"d:\sharpdevelop\addins\texttemplating";
+ CreateHost(applicationBase);
+ host.ProvideTemplatingAppDomain("test");
+
+ string actualApplicationBase = textTemplatingAppDomainFactory.ApplicationBasePassedToCreateTextTemplatingAppDomain;
+ Assert.AreEqual(applicationBase, actualApplicationBase);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj b/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj
new file mode 100644
index 0000000000..09a6e946f9
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj
@@ -0,0 +1,89 @@
+
+
+
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}
+ Debug
+ x86
+ Library
+ TextTemplating.Tests
+ TextTemplating.Tests
+ v4.0
+ Properties
+ False
+ False
+ 4
+ false
+ ..\..\..\..\..\..\bin\UnitTests\
+
+
+ x86
+ False
+ Auto
+ 4194304
+ 4096
+
+
+ true
+ Full
+ False
+ True
+ DEBUG;TRACE
+ Project
+
+
+ false
+ None
+ True
+ False
+ TRACE
+
+
+
+ ..\Project\lib\Mono.TextTemplating.dll
+
+
+ ..\..\..\..\Tools\NUnit\nunit.framework.dll
+
+
+
+ 3.5
+
+
+
+
+
+ Configuration\GlobalAssemblyInfo.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}
+ ICSharpCode.SharpDevelop
+
+
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
+ ICSharpCode.Core
+
+
+ {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}
+ TextTemplating
+
+
+
+
\ No newline at end of file
diff --git a/src/AddIns/Misc/TextTemplating/TextTemplating.sln b/src/AddIns/Misc/TextTemplating/TextTemplating.sln
new file mode 100644
index 0000000000..7d3ca24b52
--- /dev/null
+++ b/src/AddIns/Misc/TextTemplating/TextTemplating.sln
@@ -0,0 +1,110 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+# SharpDevelop 4.1.0.7318-alpha
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextTemplating", "Project\TextTemplating.csproj", "{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonDock", "..\..\..\Libraries\AvalonDock\AvalonDock\AvalonDock.csproj", "{87E61430-4243-45F2-B74E-0A4C096CEBF3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentation", "..\..\..\Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj", "{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.WinForms", "..\..\..\Main\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj", "{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextTemplating.Tests", "Test\TextTemplating.Tests.csproj", "{5186325C-DD7F-4246-9BE7-3F384EFBF5A6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "..\..\..\Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x86 = Debug|x86
+ Release|x86 = Release|x86
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Debug|x86.Build.0 = Debug|x86
+ {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Debug|x86.ActiveCfg = Debug|x86
+ {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Release|x86.Build.0 = Release|x86
+ {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Release|x86.ActiveCfg = Release|x86
+ {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Debug|x86.Build.0 = Debug|Any CPU
+ {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Release|x86.Build.0 = Release|Any CPU
+ {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Release|x86.ActiveCfg = Release|Any CPU
+ {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|x86.Build.0 = Debug|Any CPU
+ {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|x86.Build.0 = Release|Any CPU
+ {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|x86.ActiveCfg = Release|Any CPU
+ {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Debug|x86.Build.0 = Debug|Any CPU
+ {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Release|x86.Build.0 = Release|Any CPU
+ {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Release|x86.ActiveCfg = Release|Any CPU
+ {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Debug|x86.Build.0 = Debug|Any CPU
+ {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Release|x86.Build.0 = Release|Any CPU
+ {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Release|x86.ActiveCfg = Release|Any CPU
+ {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Release|Any CPU.Build.0 = Release|Any CPU
+ {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|x86.Build.0 = Debug|Any CPU
+ {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|x86.Build.0 = Release|Any CPU
+ {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|x86.ActiveCfg = Release|Any CPU
+ {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|x86.Build.0 = Debug|Any CPU
+ {8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8035765F-D51F-4A0C-A746-2FD100E19419}.Release|x86.Build.0 = Release|Any CPU
+ {8035765F-D51F-4A0C-A746-2FD100E19419}.Release|x86.ActiveCfg = Release|Any CPU
+ {8035765F-D51F-4A0C-A746-2FD100E19419}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8035765F-D51F-4A0C-A746-2FD100E19419}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Debug|x86.Build.0 = Debug|x86
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Debug|x86.ActiveCfg = Debug|x86
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Debug|Any CPU.Build.0 = Debug|x86
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Release|x86.Build.0 = Release|x86
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Release|x86.ActiveCfg = Release|x86
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Release|Any CPU.Build.0 = Release|x86
+ {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Release|Any CPU.ActiveCfg = Release|x86
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Debug|x86.Build.0 = Debug|Any CPU
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|x86.Build.0 = Release|Any CPU
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|x86.ActiveCfg = Release|Any CPU
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Debug|x86.Build.0 = Debug|Any CPU
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|x86.Build.0 = Release|Any CPU
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|x86.ActiveCfg = Release|Any CPU
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ EndGlobalSection
+EndGlobal