using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_General._0_Modelos;
using Exferia_General._3_Vistas.Controladoras;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_General._3_Vistas
{
    public partial class P_ConfiguracionEsquemaMenu : Exferia_Formularios.P_Base_Mantenimientos
    {
        #region Variables generales
        private P_ConfiguracionEsquemaMenu_Controladora g_obj_Controladora;

        private bool g_bol_ConstructorPantalla_Terminado_Correctamente = true;
        public PRV_OpcionesDetalle g_mdl_PRV_OpcionesDetalle = null;

        internal List<INTERNO_Permisos_Modelo> g_lst_INTERNO_Permisos_Modelo = null;

        //OpcionesDisponibles
        private INTERNO_ConfiguracionPantalla_Modelo g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES = null;

        #endregion

        #region Objetos en Pantalla
        //Exferia_BarraProgreso
        internal Exferia_BarraProgreso Exferia_BarraProgreso_Opciones { get { return ex_pgb_P_ConfiguracionEsquemaMenu_Opciones; } }

        //Exferia_ComboBox
        internal Exferia_ComboBox Exferia_ComboBox_Requeridas { get { return ex_cbo_P_ConfiguracionEsquemaMenu_Requeridas; } }
        internal Exferia_ComboBox Exferia_ComboBox_Productos { get { return ex_cbo_P_ConfiguracionEsquemaMenu_Productos; } }
        internal Exferia_ComboBox Exferia_ComboBox_Utilizadas { get { return ex_cbo_P_ConfiguracionEsquemaMenu_Utilizadas; } }

        //Exferia_DataGridView
        internal Exferia_DataGridView Exferia_DataGridView_Opciones { get { return ex_dgv_P_ConfiguracionEsquemaMenu_Opciones; } }

        //ImageList
        internal ImageList ImageList_ArbolPrincipal { get { return imglst_ArbolPrincipal; } }

        //Exferia_Panel
        internal Panel Panel_OpcionesDetalle { get { return pnl_P_ConfiguracionEsquemaMenu_OpcionesDetalle; } }
        internal Exferia_Panel_Degradado Exferia_Panel_Degradado { get { return ex_pnl_P_ConfiguracionEsquemaMenu_Detalle; } }

        //PictureBox
        internal PictureBox PictureBox_ArbolPrincipal { get { return pct_Imagen_Arbol; } }

        //Exferia_TreeView
        internal Exferia_TreeView Exferia_TreeView_Menu { get { return ex_trv_P_ConfiguracionEsquemaMenu_Menu; } }

        //Exferia_TextBox
        internal Exferia_TextBox Exferia_TextBox_TituloListado { get { return ex_txt_P_ConfiguracionEsquemaMenu_TituloListado; } }
        internal Exferia_TextBox Exferia_TextBox_TituloMantenimiento { get { return ex_txt_P_ConfiguracionEsquemaMenu_TituloMantenimiento; } }
        internal Exferia_TextBox Exferia_TextBox_DescripcionPlural { get { return ex_txt_P_ConfiguracionEsquemaMenu_DescripcionPlural; } }
        internal Exferia_TextBox Exferia_TextBox_DescripcionSingular { get { return ex_txt_P_ConfiguracionEsquemaMenu_DescripcionSingular; } }
        internal Exferia_TextBox Exferia_TextBox_DescripcionNodo { get { return ex_txt_P_ConfiguracionEsquemaMenu_DescripcionNodo; } }

        #endregion

        #region Constructor
        public P_ConfiguracionEsquemaMenu(INTERNO_ValoresGenerales_Modelo _mdl_INTERNO_ValoresGenerales_Modelo, DateTime _dtt_FechaTrabajo, PRV_OpcionesDetalle _mdl_PRV_OpcionesDetalle)
        {
            InitializeComponent();

            try
            {
                Repintar.Empezar(this);

                CheckForIllegalCrossThreadCalls = false;

                //Empresa Sleccionada y Fecha de trabajo ...............
                P_Base_ValoresGenerales = _mdl_INTERNO_ValoresGenerales_Modelo;
                P_Base_FechaTrabajo = _dtt_FechaTrabajo;

                //Inicializo la controladora
                g_obj_Controladora = new P_ConfiguracionEsquemaMenu_Controladora(this);

                //Datos de OpcionesDetalle
                g_mdl_PRV_OpcionesDetalle = _mdl_PRV_OpcionesDetalle;

                //Buscar los Permisos
                g_lst_INTERNO_Permisos_Modelo = Datos_Generales.Permisos_Buscar(g_mdl_PRV_OpcionesDetalle.opcion);

                //Permitir editar nombre de etiquetas
                ex_trv_P_ConfiguracionEsquemaMenu_Menu.LabelEdit = true;

                //Si es Superusuario dehabilitamos el boton de Borrar
                if (g_obj_Controladora.g_mdl_INTERNO_UsuarioValidado_Modelo.esAdministrador)
                {
                    ex_btn_P_Configuracion_EsquemaMenu_BorrarArbol.Exferia_Button_ReadOnly = true;
                    ex_btn_P_Configuracion_EsquemaMenu_BorrarArbol.Enabled = false;
                }

                //Titulo de la Pantalla
                P_Base_TituloPantalla = _mdl_PRV_OpcionesDetalle.descripcion_TituloMantenimiento;

                // Label con Empresa Seleccionada 
                if (P_Base_ValoresGenerales != null)
                {
                    try
                    {
                        P_Base_Mantenimientos_InformacionEmpresaSeleccionada = P_Base_ValoresGenerales.str_Empresa_Descripcion + " - " +
                                                                "(" + P_Base_FechaTrabajo.ToString("dd/MM/yyyy") + ")";
                    }
                    catch (Exception ex)
                    {
                        //No se muestra mensaje pero se guarda en el log
                        Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(P_ConfiguracionEsquemaMenu));
                    }
                }
                //....................................................................................................

                //Bloquear pantalla hasta que termine la carga por defecto .....
                Enabled = false;
                //.............................................................

                //Si el usurio esd Administrador se quita el boton de borrar
                if (Variables.G_MDL_USUARIOVALIDADO_MODELO.esAdministrador)
                {
                    ex_btn_P_Configuracion_EsquemaMenu_BorrarArbol.Visible = false;
                }


                //Bloquear y ocultar la parte de datos opciones
                SoloLectura.Empezar(pnl_P_ConfiguracionEsquemaMenu_OpcionesDetalle, true);
                pnl_P_ConfiguracionEsquemaMenu_OpcionesDetalle.Visible = false;

                //Colores de los tipos
                lbl_P_ConfiguracionEsquemaMenu_Color_Etiqueta.BackColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_ETIQUETA_FONDO;
                lbl_P_ConfiguracionEsquemaMenu_Color_Etiqueta.ForeColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_ETIQUETA_LETRA;

                lbl_P_ConfiguracionEsquemaMenu_Color_Opcion.BackColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_OPCION_FONDO;
                lbl_P_ConfiguracionEsquemaMenu_Color_Opcion.ForeColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_OPCION_LETRA;

                lbl_P_configuracionEsquemaMenu_Color_Requerido.BackColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_OBLIGATORIA_FONDO;
                lbl_P_configuracionEsquemaMenu_Color_Requerido.ForeColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_OBLIGATORIA_LETRA;
            }
            catch (Control_Errores)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
            catch (Exception ex)
            {
                g_bol_ConstructorPantalla_Terminado_Correctamente = false;

                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(P_ConfiguracionEsquemaMenu));
            }
            finally
            {
                //Bloquear pantalla hasta que termine la carga por defecto .....
                Enabled = true;
                //.............................................................
            }
        }
        #endregion

        #region Inicio de Pantalla
        private void P_ConfiguracionEsquemaMenu_Load(object sender, EventArgs e)
        {
            try
            {
                #region Opciones Disponibles
                //Crear Columnas Listado
                CrearColumnas_Listado_Opciones();

                //Combo Por defecto
                ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedIndex = 0;
                //########################################################################################
                #endregion
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda en el log
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(P_ConfiguracionEsquemaMenu_Load));

                g_bol_ConstructorPantalla_Terminado_Correctamente = false;
            }
        }

        public void P_ConfiguracionEsquemaMenu_Shown(object sender, EventArgs e)
        {
            try
            {
                if (g_bol_ConstructorPantalla_Terminado_Correctamente)
                {
                    //si es SuperUsuario Salimos de la pantalla
                    if (!g_obj_Controladora.g_mdl_INTERNO_UsuarioValidado_Modelo.esSuperUsuario)
                    {

                        //Rellenar datos de la pantalla
                        g_obj_Controladora.RecargarDatos();
                    }
                    else
                    {
                        Mensajes.MostrarMensaje(Mensajes.G_STR_PCONFIGURACIONESQUEMAMENU_USUARIO_NOPUEDEMODIFICAR());
                        Salir_P_Base();
                    }
                }
                else
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                    Salir_P_Base();
                }
            }
            catch (Control_Errores)
            {
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                Salir_P_Base();
            }
            catch (Exception ex)
            {
                //No se muestra mensaje pero se guarda el log
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(P_ConfiguracionEsquemaMenu_Shown));

                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                Salir_P_Base();
            }
        }
        #endregion

        #region Botones Agregar_Nodo, Eliminar_Nodo,Grabar y BorrarArbol
        private void ex_btn_P_ConfiguracionEsquemaMenu_AgregarNodo_Click(object sender, EventArgs e)
        {
            Agregar_Nodo();
        }
        private void Agregar_Nodo()
        {
            try
            {
                TreeNode trn_NodoSeleccionado = ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode;
                TreeNode trn_NodoNuevo = new TreeNode(Variables.G_STR_CONFIGURACIONESQUEMAMENU_NUEVAOPCION);

                trn_NodoNuevo.Name = g_obj_Controladora.g_lng_idArbol_NuevosNodos.ToString();
                trn_NodoNuevo.BackColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_ETIQUETA_FONDO;
                trn_NodoNuevo.Tag = "";

                if (trn_NodoSeleccionado != null)
                {
                    if (!g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo_NoNulo.Exists(x => x.Id.Equals(!trn_NodoSeleccionado.Name.Equals("") ? long.Parse(trn_NodoSeleccionado.Name) : -1)))
                    {
                        trn_NodoSeleccionado.Nodes.Add(trn_NodoNuevo);
                        trn_NodoSeleccionado.Expand();
                    }
                    else
                    {
                        Mensajes.MostrarMensaje(Mensajes.G_STR_PCONFIGURACIONESQUEMAMENU_NOSEPUEDE_AGREGARNODOSHIJOS());
                    }
                }
                else
                {
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.Add(trn_NodoNuevo);
                }
                ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = trn_NodoNuevo;
                ex_trv_P_ConfiguracionEsquemaMenu_Menu.Select();

                g_obj_Controladora.Cargar_Datos_Auxiliares(g_obj_Controladora.g_lng_idArbol_NuevosNodos, null, null);

                //Sumarle 1 para el siguiente
                g_obj_Controladora.g_lng_idArbol_NuevosNodos += -1;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(Agregar_Nodo));
            }
        }

        private void ex_btn_P_ConfiguracionEsquemaMenu_EliminarNodo_Click(object sender, EventArgs e)
        {
            Eliminar_Nodo();
        }
        private void Eliminar_Nodo()
        {
            try
            {
                TreeNode trn_NodoSeleccionado = ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode;
                long lng_idOpcion = -1;//la variable se usa para guardar el id de la opcion por si se eliminara
                bool bol_SeElimino = false;// la varable se usa para saber si se elimino
                if (trn_NodoSeleccionado != null)
                {
                    INTERNO_ArbolPrincipal_Modelo mdl_INTERNO_ArbolPrincipal_Modelo = null;

                    //Compruebo si esta en el las duplicadas para poder eliminarla
                    if (g_obj_Controladora.g_dct_Opciones_Duplicadas.ContainsKey(long.Parse(trn_NodoSeleccionado.Name)))
                    {
                        long lng_id = g_obj_Controladora.g_dct_Opciones_Duplicadas[long.Parse(trn_NodoSeleccionado.Name)];
                        mdl_INTERNO_ArbolPrincipal_Modelo = g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo.Where(x => x.Id.Equals(lng_id)).FirstOrDefault();
                    }
                    else
                    {
                        mdl_INTERNO_ArbolPrincipal_Modelo = g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo.Where(x => x.Id.Equals(!trn_NodoSeleccionado.Name.Equals("") ? long.Parse(trn_NodoSeleccionado.Name) : -1)).FirstOrDefault();
                    }

                    lng_idOpcion = Convert.ToInt64(ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode.Name.ToString());

                    //Miro haber si se puede eliminar
                    if (trn_NodoSeleccionado.Nodes != null && trn_NodoSeleccionado.Nodes.Count > 0)
                    {
                        //Llamo a la funcion que recorre todos los hijos para añadirlos en el listado de opciones a eliminar
                        Eliminar_Nodos_EnCastada(trn_NodoSeleccionado);

                        //Cuando termino de recorrer todo elimino el nodo padre para que desaparesca todo del arbol
                        trn_NodoSeleccionado.Remove();

                        bol_SeElimino = true;
                    }
                    else if (mdl_INTERNO_ArbolPrincipal_Modelo != null && mdl_INTERNO_ArbolPrincipal_Modelo.Opcion != null)
                    {
                        if (g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo_Obligatorio.Exists(x => x.Opcion.Equals(mdl_INTERNO_ArbolPrincipal_Modelo.Opcion)))
                        {
                            if (g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo_Obligatorio.Where(x => x.Opcion.Equals(mdl_INTERNO_ArbolPrincipal_Modelo.Opcion)).Count() > 1)
                            {
                                trn_NodoSeleccionado.Remove();
                                if (!trn_NodoSeleccionado.Name.Equals("") && long.Parse(trn_NodoSeleccionado.Name) > 0)
                                {
                                    g_obj_Controladora.g_lst_IdsOpciones_ArbolPrincipal_ABorrar.Add(long.Parse(trn_NodoSeleccionado.Name));
                                }

                                g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo_Obligatorio.RemoveAll(x => x.Id.Equals(long.Parse(trn_NodoSeleccionado.Name)));

                                bol_SeElimino = true;
                            }
                            else
                            {
                                Mensajes.MostrarMensaje(Mensajes.G_STR_PCONFIGURACIONESQUEMAMENU_NOSEPUEDE_BORRAR_OPCIONPRINCIPAL());
                            }
                        }
                        else
                        {
                            trn_NodoSeleccionado.Remove();
                            if (!trn_NodoSeleccionado.Name.Equals("") && long.Parse(trn_NodoSeleccionado.Name) > 0)
                            {
                                g_obj_Controladora.g_lst_IdsOpciones_ArbolPrincipal_ABorrar.Add(long.Parse(trn_NodoSeleccionado.Name));
                            }

                            bol_SeElimino = true;
                        }
                    }
                    else
                    {
                        trn_NodoSeleccionado.Remove();
                        if (!trn_NodoSeleccionado.Name.Equals("") && long.Parse(trn_NodoSeleccionado.Name) > 0)
                        {
                            g_obj_Controladora.g_lst_IdsOpciones_ArbolPrincipal_ABorrar.Add(long.Parse(trn_NodoSeleccionado.Name));
                        }

                        //Lo elimina del diccionario
                        if (g_obj_Controladora.g_dct_Opciones_Duplicadas.ContainsKey(long.Parse(trn_NodoSeleccionado.Name)))
                        {
                            g_obj_Controladora.g_dct_Opciones_Duplicadas.Remove(long.Parse(trn_NodoSeleccionado.Name));
                        }

                        bol_SeElimino = true;
                    }

                    //Si el nodo eliminado tenia una imagen debo eliminarla para que no de problemas
                    if (bol_SeElimino)
                    {
                        //Si se elimino compruebo si tenia imagen
                        if (lng_idOpcion > -1 && g_obj_Controladora.g_dct_Imagenes_ArbolPrincipal_DesdeCarga.ContainsKey(lng_idOpcion))
                        {
                            //aSigno el id del nodo seleccionado
                            g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.IdArbolPrincipal = lng_idOpcion;

                            //Mando a borrar la imagen
                            g_obj_Controladora.Imagen_Borrar();
                        }

                        //Recargo el listado de Opciones
                        g_obj_Controladora.Rellenar_DataGrid_Opciones();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(Eliminar_Nodo));
            }
        }
        private void Eliminar_Nodos_EnCastada(TreeNode _trn_NodoPadre)
        {
            long lng_idOpcion_Padre = Convert.ToInt64(_trn_NodoPadre.Name.ToString());
            //Recorro todos los hijos y los añado al listado de opciones a Borrar
            foreach (TreeNode trn_NodoHijo in _trn_NodoPadre.Nodes)
            {
                long lng_idOpcion_Hijo = Convert.ToInt64(trn_NodoHijo.Name.ToString());

                //Si el nodo tiene hijos llamo a la funcion recursivamente
                if (trn_NodoHijo.Nodes != null && trn_NodoHijo.Nodes.Count > 0)
                {
                    Eliminar_Nodos_EnCastada(trn_NodoHijo);
                }
                else
                {
                    if (!trn_NodoHijo.Name.Equals("") && long.Parse(trn_NodoHijo.Name) > 0)
                    {
                        g_obj_Controladora.g_lst_IdsOpciones_ArbolPrincipal_ABorrar.Add(long.Parse(trn_NodoHijo.Name));
                    }

                    //Lo elimina del diccionario
                    if (g_obj_Controladora.g_dct_Opciones_Duplicadas.ContainsKey(long.Parse(trn_NodoHijo.Name)))
                    {
                        g_obj_Controladora.g_dct_Opciones_Duplicadas.Remove(long.Parse(trn_NodoHijo.Name));
                    }

                    //Si se elimino compruebo si tenia imagen
                    if (lng_idOpcion_Hijo > -1 && g_obj_Controladora.g_dct_Imagenes_ArbolPrincipal_DesdeCarga.ContainsKey(lng_idOpcion_Hijo))
                    {
                        //aSigno el id del nodo seleccionado
                        g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.IdArbolPrincipal = lng_idOpcion_Hijo;

                        //Mando a borrar la imagen
                        g_obj_Controladora.Imagen_Borrar();
                    }
                }
            }

            //Cuando termino de recorrer elimino el nodo Padre
            if (!_trn_NodoPadre.Name.Equals("") && long.Parse(_trn_NodoPadre.Name) > 0)
            {
                g_obj_Controladora.g_lst_IdsOpciones_ArbolPrincipal_ABorrar.Add(long.Parse(_trn_NodoPadre.Name));
            }

            //Lo elimina del diccionario
            if (g_obj_Controladora.g_dct_Opciones_Duplicadas.ContainsKey(long.Parse(_trn_NodoPadre.Name)))
            {
                g_obj_Controladora.g_dct_Opciones_Duplicadas.Remove(long.Parse(_trn_NodoPadre.Name));
            }

            //Si se elimino compruebo si tenia imagen
            if (lng_idOpcion_Padre > -1 && g_obj_Controladora.g_dct_Imagenes_ArbolPrincipal_DesdeCarga.ContainsKey(lng_idOpcion_Padre))
            {
                //aSigno el id del nodo seleccionado
                g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.IdArbolPrincipal = lng_idOpcion_Padre;

                //Mando a borrar la imagen
                g_obj_Controladora.Imagen_Borrar();
            }
        }

        private void ex_btn_P_ConfiguracionEsquemaMenu_Grabar_Click(object sender, EventArgs e)
        {
            Grabar();
        }
        private void Grabar()
        {
            if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_GEN_CONFIGURACIONESQUEMA_MENU, g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, true)))
            {
                g_obj_Controladora.GrabarDatos();
            }
        }

        private void ex_btn_P_Configuracion_EsquemaMenu_BorrarArbol_Click(object sender, EventArgs e)
        {
            if (!g_obj_Controladora.g_mdl_INTERNO_UsuarioValidado_Modelo.esAdministrador)
            {
                g_obj_Controladora.BorrarDatos();
            }
        }

        private void ex_btn_P_Configuracion_EsquemaMenu_InicializarArbol_Click(object sender, EventArgs e)
        {
            g_obj_Controladora.InicializarArbol();
        }
        #endregion

        #region Botones de navegacion: PrimeroNodo,UltimoNodo,SubirNodo, BajarNodo, IzquierdaNodo, DerechaNodo
        //Botones de navegacion
        private void ex_btn_P_ConfiguracionEsquemaMenu_PrimeroNodo_Click(object sender, EventArgs e)
        {
            Mover_Nodo_Al_Primero();
        }
        private void Mover_Nodo_Al_Primero()
        {
            int int_Posicion;

            TreeNode trn_NodoSeleccionado = ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode;
            if (trn_NodoSeleccionado != null)
            {
                if (trn_NodoSeleccionado.Parent != null)
                {
                    TreeNode trn_nodoPadre = trn_NodoSeleccionado.Parent;
                    int_Posicion = trn_nodoPadre.Nodes[0].Index;
                    trn_NodoSeleccionado.Remove();
                    trn_nodoPadre.Nodes.Insert(int_Posicion - 1, trn_NodoSeleccionado);
                }
                else
                {
                    int_Posicion = ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.IndexOf(trn_NodoSeleccionado);
                    trn_NodoSeleccionado.Remove();
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.Insert(0, trn_NodoSeleccionado);
                }
                ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = trn_NodoSeleccionado;
                ex_trv_P_ConfiguracionEsquemaMenu_Menu.Select();
            }
        }

        private void ex_btn_P_ConfiguracionEsquemaMenu_UltimoNodo_Click(object sender, EventArgs e)
        {
            Mover_Nodo_Al_Ultimo();
        }
        private void Mover_Nodo_Al_Ultimo()
        {
            int int_Posicion;

            TreeNode trn_NodoSeleccionado = ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode;
            if (trn_NodoSeleccionado != null)
            {
                if (trn_NodoSeleccionado.Parent != null)
                {
                    TreeNode trn_nodoPadre = trn_NodoSeleccionado.Parent;
                    int_Posicion = trn_nodoPadre.Nodes[trn_nodoPadre.Nodes.Count - 1].Index;
                    trn_NodoSeleccionado.Remove();
                    trn_nodoPadre.Nodes.Insert(int_Posicion + 1, trn_NodoSeleccionado);
                }
                else
                {
                    int_Posicion = ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.IndexOf(trn_NodoSeleccionado);
                    trn_NodoSeleccionado.Remove();
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.Insert(ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.Count, trn_NodoSeleccionado);
                }
                ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = trn_NodoSeleccionado;
                ex_trv_P_ConfiguracionEsquemaMenu_Menu.Select();
            }
        }

        private void ex_btn_P_ConfiguracionEsquemaMenu_SubirNodo_Click(object sender, EventArgs e)
        {
            Mover_Subir_Nodo();
        }
        private void Mover_Subir_Nodo()
        {
            try
            {
                int int_Posicion;

                TreeNode trn_NodoSeleccionado = ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    if (trn_NodoSeleccionado.Parent != null)
                    {
                        TreeNode trn_nodoPadre = trn_NodoSeleccionado.Parent;
                        int_Posicion = trn_nodoPadre.Nodes.IndexOf(trn_NodoSeleccionado);
                        trn_NodoSeleccionado.Remove();
                        trn_nodoPadre.Nodes.Insert(int_Posicion - 1, trn_NodoSeleccionado);
                    }
                    else
                    {
                        int_Posicion = ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.IndexOf(trn_NodoSeleccionado);
                        trn_NodoSeleccionado.Remove();
                        ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.Insert(int_Posicion - 1, trn_NodoSeleccionado);
                    }
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = trn_NodoSeleccionado;
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.Select();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(Mover_Subir_Nodo));
            }
        }

        private void ex_btn_P_ConfiguracionEsquemaMenu_BajarNodo_Click(object sender, EventArgs e)
        {
            Mover_Bajar_Nodo();
        }
        private void Mover_Bajar_Nodo()
        {
            try
            {
                int int_Posicion;

                TreeNode trn_NodoSeleccionado = ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    if (trn_NodoSeleccionado.Parent != null)
                    {
                        TreeNode trn_NodoPadre = trn_NodoSeleccionado.Parent;
                        int_Posicion = trn_NodoPadre.Nodes.IndexOf(trn_NodoSeleccionado);
                        trn_NodoSeleccionado.Remove();
                        trn_NodoPadre.Nodes.Insert(int_Posicion + 1, trn_NodoSeleccionado);
                    }
                    else
                    {
                        int_Posicion = ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.IndexOf(trn_NodoSeleccionado);
                        trn_NodoSeleccionado.Remove();
                        ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.Insert(int_Posicion + 1, trn_NodoSeleccionado);
                    }
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = trn_NodoSeleccionado;
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.Select();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(Mover_Bajar_Nodo));
            }
        }

        private void ex_btn_P_ConfiguracionEsquemaMenu_IzquierdaNodo_Click(object sender, EventArgs e)
        {
            Mover_Nodo_Izquierda();
        }
        private void Mover_Nodo_Izquierda()
        {
            try
            {
                TreeNode trv_NodoSeleccionado = ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode;
                if (trv_NodoSeleccionado != null)
                {
                    if (trv_NodoSeleccionado.Parent != null)
                    {
                        if (trv_NodoSeleccionado.Parent.Parent != null)
                        {
                            TreeNode trn_NodoAnterior = trv_NodoSeleccionado.Parent.Parent;
                            trv_NodoSeleccionado.Remove();
                            trn_NodoAnterior.Nodes.Add(trv_NodoSeleccionado);
                        }
                        else
                        {
                            int int_Posicion = ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.IndexOf(trv_NodoSeleccionado);
                            trv_NodoSeleccionado.Remove();
                            ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.Insert(int_Posicion - 1, trv_NodoSeleccionado);
                        }
                        ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = trv_NodoSeleccionado;
                        ex_trv_P_ConfiguracionEsquemaMenu_Menu.Select();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(Mover_Nodo_Izquierda));
            }
        }

        private void ex_btn_P_ConfiguracionEsquemaMenu_DerechaNodo_Click(object sender, EventArgs e)
        {
            Mover_Nodo_Derecha();
        }
        private void Mover_Nodo_Derecha()
        {
            try
            {
                TreeNode trn_NodoSeleccionado = ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode;
                if (trn_NodoSeleccionado != null)
                {
                    if (trn_NodoSeleccionado.NextNode != null && !g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo_NoNulo.Exists(x => x.Id.Equals(!trn_NodoSeleccionado.NextNode.Name.Equals("") ? long.Parse(trn_NodoSeleccionado.NextNode.Name) : -1)))
                    {
                        TreeNode trn_NodoSiguiente = trn_NodoSeleccionado.NextNode;
                        trn_NodoSeleccionado.Remove();
                        trn_NodoSiguiente.Nodes.Add(trn_NodoSeleccionado);
                    }
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = trn_NodoSeleccionado;
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.Select();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(Mover_Nodo_Derecha));
            }
        }
        #endregion

        #region Metodos del treeview
        private void ex_trv_P_ConfiguracionEsquemaMenu_Menu_ItemDrag(object sender, ItemDragEventArgs e)
        {
            //Mueve el nodo usando el click izquierdo del raton.
            if (e.Button == MouseButtons.Left)
            {
                DoDragDrop(e.Item, DragDropEffects.Move);
            }

            //Copia el nodo usando mel click derecho del raton
            else if (e.Button == MouseButtons.Right)
            {
                DoDragDrop(e.Item, DragDropEffects.Copy);
            }
        }
        private void ex_trv_P_ConfiguracionEsquemaMenu_Menu_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }
        private void ex_trv_P_ConfiguracionEsquemaMenu_Menu_DragOver(object sender, DragEventArgs e)
        {
            try
            {
                // Recupera las coordenadas de la posicion del raton
                Point Posicion = ex_trv_P_ConfiguracionEsquemaMenu_Menu.PointToClient(new Point(e.X, e.Y));

                // Seleciona el nodo en la posicion del ratón
                ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = ex_trv_P_ConfiguracionEsquemaMenu_Menu.GetNodeAt(Posicion);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(ex_trv_P_ConfiguracionEsquemaMenu_Menu_DragOver));
            }
        }
        private void ex_trv_P_ConfiguracionEsquemaMenu_Menu_DragDrop(object sender, DragEventArgs e)
        {
            try
            {
                // Recupera las coordenadas de la posicion del raton
                Point Posicion = ex_trv_P_ConfiguracionEsquemaMenu_Menu.PointToClient(new Point(e.X, e.Y));

                // Recupera la posicion de colocacion del nodo
                TreeNode trn_Nodo_Objetivo = ex_trv_P_ConfiguracionEsquemaMenu_Menu.GetNodeAt(Posicion);

                //Nodo
                if (e.Data.GetData(typeof(TreeNode)) != null)
                {
                    // Recupera el nodo que fue arrastrado
                    TreeNode trn_Nodo_En_Movimiento = (TreeNode)e.Data.GetData(typeof(TreeNode));
                    if (trn_Nodo_Objetivo != null)
                    {
                        //Confirma si el nodo esta en la posicion de colocacion y si es un nodo o un descendiente de nodo
                        if (!trn_Nodo_En_Movimiento.Equals(trn_Nodo_Objetivo) && !Continene_Nodo(trn_Nodo_En_Movimiento, trn_Nodo_Objetivo))
                        {
                            //Si se trata de un movimiento, elimina el nodo y lo agrega al nodo de colocacion
                            if (e.Effect == DragDropEffects.Move)
                            {
                                if (!g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo_NoNulo.Exists(x => x.Id.Equals(!trn_Nodo_Objetivo.Name.Equals("") ? long.Parse(trn_Nodo_Objetivo.Name) : -1)))
                                {
                                    trn_Nodo_En_Movimiento.Remove();
                                    trn_Nodo_Objetivo.Nodes.Add(trn_Nodo_En_Movimiento);
                                }
                            }

                            //Expande el nodo
                            trn_Nodo_Objetivo.Expand();
                        }
                    }
                    else
                    {
                        if (e.Effect == DragDropEffects.Move)
                        {
                            trn_Nodo_En_Movimiento.Remove();
                            ex_trv_P_ConfiguracionEsquemaMenu_Menu.Nodes.Add(trn_Nodo_En_Movimiento);
                        }
                    }
                }
                //Listado de Opciones Seleccionadas
                else if (e.Data.GetData(typeof(List<DataGridViewRow>)) != null)
                {
                    List<DataGridViewRow> lst_Rows = (List<DataGridViewRow>)e.Data.GetData(typeof(List<DataGridViewRow>));

                    if (lst_Rows != null && lst_Rows.Count > 0)
                    {
                        if (trn_Nodo_Objetivo != null)
                        {
                            //Si se trata de un movimiento, elimina el nodo y lo agrega al nodo de colocacion
                            if (e.Effect == DragDropEffects.Move)
                            {
                                TreeNode trn_NodoNuevo = null;
                                string str_Descripcion = "";
                                string str_Opcion = "";
                                bool bol_Obligatorio = false;
                                //Añadimos tantos nodos como filas haya
                                foreach (DataGridViewRow dgvr_Filas in lst_Rows)
                                {
                                    str_Opcion = dgvr_Filas.Cells[nameof(INTERNO_PRV_OpcionesDisponiblesParaClientes_Modelo.opcion)].Value.ToString();
                                    str_Descripcion = dgvr_Filas.Cells[nameof(INTERNO_PRV_OpcionesDisponiblesParaClientes_Modelo.descripcionAMostrar)].Value.ToString();
                                    bol_Obligatorio = Convert.ToBoolean(dgvr_Filas.Cells[nameof(INTERNO_PRV_OpcionesDisponiblesParaClientes_Modelo.obligatorio)].Value.ToString());

                                    trn_NodoNuevo = new TreeNode(str_Descripcion);

                                    //Color del nodo
                                    if (bol_Obligatorio)
                                    {
                                        trn_NodoNuevo.BackColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_OBLIGATORIA_FONDO;//Añado otro color a los Objetos del arbol con opciones
                                    }
                                    else
                                    {
                                        trn_NodoNuevo.BackColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_OPCION_FONDO;//Añado otro color a los Objetos del arbol con opciones
                                    }

                                    trn_NodoNuevo.Name = g_obj_Controladora.g_lng_idArbol_NuevosNodos.ToString();
                                    trn_NodoNuevo.Text = str_Descripcion;
                                    trn_NodoNuevo.Tag = str_Opcion;

                                    trn_Nodo_Objetivo.Nodes.Add(trn_NodoNuevo);

                                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode = trn_NodoNuevo;
                                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.Select();

                                    //Agrego al diccionario
                                    if (g_obj_Controladora.g_dct_Opciones_Duplicadas.ContainsKey(g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo.Where(x => x.Opcion != null && x.Opcion.Equals(str_Opcion)).FirstOrDefault().Id))
                                    {
                                        g_obj_Controladora.g_dct_Opciones_Duplicadas.Add(long.Parse(trn_NodoNuevo.Name), g_obj_Controladora.g_dct_Opciones_Duplicadas[long.Parse(trn_NodoNuevo.Name)]);
                                    }
                                    else
                                    {
                                        g_obj_Controladora.g_dct_Opciones_Duplicadas.Add(long.Parse(trn_NodoNuevo.Name), g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo.Where(x => x.Opcion != null && x.Opcion.Equals(str_Opcion)).FirstOrDefault().Id);
                                    }

                                    //Agregar al listado de ArbolPrincipal_NoNulo si tuviera opcion
                                    if (g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo.Exists(x => x.Opcion != null && x.Opcion.Equals(str_Opcion)))
                                    {
                                        INTERNO_ArbolPrincipal_Modelo mdl_INTERNO_ArbolPrincipal_Modelo = new INTERNO_ArbolPrincipal_Modelo();
                                        mdl_INTERNO_ArbolPrincipal_Modelo.Descripcion = str_Descripcion;
                                        mdl_INTERNO_ArbolPrincipal_Modelo.Id = g_obj_Controladora.g_lng_idArbol_NuevosNodos;
                                        mdl_INTERNO_ArbolPrincipal_Modelo.Opcion = str_Opcion;
                                        g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo_NoNulo.Add(mdl_INTERNO_ArbolPrincipal_Modelo);

                                        if (bol_Obligatorio)
                                        {
                                            g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo_Obligatorio.Add(mdl_INTERNO_ArbolPrincipal_Modelo);
                                        }
                                    }

                                    //Cargar el ultimo nodo introducido
                                    g_obj_Controladora.Cargar_Datos_Auxiliares(g_obj_Controladora.g_lng_idArbol_NuevosNodos, long.Parse(trn_NodoNuevo.Name), null);

                                    g_obj_Controladora.g_lng_idArbol_NuevosNodos += -1;
                                }
                                //Expande el nodo
                                trn_Nodo_Objetivo.Expand();

                                //Recargo el listado de Opciones
                                g_obj_Controladora.Rellenar_DataGrid_Opciones();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(ex_trv_P_ConfiguracionEsquemaMenu_Menu_DragDrop));
            }
        }
        private bool Continene_Nodo(TreeNode _trn_nodo_1, TreeNode _trn_nodo_2)
        {
            try
            {
                // Comprueba si el nodo es padre y si tiene hijos
                if (_trn_nodo_2.Parent == null)
                {
                    return false;
                }
                if (_trn_nodo_2.Parent.Equals(_trn_nodo_1))
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(Continene_Nodo));
            }

            return Continene_Nodo(_trn_nodo_1, _trn_nodo_2.Parent);
        }

        private void ex_trv_P_ConfiguracionEsquemaMenu_Menu_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
        {
            try
            {
                if (g_obj_Controladora.g_dct_Opciones_Modificadas.Count > 0 && g_obj_Controladora.g_dct_Opciones_Modificadas.ContainsKey(long.Parse(e.Node.Name)))
                {
                    if (!g_obj_Controladora.g_dct_Opciones_Modificadas[long.Parse(e.Node.Name)].Equals(e.Node.Text))
                    {
                        g_obj_Controladora.g_dct_Opciones_Modificadas.Remove(long.Parse(e.Node.Name));
                        g_obj_Controladora.g_dct_Opciones_Modificadas.Add(long.Parse(e.Node.Name), e.Node.Text);
                    }
                }
                else
                {
                    g_obj_Controladora.g_dct_Opciones_Modificadas.Add(long.Parse(e.Node.Name), e.Node.Text);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(ex_trv_P_ConfiguracionEsquemaMenu_Menu_AfterLabelEdit));
            }
        }

        private void ex_trv_P_ConfiguracionEsquemaMenu_Menu_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado = null;

            if (!g_obj_Controladora.g_dct_Opciones_Duplicadas.ContainsKey(long.Parse(e.Node.Name)))
            {
                if (long.Parse(e.Node.Name) > 0)
                {
                    g_obj_Controladora.Cargar_Datos_Auxiliares(long.Parse(e.Node.Name), null, e.Node);
                }
                else
                {
                    g_obj_Controladora.Cargar_Datos_Auxiliares(long.Parse(e.Node.Name), null, e.Node);
                }
            }
            else
            {

                if (e.Node.Tag.ToString().Trim().Length == 0)
                {
                    //Busco por la descripcion
                    if (g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo.Exists(x => x.Descripcion.Equals(e.Node.Text)))
                    {
                        g_obj_Controladora.Cargar_Datos_Auxiliares(long.Parse(e.Node.Name), g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo.Where(x => x.Descripcion.Equals(e.Node.Text)).FirstOrDefault().Id, e.Node);
                    }
                    //si no tiene nada no cargo solo la descripcion
                    else
                    {
                        g_obj_Controladora.Cargar_Datos_Auxiliares(long.Parse(e.Node.Name), null, e.Node);
                    }
                }
                //Si tiene el tag con la opcion busco por ahi
                else
                {
                    g_obj_Controladora.Cargar_Datos_Auxiliares(long.Parse(e.Node.Name), g_obj_Controladora.g_lst_INTERNO_ArbolPrincipal_Modelo.Where(x => x.Opcion != null && x.Opcion.Equals(e.Node.Tag.ToString())).FirstOrDefault().Id, e.Node);
                }
            }
        }
        #endregion

        #region Metodos TextBox

        private void ex_txt_P_ConfiguracionEsquemaMenu_TextBox_Evento_TextChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora.g_bol_CargandoDatos_TextBox == false)
            {
                try
                {
                    if (g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado != null &&
                        g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.Opcion != null &&
                         g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.Opcion.Trim().Length > 0)
                    {
                        INTERNO_EsquemaArbol_OpcionesDetalle_Modelo mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Modificadas_Modelo = new INTERNO_EsquemaArbol_OpcionesDetalle_Modelo(g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.Opcion,
                                                                                                                                                                                                            -1,
                                                                                                                                                                                                           ex_txt_P_ConfiguracionEsquemaMenu_TituloListado.Text,
                                                                                                                                                                                                           ex_txt_P_ConfiguracionEsquemaMenu_TituloMantenimiento.Text,
                                                                                                                                                                                                           ex_txt_P_ConfiguracionEsquemaMenu_DescripcionPlural.Text,
                                                                                                                                                                                                           ex_txt_P_ConfiguracionEsquemaMenu_DescripcionSingular.Text);


                        if (g_obj_Controladora.g_dct_OpcionesDetalle_Modificadas.Count > 0)
                        {
                            if (g_obj_Controladora.g_dct_OpcionesDetalle_Modificadas.ContainsKey(g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.Opcion))
                            {
                                g_obj_Controladora.g_dct_OpcionesDetalle_Modificadas[g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.Opcion] = mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Modificadas_Modelo;
                            }
                            else
                            {
                                g_obj_Controladora.g_dct_OpcionesDetalle_Modificadas.Add(g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.Opcion, mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Modificadas_Modelo);
                            }
                        }
                        else
                        {
                            g_obj_Controladora.g_dct_OpcionesDetalle_Modificadas.Add(g_obj_Controladora.g_mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Seleccionado.Opcion, mdl_INTERNO_EsquemaArbol_OpcionesDetalle_Modificadas_Modelo);
                        }
                    }


                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(ex_txt_P_ConfiguracionEsquemaMenu_TextBox_Evento_TextChanged));

                }
            }
        }

        private void ex_txt_P_ConfiguracionEsquemaMenu_DescripcionNodo_Exferia_TextBox_Evento_KeyUp(object sender, KeyEventArgs e)
        {
            try
            {
                if (ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode != null)
                {
                    ex_trv_P_ConfiguracionEsquemaMenu_Menu.SelectedNode.Text = ex_txt_P_ConfiguracionEsquemaMenu_DescripcionNodo.Text;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_ConfiguracionEsquemaMenu) + "/" + nameof(ex_txt_P_ConfiguracionEsquemaMenu_DescripcionNodo_Exferia_TextBox_Evento_KeyUp));
            }
        }
        #endregion

        #region Metodos Imagen
        private void ex_btn_ImagenAdd_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog obj_OpenFileDialog = new OpenFileDialog();
                obj_OpenFileDialog.Filter = "Archivos de Imagen JPG|*.jpg|Archivos de Imagen PNG|*.png|Todos los tipos|*.*";
                obj_OpenFileDialog.FileName = "";
                obj_OpenFileDialog.Title = "Buscar Imagen ";
                obj_OpenFileDialog.InitialDirectory = "C:\\";

                if (obj_OpenFileDialog.ShowDialog() == DialogResult.OK)
                {
                    g_obj_Controladora.Imagen_Add(Image.FromFile(obj_OpenFileDialog.FileName));
                }
            }
            catch (Exception ex)
            {
                Mensajes.MostrarMensaje(ex.Message);
            }
        }
        private void ex_btn_ImagenDelete_Click(object sender, EventArgs e)
        {
            if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR_IMAGEN()))
            {
                g_obj_Controladora.Imagen_Borrar();
            }
        }
        #endregion

        #region Opciones

        private void CrearColumnas_Listado_Opciones()
        {
            ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.AutoGenerateColumns = false;

            g_obj_Controladora.g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_OpcionesDisponibles_Columnas = g_obj_Controladora.g_obj_ABS_Listado_PRV_OpcionesDisponiblesParaCliente.LISTADO_COLUMNAS().Values.ToList();

            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_obj_Controladora.g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_OpcionesDisponibles_Columnas)
            {
                DataGridViewTextBoxColumn dgv_Columna = new DataGridViewTextBoxColumn();
                dgv_Columna.DataPropertyName = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                dgv_Columna.Name = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna;
                dgv_Columna.HeaderText = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_AMostrar;

                //Poner visible o no .........................................................................
                bool bol_Visible = true;
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Oculto)
                {
                    bol_Visible = false;
                }
                else if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES != null &&
                         g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNASAMOSTRAR != null &&
                         g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNASAMOSTRAR.Count > 0)
                {
                    if (!g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNASAMOSTRAR.Contains(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna))
                    {
                        bol_Visible = false;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Mostrado_PorDefecto == false)
                {
                    bol_Visible = false;
                }
                dgv_Columna.Visible = bol_Visible;

                if (bol_Visible)
                {
                    g_obj_Controladora.g_lst_ColumnasAMostrar_PRV_OpcionesDisponibles.Add(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna);
                }
                //.....................................................................................................

                //Tipo de Formateo si fuera Fecha
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    dgv_Columna.DefaultCellStyle.Format = "d";
                }

                //Poner Ancho Columna ................................................................................
                if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNAS_ANCHO != null &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNAS_ANCHO.Count > 0 &&
                    g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNAS_ANCHO.ContainsKey(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna))
                {
                    dgv_Columna.Width = g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNAS_ANCHO[mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna];
                }
                else
                {
                    if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Ancho > 0)
                    {
                        dgv_Columna.Width = mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Ancho;
                    }
                }
                //................................................................................................................

                dgv_Columna.ReadOnly = true;

                //Poner alineado segun tipo de datos ......................................................................................
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL) ||
                    mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG) ||
                    mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT) ||
                    mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    dgv_Columna.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                }
                else
                {
                    dgv_Columna.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                }
                //..............................................................................................................................

                ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Columns.Add(dgv_Columna);

                //RELLENAR EL ORDEN EN COMBO
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Oculto == false)
                {
                    ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.Items.Add(new INTERNO_ComboBox_Modelo(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna, mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_AMostrar, null));
                }
            }

            //Cambiar el orden de las columnas ........
            if (g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES != null && g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNAS_ORDEN != null && g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNAS_ORDEN.Count > 0)
            {
                foreach (KeyValuePair<string, int> kvp_Valores in g_mdl_INTERNO_ConfiguracionPantalla_Modelo_OPCIONES.LISTADO_COLUMNAS_ORDEN)
                {
                    ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Columns[kvp_Valores.Key].DisplayIndex = kvp_Valores.Value;
                }
            }
            //.........................................
        }

        #region Ordenar
        private void ex_btn_P_ConfiguracionEsquemaMenu_OrdenListado_Click(object sender, EventArgs e)
        {
            //Esta Descedente
            if (ex_btn_P_ConfiguracionEsquemaMenu_OrdenListado.Tag.ToString().Equals("1"))
            {
                Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_ConfiguracionEsquemaMenu_OrdenListado);
            }
            //Esta Ascendente
            else
            {
                Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_ConfiguracionEsquemaMenu_OrdenListado);
            }

            Listado_Opciones_Ordenar_DataGridView();
        }
        private void ex_dgv_P_ConfiguracionEsquemaMenu_Opciones_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {
                //Mostrar u Ocultar las columnas
                if (e.Button == MouseButtons.Left)
                {
                    string str_CambioOrdenAnterior = "";
                    if (ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedItem != null)
                    {
                        str_CambioOrdenAnterior = ((INTERNO_ComboBox_Modelo)ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedItem).Identificador;
                    }

                    //Seleccionar la columna en el Combo de orden
                    ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedItem = ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.Items.Cast<INTERNO_ComboBox_Modelo>().Where(m => m.Identificador.Equals(ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Columns[e.ColumnIndex].Name)).FirstOrDefault();

                    if (str_CambioOrdenAnterior.Equals(((INTERNO_ComboBox_Modelo)ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedItem).Identificador))
                    {
                        //Si estaba Ascendente lo pongo descendente
                        if (ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.SortOrder == SortOrder.Ascending)
                        {
                            Funciones.Cambiar_Imagen_Boton_Orden(1, ex_btn_P_ConfiguracionEsquemaMenu_OrdenListado);
                        }
                        //Si estaba descendente lo pongo Ascendente
                        else
                        {
                            Funciones.Cambiar_Imagen_Boton_Orden(0, ex_btn_P_ConfiguracionEsquemaMenu_OrdenListado);
                        }
                    }

                    Listado_Opciones_Ordenar_DataGridView();
                }
            }
            catch
            { }
        }
        private void ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Saber el Tipo de Ordenacion .................................
            ListSortDirection obj_ListSortDirection = ListSortDirection.Ascending;
            if (ex_btn_P_ConfiguracionEsquemaMenu_OrdenListado.Tag.ToString().Equals("1"))
            {
                obj_ListSortDirection = ListSortDirection.Descending;
            }
            //..............................................................

            //Cambiar el tipo Orden en Listado
            ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Sort(ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Columns[((INTERNO_ComboBox_Modelo)ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedItem).Identificador], obj_ListSortDirection);

            Listado_Opciones_Ordenar_DataGridView();
        }

        public void Listado_Opciones_Ordenar_DataGridView()
        {
            try
            {
                if (ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Rows.Count > 0)
                {
                    //Saber el Tipo de Ordenacion .................................
                    ListSortDirection obj_ListSortDirection = ListSortDirection.Ascending;
                    if (ex_btn_P_ConfiguracionEsquemaMenu_OrdenListado.Tag.ToString().Equals("1"))
                    {
                        obj_ListSortDirection = ListSortDirection.Descending;
                    }
                    //..............................................................

                    if (ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedItem != null && ((INTERNO_ComboBox_Modelo)ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedItem).Identificador.Trim().Length > 0)
                    {
                        ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Sort(ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Columns[((INTERNO_ComboBox_Modelo)ex_cbo_P_ConfiguracionEsquemaMenu_OrdenListado.SelectedItem).Identificador], obj_ListSortDirection);
                    }
                    else
                    {
                        ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Sort(ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Columns[g_obj_Controladora.g_obj_ABS_Listado_PRV_OpcionesDisponiblesParaCliente.ORDENACION_NOMBRECOLUMNA_PORDEFECTO()], obj_ListSortDirection);
                    }
                }
            }
            catch (Exception)
            { }
        }

       
        #endregion

        #region Filtros
        //Productos
        private void ex_cbo_P_ConfiguracionEsquemaMenu_Productos_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null && g_obj_Controladora.g_bol_Termino_CargaDatos_Inicial)
            {
                //IdProducto
                g_obj_Controladora.g_lng_idProductos = long.Parse(((INTERNO_ComboBox_Modelo)((Exferia_ComboBox)sender).SelectedItem).Identificador);

                //Rellenar DataGridView
                g_obj_Controladora.Rellenar_DataGrid_Opciones();
            }
        }
        //Busqueda
        private void ex_txt_P_ConfiguracionEsquemaMenu_Busqueda_Exferia_TextBox_Evento_TextChanged(object sender, EventArgs e)
        {
            //Texto de busqueda
            g_obj_Controladora.g_str_TextoBusqueda = ((Exferia_TextBox)sender).Text;

            //Rellenar DataGridView
            g_obj_Controladora.Rellenar_DataGrid_Opciones();
        }
        //Requeridas
        private void ex_cbo_P_ConfiguracionEsquemaMenu_Requeridas_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null && g_obj_Controladora.g_bol_Termino_CargaDatos_Inicial)
            {
                //Requerido(Obligatorio)
                g_obj_Controladora.g_int_Requerido = int.Parse(((INTERNO_ComboBox_Modelo)((Exferia_ComboBox)sender).SelectedItem).Identificador);

                //Rellenar DataGridView
                g_obj_Controladora.Rellenar_DataGrid_Opciones();
            }
        }
        //Utilizadas
        private void ex_cbo_P_ConfiguracionEsquemaMenu_Utilizadas_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (g_obj_Controladora != null && g_obj_Controladora.g_bol_Termino_CargaDatos_Inicial)
            {
                //Utilizadas
                g_obj_Controladora.g_int_Utilizadas = int.Parse(((INTERNO_ComboBox_Modelo)((Exferia_ComboBox)sender).SelectedItem).Identificador);

                //Rellenar DataGridView
                g_obj_Controladora.Rellenar_DataGrid_Opciones();
            }
        }
        #endregion

        #region Mover Opciones
        private bool g_bol_TieneSeleccion = false;
        private void ex_dgv_P_ConfiguracionEsquemaMenu_Opciones_MouseDown(object sender, MouseEventArgs e)
        {
            g_bol_TieneSeleccion = false;
            if (e.Button != MouseButtons.Left)
                return;

            ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.MouseMove += ex_dgv_P_ConfiguracionEsquemaMenu_Opciones_MouseMove;
        }
        private void ex_dgv_P_ConfiguracionEsquemaMenu_Opciones_MouseMove(object sender, MouseEventArgs e)
        {
            if (g_bol_TieneSeleccion == false)
            {
                g_bol_TieneSeleccion = true;

                ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.MouseMove -= ex_dgv_P_ConfiguracionEsquemaMenu_Opciones_MouseMove;

                if (e.Button != MouseButtons.Left)
                    return;

                List<DataGridViewRow> lst_Rows = new List<DataGridViewRow>();

                foreach (DataGridViewRow dgvr_Opcion in ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.SelectedRows)
                {
                    lst_Rows.Add(dgvr_Opcion);
                }

                ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.DoDragDrop(lst_Rows, DragDropEffects.Move);
            }
        }
        #endregion

        //Pera poner el color a las celdas
        private void ex_dgv_P_ConfiguracionEsquemaMenu_Opciones_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e != null)
            {
                if ((bool)ex_dgv_P_ConfiguracionEsquemaMenu_Opciones.Rows[e.RowIndex].Cells[nameof(INTERNO_PRV_OpcionesDisponiblesParaClientes_Modelo.obligatorio)].Value)
                {
                    e.CellStyle.BackColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_OBLIGATORIA_FONDO;
                }
                else
                {
                    e.CellStyle.BackColor = Colores.G_COLOR_CONFIGURACIONESQUEMAMENU_OPCION_FONDO;
                }
            }
        }

        #endregion

        #region Teclas de acceso rapido
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            //Agregar_Nodo
            if (keyData == Keys.F9)
            {
                Agregar_Nodo();
            }
            //Eliminar Nodo
            else if (keyData == Keys.F11)
            {
                Eliminar_Nodo();
            }
            // Grabar
            else if (keyData == Keys.F2)
            {
                Grabar();
                return true;
            }
            //Mover Nodo Al Primero
            else if (keyData == (Keys.Control | Keys.Home))
            {
                Mover_Nodo_Al_Primero();
            }
            //Mover Nodo Al Ultimo
            else if (keyData == (Keys.Control | Keys.End))
            {
                Mover_Nodo_Al_Ultimo();
            }
            //Mover Subir Nodo
            else if (keyData == (Keys.Control | Keys.Up))
            {
                Mover_Subir_Nodo();
            }
            //Mover Bajar Nodo
            else if (keyData == (Keys.Control | Keys.Down))
            {
                Mover_Bajar_Nodo();
            }
            //Mover Nodo Derecha
            else if (keyData == (Keys.Control | Keys.Right))
            {
                Mover_Nodo_Derecha();
            }
            //Mover Nodo Izquierda 
            else if (keyData == (Keys.Control | Keys.Left))
            {
                Mover_Nodo_Izquierda();
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }




        #endregion

       
    }
}
