using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;

using System.Text;
using System.Windows.Forms;

namespace CommonFroms.G2D
{
    public partial class G2DListSelectEditor<T> : Form
    //  where T : class
    {
        private static Rectangle last_open_rect = Rectangle.Empty;


        public T SelectedObject
        {
            get;
            private set;
        }

        public G2DListSelectEditor(List<T> list, T selected = default(T))
            : this(list.ToArray(), selected) { }
        public G2DListSelectEditor(T[] list, T selected = default(T))
        {
            InitializeComponent();

            this.listView1.Visible = true;
            this.treeView1.Visible = false;

            foreach (T e in list)
            {
                ListViewItem item = new ListViewItem(e.ToString());
                item.Tag = e;
                listView1.Items.Add(item);
            }

            if (selected != null)
            {
                listView1.SelectedItems.Clear();
                foreach (ListViewItem item in listView1.Items)
                {
                    if (object.Equals(item.Tag, selected))
                    {
                        item.Selected = true;
                        return;
                    }
                }
            }
        }

        public G2DListSelectEditor(TreeNode root, ImageList imageList, object selected)
        {
            InitializeComponent();

            this.listView1.Visible = false;
            this.treeView1.Visible = true;

            this.treeView1.ImageList = imageList;

            TreeNode tr = TreeNodeDuplicate(root);
            this.treeView1.Nodes.Add(tr);
            this.treeView1.CollapseAll();
            tr.Expand();

            if (selected != null)
            {
                foreach (TreeNode tn in G2DTreeNodeBase.GetAllNodes(treeView1.Nodes))
                {
                    if (tn.Tag == selected)
                    {
                        treeView1.SelectedNode = tn;
                        tn.Parent.Expand();
                        return;
                    }
                }
            }

        }

        public static TreeNode TreeNodeDuplicate(TreeNode root)
        {
            TreeNode node = new TreeNode(root.Text);
            node.Tag = root.Tag;
            node.ImageIndex = root.ImageIndex;
            node.SelectedImageIndex = root.SelectedImageIndex;
            if (!string.IsNullOrEmpty(root.ImageKey))
                node.ImageKey = root.ImageKey;
            if (!string.IsNullOrEmpty(root.SelectedImageKey))
                node.SelectedImageKey = root.SelectedImageKey;
            foreach (TreeNode tn in root.Nodes)
            {
                TreeNode ctn = TreeNodeDuplicate(tn);
                node.Nodes.Add(ctn);
            }
            if (root.IsExpanded)
            {
                node.Expand();
            }
            else
            {
                node.Collapse();
            }
            return node;
        }

        private void G2DListSelectEditor_Load(object sender, EventArgs e)
        {
            if (last_open_rect != Rectangle.Empty)
            {
                this.Bounds = last_open_rect;
            }
            if (treeView1.Visible && treeView1.Nodes.Count > 0)
            {
                treeView1.Nodes[0].Expand();
            }
        }

        private void G2DListSelectEditor_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (listView1.Visible)
            {
                if (listView1.SelectedItems.Count > 0)
                {
                    SelectedObject = (T)listView1.SelectedItems[0].Tag;
                }
            }
            else if (treeView1.Visible)
            {
                if (treeView1.SelectedNode != null)
                {
                    SelectedObject = (T)treeView1.SelectedNode.Tag;
                }
            }

            last_open_rect = this.Bounds;
        }



    }
}