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

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


// Función de salida
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 Ocultar/Visualizar la Barra de Estado
Vacio fnBarraProgresoOnOff(xsObjetoGUI* objeto,xsApuntador barraProgreso);

// Función para controlar los cambios en la Barra de Progreso
void fnBarraProgresoControl(xsRango* objetoRango, xsApuntador etiqueta);

// Función para Aplicar el Valor
Estatica Vacio fnAplicarValor(xsObjetoGUI* boton, xsApuntador barraProgreso);

// Función para Aplicar el Rango
Estatica Vacio fnAplicarRango(xsObjetoGUI* boton, xsApuntador barraProgreso);

// Función para Aplicar el Incremento
Estatica Vacio fnAplicarIncremento(xsObjetoGUI* boton, xsApuntador barraProgreso);

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

  // Centra la Ventana
  oVentana.centrar();

  // Establece el borde de la Ventana
  oVentana.colocarBordeVentana(10);
  
  // Coloca el Título
  oVentana.colocarTitulo("xsEasyCpp Demo Barra Progreso");

  // 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 Barra de Progreso
  xsBarraProgreso oBarraProgreso(XS_ORIENTACION_HORIZONTAL,0,10,2);  
    
  // Agregar la Barra de Estado a la Ventana Principal
  oVentana.agregarAlContenedor(oBarraProgreso.obtenerManejador());  

  // Crea una Etiqueta
  xsEtiqueta oEtiqueta("User las Teclas del Movimiento del Cursor y Pagina");
  oVentana.agregarAlContenedor(oEtiqueta.obtenerManejador());

  // Colocar el valor
  oBarraProgreso.colocarValorRango(1.5);
 
  
  // Creamos las Etiquetas
  xsEtiqueta etqValor ("Valor :");
  xsEtiqueta etqMinimo("Mínimo :");
  xsEtiqueta etqMaximo("Máximo :");
  xsEtiqueta etqIncremento("Incremento :");
  xsEtiqueta etqPorPagina("Por Página :");

  // Alinear las etiquetas a la izquierda
  etqValor.alinearHorizontalmente(0);
  etqMinimo.alinearHorizontalmente(0);
  etqMaximo.alinearHorizontalmente(0);
  etqIncremento.alinearHorizontalmente(0);
  etqPorPagina.alinearHorizontalmente(0);
  
  // Coloca la dimensión de la primera etiqueta y se refleja en las demás
  etqValor.colocarDimensiones(100,-1);

  // Creamos las Entradas
  entValor.crear();
  entMinimo.crear();
  entMaximo.crear();
  entIncremento.crear();
  entPorPagina.crear();

  // Alineación
  entValor.colocarAlineamientoTexto(XS_JUSTIFICACION_DERECHA);
  entMinimo.colocarAlineamientoTexto(XS_JUSTIFICACION_DERECHA);
  entMaximo.colocarAlineamientoTexto(XS_JUSTIFICACION_DERECHA);
  entIncremento.colocarAlineamientoTexto(XS_JUSTIFICACION_DERECHA);
  entPorPagina.colocarAlineamientoTexto(XS_JUSTIFICACION_DERECHA);

  // Colocar los valores que se están usando
  entValor.colocarTexto("2");
  entMinimo.colocarTexto("0");
  entMaximo.colocarTexto("10");
  entIncremento.colocarTexto("2");
  entPorPagina.colocarTexto("10");

  // Creamos la matriz
  xsMatriz matriz;
  matriz.crear();  

  // Agregamos las Etiquetas
  matriz.insertarEn(etqValor.obtenerManejador(),0,0,1,1);
  matriz.insertarEn(etqMinimo.obtenerManejador(),0,1,1,1);
  matriz.insertarEn(etqMaximo.obtenerManejador(),0,2,1,1);
  matriz.insertarEn(etqIncremento.obtenerManejador(),0,3,1,1);
  matriz.insertarEn(etqPorPagina.obtenerManejador(),0,4,1,1);

  // Agregamos las Entradas a la Matriz
  matriz.insertarEn(entValor.obtenerManejador(),1,0,1,1);
  matriz.insertarEn(entMinimo.obtenerManejador(),1,1,1,1);
  matriz.insertarEn(entMaximo.obtenerManejador(),1,2,1,1);
  matriz.insertarEn(entIncremento.obtenerManejador(),1,3,1,1);
  matriz.insertarEn(entPorPagina.obtenerManejador(),1,4,1,1);

  // Establece un borde
  matriz.colocarBorde(10);

  // Agrega la Matriz al Contenedor
  oVentana.agregarAlContenedor(matriz.obtenerManejador());

  // Botones
  xsBoton btnAplicarValor("Aplicar Valor",NO XS_CON_MNEMONICO);
  xsBoton btnAplicarRango("Aplicar Rango Mínimo-Máximo",NO XS_CON_MNEMONICO);
  xsBoton btnAplicarIncremento("Aplicar Incremento y por Página",NO XS_CON_MNEMONICO);
  
  // Agrego los botones al Contenedor
  oVentana.agregarAlContenedor(btnAplicarValor.obtenerManejador());
  oVentana.agregarAlContenedor(btnAplicarRango.obtenerManejador());
  oVentana.agregarAlContenedor(btnAplicarIncremento.obtenerManejador());

  // Conecta la Señal
  oBarraProgreso.conectarSenal(XS_EVENTO_VALOR_CAMBIADO,
                               XS_FUNCION_RETORNO (fnBarraProgresoControl),
                               entValor.obtenerManejador());

  // Conecta la Señal
  btnAplicarValor.conectarSenal(XS_EVENTO_CLICKED,
                                XS_FUNCION_RETORNO (fnAplicarValor),
                                oBarraProgreso.obtenerManejador());

  // Conecta la Señal
  btnAplicarRango.conectarSenal(XS_EVENTO_CLICKED,
                                XS_FUNCION_RETORNO (fnAplicarRango),
                                oBarraProgreso.obtenerManejador());

  // Conecta la Señal
  btnAplicarRango.conectarSenal(XS_EVENTO_CLICKED,
                                XS_FUNCION_RETORNO (fnAplicarRango),
                                oBarraProgreso.obtenerManejador());

  // Conecta la Señal
  btnAplicarIncremento.conectarSenal(XS_EVENTO_CLICKED,
                                     XS_FUNCION_RETORNO (fnAplicarIncremento),
                                     oBarraProgreso.obtenerManejador());


  // Coloca el foco en la Barra
  oBarraProgreso.colocarFoco();

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

  // Ciclo
  xsAppCiclo;

  // Finaliza retornando 0
  retorna 0;

}

// Función de Salida
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)
{
  // Para que se cierre, lo contrario para que no se cierre
  retorna Falso; 
}

// Función para controlar la accción del MenuChekItem y Ocultar/Visualizar la Barra de Herramientas
Vacio fnBarraProgresoOnOff(xsObjetoGUI *objeto, xsApuntador barraProgreso)
{
  // Verifica si está activo
  si (xsObjeto_MenuOpcionCheck_activo_obtener(XS_CHECK_MENU_OPCION(objeto)))
  {
       // Mostramos la Barra de Estado
       xsObjeto_mostrar(XS_OBJETOGUI(barraProgreso));       
  }
  // Está desactiva
  deOtroModo
  {
       // Oculta la Barra
       xsObjeto_ocultar(XS_OBJETOGUI(barraProgreso));
  }
}

// Función para controlar los cambios en la Barra de Progreso
void fnBarraProgresoControl(xsRango* objetoRango, xsApuntador etiqueta) 
{    
   // Variable para obtener el valor
   Doble valor;
   valor = xsObjeto_obtener_valor_rango(objetoRango);

   // Convierte a String el Valor Doble
   Caracter *strValor = xsObtenCadenaFto("%.f", valor);    

   // Coloca el Valor en la etiqueta
   xsObjeto_Entrada_colocar_texto(XS_ENTRADA(etiqueta), strValor);
   
   // Libera la memoria
   xsObjeto_liberar(strValor);
}

// Función para Aplicar el Valor
Estatica Vacio fnAplicarValor(xsObjetoGUI* boton, xsApuntador barraProgreso)
{
   // Define variable
   xsBarraProgreso tmpBarraProgreso;

   // Asigna el Manejador
   tmpBarraProgreso.asignarManejador(XS_OBJETOGUI(barraProgreso));

   // Convertimos a doble el valor de Entrada
   Doble elValor = stod(entValor.obtenerTexto());

   // Llama a función para colocar el valor del Rango
   tmpBarraProgreso.colocarValorRango(elValor);

   // Regresa el Foco
   tmpBarraProgreso.colocarFoco();
}

// Función para Aplicar el Rango
Estatica Vacio fnAplicarRango(xsObjetoGUI* boton, xsApuntador barraProgreso)
{
   // Define variable
   xsBarraProgreso tmpBarraProgreso;

   // Asigna el Manejador
   tmpBarraProgreso.asignarManejador(XS_OBJETOGUI(barraProgreso));

   // Convertimos a doble el Mínimo y el Máximo
   Doble elMinimo = stod(entMinimo.obtenerTexto());
   Doble elMaximo = stod(entMaximo.obtenerTexto());

   // Llama a función para colocar el Rango
   tmpBarraProgreso.colocarRango(elMinimo,elMaximo);

   // Regresa el Foco
   tmpBarraProgreso.colocarFoco();
}

// Función para Aplicar el Incremento
Estatica Vacio fnAplicarIncremento(xsObjetoGUI* boton, xsApuntador barraProgreso)
{
   // Define variable
   xsBarraProgreso tmpBarraProgreso;

   // Asigna el Manejador
   tmpBarraProgreso.asignarManejador(XS_OBJETOGUI(barraProgreso));

   // Convertimos a doble el Mínimo y el Máximo
   Doble elIncremento = stod(entIncremento.obtenerTexto());
   Doble elPorPagina  = stod(entPorPagina.obtenerTexto());

   // Llama a función para colocar el Incremento
   tmpBarraProgreso.colocarIncremento(elIncremento,elPorPagina);

   // Regresa el foco
   tmpBarraProgreso.colocarFoco();
}
