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;

using System.Runtime.InteropServices;
using AcadDb = Autodesk.AutoCAD.DatabaseServices;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.DatabaseServices;

namespace GMLC01HerramientasCad.Acad
{

    public partial class SeleccionElementoCtl : UserControl
    {

        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 SeleccionElementoCtl()
        {
            try
            {
                InitializeComponent();
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new COMUN.ExcepcionGMLC(e.Message, e);
            }
        }

        public void Initialize(COMUN.XSDInfo xsd, Boolean mostrarSubtipos)
        {
            try
            {
                elementosTreeView.Nodes.Clear();

                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];
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new COMUN.ExcepcionGMLC(e.Message, e);
            }
        }

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

            if (e.Node.Parent != null) // ¿si no es una categoría?
            {
                nodoSel = e.Node;

                this.elementosTreeView.SelectedNode = null;

                MyCommands.selElemCtl = this;

                Autodesk.AutoCAD.ApplicationServices.Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                if (doc != null)
                    doc.SendStringToExecute(((char)27).ToString() + ((char)27).ToString() + "IDIBUJAR ", false, true, false);
            }
        }

        internal void Continua()
        {
            if (nodoSel == null) return;

            pSubtipoSeleccionado = null;
            if (nodoSel.Parent.Parent == null) // es una entidad
            {
                pCategoriaSeleccionada = (COMUN.Categoria)nodoSel.Parent.Tag;
                EntidadSeleccionada = (COMUN.Entidad)nodoSel.Tag;
            }
            else // es un subtipo
            {
                pCategoriaSeleccionada = (COMUN.Categoria)nodoSel.Parent.Parent.Tag;
                EntidadSeleccionada = (COMUN.Entidad)nodoSel.Parent.Tag;
                pSubtipoSeleccionado = (COMUN.SubTipo)nodoSel.Tag;
            }

            nodoSel = null;

            try
            {
                if (MyPlugin.dibujarElemento == null)
                    MyPlugin.dibujarElemento = new DibujarEnts();

                ((DibujarEnts)MyPlugin.dibujarElemento).InitDibujado(EntidadSeleccionada, NivelCad, pSubtipoSeleccionado);
            }
            /*catch (Exception ex)
            {
                MessageBox.Show(ex.Message, ex.Source);
            }*/
            finally
            {
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public void ActualizarIdiomaInterfaz()
        {
            try
            {
                this.Text = COMUN.Properties.Resources.SeleccionarEntidad;
                TreeNodeCollection nodes = elementosTreeView.Nodes;
                foreach (TreeNode n in nodes)
                {
                    UpdateRecursive(n);
                }
                elementosTreeView.Sort();
            }
            catch (Exception e)
            {
                Log.RegisterError(e);
                throw new COMUN.ExcepcionGMLC(e.Message, e);
            }
        }

        private void UpdateRecursive(TreeNode treeNode)
        {
            COMUN.Categoria cat = treeNode.Tag as COMUN.Categoria;
            if (cat != null) treeNode.Text = cat.Nombre;

            COMUN.Entidad ent = treeNode.Tag as COMUN.Entidad;
            if (ent != null) treeNode.Text = ent.Nombre;

            COMUN.SubTipo sbt = treeNode.Tag as COMUN.SubTipo;
            if (sbt != null) treeNode.Text = sbt.Nombre;

            foreach (TreeNode tn in treeNode.Nodes)
            {
                UpdateRecursive(tn);
            }
        }
    }
}
