using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using CommonLang.Property;
using CommonFroms.Utils;
using System.Drawing.Design;
using CommonLang;
using System.Collections;
using CommonFroms.G2D.DataGrid;

namespace CommonFroms.DescAttributeEdit
{
    public partial class ValuePanel : UserControl
    {
        public object EditValue { get; private set; }

        private IG2DPropertyAdapter[] value_adapters;


        public ValuePanel()
        {
            InitializeComponent();
            this.propertyGrid1.PropertySort = PropertySort.Categorized;
        }

        public void SetAdapters(IG2DPropertyAdapter[] adapters)
        {
            this.value_adapters = CUtils.ArrayLink<IG2DPropertyAdapter>(adapters, new ValuePanelAdapter(adapters));
        }

        public void SetValue(object obj)
        {
            this.EditValue = obj;
            this.propertyGrid1.SelectedObject = new G2DPropertyDescriptor(obj, value_adapters);
        }

        class ValuePanelAdapter : IG2DPropertyAdapter
        {
            private IG2DPropertyAdapter[] adapters;

            public ValuePanelAdapter(IG2DPropertyAdapter[] adapters)
            {
                this.adapters = adapters;
            }

            public UITypeEditor GetEditor(MemberInfo field, Type fieldType, object ownerData)
            {
                return new ValuePanelUITypeEditor(adapters, field, ownerData);

            }
            public TypeConverter GetConverter(MemberInfo field, Type fieldType, object ownerData)
            {
                return null;
            }
        }

        class ValuePanelUITypeEditor : G2DMemberUITypeEditor
        {
            private IG2DPropertyAdapter[] adapters;
            private DescAttribute desc;

            public ValuePanelUITypeEditor(IG2DPropertyAdapter[] adapters, MemberInfo field, object ownerData)
                : base(field, ownerData)
            {
                this.adapters = CUtils.ArrayLink<IG2DPropertyAdapter>(adapters, new ValuePanelAdapter(adapters));
                this.desc = PropertyUtil.GetAttribute<DescAttribute>(field);
            }
            public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
            {
                if (fieldType.IsPrimitive)
                {
                    return UITypeEditorEditStyle.None;
                }
                else if (fieldType.IsEnum)
                {
                    return UITypeEditorEditStyle.None;
                }
                else if (fieldType.Equals(typeof(string)))
                {
                    return UITypeEditorEditStyle.None;
                }
                else if (fieldType.IsClass)
                {
                    return UITypeEditorEditStyle.Modal;
                }
                else if (fieldType.IsArray)
                {
                    return UITypeEditorEditStyle.Modal;
                }
                return UITypeEditorEditStyle.Modal;
            }
            public override object EditValue(
                ITypeDescriptorContext context,
                IServiceProvider provider,
                object value)
            {
                ListAttribute listattr = PropertyUtil.GetAttribute<ListAttribute>(fieldInfo);
                if (listattr != null)
                {
                    G2DCollectionEditor editor = new G2DCollectionEditor(
                        fieldType,
                        value,
                        listattr.ElementTypes.ToArray(),
                        adapters);
                    if (editor.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        return editor.GetEditCompleteData();
                    }
                }
                else
                {
                    object result = ValueTypeDialog.ShowValueDialog(
                        null, "设置 " + desc.Desc, fieldType, value, adapters);
                    if (result != null)
                    {
                        return result;
                    }
                }
                return base.EditValue(context, provider, value);
            }
        }
    }
}