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;
using ESRI.ArcGIS.Geodatabase;

namespace OliviaAddIn
{
    public partial class ListCapasMaqueta : Form
    {
        //*************************************************************************************
        //Variables 
        /**
         * Matriz que contiene las instalaciones que están contemplados en .gdb una vez leida
         */
        public String[] capas_maquetar = null;
        public String[] capas = null;
        public List<String> capas_l = null;
        public List<String> grupo_l = null;
        public String[] grupo_maquetar = null;

        public bool aceptar = false;

        //*************************************************************************************

        public ListCapasMaqueta()
        {
            InitializeComponent();
        }

        /*
         * Inicializa los elementos de la ventana: rellena la listbox
         * Se listan aquellas capas que pertenecen a la GDB y que terminan con el sufijo "Sector", 
         * que serán aquellas que cada sector es una única geometría de modo que a la hora de emplear DataDrive Pages facilitará el centrado de la vista por cada sector
         */
        public void inicia(IEnumDatasetName grupos)
        {
            IDatasetName grupo, element;
            IEnumDatasetName elementos;

            try
            {
                grupo = grupos.Next();

                capas_l = new List<String>();
                grupo_l = new List<String>();
                while (grupo != null)
                {
                    elementos = grupo.SubsetNames;
                    element = elementos.Next();
                    while (element != null)
                    {
                        if (element.Name.EndsWith(OliviaGlob.gdb.name_sect) ||
                            element.Name.EndsWith(OliviaGlob.gdb.name_ruta_out))
                        {
                            capas_l.Add(element.Name);
                            grupo_l.Add(grupo.Name);
                        }
                        element = elementos.Next();
                    }
                    grupo = grupos.Next();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Error al mostrar las capas que contiene la GDB para maquetar", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

        /*
         * Al hacer click en el boton cancelar se rechaza seleccionar capas para la maquetación.
         */
        private void bt_cancel_Click(object sender, EventArgs e)
        {
            capas_maquetar = null;
            Close();
        }

        /*
         * Cuando se muestra el dialogo se añade a la lista aquellas capas que componen el array capas (capas que cumplen con que terminan en "_Sector")
         */
        private void ListCapasMaqueta_Shown(object sender, EventArgs e)
        {
            listBox_maqueta.Items.Clear();
            if (capas_l[0] != null)
            {
                capas = new string[capas_l.Count];
                capas_l.CopyTo(capas);
                listBox_maqueta.Items.AddRange(capas);
            }
        }

        /*
        * Cuando se clicka en Aceptar se hace un listado String con el nombre de los grupos que contienen las capas seleccionadas
        */
        private void bt_acept_Click(object sender, EventArgs e)
        {
            object obj;
            ListBox.SelectedObjectCollection seleccionados;
            ListBox.SelectedIndexCollection indices;

            try
            {
                //se pone aceptar a true para que a la hora de cerrar el dialogo pueda verificar si ha pasado por aceptar para no poner las variables a null
                aceptar = true;

                indices = listBox_maqueta.SelectedIndices;
                seleccionados = listBox_maqueta.SelectedItems;
                int num = seleccionados.Count;
                if (num == 0)
                {
                    MessageBox.Show("No se ha seleccionado ninguna capa para maquetar", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                //una vez se conoce el numero de elementos seleccionados de la lista se crea el array string de los grupos que contienen dichas capas.
                capas_maquetar = new String[num];
                for (int i = 0; i < num; i++)
                {
                    obj = seleccionados[i];
                    capas_maquetar[i] = obj.ToString();
                }
                num = indices.Count;
                grupo_maquetar = new String[num];
                for (int i = 0; i < num; i++)
                {
                    grupo_maquetar[i] = grupo_l[indices[i]];
                }
                Close();
            }
            catch (Exception)
            {
                MessageBox.Show("Error al aceptar las capas a maquetar.", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

        /*
        * Al hacer click en el boton cerrar se rechaza seleccionar capas para la maquetación.
        */
        private void ListCapasMaqueta_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (aceptar == false)
                capas_maquetar = null;
        }

    }
}
