using CommonAI.Zone;
using CommonFroms.G2D.DataGrid;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CommonAIEditor
{
    public partial class FormTerrainDefinition : Form
    {
        private TerrainDefinitionMap data;

        public TerrainDefinitionMap Data { get { return data; } }

        public FormTerrainDefinition()
        {
            InitializeComponent();
            this.data = Editor.Instance.TerrainDefinition.Clone() as TerrainDefinitionMap;
            this.Refresh();
        }
        //---------------------------------------------------------------------------------------------------------------------------
        #region ui_event
        private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        {
            var selected = SelectedBrush;
            if (selected != null)
            {
                g2DPropertyGrid1.SelectedObject = new G2DPropertyDescriptor(selected);
            }
            else
            {
                g2DPropertyGrid1.SelectedObject = null;
            }
        }
        private void g2DPropertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
        {
            Refresh(SelectedBrush);
        }
        private void btn_Add_Click(object sender, EventArgs e)
        {
            AddBrush();
        }
        private void btn_Remove_Click(object sender, EventArgs e)
        {
            RemoveBrush(SelectedBrush);
        }
        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            this.Close();
        }
        private void button_OK_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        #endregion
        //---------------------------------------------------------------------------------------------------------------------------
        public TerrainDefinitionMap.MapBlockBrush SelectedBrush
        {
            get
            {
                if (listView1.SelectedItems.Count > 0 && listView1.SelectedItems[0].Tag is TerrainDefinitionMap.MapBlockBrush)
                {
                    return listView1.SelectedItems[0].Tag as TerrainDefinitionMap.MapBlockBrush;
                }
                return null;
            }
            set
            {
                listView1.SelectedItems.Clear();
                foreach (ListViewItem item in listView1.Items)
                {
                    if (item.Tag is TerrainDefinitionMap.MapBlockBrush)
                    {
                        var d = item.Tag as TerrainDefinitionMap.MapBlockBrush;
                        if (d.Value == value.Value)
                        {
                            item.Selected = true;
                        }
                    }
                }
            }
        }
        public int SelectedColor
        {
            get
            {
                var brush = SelectedBrush;
                if (brush != null)
                {
                    return brush.Value;
                }
                return 0;
            }
            set
            {
                listView1.SelectedItems.Clear();
                foreach (ListViewItem item in listView1.Items)
                {
                    if (item.Tag is TerrainDefinitionMap.MapBlockBrush)
                    {
                        var d = item.Tag as TerrainDefinitionMap.MapBlockBrush;
                        if (d.Value == value)
                        {
                            item.Selected = true;
                        }
                    }
                }
            }
        }

        private void AddBrush()
        {

            ColorDialog cd = new ColorDialog();
            if (cd.ShowDialog() == DialogResult.OK)
            {
                var value = cd.Color.ToArgb();
                if (data.ContainsValue(value))
                {
                    MessageBox.Show("已存在地块颜色: " + cd.Color);
                }
                else
                {
                    TerrainDefinitionMap.MapBlockBrush block = new TerrainDefinitionMap.MapBlockBrush();
                    data.Brushes.Add(block);
                    Refresh(block);
                }
            }

        }
        private void RemoveBrush(TerrainDefinitionMap.MapBlockBrush selected)
        {

            if (selected != null)
            {
                int index = data.Brushes.IndexOf(selected);
                if (index >= 0)
                {
                    data.Brushes.Remove(selected);
                    if (index < data.Brushes.Count)
                    {
                        var next = data.Brushes[index];
                        Refresh(next);
                    }
                    else if (data.Brushes.Count > 0)
                    {
                        var next = data.Brushes[index - 1];
                        Refresh(next);
                    }
                    else
                    {
                        Refresh();
                    }
                }
            }

        }
        private void Refresh(TerrainDefinitionMap.MapBlockBrush selected = null)
        {
            listView1.SuspendLayout();
            try
            {
                listView1.Items.Clear();
                foreach (var d in data.Brushes)
                {
                    ListViewItem add = new ListViewItem();
                    add.SubItems.Add(d.Value.ToString("X8") + "(" + d.Value + ")");
                    add.SubItems.Add(d.IsBlock.ToString());
                    add.SubItems.Add(d.Name + "");
                    add.SubItems.Add(d.Desc + "");
                    add.UseItemStyleForSubItems = false;
                    add.BackColor = Color.FromArgb(d.Value);
                    add.Tag = d;
                    add.ToolTipText = d.Desc + "";
                    listView1.Items.Add(add);
                    if (selected != null && selected.Value == d.Value)
                    {
                        add.Selected = true;
                    }
                }
            }
            finally
            {
                listView1.ResumeLayout();
            }
        }

    }
}