Example #1
0
    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);
        }