using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using COMUN=GMLC01HerramientasCad.Logica;

namespace GMLC01HerramientasCad.Acad
{
    internal partial class SeleccionElementoForm : COMUN.BaseForm
    {
        private TreeViewState tvState = new TreeViewState();
        private COMUN.Categoria pCategoriaSeleccionada;
        private COMUN.Entidad pEntidadSeleccionada;
        private COMUN.SubTipo pSubtipoSeleccionado;

        public String Nivel
        {
            get
            {
                return (pCategoriaSeleccionada != null ?
                          (pEntidadSeleccionada != null ?
                              (pSubtipoSeleccionado != null ? pCategoriaSeleccionada.Codigo + ":" + pEntidadSeleccionada.Codigo + ":" + pSubtipoSeleccionado.Codigo
                            : pCategoriaSeleccionada.Codigo + ":" + pEntidadSeleccionada.Codigo)
                           : null)
                        : null);
            }
        }
        /*
        public String NivelCad
        {
            get
            {
                return (pEntidadSeleccionada != null ?
                          (pSubtipoSeleccionado != null ? pEntidadSeleccionada.Codigo + "." + pEntidadSeleccionada.CampoSubTipo + "." + pSubtipoSeleccionado.Codigo //Nombre//s["es"]
                        : pEntidadSeleccionada.Codigo)
                       : null);
            }
        }
        */
        /// <summary>
        /// Devuelve la categoría seleccionada
        /// </summary>
        public COMUN.Categoria CategoriaSeleccionada
        {
            get { return pCategoriaSeleccionada; }
        }

        /// <summary>
        /// Devuelve la entidad seleccionada
        /// </summary>
        public COMUN.Entidad EntidadSeleccionada
        {
            get { return pEntidadSeleccionada; }
            set { pEntidadSeleccionada = value; }
        }
        /*
        /// <summary>
        /// Devuelve el tipo seleccionado
        /// </summary>
        public COMUN.SubTipo SubTipoSeleccionado
        {
            get { return pSubtipoSeleccionado; }
        }
        */
        public SeleccionElementoForm(COMUN.XSDInfo xsd, Boolean mostrarSubtipos)
        {
            InitializeComponent();

            elementosTreeView.Nodes.Clear();

            this.CancelButton = new Button();
            //((Button)this.CancelButton).Click += delegate(System.Object o, System.EventArgs e) { this.Close(); };

            foreach (COMUN.Categoria cat in xsd.Categorias)
            {
                TreeNode treeNodeCat = elementosTreeView.Nodes.Add(cat.Nombre);
                treeNodeCat.Tag = cat;
                foreach (COMUN.Entidad ent in cat.Entidades)
                {
                    TreeNode treeNodeEnt = treeNodeCat.Nodes.Add(ent.Nombre);
                    treeNodeEnt.Tag = ent;
                    if (mostrarSubtipos && (ent.SubTipos != null))
                    {
                        foreach (COMUN.SubTipo stipo in ent.SubTipos)
                        {
                            TreeNode treeNodeSTipo = treeNodeEnt.Nodes.Add(stipo.Nombre);
                            treeNodeSTipo.Tag = stipo;
                        }
                        treeNodeEnt.Collapse();
                    }
                }
                treeNodeCat.Expand();
            }
            //elementosTreeView.ExpandAll();
            elementosTreeView.Sort();
            elementosTreeView.SelectedNode = elementosTreeView.Nodes[0];
        }

        private void ElementosTreeViewAfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.ByMouse)
                return;

            if (e.Node.Parent != null) // ¿si no es una categoría?
            {
                pSubtipoSeleccionado = null;
                if (e.Node.Parent.Parent == null) // es una entidad
                {
                    pCategoriaSeleccionada = (COMUN.Categoria)e.Node.Parent.Tag;
                    EntidadSeleccionada = (COMUN.Entidad)e.Node.Tag;
                }
                else // es un subtipo
                {
                    pCategoriaSeleccionada = (COMUN.Categoria)e.Node.Parent.Parent.Tag;
                    EntidadSeleccionada = (COMUN.Entidad)e.Node.Parent.Tag;
                    pSubtipoSeleccionado = (COMUN.SubTipo)e.Node.Tag;
                }
                tvState.SaveTreeView(elementosTreeView);
                this.Hide();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public override void ActualizarIdiomaInterfaz()
        {
            base.ActualizarIdiomaInterfaz();

            this.Text = COMUN.Properties.Resources.SeleccionarEntidad;
        }

        private void SeleccionElementoFormFormClosing(object sender, FormClosingEventArgs e)
        {
            tvState.SaveTreeView(elementosTreeView);
        }

        private void SeleccionElementoFormShown(object sender, EventArgs e)
        {
            tvState.RestoreTreeView(elementosTreeView);
            elementosTreeView.SelectedNode = null;
        }
    }
}