// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto Matriz
// g++ -g Matriz.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 Matriz.exe
// g++ -g Matriz.cpp %PKG-XSEASYCPP% -o Matriz.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 
Vacio fnColumnasHomogeneas(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnRenglonesHomogeneas(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnAgregarBoton(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnEliminarRenglon(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnEliminarColumna(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnInsertarRenglon(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnInsertarColumna(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnEspacioEntreCol(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnEspacioEntreRen(xsObjetoGUI* objeto, xsApuntador matriz);
Vacio fnColocarBorde(xsObjetoGUI* objeto, xsApuntador matriz);

// Variables Globales
xsBotonNumerico btnPosX1;
xsBotonNumerico btnPosY1;
xsBotonNumerico btnPosX2;
xsBotonNumerico btnPosY2;

// 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,400);

  // Centrar la Ventana
  oVentana.centrar();

  // Coloca el Título
  oVentana.colocarTitulo("xsEasyCpp Demo Matriz");

  // 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));

  // Establece un Borde para la Ventana
  oVentana.colocarBordeVentana(10);

  // Declara un scroll
  xsVentanaDesplazamiento scroll(NULO,NULO);
  scroll.colocarDimensiones(0,150);

  // Se crea la Matriz
  xsMatriz oMatriz;
  oMatriz.crear();
  
  // Agregar la Matriz al  Scroll
  scroll.agregarEn(oMatriz.obtenerManejador());

  // Agregar el Scroll al Contenedor
  oVentana.agregarAlContenedor(scroll.obtenerManejador());
  
  // Define los 4 botones Iniciales
  xsBoton btn0011("Boton-0011",XS_SIN_MNEMONICO);  
  xsBoton btn0111("Boton-0111",XS_SIN_MNEMONICO);
  xsBoton btn1011("Boton-1011",XS_SIN_MNEMONICO);
  xsBoton btn1111("Boton-1111",XS_SIN_MNEMONICO);


  // Agrega las etiquetas y entradas a la Matriz
  oMatriz.insertarEn(btn0011.obtenerManejador(),0,0,1,1);
  oMatriz.insertarEn(btn0111.obtenerManejador(),0,1,1,1);
  oMatriz.insertarEn(btn1011.obtenerManejador(),1,0,1,1);
  oMatriz.insertarEn(btn1111.obtenerManejador(),1,1,1,1);

  // Columnas Homogéneos o No
  xsBotonInterruptor btnColumnasHomogeneas("Columnas Homogeneas Desactivado",!XS_CON_MNEMONICO);

  // Renglones Homogéneos o No
  xsBotonInterruptor btnRenglonesHomogeneos("Renglones Homogeneas Desactivado",!XS_CON_MNEMONICO);
  
  // Crea los botones numericos para las posiciones
  btnPosX1.crear(0,5,1);
  btnPosX1.colocarTextoEmergente("Posición Iquierda o Columna/Renglón a Eliminar");
  btnPosY1.crear(0,5,1);
  btnPosY1.colocarTextoEmergente("Posición Arriba o Espacio Entre Columnas/Renglones");
  btnPosX2.crear(1,5,1);
  btnPosX2.colocarTextoEmergente("Ancho en Columnas del Objeto a Insertar o Borde");
  btnPosY2.crear(1,5,1);
  btnPosY2.colocarTextoEmergente("Alto  en Renglones del Objeto a Insertar");

  // Definimos botones
  xsBoton btnAgregarBoton   ("Agregar Botón en Coordenada ",NO XS_CON_MNEMONICO);
  xsBoton btnEliminarRenglon("Eliminar Renglón ",NO XS_CON_MNEMONICO);
  xsBoton btnEliminarColumna("Eliminar Columna ",NO XS_CON_MNEMONICO);
  xsBoton btnInsertarRenglon("Insertar Renglón ",NO XS_CON_MNEMONICO);
  xsBoton btnInsertarColumna("Insertar Columna ",NO XS_CON_MNEMONICO);
  xsBoton btnEspacioEntreCol("Espacio entre Columnas ",NO XS_CON_MNEMONICO);
  xsBoton btnEspacioEntreRen("Espacio entre Renglones ",NO XS_CON_MNEMONICO);
  xsBoton btnColocarBorde("Colocar Borde ",NO XS_CON_MNEMONICO);

  // Control de Eventos
  btnColumnasHomogeneas.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnColumnasHomogeneas),oMatriz.obtenerManejador());
  btnRenglonesHomogeneos.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnRenglonesHomogeneas),oMatriz.obtenerManejador());
  btnAgregarBoton.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnAgregarBoton),oMatriz.obtenerManejador());
  btnEliminarRenglon.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnEliminarRenglon),oMatriz.obtenerManejador());
  btnEliminarColumna.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnEliminarColumna),oMatriz.obtenerManejador());
  btnInsertarRenglon.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnInsertarRenglon),oMatriz.obtenerManejador());
  btnInsertarColumna.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnInsertarColumna),oMatriz.obtenerManejador());
  btnEspacioEntreCol.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnEspacioEntreCol),oMatriz.obtenerManejador());
  btnEspacioEntreRen.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnEspacioEntreRen),oMatriz.obtenerManejador());
  btnColocarBorde.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnColocarBorde),oMatriz.obtenerManejador());

  // Agregar Al Contenedor
  oVentana.agregarAlContenedor(btnColumnasHomogeneas.obtenerManejador());
  oVentana.agregarAlContenedor(btnRenglonesHomogeneos.obtenerManejador());
  oVentana.agregarAlContenedor(btnPosX1.obtenerManejador());
  oVentana.agregarAlContenedor(btnPosY1.obtenerManejador());
  oVentana.agregarAlContenedor(btnPosX2.obtenerManejador());
  oVentana.agregarAlContenedor(btnPosY2.obtenerManejador());
  oVentana.agregarAlContenedor(btnAgregarBoton.obtenerManejador());
  oVentana.agregarAlContenedor(btnEliminarRenglon.obtenerManejador());
  oVentana.agregarAlContenedor(btnEliminarColumna.obtenerManejador());
  oVentana.agregarAlContenedor(btnInsertarRenglon.obtenerManejador());
  oVentana.agregarAlContenedor(btnInsertarColumna.obtenerManejador());
  oVentana.agregarAlContenedor(btnEspacioEntreCol.obtenerManejador());
  oVentana.agregarAlContenedor(btnEspacioEntreRen.obtenerManejador());
  oVentana.agregarAlContenedor(btnColocarBorde.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
}


// Función para controlar ColumnasHomogeneas
Vacio fnColumnasHomogeneas(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));

    // Declara variable temporal
    xsBotonInterruptor btnTemporal;

    // Obtengo la referencia al objeto
    btnTemporal.asignarManejador(objeto);

    // Verifica si está activo
    si (btnTemporal.obtenerActivo())    
    {
       // Cambiamos el Titulo del Botón
       btnTemporal.colocarTexto("Columnas Homogeneas Activado");            

       // Cambia las COlumnas Homogeneas
       matTemporal.colocarColumnasHomogeneas(Verdad);
    } 
    // Está desactiva
    deOtroModo
    {
       // Cambiamos el Titulo del Botón
       btnTemporal.colocarTexto("Columnas Homogeneas Desactivado");            

       // Cambia las COlumnas Homogeneas
       matTemporal.colocarColumnasHomogeneas(Falso);
    }
}

//  Renglones Homogeneos
Vacio fnRenglonesHomogeneas(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));

    // Declara variable temporal
    xsBotonInterruptor btnTemporal;

    // Obtengo la referencia al objeto
    btnTemporal.asignarManejador(objeto);

    // Verifica si está activo
    si (btnTemporal.obtenerActivo())    
    {
       // Cambiamos el Titulo del Botón
       btnTemporal.colocarTexto("Renglones Homogeneos Activado");            

       // Cambia las COlumnas Homogeneas
       matTemporal.colocarRenglonesHomogeneos(Verdad);
    } 
    // Está desactiva
    deOtroModo
    {
       // Cambiamos el Titulo del Botón
       btnTemporal.colocarTexto("Renglones Homogeneos Desactivado");            

       // Cambia las COlumnas Homogeneas
       matTemporal.colocarRenglonesHomogeneos(Falso);
    }
}

// Agregar Botón
Vacio fnAgregarBoton(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));

    // Cadena para el Nombre del Botón
    string nombre="Botón ";
    
    // Agrega los Valores de las Coordenadas
    nombre = nombre + to_string(btnPosX1.obtenerValorEntero());
    nombre = nombre + to_string(btnPosY1.obtenerValorEntero());
    nombre = nombre + to_string(btnPosX2.obtenerValorEntero());
    nombre = nombre + to_string(btnPosY2.obtenerValorEntero());

    // Crea un Botón
    xsBoton btnTemporal(nombre,XS_SIN_MNEMONICO);
    
    // Agrega el Botón en los datos de coordenada
    matTemporal.insertarEn(btnTemporal.obtenerManejador(),
                           btnPosX1.obtenerValorEntero(),
                           btnPosY1.obtenerValorEntero(),
                           btnPosX2.obtenerValorEntero(),
                           btnPosY2.obtenerValor()); 

    // Actualizar (lo necesita al insertar)
    matTemporal.mostrarTodo();                           
}

// Eliminar Renglón
Vacio fnEliminarRenglon(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));
    
    // Eliminar el Renglón Indicado en btnPosX1
    matTemporal.eliminarRenglon(btnPosX1.obtenerValorEntero()); 
}

// Eliminar Columna
Vacio fnEliminarColumna(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));
    
    // Eliminar el Renglón Indicado en btnPosX1
    matTemporal.eliminarColumna(btnPosX1.obtenerValorEntero()); 
}

// Insertar Renglón
Vacio fnInsertarRenglon(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));
    
    // Insertar el Renglón Indicado en btnPosX1
    matTemporal.insertarRenglon(btnPosX1.obtenerValorEntero()); 
}

// Eliminar Columna
Vacio fnInsertarColumna(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));
    
    // Insertar el Renglón Indicado en btnPosX1
    matTemporal.insertarColumna(btnPosX1.obtenerValorEntero()); 
}

// Espacio entre Columnas
Vacio fnEspacioEntreCol(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));
    
    // Insertar el Renglón Indicado en btnPosX1
    matTemporal.colocarEspaciosEntreColumnas(btnPosY1.obtenerValorEntero()); 
}

// Espacio entre Renglones
Vacio fnEspacioEntreRen(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));
    
    // Insertar el Renglón Indicado en btnPosX1
    matTemporal.colocarEspaciosEntreRenglones(btnPosY1.obtenerValorEntero()); 
}

// Colocar el Borde
Vacio fnColocarBorde(xsObjetoGUI* objeto, xsApuntador matriz)
{
    // Variable temporal para la matriz
    xsMatriz matTemporal;

    // Obtiene el manejador
    matTemporal.asignarManejador(XS_OBJETOGUI(matriz));
    
    // Insertar el Renglón Indicado en btnPosX1
    matTemporal.colocarBorde(btnPosX2.obtenerValorEntero()); 
}



