diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj index 23a62ba5d9..9914c066be 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj @@ -51,6 +51,10 @@ Create.tt True + + Details.tt + True + Empty.tt @@ -204,6 +208,12 @@ Create.cs Always + + TextTemplatingFilePreprocessor + ICSharpCode.AspNet.Mvc.AspxCSharp + Details.cs + Always + Always TextTemplatingFilePreprocessor diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.cs new file mode 100644 index 0000000000..8b0ee8537d --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.cs @@ -0,0 +1,450 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.239 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ICSharpCode.AspNet.Mvc.AspxCSharp { + using ICSharpCode.AspNet.Mvc; + using System; + + + public partial class Details : DetailsBase { + + private global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost hostValue; + + + #line 51 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + + MvcTextTemplateHost MvcHost { + get { return (MvcTextTemplateHost)Host; } + } + + public string GetViewPageType() + { + string viewDataTypeName = MvcHost.ViewDataTypeName; + if (!String.IsNullOrEmpty(viewDataTypeName)) { + return String.Format("<{0}>", viewDataTypeName); + } + return String.Empty; + } + + #line default + #line hidden + + + public global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost Host { + get { + return this.hostValue; + } + set { + this.hostValue = value; + } + } + + public virtual string TransformText() { + this.GenerationEnvironment = null; + + #line 3 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + if (MvcHost.IsPartialView) { + + #line default + #line hidden + + #line 4 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("<%@ Control Language=\"C#\" Inherits=\"System.Web.Mvc.ViewUserControl"); + + #line default + #line hidden + + #line 4 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( GetViewPageType() )); + + #line default + #line hidden + + #line 4 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("\" %>\r\n\r\n"); + + #line default + #line hidden + + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + } else if (MvcHost.IsContentPage) { + + #line default + #line hidden + + #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("<%@ Page Language=\"C#\" MasterPageFile=\""); + + #line default + #line hidden + + #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.MasterPageFile )); + + #line default + #line hidden + + #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("\" Inherits=\"System.Web.Mvc.ViewPage"); + + #line default + #line hidden + + #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( GetViewPageType() )); + + #line default + #line hidden + + #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("\" %>\r\n\r\n\r\n" + + ""); + + #line default + #line hidden + + #line 10 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.ViewName )); + + #line default + #line hidden + + #line 10 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("\r\n\r\n\r\n\r\n"); + + #line default + #line hidden + + #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + + } else { + PopIndent(); + + + #line default + #line hidden + + #line 48 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("\t\r\n\r\n"); + + #line default + #line hidden + + #line 50 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + } + + #line default + #line hidden + return this.GenerationEnvironment.ToString(); + } + + protected virtual void Initialize() { + } + } + + public class DetailsBase { + + private global::System.Text.StringBuilder builder; + + private global::System.Collections.Generic.IDictionary session; + + private global::System.CodeDom.Compiler.CompilerErrorCollection errors; + + private string currentIndent = string.Empty; + + private global::System.Collections.Generic.Stack indents; + + private bool endsWithNewline; + + private ToStringInstanceHelper _toStringHelper = new ToStringInstanceHelper(); + + public virtual global::System.Collections.Generic.IDictionary Session { + get { + return this.session; + } + set { + this.session = value; + } + } + + public global::System.Text.StringBuilder GenerationEnvironment { + get { + if ((this.builder == null)) { + this.builder = new global::System.Text.StringBuilder(); + } + return this.builder; + } + set { + this.builder = value; + } + } + + protected global::System.CodeDom.Compiler.CompilerErrorCollection Errors { + get { + if ((this.errors == null)) { + this.errors = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errors; + } + } + + public string CurrentIndent { + get { + return this.currentIndent; + } + } + + private global::System.Collections.Generic.Stack Indents { + get { + if ((this.indents == null)) { + this.indents = new global::System.Collections.Generic.Stack(); + } + return this.indents; + } + } + + public ToStringInstanceHelper ToStringHelper { + get { + return this._toStringHelper; + } + } + + public void Error(string message) { + this.Errors.Add(new global::System.CodeDom.Compiler.CompilerError(null, -1, -1, null, message)); + } + + public void Warning(string message) { + global::System.CodeDom.Compiler.CompilerError val = new global::System.CodeDom.Compiler.CompilerError(null, -1, -1, null, message); + val.IsWarning = true; + this.Errors.Add(val); + } + + public string PopIndent() { + if ((this.Indents.Count == 0)) { + return string.Empty; + } + int lastPos = (this.currentIndent.Length - this.Indents.Pop()); + string last = this.currentIndent.Substring(lastPos); + this.currentIndent = this.currentIndent.Substring(0, lastPos); + return last; + } + + public void PushIndent(string indent) { + this.Indents.Push(indent.Length); + this.currentIndent = (this.currentIndent + indent); + } + + public void ClearIndent() { + this.currentIndent = string.Empty; + this.Indents.Clear(); + } + + public void Write(string textToAppend) { + if (string.IsNullOrEmpty(textToAppend)) { + return; + } + if ((((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline) + && (this.CurrentIndent.Length > 0))) { + this.GenerationEnvironment.Append(this.CurrentIndent); + } + this.endsWithNewline = false; + char last = textToAppend[(textToAppend.Length - 1)]; + if (((last == '\n') + || (last == '\r'))) { + this.endsWithNewline = true; + } + if ((this.CurrentIndent.Length == 0)) { + this.GenerationEnvironment.Append(textToAppend); + return; + } + int lastNewline = 0; + for (int i = 0; (i + < (textToAppend.Length - 1)); i = (i + 1)) { + char c = textToAppend[i]; + if ((c == '\r')) { + if ((textToAppend[(i + 1)] == '\n')) { + i = (i + 1); + if ((i + == (textToAppend.Length - 1))) { + goto breakLoop; + } + } + } + else { + if ((c != '\n')) { + goto continueLoop; + } + } + i = (i + 1); + int len = (i - lastNewline); + if ((len > 0)) { + this.GenerationEnvironment.Append(textToAppend, lastNewline, (i - lastNewline)); + } + this.GenerationEnvironment.Append(this.CurrentIndent); + lastNewline = i; + continueLoop: + ; + } + breakLoop: + if ((lastNewline > 0)) { + this.GenerationEnvironment.Append(textToAppend, lastNewline, (textToAppend.Length - lastNewline)); + } + else { + this.GenerationEnvironment.Append(textToAppend); + } + } + + public void Write(string format, params object[] args) { + this.Write(string.Format(format, args)); + } + + public void WriteLine(string textToAppend) { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + + public void WriteLine(string format, params object[] args) { + this.WriteLine(string.Format(format, args)); + } + + public class ToStringInstanceHelper { + + private global::System.IFormatProvider formatProvider = global::System.Globalization.CultureInfo.InvariantCulture; + + public global::System.IFormatProvider FormatProvider { + get { + return this.formatProvider; + } + set { + if ((this.formatProvider == null)) { + throw new global::System.ArgumentNullException("formatProvider"); + } + this.formatProvider = value; + } + } + + public string ToStringWithCulture(object objectToConvert) { + if ((objectToConvert == null)) { + throw new global::System.ArgumentNullException("objectToConvert"); + } + global::System.Type type = objectToConvert.GetType(); + global::System.Type iConvertibleType = typeof(global::System.IConvertible); + if (iConvertibleType.IsAssignableFrom(type)) { + return ((global::System.IConvertible)(objectToConvert)).ToString(this.formatProvider); + } + global::System.Reflection.MethodInfo methInfo = type.GetMethod("ToString", new global::System.Type[] { + iConvertibleType}); + if ((methInfo != null)) { + return ((string)(methInfo.Invoke(objectToConvert, new object[] { + this.formatProvider}))); + } + return objectToConvert.ToString(); + } + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.tt new file mode 100644 index 0000000000..be938dd74f --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.tt @@ -0,0 +1,64 @@ +<#@ template language="C#" HostSpecific="true" #> +<#@ import namespace="ICSharpCode.AspNet.Mvc" #> +<# if (MvcHost.IsPartialView) { #> +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<#= GetViewPageType() #>" %> + +<# } else if (MvcHost.IsContentPage) { #> +<%@ Page Language="C#" MasterPageFile="<#= MvcHost.MasterPageFile #>" Inherits="System.Web.Mvc.ViewPage<#= GetViewPageType() #>" %> + + +<#= MvcHost.ViewName #> + + + +<# + PushIndent("\t"); + } else { +#> +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<#= GetViewPageType() #>" %> + + + + + <#= MvcHost.ViewName #> + + +<# + PushIndent("\t\t"); + } +#> +
+ <#= MvcHost.ViewDataType.Name #> +
+

+ <%: Html.ActionLink("Edit", "Edit") %> | + <%: Html.ActionLink("Back", "Index") %> +

+<# + if (MvcHost.IsPartialView) { + // Do nothing. + } else if (MvcHost.IsContentPage) { + PopIndent(); +#> +
+<# + } else { + PopIndent(); +#> + + +<# } #> +<#+ + MvcTextTemplateHost MvcHost { + get { return (MvcTextTemplateHost)Host; } + } + + public string GetViewPageType() + { + string viewDataTypeName = MvcHost.ViewDataTypeName; + if (!String.IsNullOrEmpty(viewDataTypeName)) { + return String.Format("<{0}>", viewDataTypeName); + } + return String.Empty; + } +#> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj index 57459409ed..fdaaecfdf0 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj @@ -86,6 +86,7 @@ + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs new file mode 100644 index 0000000000..d2d368d736 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs @@ -0,0 +1,151 @@ +// 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 AspNet.Mvc.Tests.CodeTemplates.Models; +using AspNet.Mvc.Tests.Helpers; +using ICSharpCode.AspNet.Mvc.AspxCSharp; +using NUnit.Framework; + +namespace AspNet.Mvc.Tests.CodeTemplates +{ + [TestFixture] + public class AspxCSharpDetailsViewTemplateTests + { + Details templatePreprocessor; + TestableMvcTextTemplateHost mvcHost; + + void CreateViewTemplatePreprocessor() + { + mvcHost = new TestableMvcTextTemplateHost(); + templatePreprocessor = new Details(); + templatePreprocessor.Host = mvcHost; + } + + [Test] + public void GetViewPageType_HostViewDataTypeNameIsMyAppMyModel_ReturnsMyAppMyModelSurroundedByAngleBrackets() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataTypeName = "MyApp.MyModel"; + + string viewPageType = templatePreprocessor.GetViewPageType(); + + Assert.AreEqual("", viewPageType); + } + + [Test] + public void GetViewPageType_HostViewDataTypeNameIsNull_ReturnsEmptyString() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataTypeName = null; + + string viewPageType = templatePreprocessor.GetViewPageType(); + + Assert.AreEqual(String.Empty, viewPageType); + } + + [Test] + public void GetViewPageType_HostViewDataTypeNameIsEmptyString_ReturnsEmptyString() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataTypeName = String.Empty; + + string viewPageType = templatePreprocessor.GetViewPageType(); + + Assert.AreEqual(String.Empty, viewPageType); + } + + [Test] + public void TransformText_ModelHasNoPropertiesAndNoMasterPage_ReturnsFullHtmlPageWithFormAndFieldSetForModel() + { + CreateViewTemplatePreprocessor(); + Type modelType = typeof(ModelWithNoProperties); + mvcHost.ViewDataType = modelType; + mvcHost.ViewDataTypeName = modelType.FullName; + mvcHost.ViewName = "MyView"; + + string output = templatePreprocessor.TransformText(); + + string expectedOutput = +@"<%@ Page Language=""C#"" Inherits=""System.Web.Mvc.ViewPage"" %> + + + + + MyView + + +
+ ModelWithNoProperties +
+

+ <%: Html.ActionLink(""Edit"", ""Edit"") %> | + <%: Html.ActionLink(""Back"", ""Index"") %> +

+ + +"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void TransformText_ModelHasNoPropertiesAndIsPartialView_ReturnsControlWithFormAndFieldSetForModel() + { + CreateViewTemplatePreprocessor(); + mvcHost.IsPartialView = true; + Type modelType = typeof(ModelWithNoProperties); + mvcHost.ViewDataType = modelType; + mvcHost.ViewDataTypeName = modelType.FullName; + mvcHost.ViewName = "MyView"; + + string output = templatePreprocessor.TransformText(); + + string expectedOutput = +@"<%@ Control Language=""C#"" Inherits=""System.Web.Mvc.ViewUserControl"" %> + +
+ ModelWithNoProperties +
+

+ <%: Html.ActionLink(""Edit"", ""Edit"") %> | + <%: Html.ActionLink(""Back"", ""Index"") %> +

+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void TransformText_ModelHasNoPropertiesAndIsContentPage_ReturnsContentPageWithFormAndFieldSetForModel() + { + CreateViewTemplatePreprocessor(); + mvcHost.IsContentPage = true; + Type modelType = typeof(ModelWithNoProperties); + mvcHost.ViewDataType = modelType; + mvcHost.ViewDataTypeName = modelType.FullName; + mvcHost.ViewName = "MyView"; + mvcHost.MasterPageFile = "~/Views/Shared/Site.master"; + mvcHost.PrimaryContentPlaceHolderID = "Main"; + + string output = templatePreprocessor.TransformText(); + + string expectedOutput = +@"<%@ Page Language=""C#"" MasterPageFile=""~/Views/Shared/Site.master"" Inherits=""System.Web.Mvc.ViewPage"" %> + + +MyView + + + +
+ ModelWithNoProperties +
+

+ <%: Html.ActionLink(""Edit"", ""Edit"") %> | + <%: Html.ActionLink(""Back"", ""Index"") %> +

+
+"; + Assert.AreEqual(expectedOutput, output); + } + } +}