static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var form = new Form(); var gridView = new DataGridView { Dock = DockStyle.Fill, Parent = form }; gridView.DataSource = ListDataView.Create(GetData(), null, p => { if (p.PropertyType == typeof(ComplexDataWrapper)) { return(ChildPropertyDescriptor.Create(p, "Name", "Complex Name")); } return(p); }); Application.Run(form); }
void AddProperty(DomNodeType domNodeType, SF.Tong.Schema.Property prop, PropertyDescriptorCollection newDescs) { if (prop.Type == SF.Tong.Schema.PropertyType.Enum) { SF.Tong.Schema.EnumTypeInfo enumInfo; if (!m_EnumDefines.TryGetValue(prop.TypeName, out enumInfo)) { Outputs.WriteLine(OutputMessageType.Error, "Invalid enum type {1} for property {0}", prop.Name, prop.TypeName); return; } AttributeInfo newAttr = null; if (prop.IsArray) { newAttr = new AttributeInfo(prop.Name, enumInfo.ArrayValueType); } else { newAttr = new AttributeInfo(prop.Name, enumInfo.SingleValueType); } if (prop.Default == null) { newAttr.DefaultValue = enumInfo.Value[0]; } else { newAttr.DefaultValue = prop.Default; } newAttr.AddRule(enumInfo.EnumRule); var newDesc = new AttributePropertyDescriptor(newAttr.Name, newAttr, "Node", newAttr.Name, false, new EnumUITypeEditor(enumInfo.Value), new EnumTypeConverter(enumInfo.Value)); newDescs.Add(newDesc); domNodeType.Define(newAttr); return; } var propTypeInfo = m_PropertyInfos[(int)prop.Type]; if (propTypeInfo.AttributeInfo != null) { AttributeInfo newAttr = null; if (prop.IsArray) { newAttr = propTypeInfo.ListAttributeInfo.Clone(prop.Name); } else { newAttr = propTypeInfo.AttributeInfo.Clone(prop.Name); } if (!string.IsNullOrEmpty(prop.Default)) { newAttr.DefaultValue = newAttr.Type.Convert(prop.Default); } newAttr.AddRule(new GameDataAttributeRule(prop)); var newDesc = new AttributePropertyDescriptor(newAttr.Name, newAttr, "Node", newAttr.Name, false, propTypeInfo.Editor, propTypeInfo.Converter); newDescs.Add(newDesc); domNodeType.Define(newAttr); } else if (propTypeInfo.ChildInfo != null) { var newChild = propTypeInfo.ChildInfo.Clone(prop.Name, prop.IsArray); newChild.AddRule(new GameDataChildRule(prop)); object editor = m_ChildCollectionEditor; var newDesc = new ChildPropertyDescriptor(newChild.Name, newChild, "Node", newChild.Name, false, editor, propTypeInfo.Converter); newDescs.Add(newDesc); domNodeType.Define(newChild); } }
DomNodeType CreateDOMType(Type clrType) { var nodeType = new DomNodeType(clrType.Name); var propertyDescs = new PropertyDescriptorCollection(null); var properties = clrType.GetProperties(); foreach (var prop in properties) { var propType = prop.PropertyType; AttributeInfo newAttr = null; PropertyDescriptor propDesc = null; if (propType.IsClass && propType != typeof(string)) { ChildInfo newChild = null; object editor = null; var childCLRType = propType.IsArray ? propType.GetElementType() : propType; newChild = new ChildInfo(prop.Name, CreateDOMType(childCLRType), propType.IsArray); nodeType.Define(newChild); if (propType.IsArray && clrType != typeof(SF.Tong.Schema.EditorSocket)) { editor = m_ChildCollectionEditor; } propDesc = new ChildPropertyDescriptor(prop.Name, newChild, "Node", prop.Name, false, editor); } else if (propType.IsEnum) { if (propType.IsArray) { newAttr = new AttributeInfo(prop.Name, AttributeType.StringArrayType); newAttr.AddRule(new StringEnumRule(Enum.GetNames(propType))); } else { newAttr = new AttributeInfo(prop.Name, AttributeType.StringType); newAttr.AddRule(new StringEnumRule(Enum.GetNames(propType))); } } else { if (propType.IsArray) { switch (propType.Name) { case "String": // Consider them as string crc always? newAttr = new AttributeInfo(prop.Name, new AttributeType(AttributeTypes.SingleArray.ToString(), typeof(string[]))); newAttr.AddRule(new StringHashRule()); break; case "int": newAttr = new AttributeInfo(prop.Name, new AttributeType(AttributeTypes.Int32Array.ToString(), typeof(int[]))); break; case "boolean": newAttr = new AttributeInfo(prop.Name, new AttributeType(AttributeTypes.BooleanArray.ToString(), typeof(bool[]))); break; case "Single": newAttr = new AttributeInfo(prop.Name, new AttributeType(AttributeTypes.SingleArray.ToString(), typeof(float[]))); break; default: throw new NotSupportedException("Not supported data type for DOM type gen:" + prop.PropertyType.Name); } } else { switch (propType.Name) { case "String": // Consider them as string crc always? newAttr = new AttributeInfo(prop.Name, AttributeType.StringType); newAttr.AddRule(new StringHashRule()); break; case "int": newAttr = new AttributeInfo(prop.Name, AttributeType.IntType); break; case "boolean": newAttr = new AttributeInfo(prop.Name, AttributeType.BooleanType); break; case "Single": newAttr = new AttributeInfo(prop.Name, AttributeType.FloatType); break; default: throw new NotSupportedException("Not supported data type for DOM type gen:" + prop.PropertyType.Name); } } } if (newAttr != null) { propDesc = new AttributePropertyDescriptor(prop.Name, newAttr, "Node", prop.Name, false); nodeType.Define(newAttr); } if (propDesc != null) { propertyDescs.Add(propDesc); } } nodeType.SetTag(propertyDescs); return(nodeType); }