using AdvancedDataGridView;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CommonFroms.Utils.TreeGrid
{
    public class G2DTreeGridValueColumn : DataGridViewTextBoxColumn
    {
        public G2DTreeGridValueColumn()
        {
            this.CellTemplate = new G2DTreeGridValueCell();
        }
        public override DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                G2DTreeGridValueCell cell = value as G2DTreeGridValueCell;
                if (value != null && cell == null)
                {
                    throw new InvalidCastException("Value provided for CellTemplate must be of type TEditNumDataGridViewCell or derive from it.");
                }
                base.CellTemplate = value;
            }
        }
    }

    public class G2DTreeGridValueCell : DataGridViewTextBoxCell
    {
        public G2DTreeGridValueCell()
        {

        }

        private Type editType = typeof(TextG2DTreeGridValueEditingControl);
        private Type valueType = typeof(string);

        public void SetValueEditType(Type vtype, Type etype = null)
        {
            this.valueType = vtype;
            if (etype != null)
            {
                this.editType = etype;
            }
            else
            {
                if (valueType.IsEnum)
                {
                    this.editType = typeof(EnumG2DTreeGridValueEditingControl);
                }
                else if (typeof(bool).IsAssignableFrom(ValueType))
                {
                    this.editType = typeof(BoolG2DTreeGridValueEditingControl);
                }
                else
                {
                    this.editType = typeof(TextG2DTreeGridValueEditingControl);
                }
            }
        }

        public override Type EditType
        {
            get { return editType; }
        }
        public override Type ValueType
        {
            get { return valueType; }
        }
        public override object ParseFormattedValue(object formattedValue, DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter formattedValueTypeConverter, System.ComponentModel.TypeConverter valueTypeConverter)
        {
            return base.ParseFormattedValue(formattedValue, cellStyle, formattedValueTypeConverter, valueTypeConverter);
        }
    }


    public class TextG2DTreeGridValueEditingControl : DataGridViewTextBoxEditingControl
    {
        public TextG2DTreeGridValueEditingControl()
        {
        }
    }
    public class EnumG2DTreeGridValueEditingControl : DataGridViewComboBoxEditingControl
    {
        public EnumG2DTreeGridValueEditingControl()
        {
        }
        public void SetEnumType(Type type)
        {
            if (type.IsEnum)
            {
                base.Items.Clear();
                foreach (object obj in Enum.GetValues(type))
                {
                    base.Items.Add(obj.ToString());
                }
            }
        }
        public G2DTreeGridValueCell CurrentCell
        {
            get
            {
                return EditingControlDataGridView[2, EditingControlRowIndex] as G2DTreeGridValueCell;
            }
        }
        public override void PrepareEditingControlForEdit(bool selectAll)
        {
            this.Text = CurrentCell.Value + "";
            SetEnumType(CurrentCell.ValueType);
        }
    }
    public class BoolG2DTreeGridValueEditingControl : DataGridViewComboBoxEditingControl
    {
        public BoolG2DTreeGridValueEditingControl()
        {
            base.Items.Add(true.ToString());
            base.Items.Add(false.ToString());
        }
        public G2DTreeGridValueCell CurrentCell
        {
            get
            {
                return EditingControlDataGridView[2, EditingControlRowIndex] as G2DTreeGridValueCell;
            }
        }
        public override void PrepareEditingControlForEdit(bool selectAll)
        {
            this.Text = CurrentCell.Value + "";
        }
    }



    public class MoneyTextBoxDataGridViewEditingControl : TextBox, IDataGridViewEditingControl
    {
        private DataGridView dataGridView;  // grid owning this editing control
        private bool valueChanged;  // editing control's value has changed or not
        private int rowIndex;  //  row index in which the editing control resides

        #region IDataGridViewEditingControl 成员

        public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        {
            this.Font = dataGridViewCellStyle.Font;
            if (dataGridViewCellStyle.BackColor.A < 255)
            {
                // The NumericUpDown control does not support transparent back colors
                Color opaqueBackColor = Color.FromArgb(255, dataGridViewCellStyle.BackColor);
                this.BackColor = opaqueBackColor;
                this.dataGridView.EditingPanel.BackColor = opaqueBackColor;
            }
            else
            {
                this.BackColor = dataGridViewCellStyle.BackColor;
            }
            this.ForeColor = dataGridViewCellStyle.ForeColor;
        }

        public DataGridView EditingControlDataGridView
        {
            get
            {
                return this.dataGridView;
            }
            set
            {
                this.dataGridView = value;
            }
        }

        public object EditingControlFormattedValue
        {
            get
            {
                return GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting);
            }
            set
            {
                this.Text = (string)value;
            }
        }

        public int EditingControlRowIndex
        {
            get
            {
                return this.rowIndex;
            }
            set
            {
                this.rowIndex = value;
            }
        }

        public bool EditingControlValueChanged
        {
            get { return this.valueChanged; }
            set { this.valueChanged = value; }
        }

        public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
        {
            switch (keyData & Keys.KeyCode)
            {
                case Keys.Right:
                case Keys.Left:
                case Keys.Down:
                case Keys.Up:
                case Keys.Home:
                case Keys.End:
                case Keys.Delete:
                    return true;
            }
            return !dataGridViewWantsInputKey;
        }

        public Cursor EditingPanelCursor
        {
            get { return Cursors.Default; }
        }

        public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        {
            return this.Text;
        }

        public void PrepareEditingControlForEdit(bool selectAll)
        {
            if (selectAll)
            {
                this.SelectAll();
            }
            else
            {
                this.SelectionStart = this.Text.Length;
            }
        }

        public bool RepositionEditingControlOnValueChange
        {
            get { return false; }
        }

        #endregion
    }
}