// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto Marco
// g++ -g Marco.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 Marco.exe
// g++ -g Marco.cpp %PKG-XSEASYCPP% -o Marco.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 Colocar los valores alineamiento
Vacio fnAlineamiento(xsObjetoGUI* objeto,xsApuntador marco);

// Función para Colocar los valores alineamiento
Vacio fnSombra(xsObjetoGUI* objeto,xsApuntador marco);

// Define los botones numéricos
xsBotonNumerico numPosX;
xsBotonNumerico numPosY;

// 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(300,250);

  // Centrar la Ventana
  oVentana.centrar();

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

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

  // Se crea el Marco
  xsMarco oMarco("Inicio de Sesión");
    
  // Agregar la Etiqueta al Contenedor
  oVentana.agregarAlContenedor(oMarco.obtenerManejador());

  // Establece las dimensiones del Marco; solo la altura procede
  oMarco.colocarDimensiones(100,100);  
  
  // Define una Matriz
  xsMatriz oMatriz;
  oMatriz.crear();

  // Define etiquetas 
  xsEtiqueta etqUsuario("Usuario:");
  etqUsuario.colocarDimensiones(100,0);
  xsEtiqueta etqClave("Clave:");
  etqClave.colocarDimensiones(100,0);

  // Define entradas
  xsEntrada txtUsuario;
  xsEntrada txtClave;
  txtUsuario.crear();
  txtClave.crear();

  // Agrega las etiquetas y entradas a la Matriz
  oMatriz.insertarEn(etqUsuario.obtenerManejador(),0,0,1,1);
  oMatriz.insertarEn(etqClave.obtenerManejador(),0,1,1,1);
  oMatriz.insertarEn(txtUsuario.obtenerManejador(),1,0,1,1);
  oMatriz.insertarEn(txtClave.obtenerManejador(),1,1,1,1);
  oMatriz.colocarEspaciosEntreColumnas(5);
  oMatriz.colocarEspaciosEntreRenglones(5);  

  // Agrega la Matriz al Marco
  oMarco.agregarAlMarco(oMatriz.obtenerManejador());
  
  // Crea los botones numéricos
  numPosX.crear(0,1,0.1);
  numPosY.crear(0,1,0.1);

  // Agrega un Margen Superior al Primer Botón
  numPosX.colocarMargenSuperior(5);

  // Crea el botón para aplicar el alineamiento
  xsBoton btnAlinear("Alinear Título Marco", Falso);
  btnAlinear.colocarMargenInferior(5);

  // Crea la opcion para la sombra
  xsListaOpcionesTexto opcionesSombra;
  
  // Creamos Objetos Opcion  
  opcionesSombra.crear();

  // Agregamos opciones
  opcionesSombra.agregar("Sin Sombra");
  opcionesSombra.agregar("Sombra Interna");
  opcionesSombra.agregar("Sombra Externa");
  opcionesSombra.agregar("Sombra Grabada Interna");
  opcionesSombra.agregar("Sombra Grabada Externa");
  

  // Agregar los botones a la Ventana
  oVentana.agregarAlContenedor(numPosX.obtenerManejador());
  oVentana.agregarAlContenedor(numPosY.obtenerManejador());
  oVentana.agregarAlContenedor(btnAlinear.obtenerManejador());
  oVentana.agregarAlContenedor(opcionesSombra.obtenerManejador());
  
  // Capturamos la señal del Botón de btnAlinear
  btnAlinear.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnAlineamiento),oMarco.obtenerManejador());
  opcionesSombra.conectarSenal(XS_EVENTO_CAMBIADO,XS_FUNCION_RETORNO (fnSombra),oMarco.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)
{
  // retora Falso
  retorna Falso; // Para que se cierre, lo contrario para que no se cierre
}

// Función para aplicar el Alineamiento del Título del Marco
Vacio fnAlineamiento(xsObjetoGUI* objeto, xsApuntador marco)
{
    // Creo la variable temporal para el Marco
    xsMarco tmpMarco;
 
    // Asigna el Manejador
    tmpMarco.asignarManejador(XS_OBJETOGUI(marco));

    // Coloco los valores
    tmpMarco.colocarAlineamientoTitulo(numPosX.obtenerValor(),numPosY.obtenerValor());

    // El Título del Marco se ha alineado
    xsVentana::mensajeInformacion("Demo Marco","El Título de Marco se ha alineado");
}

// Función para aplicar la Sombra
Vacio fnSombra(xsObjetoGUI* objeto, xsApuntador marco)
{
    // Variable temporal para el objeto
    xsListaOpcionesTexto tmpLista;

    // Asigna el manejador
    tmpLista.asignarManejador(objeto);

    // Creo la variable temporal para el Marco
    xsMarco tmpMarco;
 
    // Asigna el Manejador
    tmpMarco.asignarManejador(XS_OBJETOGUI(marco));

    // Evalua cual sombra
    evaluar (tmpLista.obtenerIndiceSeleccionado())
    {
      case 0:// Coloco los valores
             tmpMarco.colocarSombra(XS_TIPO_SOMBRA_NINGUNA);
             salirEvaluar;

      case 1:// Coloco los valores
             tmpMarco.colocarSombra(XS_TIPO_SOMBRA_INTERNA);
             salirEvaluar;       

      case 2:// Coloco los valores
             tmpMarco.colocarSombra(XS_TIPO_SOMBRA_EXTERNA);
             salirEvaluar;       

      case 3:// Coloco los valores
             tmpMarco.colocarSombra(XS_TIPO_SOMBRA_GRABADA_INTERNA);
             salirEvaluar;       

      case 4:// Coloco los valores
             tmpMarco.colocarSombra(XS_TIPO_SOMBRA_GRABADA_EXTERNA);
             salirEvaluar;       
    }
    
    // El Título del Marco se ha alineado
    xsVentana::mensajeInformacion("Demo Marco","Se ha aplicado una nueva Sombra");
}