// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto ListaOpcionesTexto
// g++ -g ListaOpcionesTexto.cpp -lxseasycpp -LC:/msys64/mingw64/lib -lgtk-3 -lgdk-3 -lz -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lintl -lglib-2.0 -o ListaOpcionesTexto.exe
// g++ -g ListaOpcionesTexto.cpp %PKG-XSEASYCPP% -o ListaOpcionesTexto.exe
// -------------------------------------------------------------------------------------

// Incluye las librería de xsWindows
#include "include/xsEasyCpp.hpp"

// Detiene el Ciclo Principal iniciado por gtk_main cuando la ventana es destruida
Estatica Vacio fnSalida(xsObjetoGUI* ventana, xsApuntador datos);

// Función para controlar el Cierre de una Ventana
Estatica Entero fnCierre(xsObjetoGUI* ventana, xsEvento *evento);

// Función para controlar la selección en el Opcion
Vacio fnOpcionSeleccionada(xsObjetoGUI* objeto, xsApuntador datos);

// Función para procesar los Botones
Vacio fnClickBotones(xsObjetoGUI* objeto, Entero* funcion);

// Función para validar que una cadena solo tenga números
Logico fnCadenaConSoloNumeros(xsCadena cadena);

// Declaramos los objetos de Entrada para Indice, Identificador y Opción
xsEntrada entIndice, entIdentificador, entOpcion;

// Declaramos la Lista de Opciones de texto
xsListaOpcionesTexto oOpcionLenguajes;

// Función principal de xsEasyWindow
xsPrincipal
{
  // Iniciamos xsEasyWindows
  xsAppInicia;

  // Definimos un objeto de la Clase xsVentana
  xsVentana oVentana(XS_CON_CONTENEDOR);

  // Estableciendo un tamaño para la Ventana                                  
  oVentana.colocarDimensiones(400,250);

  // Borde la ventana
  oVentana.colocarBordeVentana(10);

  // Centrar la Ventana
  oVentana.centrar();

  // Coloca el Título
  oVentana.colocarTitulo("xsEasyCpp Demo Lista Opciones Texto");

  // Establece el Icono
  oVentana.colocarIcono("img/js.ico");
    
  // Establece la función de Salida
  oVentana.colocarFuncionSalida(XS_FUNCION_RETORNO (fnSalida));

  // Establece la función de Cierre
  oVentana.colocarFuncionCierre(XS_FUNCION_RETORNO (fnCierre));

  
  // Creamos Objetos Opcion  
  oOpcionLenguajes.crear();

  // Agregamos opciones
  oOpcionLenguajes.agregar("Java");
  oOpcionLenguajes.agregar("Dava");
  oOpcionLenguajes.agregar("wnd","Windows");
  oOpcionLenguajes.anteponer("C");
  oOpcionLenguajes.anteponer("C++");
  oOpcionLenguajes.insertar(0,"Ensamblador");

  // Activamos la opción 2
  oOpcionLenguajes.seleccionar(2);
  oOpcionLenguajes.seleccionar(XS_OPCION_DESSELECCIONAR);


  // Creama la entrada para el índice
  entIndice.crear();
  entIndice.colocarPlaceHolderTexto("Indice");  

  // Creamos la entrada para el Identificador
  entIdentificador.crear();
  entIdentificador.colocarPlaceHolderTexto("Identificador");

  // Creamos la entrada para la opción Seleccionada
  entOpcion.crear();
  entOpcion.colocarPlaceHolderTexto("Opción Seleccionada");

  // Botones
  xsBoton btnDesSeleccionar    ("DesSeleccionar"          ,Falso);
  xsBoton btnSeleccionar       ("Seleccionar"             ,Falso);
  xsBoton btnDesHabilitar      ("DesHabilitar"            ,Falso);
  xsBoton btnHabilitar         ("Habilitar"               ,Falso);
  xsBoton btnLimpiar           ("Limpiar"                 ,Falso);
  xsBoton btnAgregar           ("Agregar"                 ,Falso);
  xsBoton btnAnteponer         ("Anteponer"               ,Falso);
  xsBoton btnAgregarEnPosicion ("Agregar en Posición"     ,Falso);
  xsBoton btnEliminar          ("Eliminar el Seleccionado",Falso);
  xsBoton btnEliminarEnPosicion("Eliminar en Posición"    ,Falso);
  xsBoton btnLongitud          ("Longitud"                ,Falso);
  
  // Conecta la Señal del Opcion
  oOpcionLenguajes.conectarSenal(XS_EVENTO_CAMBIADO,XS_FUNCION_RETORNO (fnOpcionSeleccionada),NULO);

  // Conecta la Señal de los Botones
  Entero funcion1=1;
  btnDesSeleccionar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion1);
  
  Entero funcion2=2;
  btnSeleccionar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion2);

  Entero funcion3=3;
  btnDesHabilitar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion3);

  Entero funcion4=4;
  btnHabilitar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion4);

  Entero funcion5=5;
  btnLimpiar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion5);

  Entero funcion6=6;
  btnAgregar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion6);

  Entero funcion7=7;
  btnAnteponer.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion7);

  Entero funcion8=8;
  btnAgregarEnPosicion.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion8);

  Entero funcion9=9;
  btnEliminar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion9);

  Entero funcion10=10;
  btnEliminarEnPosicion.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion10);

  Entero funcion11=11;
  btnLongitud.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnClickBotones),&funcion11);

  // Agregar las Opciones a la Ventana Principal
  oVentana.agregarAlContenedor(oOpcionLenguajes.obtenerManejador());
  
  // Agregamos la entrada y la etiqueta a la Ventana Principal
  oVentana.agregarAlContenedor(entIndice.obtenerManejador());
  oVentana.agregarAlContenedor(entIdentificador.obtenerManejador());
  oVentana.agregarAlContenedor(entOpcion.obtenerManejador());
  oVentana.agregarAlContenedor(btnDesSeleccionar.obtenerManejador());
  oVentana.agregarAlContenedor(btnSeleccionar.obtenerManejador());
  oVentana.agregarAlContenedor(btnDesHabilitar.obtenerManejador());
  oVentana.agregarAlContenedor(btnHabilitar.obtenerManejador());
  oVentana.agregarAlContenedor(btnLimpiar.obtenerManejador());
  oVentana.agregarAlContenedor(btnAgregar.obtenerManejador());
  oVentana.agregarAlContenedor(btnAnteponer.obtenerManejador());
  oVentana.agregarAlContenedor(btnAgregarEnPosicion.obtenerManejador());
  oVentana.agregarAlContenedor(btnEliminar.obtenerManejador());
  oVentana.agregarAlContenedor(btnEliminarEnPosicion.obtenerManejador());
  oVentana.agregarAlContenedor(btnLongitud.obtenerManejador());
  
  // Muestra todos los objetos
  oVentana.mostrarTodo();

  // Ciclo
  xsAppCiclo;

  // Finaliza retornando 0
  retorna 0;

}


// Función de Salida
Estatica Vacio fnSalida(xsObjetoGUI* ventana, xsApuntador datos)
{
  // Llama a la función de la Librería que sale del Ciclo Main  
  xsAppSalida;
}

// Función para controlar el Cierre de una Ventana
Estatica Entero fnCierre(xsObjetoGUI* ventana, xsEvento *evento)
{
  retorna Falso; // Para que se cierre, lo contrario para que no se cierre
}


// Función para controlar opción Seleccionada
Vacio fnOpcionSeleccionada(xsObjetoGUI* objeto, xsApuntador datos)
{  
  // Obtener el índice
  int indice = oOpcionLenguajes.obtenerIndiceSeleccionado();

  // Coloca el índice del Seleccionado
  entIndice.colocarTexto(to_string(indice));

  // Coloca el ídentificador del Seleccionado
  entIdentificador.colocarTexto(oOpcionLenguajes.obtenerIdeSeleccionado());

  // Coloca el Texto en la Entrada Correspondiente
  entOpcion.colocarTexto(oOpcionLenguajes.obtenerTextoSeleccionado());
}

// Función para controlar opción Seleccionada
Vacio fnClickBotones(xsObjetoGUI* objeto, Entero* funcion)
{
  // Declaro variable temporal Entero
  Entero opcion;

  // Obtengo el valor desde el parámetro
  opcion = *funcion;

  // Ejecuto opción dependiendo de Función
  evaluar (opcion)
  {
    // Botón de Seleccionar
    siEs 1:
         // Desseleccionar
         oOpcionLenguajes.seleccionar(XS_OPCION_DESSELECCIONAR);
         // Limpia los Controles
         entIndice.colocarTexto("-1");
         entIdentificador.colocarTexto("");
         entOpcion.colocarTexto("");
         salirEvaluar;

    // Seleccionar
    siEs 2:

         salirEvaluar;

    // Seleccionar
    siEs 3:
         oOpcionLenguajes.habilitar(Falso);
         salirEvaluar;

    // Seleccionar
    siEs 4:
         oOpcionLenguajes.habilitar(Verdad);
         salirEvaluar;

    // Seleccionar
    siEs 5:
         oOpcionLenguajes.limpiar();
         salirEvaluar;    

    // Agregar 
    siEs 6:
         // Verifica la longitud de la Entrada Opción
         si (entOpcion.obtenerLongitudTexto()>0)
         {
            // Obtiene la longitud del Opcion Texto
            int longitud = oOpcionLenguajes.longitud();

            // Verifica si tiene identificador
            si (entIdentificador.obtenerLongitudTexto()>0)
            {
               // Agrega con Identificador
               oOpcionLenguajes.agregar(entIdentificador.obtenerTexto(),
                                        entOpcion.obtenerTexto());

               // Mensaje
               xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Se agregó la opción con identificador en la posición "+to_string(longitud));
            }
            deOtroModo
            {
               // Agrega sin Identificador
               oOpcionLenguajes.agregar(entOpcion.obtenerTexto());

               // Mensaje
               xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Se agregó la opción sin identificador en la posición "+to_string(longitud));
            }

            // Coloca la posición en el control
            entIndice.colocarTexto(to_string(longitud));
         }
         deOtroModo
            // Mensaje
            xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Capture la opción a agregar");

          // Sale de la Opción
          salirEvaluar;

    // Anteponer
    siEs 7:
         // Verifica la longitud de la Entrada Opción
         si (entOpcion.obtenerLongitudTexto()>0)
         {
            
            // Verifica si tiene identificador
            si (entIdentificador.obtenerLongitudTexto()>0)
            {
               // Agrega con Identificador
               oOpcionLenguajes.anteponer(entIdentificador.obtenerTexto(),
                                          entOpcion.obtenerTexto());

               // Mensaje
               xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Se antepuso la opción con identificador al inicio ");
            }
            deOtroModo
            {
               // Agrega sin Identificador
               oOpcionLenguajes.anteponer(entOpcion.obtenerTexto());

               // Mensaje
               xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Se agregó la opción sin identificador al inicio ");
            }

            // Coloca la posición en el control
            entIndice.colocarTexto("0");
         }
         deOtroModo
            // Mensaje
            xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Capture la opción a agregar");

          // Sale de la Opción
          salirEvaluar;

    // Agregar en Posición
    siEs 8:
    
          // Verifica si hay indice capturado
          si (entIndice.obtenerLongitudTexto()>0)
          {
             // Verifica que sea solo numeros
             si (fnCadenaConSoloNumeros(entIndice.obtenerTexto()))
             {
                // Obtengo la posición
                Entero posicion = stoi(entIndice.obtenerTexto());

                // Verifico la posición
                si (posicion <= oOpcionLenguajes.longitud())                
                {

                    // Verifica la longitud de la Entrada Opción
                    si (entOpcion.obtenerLongitudTexto()>0)
                    {
                        
                        // Verifica si tiene identificador
                        si (entIdentificador.obtenerLongitudTexto()>0)
                        {
                          // Agrega con Identificador
                          oOpcionLenguajes.insertar(posicion,
                                                    entIdentificador.obtenerTexto(),
                                                    entOpcion.obtenerTexto());

                          // Mensaje
                          xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Se insertó la opción con identificador en posición "+to_string(posicion));
                        }
                        deOtroModo
                        {
                          // Agrega sin Identificador
                          oOpcionLenguajes.insertar(posicion,entOpcion.obtenerTexto());

                          // Mensaje
                          xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Se insertó la opción sin identificador en posición "+to_string(posicion));
                        }

                        // Coloca la posición en el control
                        entIndice.colocarTexto(to_string(posicion));
                    }
                    deOtroModo
                        // Mensaje
                        xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Capture la opción a agregar");
                }        
                deOtroModo
                    // Mensaje
                    xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","La posición no puede ser mayor que la Longitud");                                           
              }   
              deOtroModo
                  // Mensaje
                  xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Capture un numero para la posición");    
          }
          deOtroModo
             // Mensaje
             xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Capture el Indice para la posición");

          // Sale de la Opción
          salirEvaluar;

    // Eliminar Seleccionado
    siEs 9:
        // Declara una variable Entera
        Entero iSel;

        // Obtengo el Indice
        iSel = oOpcionLenguajes.obtenerIndiceSeleccionado();

        // Verifica que haya seleccionado
        si (iSel >= 0)

           // Verifica que no sea mayor que el numero de Elementos
           si (iSel <= oOpcionLenguajes.longitud())
              // Elimina el Elemento
              oOpcionLenguajes.eliminar(iSel);

           deOtroModo
              // Despliega el Mensaje
              xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","La posición indicada es fuera de Rango");
              
        deOtroModo
           // Mensaje 
           xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","No hay elemento seleccionado");

        // Sale de la Opción
        salirEvaluar;

    // Eliminar Seleccionado
    siEs 10:
        
        // Verifica si hay indice capturado
        si (entIndice.obtenerLongitudTexto()>0)
        {
             // Verifica que sea solo numeros
             si (fnCadenaConSoloNumeros(entIndice.obtenerTexto()))
             {
                // Obtengo la posición
                Entero posicion = stoi(entIndice.obtenerTexto());

                // Verifico la posición
                si (posicion < oOpcionLenguajes.longitud())                
                {
                   // elimina la posición indicada
                   oOpcionLenguajes.eliminar(posicion);

                   // Mensaje
                   xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Se ha eliminado el elemento en posición "+to_string(posicion));
                }
                deOtroModo
                  // Mensaje
                  xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","La posición a eliminar está fuera de Rango");
             }
             deOtroModo
               // Mensaje
               xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Capture números para la posición");
        }
        deOtroModo
           // Mensaje
           xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Capture la posición a eliminar");

        
        // Sale de la Opción
        salirEvaluar;     

    
    // Longitud
    siEs 11:

         // Variable para obtener la longitud
         Entero Longitud = oOpcionLenguajes.longitud();

         // Mensaje de Información
         xsVentana::mensajeInformacion("Demo ListaOpcionesTexto","Elementos en la Opcion de Texto:"+to_string(Longitud));

         // Sale de la opción
         salirEvaluar;                     
  }
  
}

// Función para validar que una cadena solo tenga números
Logico fnCadenaConSoloNumeros(xsCadena cadena)
{
	// resultado
	Logico resultado = Verdad;

	// Ciclo para verificar cada caracter
	for(int i = 0; i < cadena.size(); i++)
	{
    // Verifica que no sea dígito
		si (cadena[i] <'0' || cadena[i]>'9')
		{
			// Cambia el Resultado
			resultado = Falso;
			salirCiclo;
		}
	}

	// retorna el resultado
	retorna resultado;
}
