// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto Boton
// g++ -g Boton.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 Boton.exe
// g++ -g Boton.cpp %PKG-XSEASYCPP% -o Boton.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 accción del MenuChekItem y Ocultar/Visualizar la Barra de Herramientas
Vacio fnBotonOnOff(xsObjetoGUI* objeto, xsApuntador boton);

// Función para cambiar el texto
Estatica Vacio fnTexto(xsObjetoGUI* boton, xsApuntador botonCerrar);

// Función para cambiar el texto emergente
Estatica Vacio fnTextoEmergente(xsObjetoGUI* boton, xsApuntador botonCerrar);

// Función para cambiar la imagen desde Archivo
Estatica Vacio fnCambiarImagenArchivo(xsObjetoGUI* boton, xsApuntador botonCerrar);

// Función para cambiar la imagen desde Librería
Estatica Vacio fnCambiarImagenLibreria(xsObjetoGUI* boton, xsApuntador botonCerrar);

// Variable global
xsEntrada entDato;

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

  // Centrar
  oVentana.centrar();

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

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

  // Establecer un borde
  oVentana.colocarBordeVentana(10);

  // Creamos la Entrada
  entDato.crear("Capture Texto para botón");
  
  // Agregamos la Entrada al Contenedor
  oVentana.agregarAlContenedor(entDato.obtenerManejador());

  // Creamos un botón de solo texto
  xsBoton btnTexto;
  btnTexto.crear("Cambiar _Texto (ALT+T)",XS_CON_MNEMONICO);
  btnTexto.colocarBorde(1);
  btnTexto.colocarImagen("img/folder.png");
  btnTexto.colocarTextoEmergente("Cambia el Texto del Botón de Cerrar");

  // Agregamos la Entrada al Contenedor
  oVentana.agregarAlContenedor(btnTexto.obtenerManejador());

  
  // Boton para cambiar el Texto Emergente
  xsBoton btnTextoEmergente;
  btnTextoEmergente.crear("Colocar Texto _Emergente(ALT+E)",XS_CON_MNEMONICO);
  btnTextoEmergente.colocarBorde(1);
  btnTextoEmergente.colocarImagen("edit-cut",XS_TAMANIO_ICONO_16PX);
  btnTextoEmergente.colocarTextoEmergente("Cambia el Texto Emergente del Botón de Cerrar");

  // Agregamos la Entrada al Contenedor
  oVentana.agregarAlContenedor(btnTextoEmergente.obtenerManejador());

  // Boton para cambiar la Imagen desde Archivo
  xsBoton btnCambiarImagenArchivo;
  btnCambiarImagenArchivo.crear("Cambiar _Imagen desde Archivo (ALT+I)",XS_CON_MNEMONICO);
  btnCambiarImagenArchivo.colocarBorde(1);
  btnCambiarImagenArchivo.colocarImagen("edit-copy",XS_TAMANIO_ICONO_24PX);
  btnCambiarImagenArchivo.colocarTextoEmergente("Cambia la Imagen del Botón de Cerrar desde Archivo");

  // Agregamos la Entrada al Contenedor
  oVentana.agregarAlContenedor(btnCambiarImagenArchivo.obtenerManejador());

  // Boton para cambiar la Imagen desde Librería
  xsBoton btnCambiarImagenLibreria;
  btnCambiarImagenLibreria.crear("Cambiar Imagen desde _Librería (ALT+L)",XS_CON_MNEMONICO);
  btnCambiarImagenLibreria.colocarBorde(1);
  btnCambiarImagenLibreria.colocarImagen("edit-copy",XS_TAMANIO_ICONO_24PX);
  btnCambiarImagenLibreria.colocarTextoEmergente("Cambia la Imagen del Botón de Cerrar desde Librería");

  // Agregamos el Botón al Contenedor
  oVentana.agregarAlContenedor(btnCambiarImagenLibreria.obtenerManejador());

  
  // Creamos el Botón
  xsBoton btnCerrar("_Cerrar Ventana (ALT+C)",XS_CON_MNEMONICO);

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

  // Un tooltip
  btnCerrar.colocarTextoEmergente("Click para cerrar la Aplicación");
  
  // Coloca el Borde (separación de su contenedor)
  btnCerrar.colocarBorde(1);

  // Cargar una imagen
  btnCerrar.colocarImagen("window-close",XS_TAMANIO_ICONO_32PX);

  // Coloca el Texto Emergente
  btnCerrar.colocarTextoEmergente("Cerrar la Ventana");

  // Asocial la senal click al botón para cerrar la ventana
  btnCerrar.conectarSenalIntercambiada(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(xsObjeto_destruir),oVentana.obtenerManejador());

  // Asocia la senal click al botón de cambiar el texto
  btnTexto.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnTexto),btnCerrar.obtenerManejador());

  // Asocia la senal click al botón de cambiar el texto emergente
  btnTextoEmergente.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnTextoEmergente),btnCerrar.obtenerManejador());

  // Asocia la senal click al botón de cambiar el texto emergente
  btnCambiarImagenArchivo.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnCambiarImagenArchivo),btnCerrar.obtenerManejador());

  // Asocia la senal click al botón de cambiar la imagen del Archivo desde librería
  btnCambiarImagenLibreria.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnCambiarImagenLibreria),btnCerrar.obtenerManejador());

  // Agregar el Botón de Cerrar al Contenedor
  oVentana.agregarAlContenedor(btnCerrar.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
// Puede no ser estática
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));      
       xsImprimir("Mostramos el Boton\n");
  }
  // Está desactiva
  deOtroModo
  {
       // Oculta la Barra
       xsObjeto_ocultar(XS_OBJETOGUI(boton));       
       xsImprimir("Ocultamos el Boton\n");
  }
}

// Función para Cambiar el Texto del Botón Cerar
Estatica Vacio fnTexto(xsObjetoGUI *ventana, xsApuntador botonCerrar)
{
  // Declara una variable Temporal para el Botón
  xsBoton tmpBoton;

  // Asigna el Manejador
  tmpBoton.asignarManejador(XS_OBJETOGUI(botonCerrar));
	
  // Verifica si hay texto
  si (entDato.obtenerLongitudTexto()>0)
     // Coloca el Texto
     tmpBoton.colocarTexto(entDato.obtenerTexto());
  deOtroModo 
  {
     // Mensaje
     xsVentana::mensajeInformacion("xsEasyCpp Demo Boton","Capture el Texto");

     // Regresa el Control del Foco
     entDato.colocarFoco();
  }   
}

// Función para Cambiar el Texto Emergente del Botón Cerar
Estatica Vacio fnTextoEmergente(xsObjetoGUI *ventana, xsApuntador botonCerrar)
{
  // Declara una variable Temporal para el Botón
  xsBoton tmpBoton;

  // Asigna el Manejador
  tmpBoton.asignarManejador(XS_OBJETOGUI(botonCerrar));
	
  // Verifica si hay texto
  si (entDato.obtenerLongitudTexto()>0)
     // Coloca el Texto Emergente
     tmpBoton.colocarTextoEmergente(entDato.obtenerTexto());
  deOtroModo 
  {
     // Mensaje
     xsVentana::mensajeInformacion("xsEasyCpp Demo Boton","Capture el Texto Emergente");

     // Regresa el Control del Foco
     entDato.colocarFoco();
  }   
}

// Función para Cambiar la Imagen desde Archivo
Estatica Vacio fnCambiarImagenArchivo(xsObjetoGUI *ventana, xsApuntador botonCerrar)
{
  // Declara una variable Temporal para el Botón
  xsBoton tmpBoton;

  // Asigna el Manejador
  tmpBoton.asignarManejador(XS_OBJETOGUI(botonCerrar));
	
  // Verifica si hay texto
  si (entDato.obtenerLongitudTexto()>0)
     // Cambia la Imagen
     tmpBoton.colocarImagen(entDato.obtenerTexto());
  deOtroModo 
  {
     // Mensaje
     xsVentana::mensajeInformacion("xsEasyCpp Demo Boton","Capture la ruta de la imagen");

     // Regresa el Control del Foco
     entDato.colocarFoco();
  }   
}

// Función para Cambiar la Imagen desde Librería
Estatica Vacio fnCambiarImagenLibreria(xsObjetoGUI *ventana, xsApuntador botonCerrar)
{
  // Declara una variable Temporal para el Botón
  xsBoton tmpBoton;

  // Asigna el Manejador
  tmpBoton.asignarManejador(XS_OBJETOGUI(botonCerrar));
	
  // Verifica si hay texto
  si (entDato.obtenerLongitudTexto()>0)
     // Cambia la Imagen
     tmpBoton.colocarImagen(entDato.obtenerTexto(),XS_TAMANIO_ICONO_24PX);
  deOtroModo 
  {
     // Mensaje
     xsVentana::mensajeInformacion("xsEasyCpp Demo Boton","Capture el nombre del Icono en Librería");

     // Regresa el Control del Foco
     entDato.colocarFoco();
  }   
}

