// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto Ventana
// g++ -g Ventana.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 Ventana.exe
// g++ -g Ventana.cpp %PKG-XSEASYCPP% -o Ventana.exe
// -------------------------------------------------------------------------------------

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


// Función para Controlar la Salida
Estatica Vacio fnSalida(xsObjetoGUI* ventana, xsApuntador datos);

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

// Funciones diversas del Demo
Vacio fnColocarTitulo(xsObjetoGUI* objeto, xsApuntador ventana);
Vacio fnObtenerTitulo(xsObjetoGUI* objeto, xsApuntador ventana);
Vacio fnColocarBorde(xsObjetoGUI* objeto , xsApuntador ventana);
Vacio fnControlarDecoracion(xsObjetoGUI* botonInterruptor, xsApuntador ventana);
Vacio fnControlarCerrable(xsObjetoGUI* botonInterruptor, xsApuntador ventana);
Vacio fnControlarDimensionable(xsObjetoGUI* botonInterruptor, xsApuntador ventana);
Vacio fnMaximizar(xsObjetoGUI* objeto, xsApuntador ventana);
Vacio fnDesMaximizar(xsObjetoGUI* objeto, xsApuntador ventana);
Vacio fnIconificar(xsObjetoGUI* botonInterruptor, xsApuntador ventana);
Vacio fnDesIconificar(xsObjetoGUI* botonInterruptor, xsApuntador ventana);
Vacio fnMover(xsObjetoGUI* objeto, xsApuntador ventana);
Vacio fnCerrar(xsObjetoGUI* objeto, xsApuntador ventana);

// Crea una entrada para el Título de la Ventana y Borde
xsEntrada entDatos;

// Para las coordenadas de mover
xsBotonNumerico posX, posY;

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

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

  // Mostramos la Ventana
  oVentana.centrar();

  // Coloca el Título
  oVentana.colocarTitulo("xsEasyCpp Demo Ventana");
  
  // Establece el Icono
  oVentana.colocarIcono("img/js.ico");

  // Crea una entrada para el Título de la Ventana y Borde
  entDatos.crear("");

  // Crea los botones para agregarlos al Contenedor
  xsBoton btnColocarTitulo("Colocar el Título",NO XS_CON_MNEMONICO);
  xsBoton btnObtenerTitulo("Obtener el Título",NO XS_CON_MNEMONICO);
  xsBoton btnColocarBorde("Colocar Borde",NO XS_CON_MNEMONICO);
  xsBotonInterruptor btnDecoracion("Decoracion Activada",NO XS_CON_MNEMONICO);
  btnDecoracion.colocarActivo(Verdad);
  xsBotonInterruptor btnCerrable("Cerrable Activada",NO XS_CON_MNEMONICO);
  btnCerrable.colocarActivo(Verdad);
  xsBotonInterruptor btnDimensionable("Dimensionable Activada",NO XS_CON_MNEMONICO);
  btnDimensionable.colocarActivo(Verdad);
  xsBoton btnMaximizar("Maximizar",NO XS_CON_MNEMONICO);
  xsBoton btnDesMaximizar("DesMaximizar",NO XS_CON_MNEMONICO);
  xsBoton btnIconificar("Iconificar",NO XS_CON_MNEMONICO);
  posX.crear(-10,800,1);
  posX.colocarValor(0);
  posY.crear(-10,800,1);
  posY.colocarValor(0);
  xsBoton btnMover("Mover",NO XS_CON_MNEMONICO);
  xsBoton btnCerrar("Cerrar",NO XS_CON_MNEMONICO);

  // Agrega la entrada al Contenedor
  oVentana.agregarAlContenedor(entDatos.obtenerManejador());
  oVentana.agregarAlContenedor(btnObtenerTitulo.obtenerManejador());
  oVentana.agregarAlContenedor(btnColocarTitulo.obtenerManejador());  
  oVentana.agregarAlContenedor(btnColocarBorde.obtenerManejador());
  oVentana.agregarAlContenedor(btnDecoracion.obtenerManejador());
  oVentana.agregarAlContenedor(btnCerrable.obtenerManejador());
  oVentana.agregarAlContenedor(btnDimensionable.obtenerManejador());
  oVentana.agregarAlContenedor(btnMaximizar.obtenerManejador());
  oVentana.agregarAlContenedor(btnDesMaximizar.obtenerManejador());
  oVentana.agregarAlContenedor(btnIconificar.obtenerManejador());  
  oVentana.agregarAlContenedor(posX.obtenerManejador());  
  oVentana.agregarAlContenedor(posY.obtenerManejador());  
  oVentana.agregarAlContenedor(btnMover.obtenerManejador());  
  oVentana.agregarAlContenedor(btnCerrar.obtenerManejador());  

  // Asocia la función para verificar si está activo
  btnColocarTitulo.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnColocarTitulo),oVentana.obtenerManejador());
  btnObtenerTitulo.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnObtenerTitulo),oVentana.obtenerManejador());
  btnColocarBorde.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnColocarBorde),oVentana.obtenerManejador());
  btnDecoracion.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnControlarDecoracion),oVentana.obtenerManejador());
  btnCerrable.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnControlarCerrable),oVentana.obtenerManejador());
  btnDimensionable.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnControlarDimensionable),oVentana.obtenerManejador());
  btnMaximizar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnMaximizar),oVentana.obtenerManejador());
  btnDesMaximizar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnDesMaximizar),oVentana.obtenerManejador());
  btnIconificar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnIconificar),oVentana.obtenerManejador());
  btnMover.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnMover),oVentana.obtenerManejador());
  btnCerrar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnCerrar),oVentana.obtenerManejador());

  // Establece la función de Salida
  oVentana.colocarFuncionSalida(XS_FUNCION_RETORNO (fnSalida));

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

  // 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 colocar el Título
Vacio fnColocarTitulo(xsObjetoGUI* objeto, xsApuntador ventana)
{
    // Declara una ventana temporal
    xsVentana tmpVentana;

    // Asigna el manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));

    // Verifica que haya algo en el Título
    si (entDatos.obtenerLongitudTexto() > 0)
    {
       // Coloca el Título en la Ventana
       tmpVentana.colocarTitulo(entDatos.obtenerTexto());

       // Mensaje
       xsVentana::mensajeInformacion("Demo Ventana","Se ha colocado el Título");
    }
    deOtroModo
    {
       // Mensaje
       xsVentana::mensajeInformacion("Demo Ventana","Capture el Título a Colocar");
    }
    
}

// Función para obtener el Titulo
Vacio fnObtenerTitulo(xsObjetoGUI* objeto, xsApuntador ventana)
{
    // Declara una ventana temporal
    xsVentana tmpVentana;

    // Asigna el manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));

    // Mensaje
    xsVentana::mensajeInformacion("Demo Ventana","Titulo de la Ventana:\n"+tmpVentana.obtenerTitulo());    
}

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

	// Ciclo para verificar cada caracter
	ciclo (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;
}

// Función para colocar el Borde
Vacio fnColocarBorde(xsObjetoGUI* objeto, xsApuntador ventana)
{
    // Declara una ventana temporal
    xsVentana tmpVentana;

    // Asigna el manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));

    // Verifica si hay indice capturado
    si (entDatos.obtenerLongitudTexto()>0)
    {
        // Verifica que sea solo numeros
        si (fnEsCadenaNumerica(entDatos.obtenerTexto()))
        {
          // Obtengo la posición
          Entero borde = stoi(entDatos.obtenerTexto());

          // Coloca el borde
          tmpVentana.colocarBordeVentana(borde);
        }
        deOtroModo
        {
           // Mensaje
           xsVentana::mensajeInformacion("Demo Ventana","Capture números para la posición");
          
           // Coloca el Foco
           entDatos.colocarFoco();
        }
    }
    deOtroModo
    {
        // Mensaje
        xsVentana::mensajeInformacion("Demo Ventana","Capture un número para el Borde");

        // Coloca el Foco
        entDatos.colocarFoco();
    }
}

// Función para controlar la accción del MenuChekItem y Ocultar/Visualizar la Barra de Herramientas
Vacio fnControlarDecoracion(xsObjetoGUI* objeto, xsApuntador ventana)
{
    // Declara variable temporal
    xsBotonInterruptor btnTemporal;

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

    // Crea variable temporal para ventana
    xsVentana tmpVentana;

    // Asigna el Manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));    

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

       // Activa la Decoración
       tmpVentana.colocarDecoracion(Verdad);                     
    } 
    // Está desactiva
    deOtroModo
    {
       // Cambiamos el Titulo del Botón
       btnTemporal.colocarTexto("Decoración Desactivada");            
       
       // Desacctivar la Decoración
       tmpVentana.colocarDecoracion(Falso);       
    }
}

// Función Controlar Cerrable
Vacio fnControlarCerrable(xsObjetoGUI* objeto, xsApuntador ventana)
{
    // Declara variable temporal
    xsBotonInterruptor btnTemporal;

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

    // Crea variable temporal para ventana
    xsVentana tmpVentana;

    // Asigna el Manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));    

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

       // Activa la Decoración
       tmpVentana.colocarCerrable(Verdad);                     
    } 
    // Está desactiva
    deOtroModo
    {
       // Cambiamos el Titulo del Botón
       btnTemporal.colocarTexto("Cerrable Desactivada");            
       
       // Desacctivar la Decoración
       tmpVentana.colocarCerrable(Falso);       
    }
}

// Función Controlar Dimenionable
Vacio fnControlarDimensionable(xsObjetoGUI* objeto, xsApuntador ventana)
{
    // Declara variable temporal
    xsBotonInterruptor btnTemporal;

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

    // Crea variable temporal para ventana
    xsVentana tmpVentana;

    // Asigna el Manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));    

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

       // Activa la Decoración
       tmpVentana.colocarDimensionable(Verdad);                     
    } 
    // Está desactiva
    deOtroModo
    {
       // Cambiamos el Titulo del Botón
       btnTemporal.colocarTexto("Dimensionable Desactivada");            
       
       // Desacctivar la Decoración
       tmpVentana.colocarDimensionable(Falso);       
    }
}

// Función Controlar Ocultar Titulo al Maximizar
Vacio fnMaximizar(xsObjetoGUI* objeto, xsApuntador ventana)
{    
    // Crea variable temporal para ventana
    xsVentana tmpVentana;

    // Asigna el Manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));

    // MAximiza
    tmpVentana.maximizar();       
}

// Función Controlar Ocultar Titulo al Maximizar
Vacio fnDesMaximizar(xsObjetoGUI* objeto, xsApuntador ventana)
{    
    // Crea variable temporal para ventana
    xsVentana tmpVentana;

    // Asigna el Manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));

    // MAximiza
    tmpVentana.desMaximizar();       
}

// Función Iconificar
Vacio fnIconificar(xsObjetoGUI* objeto, xsApuntador ventana)
{    
    // Crea variable temporal para ventana
    xsVentana tmpVentana;

    // Asigna el Manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));

    // Iconificar
    tmpVentana.iconificar();     

    // Mensaje
    xsVentana::mensajeInformacion("Demo Ventana","La Ventana se ha iconificado.\nAl presionar aceptar se restaurará");

    // Desiconificar
    tmpVentana.desIconificar();     

    // Colocar el Foco
    tmpVentana.colocarFoco();
}

// Función Mover
Vacio fnMover(xsObjetoGUI* objeto, xsApuntador ventana)
{    
    // Crea variable temporal para ventana
    xsVentana tmpVentana;

    // Asigna el Manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));

    // Mueve la Ventana
    tmpVentana.mover(posX.obtenerValorEntero(),posY.obtenerValorEntero());  
}

// Función Cerrar
Vacio fnCerrar(xsObjetoGUI* objeto, xsApuntador ventana)
{    
    // Crea variable temporal para ventana
    xsVentana tmpVentana;

    // Asigna el Manejador
    tmpVentana.asignarManejador(XS_OBJETOGUI(ventana));

    // Mueve la Ventana
    tmpVentana.cerrar();  
}