//======================================================================================================= Runtime ContentType internal static ContentType Create(Type type, string ctd) { var contentType = new ContentType(ContentType.GetByName("GenericContent"));//HACK: come from ctd var reader = new StringReader(ctd); var xml = new XPathDocument(reader); var nametable = new NameTable(); var nav = xml.CreateNavigator(); var nsres = new XmlNamespaceManager(nav.NameTable); nsres.AddNamespace("x", ContentDefinitionXmlNamespace); var contentTypeElement = nav.Select("/x:ContentType", nsres); contentTypeElement.MoveNext(); var contentTypeName = contentTypeElement.Current.GetAttribute("name", ""); contentType.Name = contentTypeName; var fieldElements = nav.Select("/x:ContentType/x:Fields/x:Field", nsres); foreach (XPathNavigator fieldElement in fieldElements) { var fieldDescriptor = FieldDescriptor.Parse(fieldElement, nsres, contentType); var fieldSetting = FieldSetting.Create(fieldDescriptor); contentType.FieldSettings.Add(fieldSetting); } contentType.SetFieldSlots(type); return(contentType); }
private void ParseFieldElements(XPathNavigator fieldsElement, IXmlNamespaceResolver nsres) { foreach (XPathNavigator fieldElement in fieldsElement.SelectChildren(XPathNodeType.Element)) { FieldDescriptor fieldDescriptor = FieldDescriptor.Parse(fieldElement, nsres, this); CheckFieldValidation(fieldDescriptor, this.Name); int fieldIndex = GetFieldSettingIndexByName(fieldDescriptor.FieldName); FieldSetting fieldSetting = fieldIndex < 0 ? null : this.FieldSettings[fieldIndex]; if (fieldSetting == null) { //==== if there is not...: create and inherit fieldSetting = FieldSetting.Create(fieldDescriptor); this.FieldSettings.Add(fieldSetting); //-- inherit new fieldType foreach (ContentType child in this.ChildTypes) { child.InheritField(fieldSetting); } } else { //==== if there is ... if (fieldSetting.Owner == this) { string fieldSettingTypeName = fieldDescriptor.FieldSettingTypeName; if (String.IsNullOrEmpty(fieldSettingTypeName)) { fieldSettingTypeName = FieldManager.GetDefaultFieldSettingTypeName(fieldDescriptor.FieldTypeName); } if (fieldSettingTypeName == fieldSetting.GetType().FullName) { fieldSetting.Modify(fieldDescriptor); } else { ChangeFieldSetting(fieldSetting, fieldDescriptor); } } else { //==== if inherited: break inheritance //-- create new FieldSetting newFieldSetting = FieldSetting.Create(fieldDescriptor); newFieldSetting.ParentFieldSetting = fieldSetting; this.FieldSettings[fieldIndex] = newFieldSetting; //-- inherit foreach (ContentType child in this.ChildTypes) { child.InheritField(newFieldSetting); } } } } }
private static ContentType Create(ISupportsDynamicFields handler, ContentType baseContentType, string ctd) { var contentType = new ContentType(baseContentType); contentType.DisplayName = baseContentType.DisplayName; contentType.Description = baseContentType.Description; //contentType.ParentType = baseContentType.ParentType; contentType.ParentType = baseContentType; contentType.FieldSettings.AddRange(baseContentType.FieldSettings); var reader = new StringReader(ctd); var xml = new XPathDocument(reader); var nametable = new NameTable(); var nav = xml.CreateNavigator(); var nsres = new XmlNamespaceManager(nav.NameTable); nsres.AddNamespace("x", ContentDefinitionXmlNamespace); var contentTypeElement = nav.Select("/x:ContentType", nsres); contentTypeElement.MoveNext(); var contentTypeName = contentTypeElement.Current.GetAttribute("name", ""); contentType.Name = contentTypeName; var fieldElements = nav.Select("/x:ContentType/x:Fields/x:Field", nsres); foreach (XPathNavigator fieldElement in fieldElements) { var fieldDescriptor = FieldDescriptor.Parse(fieldElement, nsres, contentType); var fieldSetting = FieldSetting.Create(fieldDescriptor); contentType.SetFieldSlots(fieldSetting, handler); contentType.FieldSettings.Add(fieldSetting); } return(contentType); }