// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto BotonNumerico
// g++ -g BotonNumerico.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 BotonNumerico.exe
// g++ -g BotonNumerico.cpp %PKG-XSEASYCPP% -o BotonNumerico.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 acción de visualizar
Vacio fnBotonOnOff(xsObjetoGUI *objeto,xsApuntador boton);

// Función para controlar la accción del 
Vacio fnBotonNumericoHaCambiado(xsObjetoGUI* objeto,xsApuntador entrada);

// Función para cambiar el Valor del Botón Numérico
Vacio fnBotonNumericoCambiarValor(xsObjetoGUI* objeto,xsApuntador botonNumerico);

// Función para incrementar el Valor del Botón Numérico
Vacio fnBotonNumericoIncrementarValor(xsObjetoGUI* objeto,xsApuntador botonNumerico);

// Función para Cambiar el Rango
Vacio fnBotonNumericoCambiarRango(xsObjetoGUI* objeto,xsApuntador botonNumerico);

// Función para Cambiar Incremento y Por Página
Vacio fnBotonNumericoCambiarIncrementoPorPagina(xsObjetoGUI* objeto,xsApuntador botonNumerico);

// Función para Cambiar Incremento y Por Página
Vacio fnBotonNumericoRotar(xsObjetoGUI* objeto,xsApuntador botonNumerico);

// Las Entradas
xsEntrada entValor;
xsEntrada entMinimo;
xsEntrada entMaximo;
xsEntrada entIncremento;
xsEntrada entPorPagina;

// 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(350,450);

  // Colocar el Borde de la Ventana
  oVentana.colocarBordeVentana(10);

  // Centramos la Ventana
  oVentana.centrar();

  // Coloca el Título
  oVentana.colocarTitulo("xsEasyCpp Demo Botón Numérico");

  // 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 el Botón Numérico
  xsBotonNumerico oPorcentaje(0,10,0.1);

  // Margen Inferio y Superior
  oPorcentaje.colocarMargenSuperior(10);
  oPorcentaje.colocarMargenInferior(5);

  // Colocamos un valor
  oPorcentaje.colocarValor(3.5);

  // Despliega el valor y el valor entero
  xsImprimirFto("El valor actual: %f \n",oPorcentaje.obtenerValor());
  xsImprimirFto("El valor entero: %d \n",oPorcentaje.obtenerValorEntero());

  // Cambia el rango y el incremento
  //oPorcentaje.colocarRango(0.00,20.00,5);
  //oPorcentaje.incrementar(2);

  // Coloca el foco en el botón
  oPorcentaje.colocarFoco();

  // Un tooltip
  oPorcentaje.colocarTextoEmergente("Cambia el Porcentaje");

  // Creamos las Entradas
  entValor.crear("Valor");
  entValor.colocarTextoEmergente("El valor del Botón Numérico");
  entValor.colocarTexto("3.5");
  entValor.colocarAlineamientoTexto(XS_ALINEAMIENTO_DERECHA);
  entValor.colocarMargenInferior(5);
  
  entMinimo.crear("Mínimo");
  entMinimo.colocarTextoEmergente("El valor mínimo");
  entMinimo.colocarTexto("0");
  entMinimo.colocarAlineamientoTexto(XS_ALINEAMIENTO_DERECHA);
  entMinimo.colocarMargenInferior(5);
  
  entMaximo.crear("Máximo");
  entMaximo.colocarTextoEmergente("El valor mínimo");
  entMaximo.colocarTexto("10");
  entMaximo.colocarAlineamientoTexto(XS_ALINEAMIENTO_DERECHA);
  entMaximo.colocarMargenInferior(5);
  
  entIncremento.crear("Incremento");
  entIncremento.colocarTextoEmergente("El incremento con teclas de Cursor");
  entIncremento.colocarTexto("0.1");
  entIncremento.colocarAlineamientoTexto(XS_ALINEAMIENTO_DERECHA);
  entIncremento.colocarMargenInferior(5);

  entPorPagina.crear("Por Página");
  entPorPagina.colocarTextoEmergente("El incremento con teclas de página");
  entPorPagina.colocarTexto("1");
  entPorPagina.colocarAlineamientoTexto(XS_ALINEAMIENTO_DERECHA);
  entPorPagina.colocarMargenInferior(5);

  // Creamos el Botón para cambiar Valor
  xsBoton btnValor("Valor",NO XS_CON_MNEMONICO);
  btnValor.colocarMargenInferior(5);
  xsBoton btnIncrementar("Incrementar",NO XS_CON_MNEMONICO);
  btnIncrementar.colocarMargenInferior(5);  
  xsBoton btnMinimoMaximo("Mínimo y Máximo",NO XS_CON_MNEMONICO);
  btnMinimoMaximo.colocarMargenInferior(5);
  xsBoton btnIncrementoPorPagina("Incremento y Por Página",NO XS_CON_MNEMONICO);
  btnIncrementoPorPagina.colocarMargenInferior(5);
  xsBotonInterruptor btiRotar("Rotar en Extremos",NO XS_CON_MNEMONICO);
  btiRotar.colocarMargenInferior(5);

  // Asocial la senal click al botón para cerrar la ventana
  oPorcentaje.conectarSenal(XS_EVENTO_VALOR_CAMBIADO,XS_FUNCION_RETORNO(fnBotonNumericoHaCambiado),entValor.obtenerManejador());
  btnValor.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnBotonNumericoCambiarValor),oPorcentaje.obtenerManejador());
  btnIncrementar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnBotonNumericoIncrementarValor),oPorcentaje.obtenerManejador());
  btnMinimoMaximo.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnBotonNumericoCambiarRango),oPorcentaje.obtenerManejador());
  btnIncrementoPorPagina.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnBotonNumericoCambiarIncrementoPorPagina),oPorcentaje.obtenerManejador());
  btiRotar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnBotonNumericoRotar),oPorcentaje.obtenerManejador());

  // Agrega al Contenedor
  oVentana.agregarAlContenedor(oPorcentaje.obtenerManejador());
  oVentana.agregarAlContenedor(entValor.obtenerManejador());
  oVentana.agregarAlContenedor(entMinimo.obtenerManejador());
  oVentana.agregarAlContenedor(entMaximo.obtenerManejador());
  oVentana.agregarAlContenedor(entIncremento.obtenerManejador());
  oVentana.agregarAlContenedor(entPorPagina.obtenerManejador());
  oVentana.agregarAlContenedor(btnValor.obtenerManejador());
  oVentana.agregarAlContenedor(btnIncrementar.obtenerManejador());
  oVentana.agregarAlContenedor(btnMinimoMaximo.obtenerManejador());
  oVentana.agregarAlContenedor(btnIncrementoPorPagina.obtenerManejador());
  oVentana.agregarAlContenedor(btiRotar.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)
{
	// Mensaje de Salida
	xsImprimir("Saliendo del Sistema (Estatica Vacio)...");

  // 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 la accción del MenuChekItem y Ocultar/Visualizar la Barra de Herramientas
Vacio fnBotonOnOff(xsObjetoGUI *objeto, xsApuntador boton)
{
  // Verifica si está activo
  si (xsObjeto_MenuOpcionCheck_activo_obtener(XS_CHECK_MENU_OPCION(objeto)))  
       // Mostramos la Barra de Estado
       xsObjeto_mostrar(XS_OBJETOGUI(boton));      
  
  // Está desactiva
  deOtroModo
       // Oculta la Barra
       xsObjeto_ocultar(XS_OBJETOGUI(boton));       
  
}

// Función que controla cuando el valor cambia
Vacio fnBotonNumericoHaCambiado(xsObjetoGUI *objeto, xsApuntador entrada)
{
    // Declaramos valores temporales
    xsBotonNumerico tmpBotonNumerico;
    xsEntrada       tmpEntrada;

    // Obtenemos los manejadores
    tmpBotonNumerico.asignarManejador(objeto);
    tmpEntrada.asignarManejador(XS_OBJETOGUI(entrada));

    // Declara un valor doble para obtener el Valor
    Doble elValor = tmpBotonNumerico.obtenerValor();

    // Declara un caden para convertir el Valor
    xsCadena elValorEnCadena = to_string(elValor);

    // Coloca el Valor en la entrada
    tmpEntrada.colocarTexto(elValorEnCadena);
}

// Función para cambiar el Valor
Vacio fnBotonNumericoCambiarValor(xsObjetoGUI *objeto, xsApuntador botonNumerico)
{
    // Declaramos valores temporales
    xsBotonNumerico tmpBotonNumerico;    
    
    // Obtenemos los manejadores
    tmpBotonNumerico.asignarManejador(XS_OBJETOGUI(botonNumerico));    

    // Declara un caden para convertir el Valor
    xsCadena elValorEnCadena = entValor.obtenerTexto();

    // Declara un valor doble para obtener el Valor
    Doble elValor = atof(elValorEnCadena.c_str());
    
    // Coloca el Valor en el botón numérico
    tmpBotonNumerico.colocarValor(elValor);
}

// Función para incrementar el Valor
Vacio fnBotonNumericoIncrementarValor(xsObjetoGUI *objeto, xsApuntador botonNumerico)
{
    // Declaramos valores temporales
    xsBotonNumerico tmpBotonNumerico;    
        
    // Obtenemos los manejadores
    tmpBotonNumerico.asignarManejador(XS_OBJETOGUI(botonNumerico));    

    // Declara un caden para convertir el Incremento
    xsCadena elValorEnCadena = entValor.obtenerTexto();

    // Declara un valor doble para obtener el incremento
    Doble elIncremento = atof(elValorEnCadena.c_str());
    
    // Aplica el Incremento en el botón numérico
    tmpBotonNumerico.incrementar(elIncremento);
}

// Función para cambiar el rango
Vacio fnBotonNumericoCambiarRango(xsObjetoGUI *objeto, xsApuntador botonNumerico)
{
    // Declaramos valores temporales
    xsBotonNumerico tmpBotonNumerico;        
    
    // Obtenemos los manejadores
    tmpBotonNumerico.asignarManejador(XS_OBJETOGUI(botonNumerico));    

    // Declara un caden para obtener el Mínimo y Maximo
    xsCadena elMinimoEnCadena     = entMinimo.obtenerTexto();
    xsCadena elMaximoEnCadena     = entMaximo.obtenerTexto();

    // Declara valores para los dobles del minimo y maximo
    Doble elMinimo     = atof(elMinimoEnCadena.c_str());
    Doble elMaximo     = atof(elMaximoEnCadena.c_str());

    // Aplica el Incremento en el botón numérico
    tmpBotonNumerico.colocarRango(elMinimo,elMaximo);
}

// Función para cambiar Incremento y Por Página
Vacio fnBotonNumericoCambiarIncrementoPorPagina(xsObjetoGUI *objeto, 
                                                xsApuntador botonNumerico)
{
    // Declaramos valores temporales
    xsBotonNumerico tmpBotonNumerico;        
    
    // Obtenemos los manejadores
    tmpBotonNumerico.asignarManejador(XS_OBJETOGUI(botonNumerico));    

    // Declara un caden para obtener el Mínimo y Maximo
    xsCadena elIncrementoEnCadena     = entIncremento.obtenerTexto();
    xsCadena elPorPaginaEnCadena     = entPorPagina.obtenerTexto();
    
    // Declara valores para los dobles del minimo y maximo
    Doble elIncremento = atof(elIncrementoEnCadena.c_str());
    Doble elPorPagina  = atof(elPorPaginaEnCadena.c_str());

    // Aplica el Incremento en el botón numérico
    tmpBotonNumerico.colocarIncremento(elIncremento,elPorPagina);
}

// Función para Rotar
Vacio fnBotonNumericoRotar(xsObjetoGUI *objeto, 
                           xsApuntador botonNumerico)
{
    // Declaramos variable temporal 
    xsBotonInterruptor tmpRotar;

    // Declaramos valores temporales
    xsBotonNumerico tmpBotonNumerico;        
        
    // Obtenemos los manejadores
    tmpRotar.asignarManejador(objeto);
    tmpBotonNumerico.asignarManejador(XS_OBJETOGUI(botonNumerico));    
    
    // Verifica si está activo
    tmpBotonNumerico.colocarRotar(tmpRotar.obtenerActivo());
}