diff --git a/LinqToUmbraco/src/umbraco.Linq/Core/DocTypeBase.cs b/LinqToUmbraco/src/umbraco.Linq/Core/DocTypeBase.cs index a4d147ba1e..e07b945e74 100644 --- a/LinqToUmbraco/src/umbraco.Linq/Core/DocTypeBase.cs +++ b/LinqToUmbraco/src/umbraco.Linq/Core/DocTypeBase.cs @@ -16,7 +16,7 @@ namespace umbraco.Linq.Core { #region Internal Storage private int _Id; - private string _name; + private string _nodeName; private string _versionId; private int _templateId; private int _parentId; @@ -24,6 +24,7 @@ namespace umbraco.Linq.Core private User _writer; private int creatorID; private User _creator; + private string _path; private IEnumerable _ancestors; private AssociationTree _children; #endregion @@ -77,22 +78,36 @@ namespace umbraco.Linq.Core /// /// The name. [Field] - [UmbracoInfo("nodeName", DisplayName = "Name", Mandatory = true), DataMember(Name = "Name")] + [UmbracoInfo("nodeName", DisplayName = "NodeName", Mandatory = true), DataMember(Name = "NodeName")] + public virtual string NodeName + { + get + { + return this._nodeName; + } + set + { + if (this._nodeName != value) + { + this.RaisePropertyChanging(); + this._nodeName = value; + this.IsDirty = true; + this.RaisePropertyChanged("NodeName"); + } + } + } + + [Field] + [Obsolete("Name property is obsolete, use NodeName instead")] //this is because most people expect NodeName not Name as the property public virtual string Name { get { - return this._name; + return this.NodeName; } set { - if (this._name != value) - { - this.RaisePropertyChanging(); - this._name = value; - this.IsDirty = true; - this.RaisePropertyChanged("Name"); - } + this.NodeName = value; } } @@ -115,7 +130,7 @@ namespace umbraco.Linq.Core this.RaisePropertyChanging(); this._templateId = value; this.IsDirty = true; - this.RaisePropertyChanged("Name"); + this.RaisePropertyChanged("Template"); } } } @@ -161,7 +176,7 @@ namespace umbraco.Linq.Core { this.RaisePropertyChanging(); this._parentId = value; - this.RaisePropertyChanged("Version"); + this.RaisePropertyChanged("ParentId"); } } } @@ -197,6 +212,30 @@ namespace umbraco.Linq.Core [Field] [UmbracoInfo("level", DisplayName = "Level"), DataMember(Name = "Level")] public virtual int Level { get; set; } + + /// + /// Gets or sets the path. + /// + /// The path. + [Field] + [UmbracoInfo("path", DisplayName = "Path")] + [DataMember(Name = "Path")] + public virtual string Path + { + get + { + return this._path; + } + set + { + if (this._path != value) + { + this.RaisePropertyChanging(); + this._path = value; + this.RaisePropertyChanged("Path"); + } + } + } #endregion #region Parents and Children diff --git a/LinqToUmbraco/src/umbraco.Linq/Core/IDocTypeBase.cs b/LinqToUmbraco/src/umbraco.Linq/Core/IDocTypeBase.cs index 786c03edb0..56701a65c4 100644 --- a/LinqToUmbraco/src/umbraco.Linq/Core/IDocTypeBase.cs +++ b/LinqToUmbraco/src/umbraco.Linq/Core/IDocTypeBase.cs @@ -59,6 +59,12 @@ namespace umbraco.Linq.Core /// Gets or sets the name. /// /// The name. + string NodeName { get; set; } + /// + /// Gets or sets the name. + /// + /// The name. + [Obsolete("Name property is obsolete, use NodeName instead")] //this is because most people expect NodeName not Name as the property string Name { get; set; } /// /// Parent if current instance @@ -101,5 +107,10 @@ namespace umbraco.Linq.Core /// /// The name of the writer. string WriterName { get; } + /// + /// Gets or sets the path. + /// + /// The path. + string Path { get; set; } } } diff --git a/LinqToUmbraco/src/umbraco.Linq/Core/Node/NodeDataProvider.cs b/LinqToUmbraco/src/umbraco.Linq/Core/Node/NodeDataProvider.cs index b384df1ac4..fb4d805efd 100644 --- a/LinqToUmbraco/src/umbraco.Linq/Core/Node/NodeDataProvider.cs +++ b/LinqToUmbraco/src/umbraco.Linq/Core/Node/NodeDataProvider.cs @@ -320,7 +320,7 @@ namespace umbraco.Linq.Core.Node node.Id = (int)xml.Attribute("id"); node.ParentNodeId = (int)xml.Attribute("parentID"); - node.Name = (string)xml.Attribute("nodeName"); + node.NodeName = (string)xml.Attribute("nodeName"); node.Version = (string)xml.Attribute("version"); node.CreateDate = (DateTime)xml.Attribute("createDate"); node.SortOrder = (int)xml.Attribute("sortOrder"); @@ -337,12 +337,29 @@ namespace umbraco.Linq.Core.Node { var attr = ReflectionAssistance.GetUmbracoInfoAttribute(p); - var data = xml.Element(Casing.SafeAliasWithForcingCheck(attr.Alias)).Value; - if (p.PropertyType == typeof(int) && string.IsNullOrEmpty(data)) - data = "-1"; + //here is where you would put a check if the property exists in the XML + //I'm NOT putting the check in here, as there will be unusual results if the XML doesn't + //contain the property, you'd get nulls when something shouldn't really be null + string data = xml.Element(Casing.SafeAliasWithForcingCheck(attr.Alias)).Value; - // TODO: Address how Convert.ChangeType works in globalisation - p.SetValue(node, Convert.ChangeType(data, p.PropertyType), null); + if (p.PropertyType.IsValueType && typeof(Nullable<>).IsAssignableFrom(p.PropertyType.GetGenericTypeDefinition())) + { + if (string.IsNullOrEmpty(data)) + { + //non-mandatory structs which have no value will be null + p.SetValue(node, null, null); + } + else + { + //non-mandatory structs which do have a value have to be cast based on the type of their Nullable, found from the first (well, only) GenericArgument + p.SetValue(node, Convert.ChangeType(data, p.PropertyType.GetGenericArguments()[0]), null); + } + } + else + { + // TODO: Address how Convert.ChangeType works in globalisation + p.SetValue(node, Convert.ChangeType(data, p.PropertyType), null); + } } } } diff --git a/LinqToUmbraco/src/umbraco.Linq/Core/umbraco.Linq.Core.csproj b/LinqToUmbraco/src/umbraco.Linq/Core/umbraco.Linq.Core.csproj index 75a9c24888..96e045563b 100644 --- a/LinqToUmbraco/src/umbraco.Linq/Core/umbraco.Linq.Core.csproj +++ b/LinqToUmbraco/src/umbraco.Linq/Core/umbraco.Linq.Core.csproj @@ -146,4 +146,4 @@ XCOPY "$(TargetPath)" "$(SolutionDir)\umbraco\presentation\bin" /Y - \ No newline at end of file + diff --git a/umbraco.sln b/umbraco.sln index 695bcf3ec3..62106d9b65 100644 --- a/umbraco.sln +++ b/umbraco.sln @@ -9,6 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution SHOCKING.testrunconfig = SHOCKING.testrunconfig umbraco weekly.build = umbraco weekly.build umbraco.build = umbraco.build + umbraco3.vsmdi = umbraco3.vsmdi UMBRACOELISE.testrunconfig = UMBRACOELISE.testrunconfig UMBRACOHUMMER.testrunconfig = UMBRACOHUMMER.testrunconfig EndProjectSection @@ -154,7 +155,7 @@ Global SccLocalPath13 = umbraco.Test EndGlobalSection GlobalSection(TestCaseManagementSettings) = postSolution - CategoryFile = umbraco.vsmdi + CategoryFile = umbraco3.vsmdi EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/umbraco/presentation/umbraco/controls/ContentTypeControlNew.ascx.cs b/umbraco/presentation/umbraco/controls/ContentTypeControlNew.ascx.cs index 378d5b778f..980369b1a0 100644 --- a/umbraco/presentation/umbraco/controls/ContentTypeControlNew.ascx.cs +++ b/umbraco/presentation/umbraco/controls/ContentTypeControlNew.ascx.cs @@ -394,7 +394,10 @@ jQuery(function() { refreshDropDowns(); }); propertiesPH.Controls.Add(new LiteralControl("
    ")); foreach (cms.businesslogic.propertytype.PropertyType pt in cType.PropertyTypes) { - if (pt.ContentTypeId == cType.Id && !inTab.ContainsKey(pt.Id.ToString())) + //This use to be: + //if (pt.ContentTypeId == cType.Id && !inTab.ContainsKey(pt.Id.ToString()) + //But seriously, if it's not on a tab the tabId is 0, it's a lot easier to read IMO + if (pt.ContentTypeId == cType.Id && pt.TabId == 0) { GenericProperties.GenericPropertyWrapper gpw = new umbraco.controls.GenericProperties.GenericPropertyWrapper(); diff --git a/umbraco/presentation/umbraco/dialogs/ExportCode.aspx.cs b/umbraco/presentation/umbraco/dialogs/ExportCode.aspx.cs index 023896a82c..a9ba1465c9 100644 --- a/umbraco/presentation/umbraco/dialogs/ExportCode.aspx.cs +++ b/umbraco/presentation/umbraco/dialogs/ExportCode.aspx.cs @@ -11,26 +11,26 @@ using umbraco.IO; namespace umbraco.presentation.umbraco.dialogs { - public partial class ExportCode : BasePages.UmbracoEnsuredPage - { - private Dictionary dataTypeMapping = new Dictionary(); - private const string EXPORT_FOLDER = "/exported-doctypes/"; + public partial class ExportCode : BasePages.UmbracoEnsuredPage + { + private Dictionary dataTypeMapping = new Dictionary(); + private const string EXPORT_FOLDER = "/exported-doctypes/"; - private List _docTypes; - public List DocTypes - { - get - { - if (_docTypes == null) - { - _docTypes = DocumentType.GetAllAsList(); - } - return _docTypes; - } - } + private List _docTypes; + public List DocTypes + { + get + { + if (_docTypes == null) + { + _docTypes = DocumentType.GetAllAsList(); + } + return _docTypes; + } + } - #region POCO Template - private readonly static string POCO_TEMPLATE = @"using System; + #region POCO Template + private readonly static string POCO_TEMPLATE = @"using System; using System.Linq; using umbraco.Linq.Core; using System.Collections.Generic; @@ -38,456 +38,469 @@ using System.Collections.Generic; namespace {0} {{ public partial class {1}DataContext : UmbracoDataContext{2} {{ #region Partials - partial void OnCreated(); - #endregion + partial void OnCreated(); + #endregion public {1}DataContext() : base() - {{ - OnCreated(); - }} + {{ + OnCreated(); + }} - public {1}DataContext(UmbracoDataProvider provider) : base(provider) - {{ - OnCreated(); - }} + public {1}DataContext(UmbracoDataProvider provider) : base(provider) + {{ + OnCreated(); + }} - {3} + {3} }} - {4} + {4} }}"; - #endregion + #endregion - #region Abstraction Template - private readonly static string POCO_ABSTRACTION_TEMPLATE = @"using System; + #region Abstraction Template + private readonly static string POCO_ABSTRACTION_TEMPLATE = @"using System; using System.Linq; using umbraco.Linq.Core; using System.Collections.Generic; namespace {0} {{ - public interface I{1}DataContext : IUmbracoDataContext {{ - {2} + public partial interface I{1}DataContext : IUmbracoDataContext {{ + {2} }} - {3} + {3} }}"; - #endregion + #endregion - #region Tree Template - private readonly static string TREE_TEMPLATE = @" - public Tree<{0}> {0}s - {{ - get - {{ - return this.LoadTree<{0}>(); - }} - }}"; - #endregion + #region Tree Template + private readonly static string TREE_TEMPLATE = @" + public Tree<{0}> {0}s + {{ + get + {{ + return this.LoadTree<{0}>(); + }} + }}"; + #endregion - #region Abstraction Tree Template - private readonly static string TREE_ABSTRACTION_TEMPLATE = @" - IEnumerable I{1}DataContext.{0}s - {{ - get - {{ - return this.LoadTree<{0}>().OfType(); - }} - }}"; - #endregion + #region Abstraction Tree Template + private readonly static string TREE_ABSTRACTION_TEMPLATE = @" + IEnumerable I{1}DataContext.{0}s + {{ + get + {{ + return this.LoadTree<{0}>().OfType(); + }} + }}"; + #endregion - #region Class Template - //0 - Alias - //1 - class name - //2 - interface or string.Empty - //3 - properties - //4 - child relationships - //5 - interface explicit implementation - //6 - description - private readonly static string CLASS_TEMPLATE = @" - /// - /// {6} - /// - [UmbracoInfo(""{0}"")] - [System.Runtime.Serialization.DataContractAttribute()] - [DocType()] - public partial class {1} : {7} {2} {{ - public {1}() {{ - }} - {3} - {4} - {5} + #region Class Template + //0 - Alias + //1 - class name + //2 - interface or string.Empty + //3 - properties + //4 - child relationships + //5 - interface explicit implementation + //6 - description + private readonly static string CLASS_TEMPLATE = @" + /// + /// {6} + /// + [UmbracoInfo(""{0}"")] + [System.Runtime.Serialization.DataContractAttribute()] + [DocType()] + public partial class {1} : {7} {2} {{ + public {1}() {{ + }} + {3} + {4} + {5} }}"; - #endregion + #endregion - #region Interface Template - //0 - Class name - //1 - properties - //2 - child relationshipts - private readonly static string INTERFACE_TEMPLATE = @" - public interface I{0} : I{3} {{ - {1} - {2} + #region Interface Template + //0 - Class name + //1 - properties + //2 - child relationshipts + private readonly static string INTERFACE_TEMPLATE = @" + public partial interface I{0} : I{3} {{ + {1} + {2} }}"; - #endregion + #endregion - #region Properties Template - private readonly static string PROPERTIES_TEMPLATE = @" - private {0} _{1}; - /// - /// {2} - /// - [UmbracoInfo(""{3}"", DisplayName = ""{4}"", Mandatory = {5})] - [Property()] - public virtual {0} {1} - {{ - get - {{ - return this._{1}; - }} - set - {{ - if ((this._{1} != value)) - {{ - this.RaisePropertyChanging(); - this._{1} = value; - this.RaisePropertyChanged(""{1}""); - }} - }} - }}"; - #endregion + #region Properties Template + private readonly static string PROPERTIES_TEMPLATE = @" + private {0} _{1}; + /// + /// {2} + /// + [UmbracoInfo(""{3}"", DisplayName = ""{4}"", Mandatory = {5})] + [Property()] + [System.Runtime.Serialization.DataMemberAttribute()] + public virtual {0} {1} + {{ + get + {{ + return this._{1}; + }} + set + {{ + if ((this._{1} != value)) + {{ + this.RaisePropertyChanging(); + this._{1} = value; + this.RaisePropertyChanged(""{1}""); + }} + }} + }}"; + #endregion - #region Child Relationships Template - private readonly static string CHILD_RELATIONS_TEMPLATE = @" - private AssociationTree<{0}> _{0}s; - public AssociationTree<{0}> {0}s - {{ - get - {{ - if ((this._{0}s == null)) - {{ - this._{0}s = this.ChildrenOfType<{0}>(); - }} - return this._{0}s; - }} - set - {{ - this._{0}s = value; - }} - }}"; - #endregion + #region Child Relationships Template + private readonly static string CHILD_RELATIONS_TEMPLATE = @" + private AssociationTree<{0}> _{0}s; + public AssociationTree<{0}> {0}s + {{ + get + {{ + if ((this._{0}s == null)) + {{ + this._{0}s = this.ChildrenOfType<{0}>(); + }} + return this._{0}s; + }} + set + {{ + this._{0}s = value; + }} + }}"; + #endregion - #region Child Relationship Abstraction Template - private readonly static string CHILD_RELATIONS_ABSTRACTION_TEMPLATE = @" - IEnumerable I{1}.{0}s - {{ - get - {{ - return this.{0}s.OfType(); - }} - }}"; - #endregion + #region Child Relationship Abstraction Template + private readonly static string CHILD_RELATIONS_ABSTRACTION_TEMPLATE = @" + IEnumerable I{1}.{0}s + {{ + get + {{ + return this.{0}s.OfType(); + }} + }}"; + #endregion - protected void Page_Load(object sender, EventArgs e) - { - btnGenerate.Text = ui.Text("create"); - } + protected void Page_Load(object sender, EventArgs e) + { + btnGenerate.Text = ui.Text("create"); + } - protected void btnGenerate_Click(object sender, EventArgs e) - { - var includeInterfaces = ddlGenerationMode.SelectedValue == "abs"; + protected void btnGenerate_Click(object sender, EventArgs e) + { + var includeInterfaces = ddlGenerationMode.SelectedValue == "abs"; - var poco = string.Format(POCO_TEMPLATE, - this.txtNamespace.Text, - this.txtDataContextName.Text, - includeInterfaces ? ", I" + this.txtDataContextName.Text + "DataContext" : string.Empty, - GenerateDataContextCollections(includeInterfaces), - GenerateClasses(includeInterfaces) - ); + var poco = string.Format(POCO_TEMPLATE, + this.txtNamespace.Text, + this.txtDataContextName.Text, + includeInterfaces ? ", I" + this.txtDataContextName.Text + "DataContext" : string.Empty, + GenerateDataContextCollections(includeInterfaces), + GenerateClasses(includeInterfaces) + ); - // As we save in a new folder under Media, we need to ensure it exists - EnsureExportFolder(); - string pocoFile = Path.Combine(IO.SystemDirectories.Media + EXPORT_FOLDER, this.txtDataContextName.Text + ".txt"); + // As we save in a new folder under Media, we need to ensure it exists + EnsureExportFolder(); + string pocoFile = Path.Combine(IO.SystemDirectories.Media + EXPORT_FOLDER, this.txtDataContextName.Text + ".txt"); - using (var writer = new StreamWriter(IO.IOHelper.MapPath(pocoFile))) - { - writer.Write(poco); - } + using (var writer = new StreamWriter(IO.IOHelper.MapPath(pocoFile))) + { + writer.Write(poco); + } - lnkPoco.NavigateUrl = pocoFile; + lnkPoco.NavigateUrl = pocoFile; - pnlButtons.Visible = false; - pane_files.Visible = true; + pnlButtons.Visible = false; + pane_files.Visible = true; - if (includeInterfaces) - { - var abstraction = string.Format(POCO_ABSTRACTION_TEMPLATE, - this.txtNamespace.Text, - this.txtDataContextName.Text, - GenerateDataContextAbstractCollections(), - GenerateClassAbstraction() - ); + if (includeInterfaces) + { + var abstraction = string.Format(POCO_ABSTRACTION_TEMPLATE, + this.txtNamespace.Text, + this.txtDataContextName.Text, + GenerateDataContextAbstractCollections(), + GenerateClassAbstraction() + ); - string abstractionFile = Path.Combine(IO.SystemDirectories.Media + EXPORT_FOLDER, "I" + this.txtDataContextName.Text + ".txt"); + string abstractionFile = Path.Combine(IO.SystemDirectories.Media + EXPORT_FOLDER, "I" + this.txtDataContextName.Text + ".txt"); - using (var writer = new StreamWriter(IO.IOHelper.MapPath(abstractionFile))) - { - writer.Write(abstraction); - } + using (var writer = new StreamWriter(IO.IOHelper.MapPath(abstractionFile))) + { + writer.Write(abstraction); + } - lnkAbstractions.NavigateUrl = abstractionFile; - lnkAbstractions.Enabled = true; - } - } + lnkAbstractions.NavigateUrl = abstractionFile; + lnkAbstractions.Enabled = true; + } + } - private string GenerateClassAbstraction() - { - var sb = new StringBuilder(); + private string GenerateClassAbstraction() + { + var sb = new StringBuilder(); - foreach (var dt in this.DocTypes) - { - var baseType = "DocTypeBase"; - if (dt.MasterContentType > 0) - { - var parent = DocTypes.First(d => d.Id == dt.MasterContentType); - baseType = GenerateTypeName(parent.Alias); - } + foreach (var dt in this.DocTypes) + { + var baseType = "DocTypeBase"; + if (dt.MasterContentType > 0) + { + var parent = DocTypes.First(d => d.Id == dt.MasterContentType); + baseType = GenerateTypeName(parent.Alias); + } - sb.AppendLine(string.Format(INTERFACE_TEMPLATE, - GenerateTypeName(dt.Alias), - GenerateAbstractProperties(dt), - GenerateAbstractRelations(dt), - baseType - ) - ); - } + sb.AppendLine(string.Format(INTERFACE_TEMPLATE, + GenerateTypeName(dt.Alias), + GenerateAbstractProperties(dt), + GenerateAbstractRelations(dt), + baseType + ) + ); + } - return sb.ToString(); - } + return sb.ToString(); + } - private string GenerateAbstractRelations(DocumentType dt) - { - var sb = new StringBuilder(); + private string GenerateAbstractRelations(DocumentType dt) + { + var sb = new StringBuilder(); - var children = dt.AllowedChildContentTypeIDs; - foreach (var child in DocTypes.Where(d => children.Contains(d.Id))) - { - sb.AppendLine(string.Format("IEnumerable {0}s {{ get; }}", - GenerateTypeName(child.Alias) - ) - ); - } + var children = dt.AllowedChildContentTypeIDs; + foreach (var child in DocTypes.Where(d => children.Contains(d.Id))) + { + sb.AppendLine(string.Format("IEnumerable {0}s {{ get; }}", + GenerateTypeName(child.Alias) + ) + ); + } - return sb.ToString(); - } + return sb.ToString(); + } - private string GenerateAbstractProperties(DocumentType dt) - { - var sb = new StringBuilder(); + private string GenerateAbstractProperties(DocumentType dt) + { + var sb = new StringBuilder(); - foreach (var pt in dt.PropertyTypes) - { - sb.AppendLine(string.Format("{0} {1} {{ get; set; }}", - GetDotNetType(pt), - GenerateTypeName(pt.Alias) - ) - ); - } + foreach (var pt in + dt.getVirtualTabs.Where(x => x.ContentType == dt.Id).SelectMany(x => x.PropertyTypes) + .Concat(dt.PropertyTypes.Where(x => x.ContentTypeId == dt.Id && x.TabId == 0)) + ) + { + sb.AppendLine(string.Format("{0} {1} {{ get; set; }}", + GetDotNetType(pt), + GenerateTypeName(pt.Alias) + ) + ); + } - return sb.ToString(); - } + return sb.ToString(); + } - private string GenerateDataContextAbstractCollections() - { - var sb = new StringBuilder(); - foreach (var dt in this.DocTypes) - { - sb.AppendLine(string.Format("IEnumerable {0}s {{ get; }}", GenerateTypeName(dt.Alias))); - } - return sb.ToString(); - } + private string GenerateDataContextAbstractCollections() + { + var sb = new StringBuilder(); + foreach (var dt in this.DocTypes) + { + sb.AppendLine(string.Format("IEnumerable {0}s {{ get; }}", GenerateTypeName(dt.Alias))); + } + return sb.ToString(); + } - private string GenerateClasses(bool includeInterfaces) - { - var sb = new StringBuilder(); + private string GenerateClasses(bool includeInterfaces) + { + var sb = new StringBuilder(); - foreach (var dt in DocTypes) - { - string className = GenerateTypeName(dt.Alias); + foreach (var dt in DocTypes) + { + string className = GenerateTypeName(dt.Alias); - var baseType = "DocTypeBase"; - if (dt.MasterContentType > 0) - { - var parent = DocTypes.First(d => d.Id == dt.MasterContentType); - baseType = GenerateTypeName(parent.Alias); - } + var baseType = "DocTypeBase"; + if (dt.MasterContentType > 0) + { + var parent = DocTypes.First(d => d.Id == dt.MasterContentType); + baseType = GenerateTypeName(parent.Alias); + } - sb.Append(string.Format(CLASS_TEMPLATE, - dt.Alias, - className, - includeInterfaces ? ", I" + className : string.Empty, - GenerateProperties(dt), - GenerateChildRelationships(dt), - includeInterfaces ? GenerateAbstractionImplementation(dt) : string.Empty, - FormatForComment(dt.Description), - baseType - ) - ); - } + sb.Append(string.Format(CLASS_TEMPLATE, + dt.Alias, + className, + includeInterfaces ? ", I" + className : string.Empty, + GenerateProperties(dt), + GenerateChildRelationships(dt), + includeInterfaces ? GenerateAbstractionImplementation(dt) : string.Empty, + FormatForComment(dt.Description), + baseType + ) + ); + } - return sb.ToString(); - } + return sb.ToString(); + } - private string GenerateAbstractionImplementation(DocumentType dt) - { - var sb = new StringBuilder(); + private string GenerateAbstractionImplementation(DocumentType dt) + { + var sb = new StringBuilder(); - var children = dt.AllowedChildContentTypeIDs; - foreach (var child in DocTypes.Where(d => children.Contains(d.Id))) - { - sb.Append(string.Format(CHILD_RELATIONS_ABSTRACTION_TEMPLATE, - GenerateTypeName(child.Alias), - GenerateTypeName(dt.Alias) - ) - ); - } - return sb.ToString(); - } + var children = dt.AllowedChildContentTypeIDs; + foreach (var child in DocTypes.Where(d => children.Contains(d.Id))) + { + sb.Append(string.Format(CHILD_RELATIONS_ABSTRACTION_TEMPLATE, + GenerateTypeName(child.Alias), + GenerateTypeName(dt.Alias) + ) + ); + } + return sb.ToString(); + } - private object GenerateChildRelationships(DocumentType dt) - { - var sb = new StringBuilder(); - var children = dt.AllowedChildContentTypeIDs; - foreach (var child in DocTypes.Where(d => children.Contains(d.Id))) - { - sb.Append(string.Format(CHILD_RELATIONS_TEMPLATE, - GenerateTypeName(child.Alias) - ) - ); - } - return sb.ToString(); - } + private object GenerateChildRelationships(DocumentType dt) + { + var sb = new StringBuilder(); + var children = dt.AllowedChildContentTypeIDs; + foreach (var child in DocTypes.Where(d => children.Contains(d.Id))) + { + sb.Append(string.Format(CHILD_RELATIONS_TEMPLATE, + GenerateTypeName(child.Alias) + ) + ); + } + return sb.ToString(); + } - private object GenerateProperties(DocumentType dt) - { - var sb = new StringBuilder(); - foreach (var pt in dt.PropertyTypes) - { - sb.Append(string.Format(PROPERTIES_TEMPLATE, - GetDotNetType(pt), - GenerateTypeName(pt.Alias), - FormatForComment(pt.Description), - pt.Alias, - pt.Name, - pt.Mandatory.ToString().ToLower() - ) - ); - } + private object GenerateProperties(DocumentType dt) + { + var sb = new StringBuilder(); + foreach (var pt in + dt.getVirtualTabs.Where(x => x.ContentType == dt.Id).SelectMany(x => x.PropertyTypes) + .Concat(dt.PropertyTypes.Where(x => x.ContentTypeId == dt.Id && x.TabId == 0)) + ) + { + sb.Append(string.Format(PROPERTIES_TEMPLATE, + GetDotNetType(pt), + GenerateTypeName(pt.Alias), + FormatForComment(pt.Description), + pt.Alias, + pt.Name, + pt.Mandatory.ToString().ToLower() + ) + ); + } - return sb.ToString(); - } + return sb.ToString(); + } - private string GetDotNetType(PropertyType pt) - { - Guid id = pt.DataTypeDefinition.DataType.Id; - if (!dataTypeMapping.ContainsKey(id)) - { - var defaultData = pt.DataTypeDefinition.DataType.Data as DefaultData; - if (defaultData != null) //first lets see if it inherits from DefaultData, pretty much all do - { - switch (defaultData.DatabaseType) - { - case DBTypes.Integer: - dataTypeMapping.Add(id, typeof(int)); - break; - case DBTypes.Date: - dataTypeMapping.Add(id, typeof(DateTime)); - break; - case DBTypes.Nvarchar: - case DBTypes.Ntext: - dataTypeMapping.Add(id, typeof(string)); - break; - default: - dataTypeMapping.Add(id, typeof(object)); - break; - } - } - else //hmm so it didn't, lets try something else - { - var dbType = BusinessLogic.Application.SqlHelper.ExecuteScalar(@"SELECT [t0].[dbType] FROM [cmsDataType] AS [t0] WHERE [t0].[controlId] = @p0", BusinessLogic.Application.SqlHelper.CreateParameter("@p0", id)); + private string GetDotNetType(PropertyType pt) + { + Guid id = pt.DataTypeDefinition.DataType.Id; + if (!dataTypeMapping.ContainsKey(id)) + { + var defaultData = pt.DataTypeDefinition.DataType.Data as DefaultData; + if (defaultData != null) //first lets see if it inherits from DefaultData, pretty much all do + { + switch (defaultData.DatabaseType) + { + case DBTypes.Integer: + dataTypeMapping.Add(id, typeof(int)); + break; + case DBTypes.Date: + dataTypeMapping.Add(id, typeof(DateTime)); + break; + case DBTypes.Nvarchar: + case DBTypes.Ntext: + dataTypeMapping.Add(id, typeof(string)); + break; + default: + dataTypeMapping.Add(id, typeof(object)); + break; + } + } + else //hmm so it didn't, lets try something else + { + var dbType = BusinessLogic.Application.SqlHelper.ExecuteScalar(@"SELECT [t0].[dbType] FROM [cmsDataType] AS [t0] WHERE [t0].[controlId] = @p0", BusinessLogic.Application.SqlHelper.CreateParameter("@p0", id)); - if (!string.IsNullOrEmpty(dbType)) //can I determine from the DB? - { - switch (dbType.ToUpper()) - { - case "INTEGER": - dataTypeMapping.Add(id, typeof(int)); - break; - case "DATE": - dataTypeMapping.Add(id, typeof(DateTime)); - break; - case "NTEXT": - case "NVARCHAR": - dataTypeMapping.Add(id, typeof(string)); - break; - default: - dataTypeMapping.Add(id, typeof(object)); - break; - } - } - else - { - //ok, you've got a really freaky data type, so you get an Object back :P - dataTypeMapping.Add(id, typeof(object)); - } - } - } - return dataTypeMapping[id].Name; - } + if (!string.IsNullOrEmpty(dbType)) //can I determine from the DB? + { + switch (dbType.ToUpper()) + { + case "INTEGER": + dataTypeMapping.Add(id, typeof(int)); + break; + case "DATE": + dataTypeMapping.Add(id, typeof(DateTime)); + break; + case "NTEXT": + case "NVARCHAR": + dataTypeMapping.Add(id, typeof(string)); + break; + default: + dataTypeMapping.Add(id, typeof(object)); + break; + } + } + else + { + //ok, you've got a really freaky data type, so you get an Object back :P + dataTypeMapping.Add(id, typeof(object)); + } + } + } + //if it's a valueType and it's not a mandatory field we'll make it nullable. And let's be lazy and us something like 'int?' rather than + //the fully layed out version :P + if (!pt.Mandatory && dataTypeMapping[id].IsValueType) + return dataTypeMapping[id].Name + "?"; - private string GenerateDataContextCollections(bool includeInterfaces) - { - StringBuilder sb = new StringBuilder(); + //here we can use a standard type name + return dataTypeMapping[id].Name; + } - foreach (var dt in DocTypes) - { - string className = GenerateTypeName(dt.Alias); - sb.Append(string.Format(TREE_TEMPLATE, - className - ) - ); + private string GenerateDataContextCollections(bool includeInterfaces) + { + StringBuilder sb = new StringBuilder(); - if (includeInterfaces) - { - sb.AppendLine(string.Format(TREE_ABSTRACTION_TEMPLATE, - className, - txtDataContextName.Text - ) - ); - } - } - return sb.ToString(); - } + foreach (var dt in DocTypes) + { + string className = GenerateTypeName(dt.Alias); + sb.Append(string.Format(TREE_TEMPLATE, + className + ) + ); - private static string GenerateTypeName(string alias) - { - string s = Casing.SafeAlias(alias); - return s[0].ToString().ToUpper() + s.Substring(1, s.Length - 1); - } + if (includeInterfaces) + { + sb.AppendLine(string.Format(TREE_ABSTRACTION_TEMPLATE, + className, + txtDataContextName.Text + ) + ); + } + } + return sb.ToString(); + } - private static string FormatForComment(string s) - { - if (string.IsNullOrEmpty(s)) - { - return s; - } - return s.Replace("\r\n", "\r\n///"); - } + private static string GenerateTypeName(string alias) + { + string s = Casing.SafeAlias(alias); + return s[0].ToString().ToUpper() + s.Substring(1, s.Length - 1); + } - private static void EnsureExportFolder() - { - string packagesDirectory = IO.SystemDirectories.Media + EXPORT_FOLDER; - if (!System.IO.Directory.Exists(IOHelper.MapPath(packagesDirectory))) - System.IO.Directory.CreateDirectory(IOHelper.MapPath(packagesDirectory)); - } - } + private static string FormatForComment(string s) + { + if (string.IsNullOrEmpty(s)) + { + return s; + } + return s.Replace("\r\n", "\r\n///"); + } + + private static void EnsureExportFolder() + { + string packagesDirectory = IO.SystemDirectories.Media + EXPORT_FOLDER; + if (!System.IO.Directory.Exists(IOHelper.MapPath(packagesDirectory))) + System.IO.Directory.CreateDirectory(IOHelper.MapPath(packagesDirectory)); + } + } } diff --git a/umbraco2.vsmdi b/umbraco2.vsmdi new file mode 100644 index 0000000000..58397cc20f --- /dev/null +++ b/umbraco2.vsmdi @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file