// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto CuadroOpciones
// g++ -g CuadroOpciones.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 CuadroOpciones.exe
// g++ -g CuadroOpciones.cpp %PKG-XSEASYCPP% -o CuadroOpciones.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 Insertar un dato al Cuadro de Opciones
Vacio fnInsertar(xsObjetoGUI* boton, gpointer entry);

// Función para Modificar un dato al Cuadro de Opciones
Vacio fnModificar(xsObjetoGUI* boton, gpointer entry);

// Función para Eliminar un dato del Cuadro de Opciones
Vacio fnEliminarSeleccionado(xsObjetoGUI* boton, xsApuntador selection);

// Función para Eliminar Primero
Vacio fnEliminarPrimero(xsObjetoGUI* boton, xsApuntador selection);

// Función para eliminar todos
Vacio fnEliminarTodos(xsObjetoGUI* boton, xsApuntador selection);

// Función para Seleccionar todos
Vacio fnSeleccionarTodos(xsObjetoGUI* boton);

// Función para Seleccionar Primero
Vacio fnSeleccionarPrimero(xsObjetoGUI* boton);

// Función para DesSeleccionar Primero
Vacio fnDesSeleccionarPrimero(xsObjetoGUI* boton);

// Función para DesSeleccionar todos
Vacio fnDesSeleccionarTodos(xsObjetoGUI* boton);

// Función para Desplegar todos
Vacio fnDesplegarTodos(xsObjetoGUI* boton);

// Función para Controlar Selección Múltiple
Vacio fnSeleccionMultiple(xsObjetoGUI* boton);

// Función para procesar la selección del elemento
Estatica Vacio fnCuadroOpcionesSeleccionado (xsCuadroOpcion* cuadroOpciones, 
                                             xsCuadroOpcionRenglon* renglon);

// Creamos un Cuadro de Opciones
xsCuadroOpciones oCuadroOpciones;

// Define el cuadro de entrada
xsEntrada txtDato;

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

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

  // Establece no Dimensionable
  oVentana.colocarDimensionable(FALSO);
  
  // Estableciendo un tamaño para la Ventana                                  
  oVentana.colocarDimensiones(370,300);

  // Posiciona la ventana al Centro
  oVentana.colocarPosicion(XS_VENTANA_POSICION_CENTRO);

  // Establece el Borde
  oVentana.colocarBordeVentana(10);

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

  // 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 la Ventana de Desplazamiento
  xsVentanaDesplazamiento oVentanaDesplazamiento(NULO,NULO);

  // Establece el desplazamiento
  oVentanaDesplazamiento.colocarDesplazamiento(XS_DESPLAZAMIENTO_AUTOMATICO,
                                               XS_DESPLAZAMIENTO_AUTOMATICO);

  // Establece la Sombra
  oVentanaDesplazamiento.colocarTipoSombra(XS_TIPO_SOMBRA_GRABADA_INTERNA);

  // Crea el Cuadro de Opciones
  oCuadroOpciones.crear();

  // Agrega el Cuadro de Opciones a al Ventana Desplazamiento
  oVentanaDesplazamiento.agregarEn(oCuadroOpciones.obtenerManejador());

  // Establece el alto
  oVentanaDesplazamiento.colocarDimensiones(-1,200);
  
  // Añade el Scroll al Contenedor
  oVentana.agregarAlContenedor(oVentanaDesplazamiento.obtenerManejador());

  // Crea los datos de entrada
  txtDato.crear();

  // Colocar el placeholder
  txtDato.colocarPlaceHolderTexto("Capture Insertar Modificar");

  // Establecer las dimensiones de la Entrada
  txtDato.colocarDimensiones(120,-1);

  // Agrega la Entrada al Contenedor
  oVentana.agregarAlContenedor(txtDato.obtenerManejador());                                      
  
  // Se crean los botones y la entrada
  xsBoton btnInsertar("Insertar",FALSO);
  xsBoton btnModificar("Modificar",FALSO);
  xsBoton btnEliminarSeleccionado("Eliminar Seleccionado",FALSO); 
  xsBoton btnEliminarPrimero("Eliminar Primero",FALSO); 
  xsBoton btnEliminarTodos("Eliminar Todos",FALSO);
  xsBoton btnSeleccionarPrimero("Seleccionar Primero",FALSO); 
  xsBoton btnSeleccionarTodos("Seleccionar Todos",FALSO);
  xsBoton btnDesSeleccionarPrimero("DesSeleccionar Primero",FALSO); 
  xsBoton btnDesSeleccionarTodos("DesSeleccionar Todos",FALSO);
  xsBoton btnDesplegarTodos("Desplegar Todos",FALSO);
  xsBotonInterruptor btnSeleccionMultiple("Activado Selección Individual",FALSO);
  
  // Se conecta la señal de cada botón
  btnInsertar.conectarSenal("clicked",XS_FUNCION_RETORNO(fnInsertar),txtDato.obtenerManejador());
  btnModificar.conectarSenal("clicked",XS_FUNCION_RETORNO(fnModificar),txtDato.obtenerManejador());
  btnEliminarSeleccionado.conectarSenal("clicked",XS_FUNCION_RETORNO(fnEliminarSeleccionado),NULO);
  btnEliminarPrimero.conectarSenal("clicked",XS_FUNCION_RETORNO(fnEliminarPrimero),NULO);
  btnEliminarTodos.conectarSenal("clicked",XS_FUNCION_RETORNO(fnEliminarTodos),NULO);
  btnSeleccionarPrimero.conectarSenal("clicked",XS_FUNCION_RETORNO(fnSeleccionarPrimero),NULO);
  btnSeleccionarTodos.conectarSenal("clicked",XS_FUNCION_RETORNO(fnSeleccionarTodos),NULO);
  btnDesSeleccionarPrimero.conectarSenal("clicked",XS_FUNCION_RETORNO(fnDesSeleccionarPrimero),NULO);
  btnDesSeleccionarTodos.conectarSenal("clicked",XS_FUNCION_RETORNO(fnDesSeleccionarTodos),NULO);
  btnDesplegarTodos.conectarSenal("clicked",XS_FUNCION_RETORNO(fnDesplegarTodos),NULO);
  btnSeleccionMultiple.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnSeleccionMultiple),NULO);

  // Agrega los botones al contenedor Horizontal
  oVentana.agregarAlContenedor(btnInsertar.obtenerManejador());                                   
  oVentana.agregarAlContenedor(btnModificar.obtenerManejador());                                    
  oVentana.agregarAlContenedor(btnEliminarSeleccionado.obtenerManejador());
  oVentana.agregarAlContenedor(btnEliminarPrimero.obtenerManejador());
  oVentana.agregarAlContenedor(btnEliminarTodos.obtenerManejador());  
  oVentana.agregarAlContenedor(btnSeleccionarPrimero.obtenerManejador());    
  oVentana.agregarAlContenedor(btnSeleccionarTodos.obtenerManejador());    
  oVentana.agregarAlContenedor(btnDesSeleccionarPrimero.obtenerManejador());    
  oVentana.agregarAlContenedor(btnDesSeleccionarTodos.obtenerManejador());
  oVentana.agregarAlContenedor(btnDesplegarTodos.obtenerManejador());
  oVentana.agregarAlContenedor(btnSeleccionMultiple.obtenerManejador());

  // Asocia la función para Controlar Select en el ListBox
  oCuadroOpciones.conectarSenal(XS_EVENTO_RENGLON_ACTIVADO,XS_FUNCION_RETORNO (fnCuadroOpcionesSeleccionado),oCuadroOpciones.obtenerManejador());

  // Muestra todos los objetos
  oVentana.mostrarTodo();
  
  // Ciclo
  xsAppCiclo;

  // Finaliza retornando 0
  retorna 0;
}

// Detiene el Ciclo Principal iniciado por gtk_main cuando la ventana es destruida
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
}


// Insertar un dato al Cuadro de Opciones
Vacio fnInsertar(xsObjetoGUI* boton, xsApuntador entrada) 
{  
   // Crea el dato de Entrada temporal
   xsEntrada temporal("");

   // Verifica que haya algo capturado para insertar
   si (txtDato.obtenerLongitudTexto()<1)
   {
      // Mensaje de Espera
      xsVentana::mensajeInformacion("xsEasyCpp - Demo CuadroOpciones",
                                    "Capture el Dato a Insertar");      
   }
   deOtroModo
   {
      // Le asigna el Manejador
      temporal.asignarManejador(XS_OBJETOGUI(entrada));

      // Crea la etiqueta imagen
      xsEtiquetaImagen etqLogo (temporal.obtenerTexto(),"img/js16x16.jpg",XS_ORIENTACION_HORIZONTAL,VERDAD);

      // Lo agrega al Cuadro de Opciones
      oCuadroOpciones.insertar(etqLogo.obtenerManejador(),0);
   
      // Indispensable para que se muestre el dato agregado
      oCuadroOpciones.mostrarTodo();

      // Limpia la Entrada
      temporal.limpiar();
   }   
   // Manda el Foco a la Entrada
   txtDato.colocarFoco();

   // Imprime el Numero de Elementos del Cuadro   
   xsVentana::mensajeInformacion("Demo CuadroOpciones","Elementos en el Cuadro de Opciones:"+to_string(oCuadroOpciones.longitud()));
   xsVentana::mensajeInformacion("Demo CuadroOpciones","Elementos Seleccionados en el Cuadro de Opciones:"+to_string(oCuadroOpciones.longitudSeleccionados()));
}

// Modificar un dato al Cuadro de Opciones
Vacio fnModificar(xsObjetoGUI* boton, xsApuntador entrada) 
{  
  // Declara una variable lista para los hijos del Objeto
  xsLista* hijos;

  // Declara un objeto
  xsObjeto objTemporal;
  
  // Declara un objeto de Etiqueta temporal
  xsEtiqueta temporal("");

  // Variable para el Renglón
  xsCuadroOpcionRenglon* renglon = NULO;

  // Variable para el Indice
  Entero indice;


  // Obtengo el Renglón Seleccionado
  renglon = xsObjeto_CuadroOpciones_obtener_seleccionado (XS_CUADRO_OPCIONES(oCuadroOpciones.obtenerManejador()));

  // Verifica que lo haya encontrado
  si (renglon)
  {
     // Obtengo el Indice del Row
     indice = xsObjeto_CuadroOpciones_row_obtener_indice(renglon);
    
     // Obtengo los hijos del Renglon Seleccionado
     objTemporal.asignarManejador(xsObjeto_CuadroOpciones_row_obtener_hijo(XS_BINARIO(renglon)));

     // Obtiene los hijos del Objeto
     hijos = xsObjeto_Contenedor_obtener_hijos (XS_CONTENEDOR(objTemporal.obtenerManejador()));     
      
     // Se desplega al siguiente; la etiqueta está despues de la imagen     
     hijos = hijos->next; 

     // Asigna el Apuntador al Temporal de la Etiqueta
     temporal.asignarManejador(XS_OBJETOGUI(hijos->data));
  
     // Coloca el Texto de la entrada
     temporal.colocarTexto(txtDato.obtenerTexto());    
  }    
  deOtroModo
     // Mensaje de Espera
     xsVentana::mensajeInformacion("xsEasyCpp - Demo CuadroOpciones",
                                   "No hay Elemento Seleccionado para Modificar"); 
}

Vacio fnEliminarSeleccionado(xsObjetoGUI *boton, xsApuntador datos) 
{
  // Verifica que haya seleccionado
  si (oCuadroOpciones.longitudSeleccionados() > 0)
     // Elimina el Seleccionado
     oCuadroOpciones.eliminarSeleccionado();                      
  deOtroModo
     // Mensaje de Espera
     xsVentana::mensajeInformacion("xsEasyCpp - Demo CuadroOpciones",
                                   "No hay Elemento Seleccionado para Eliminar");       
}

Vacio fnEliminarPrimero(xsObjetoGUI *boton, xsApuntador datos) 
{
  // Verifica que haya seleccionado
  si (oCuadroOpciones.longitud() > 0)
     // Elimina el Primero
     oCuadroOpciones.eliminar(0);                      
  deOtroModo
     // Mensaje de Espera
     xsVentana::mensajeInformacion("xsEasyCpp - Demo CuadroOpciones",
                                   "No hay Elementos");       
}

Vacio fnEliminarTodos(GtkWidget *widget, gpointer selection) 
{
   // Elimina todos los elementos
   oCuadroOpciones.limpiar();
}

Vacio fnSeleccionarPrimero(GtkWidget *widget) 
{
   // Elimina todos los elementos
   oCuadroOpciones.seleccionar(0);
}

Vacio fnDesSeleccionarPrimero(GtkWidget *widget) 
{
   // Elimina todos los elementos
   oCuadroOpciones.desseleccionar(0);
}

Vacio fnSeleccionarTodos(GtkWidget *widget) 
{
   // Selecciona todos los elementos
   oCuadroOpciones.seleccionarTodos();
}

Vacio fnDesSeleccionarTodos(GtkWidget *widget) 
{
   // Selecciona todos los elementos
   oCuadroOpciones.desseleccionarTodos();
}


// Función para procesar la selección del elemento
Estatica Vacio fnCuadroOpcionesSeleccionado (xsCuadroOpcion* cuadroOpciones, 
                                             xsCuadroOpcionRenglon* renglon)
{
  // Declara una variable lista para los hijos del Objeto
  xsLista* hijos;

  // Objeto
  xsObjeto objTemporal;

  // Declara un objeto de Etiqueta temporal
  xsEtiqueta etqTemporal("");

  // Variable para el Indice
  Entero indice;

  // Obtengo el Indice del Row
  indice = xsObjeto_CuadroOpciones_row_obtener_indice(renglon);
  
  // Asigna al objeto Temporal el Manejador de los Hijos
  objTemporal.asignarManejador(xsObjeto_CuadroOpciones_row_obtener_hijo(XS_BINARIO(renglon)));

  // Obtiene los hijos del Objeto temporal
  hijos = xsObjeto_Contenedor_obtener_hijos (XS_CONTENEDOR(objTemporal.obtenerManejador()));     
     
  // Se desplega al siguiente; la etiqueta está despues de la imagen     
  hijos = hijos->next;

  // Asigna el Apuntador al Temporal de la Etiqueta
  etqTemporal.asignarManejador(XS_OBJETOGUI(hijos->data));

  // Colocamos el Texto en la Entrada
  txtDato.colocarTexto(etqTemporal.obtenerTexto());  
}

// Función para desplegar cada elemento del Cuadro de Opciones
Vacio fnDesplegarTodos(GtkWidget *widget)
{
  // Declara una variable lista para los hijos del Objeto
  xsLista* hijos;

  // Variable indice
  Entero indice;

  // Variable objeto
  xsObjeto objTemporal;

   // Declara un objeto de Etiqueta temporal
  xsEtiqueta etqTemporal("");
  
  // Declara variable para obtener el renglon
  xsCuadroOpcionRenglon* renglon=NULO;

  // Ciclo para obtener cada uno de los elementos
  ciclo (indice=0; indice < oCuadroOpciones.longitud(); indice++)
  {
     // Obtiene el Renglón
     renglon = oCuadroOpciones.obtenerRenglon(indice);

     // Asigna el Manejador
     objTemporal.asignarManejador(xsObjeto_CuadroOpciones_row_obtener_hijo(XS_BINARIO(renglon)));

     // Obtiene los hijos del Objeto
     hijos = xsObjeto_Contenedor_obtener_hijos (XS_CONTENEDOR(objTemporal.obtenerManejador()));     
     
     // Se desplega al siguiente; la etiqueta está despues de la imagen     
     hijos = hijos->next;

     // Asigna el Apuntador al Temporal de la Etiqueta
     etqTemporal.asignarManejador(XS_OBJETOGUI(hijos->data));

     // Despliega
     xsVentana::mensajeInformacion("xsEasyCpp Demo CuadroOpciones",etqTemporal.obtenerTexto());

  }
}

// Función para desplegar cada elemento del Cuadro de Opciones
Vacio fnSeleccionMultiple(xsObjetoGUI* objeto)
{
   // Variable temporal para el Objeto
   xsBotonInterruptor tmpInterruptor;

   // Le asigna el objeto
   tmpInterruptor.asignarManejador(objeto);

   // Verifica si está activado
   si (tmpInterruptor.obtenerActivo())
   {
      // Cambia el Texto
      tmpInterruptor.colocarTexto("Activado Selección Múltiple");

      // Activa la Selección Multiple      
      oCuadroOpciones.modoSeleccion(XS_SELECCION_MULTIPLE);
   }
   deOtroModo
   {
      // Cambia el Texto
      tmpInterruptor.colocarTexto("Activado Selección Individual");

      // Activa la Selección Multiple      
      oCuadroOpciones.modoSeleccion(XS_SELECCION_INDIVIDUAL);
   }

}