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

// Función para el Botón Nuevo
Estatica Vacio fnNew(xsObjetoGUI* boton, xsApuntador datos);

// Detiene para el Botón Open
Estatica Vacio fnOpen(xsObjetoGUI* boton, xsApuntador datos);

// Función para el Boton Logo
Estatica Vacio fnLogo(xsObjetoGUI* boton, xsApuntador datos);

// Función para el Boton Imprimir
Estatica Vacio fnImprimir(xsObjetoGUI* boton, xsApuntador datos);

// Función para Iconos de 16px
Estatica Vacio fnIconos16px(xsObjetoGUI* boton, xsApuntador barraHerramientas);

// Función para Iconos de 24px
Estatica Vacio fnIconos24px(xsObjetoGUI* boton, xsApuntador barraHerramientas);

// Función para Iconos de 32px
Estatica Vacio fnIconos32px(xsObjetoGUI* boton, xsApuntador barraHerramientas);

// Función para Iconos de 48px
Estatica Vacio fnIconos48px(xsObjetoGUI* boton, xsApuntador barraHerramientas);

// Función para Boton Nuevo Archivo
Estatica Vacio fnNuevoBotonArchivo(xsObjetoGUI* boton, xsApuntador barraHerramientas);

// Función para Boton Nuevo Libreria
Estatica Vacio fnNuevoBotonLibreria(xsObjetoGUI* boton, xsApuntador barraHerramientas);

// Variables globales
xsEntrada entTexto;
xsEntrada entImagen;
xsEntrada entImagenLibreria;

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

  // Centrar la Ventana
  oVentana.centrar();

  // Establecer un Borde al Contenedor de 10
  oVentana.colocarBordeContenedor(10);

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

  // 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 objeto para la Barra de Menu
  xsMenuBarra oMenuBarraPrincipal;
  oMenuBarraPrincipal.crear();

  // Declaramos los objetos para los Menus
  xsMenu      oMenuArchivo;
  xsMenu      oMenuVista;

  // Creamos los objetos
  oMenuArchivo.crear();
  oMenuVista.crear();

  // Creamos los objetos para las opciones del Menu Archivo
  xsMenuOpcion opcArchivo("Archivo",xsTexto);
  xsMenuOpcion opcArchivoSalir("_Salir",xsMnemonic);
  
  // Asocia la función de salida
  opcArchivoSalir.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnSalida),NULO);
  
  // Creamos los objetos para las opciones del Menu Vista
  xsMenuOpcion opcVista("Vista",xsTexto);
  xsMenuOpcionCheck opcVistaBarraHerramientas("Barra Herramientas",xsTexto);
    
  // Activa la opción
  opcVistaBarraHerramientas.activar(Verdad);
  
  // Asignando las opciones a los menus
  oMenuArchivo.colocarSubMenu(opcArchivo.obtenerManejador());
  oMenuVista.colocarSubMenu(opcVista.obtenerManejador());

  // Agrega las opciones al Menu Archivo
  oMenuArchivo.agregarOpcion(opcArchivoSalir.obtenerManejador());

  // Agrega las opciones al Menu Vista
  oMenuVista.agregarOpcion(opcVistaBarraHerramientas.obtenerManejador());

  // Agregar las opciones al Menu Barra
  oMenuBarraPrincipal.agregarOpcion(opcArchivo.obtenerManejador());
  oMenuBarraPrincipal.agregarOpcion(opcVista.obtenerManejador());
  oMenuBarraPrincipal.mostrar();

  // Agregar la Barra de Menu a la Ventana Principal
  oVentana.agregarAlContenedor(oMenuBarraPrincipal.obtenerManejador(),
                               NO xsVentana::EXPANDER,
                               NO xsVentana::LLENAR,
                                  xsVentana::RELLENO_DEFAULT, 
                                  xsVentana::AL_INICIO);

  // Crea el objeto de la Barra de Herramientas 
  xsBarraHerramientas oBarraHerramientas; 
  oBarraHerramientas.crear();

  // Coloca el Estilo
  oBarraHerramientas.estilo(XS_BARRAHERRAMIENTAS_AMBOS);  

  // Crea un boton de barra para obtenerlo al construirlo
  xsBotonBarra btnSalir;
  xsBotonBarra btnNew;
  xsBotonBarra btnOpen;
  xsBotonBarra btnLogo;

  // Agrega los botones a la barra
  btnSalir.asignarManejadorItem(oBarraHerramientas.agregarBoton("application-exit",0,XS_DESDE_LIBRERIA,"Salida"));
  btnNew.asignarManejadorItem(oBarraHerramientas.agregarBoton("document-new",1,XS_DESDE_LIBRERIA,"Nuevo"));
  btnOpen.asignarManejadorItem(oBarraHerramientas.agregarBoton("document-open",2,XS_DESDE_LIBRERIA,"Abrir"));
  btnLogo.asignarManejadorItem(oBarraHerramientas.agregarBoton("img/js32x32.jpg",3,NO XS_DESDE_LIBRERIA,"Logo"));

  // Otro Método
  xsBotonBarra btnImprimir;
  btnImprimir.crear("document-print",VERDAD);

  // Lo agrega a la Barra
  oBarraHerramientas.agregarBoton(btnImprimir.obtenerManejadorItem(),0,"Imprimir");

  // Establece el Tamaño de los ICONOS
  oBarraHerramientas.iconos(XS_TAMANIO_ICONO_32PX);

  // Agregar la Barra de Herramientas a la Ventana Principal
  oVentana.agregarAlContenedor(oBarraHerramientas.obtenerManejadorContenedor(),Falso,Falso,3, Verdad); 

  // Asigna texto emergente (despues de asignar manejador; no antes)
  btnSalir.colocarTextoEmergente("Salir de la aplicación");
  btnNew.colocarTextoEmergente("Crear un Nuevo documento");
  btnOpen.colocarTextoEmergente("Abrir un documento");
  btnLogo.colocarTextoEmergente("Cambiar el logo");
  btnImprimir.colocarTextoEmergente("Imprimir documento");

  // Las entradas
  entTexto.crear("Capture el Texto para el Botón");
  entImagen.crear("Capture la ruta de la Imagen para el Botón");
  entImagenLibreria.crear("Capture el nombre de la Imagen desde la librería");

  // Agrega las Entradas al contenedor
  oVentana.agregarAlContenedor(entTexto.obtenerManejador()); 
  oVentana.agregarAlContenedor(entImagen.obtenerManejador()); 
  oVentana.agregarAlContenedor(entImagenLibreria.obtenerManejador()); 


  // Los botones
  xsBoton btnNuevoBotonArchivo("Crear un Botón Nuevo desde Archivo", NO XS_CON_MNEMONICO);
  xsBoton btnNuevoBotonLibreria("Crear un Botón Nuevo desde Libreria", NO XS_CON_MNEMONICO);
  xsBoton btnIconos16px("Iconos de 16 Pixeles", NO XS_CON_MNEMONICO);
  xsBoton btnIconos24px("Iconos de 24 Pixeles", NO XS_CON_MNEMONICO);
  xsBoton btnIconos32px("Iconos de 32 Pixeles", NO XS_CON_MNEMONICO);
  xsBoton btnIconos48px("Iconos de 48 Pixeles", NO XS_CON_MNEMONICO);

  // Agregar los botones al Contenedor
  oVentana.agregarAlContenedor(btnNuevoBotonArchivo.obtenerManejador()); 
  oVentana.agregarAlContenedor(btnNuevoBotonLibreria.obtenerManejador()); 
  oVentana.agregarAlContenedor(btnIconos16px.obtenerManejador()); 
  oVentana.agregarAlContenedor(btnIconos24px.obtenerManejador()); 
  oVentana.agregarAlContenedor(btnIconos32px.obtenerManejador()); 
  oVentana.agregarAlContenedor(btnIconos48px.obtenerManejador()); 
  
  // Asocia la función para Controlar la Barra de Estado
  opcVistaBarraHerramientas.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnBarraHerramientasOnOff),oBarraHerramientas.obtenerManejador());

  // Conectando la señal de los botones
  btnSalir.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnSalida),NULO);
  btnNew.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnNew),oBarraHerramientas.obtenerManejador());
  btnOpen.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnOpen),NULO);
  btnLogo.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnLogo),NULO);
  btnImprimir.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnImprimir),NULO);
  btnNuevoBotonArchivo.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnNuevoBotonArchivo),oBarraHerramientas.obtenerManejador());
  btnNuevoBotonLibreria.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnNuevoBotonLibreria),oBarraHerramientas.obtenerManejador());
  btnIconos16px.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnIconos16px),oBarraHerramientas.obtenerManejador());
  btnIconos24px.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnIconos24px),oBarraHerramientas.obtenerManejador());
  btnIconos32px.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnIconos32px),oBarraHerramientas.obtenerManejador());
  btnIconos48px.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnIconos48px),oBarraHerramientas.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)
{
    // 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 fnBarraHerramientasOnOff(xsObjetoGUI *objeto,xsApuntador BarraHerramientas)
{
  // Verifica si está activo
  si (xsObjeto_MenuOpcionCheck_activo_obtener(XS_CHECK_MENU_OPCION(objeto)))
  {
       // Mostramos la Barra de Estado
       xsObjeto_mostrar(XS_OBJETOGUI(BarraHerramientas));

       // Mensaje
       xsVentana::mensajeInformacion("xsEasyCpp Demo Barra Herramientas","Se ha mostrado la Barra de Herramientas");
  }
  // Está desactiva
  deOtroModo
  {
       // Oculta la Barra
       xsObjeto_ocultar(XS_OBJETOGUI(BarraHerramientas));      
       // Mensaje
       xsVentana::mensajeInformacion("xsEasyCpp Demo Barra Herramientas","Se ha ocultado la Barra de Herramientas");
  }
}

// Función para Nuevo
Estatica Vacio fnNew(xsObjetoGUI* boton, xsApuntador barraHerramientas)
{
  // Variable para la respuesta
  Entero respuesta;

  // Mensaje
  xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Presionaste botón New");

  // Obtiene la Respuesta
  respuesta = xsVentana::mensajePregunta("xsEasyCpp Demo BarraHerramientas","Deseas eliminar este botón");

  // Verifica si dió aceptar
  si (respuesta == xsVentana::BOTON_SI)
  {
     // Destruye el Boton
     xsObjeto_destruir(boton);
  }
}

// Función para Abrir
Estatica Vacio fnOpen(xsObjetoGUI* boton, xsApuntador datos)
{
  // Variable para la respuesta
  Entero respuesta;

  // Mensaje
  xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Presionaste botón Open");

  // Obtiene la Respuesta
  respuesta = xsVentana::mensajePregunta("xsEasyCpp Demo BarraHerramientas","Deseas eliminar este botón");

  // Verifica si dió aceptar
  si (respuesta == xsVentana::BOTON_SI)
  {
     // Destruye el Boton
     xsObjeto_destruir(boton);
  }
}

// Función para Logo
Estatica Vacio fnLogo(xsObjetoGUI* boton, xsApuntador datos)
{
  // Variable para la respuesta
  Entero respuesta;

  // Mensaje
  xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Presionaste botón Logo");  

  // Obtiene la Respuesta
  respuesta = xsVentana::mensajePregunta("xsEasyCpp Demo BarraHerramientas","Deseas eliminar este botón");

  // Verifica si dió aceptar
  si (respuesta == xsVentana::BOTON_SI)
  {
     // Destruye el Boton
     xsObjeto_destruir(boton);
  }
}

// Función para Imprimir
Estatica Vacio fnImprimir(xsObjetoGUI* boton, xsApuntador datos)
{
  // Variable para la respuesta
  Entero respuesta;

  // Mensaje
  xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Presionaste botón Imprimir");  

  // Obtiene la Respuesta
  respuesta = xsVentana::mensajePregunta("xsEasyCpp Demo BarraHerramientas","Deseas eliminar este botón");

  // Verifica si dió aceptar
  si (respuesta == xsVentana::BOTON_SI)
  {
     // Destruye el Boton
     xsObjeto_destruir(boton);
  }
}

// Función para Iconos de 16 pixeles
Estatica Vacio fnIconos16px(xsObjetoGUI* boton, xsApuntador barraHerramientas)
{
  // Variable temporal de Herramientas
  xsBarraHerramientas tmpBarra;

  // Obtiene el Manejador
  tmpBarra.asignarManejador(XS_OBJETOGUI(barraHerramientas));

  // Cambia los iconos a 16px
  tmpBarra.iconos(XS_TAMANIO_ICONO_16PX);

  // Mensaje
  xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Se han cambiado los iconos a 16px");
}

// Función para Iconos de 24 pixeles
Estatica Vacio fnIconos24px(xsObjetoGUI* boton, xsApuntador barraHerramientas)
{
  // Variable temporal de Herramientas
  xsBarraHerramientas tmpBarra;

  // Obtiene el Manejador
  tmpBarra.asignarManejador(XS_OBJETOGUI(barraHerramientas));

  // Cambia los iconos a 16px
  tmpBarra.iconos(XS_TAMANIO_ICONO_24PX);

  // Mensaje
  xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Se han cambiado los iconos a 24px");
}

// Función para Iconos de 32 pixeles
Estatica Vacio fnIconos32px(xsObjetoGUI* boton, xsApuntador barraHerramientas)
{
  // Variable temporal de Herramientas
  xsBarraHerramientas tmpBarra;

  // Obtiene el Manejador
  tmpBarra.asignarManejador(XS_OBJETOGUI(barraHerramientas));

  // Cambia los iconos a 16px
  tmpBarra.iconos(XS_TAMANIO_ICONO_32PX);

  // Mensaje
  xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Se han cambiado los iconos a 32px");
}

// Función para Iconos de 48 pixeles
Estatica Vacio fnIconos48px(xsObjetoGUI* boton, xsApuntador barraHerramientas)
{
  // Variable temporal de Herramientas
  xsBarraHerramientas tmpBarra;

  // Obtiene el Manejador
  tmpBarra.asignarManejador(XS_OBJETOGUI(barraHerramientas));

  // Cambia los iconos a 16px
  tmpBarra.iconos(XS_TAMANIO_ICONO_48PX);

  // Mensaje
  xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Se han cambiado los iconos a 48px");
}

// Función para Nuevo Botón desde Archivo
Estatica Vacio fnNuevoBotonArchivo(xsObjetoGUI* boton, xsApuntador barraHerramientas)
{
  // Variable temporal de Herramientas
  xsBarraHerramientas tmpBarra;

  // BotonBarra Nuevo
  xsBotonBarra btnNuevo;
    
  // Obtiene el Manejador
  tmpBarra.asignarManejador(XS_OBJETOGUI(barraHerramientas));

  // Verifica si está captura el Texto de Botón
  si (entTexto.obtenerLongitudTexto()>0)

     // Verifica si está capturado el nombre del archivo
     si (entImagen.obtenerLongitudTexto()>0)
     {  
        // Crea el botón con la imagen              
        btnNuevo.crear(entImagen.obtenerTexto(),FALSO);     

        // Agrega el botón a la barra
        tmpBarra.agregarBoton(btnNuevo.obtenerManejadorItem(),-1,entTexto.obtenerTexto());

        // Muestra todo
        tmpBarra.mostrarTodo();

        // Mensaje
        xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Se ha creado un nuevo botón para la Barra"); 
     }  
     else
        // Mensaje
        xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Captura el Archivo con la Imagen"); 
  else
     // Mensaje
     xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Captura el nombre el Texto para el Botón");   
}

// Función para Nuevo Botón Librería
Estatica Vacio fnNuevoBotonLibreria(xsObjetoGUI* boton, xsApuntador barraHerramientas)
{
  // Variable temporal de Herramientas
  xsBarraHerramientas tmpBarra;

  // BotonBarra Nuevo
  xsBotonBarra btnNuevo;
    
  // Obtiene el Manejador
  tmpBarra.asignarManejador(XS_OBJETOGUI(barraHerramientas));

  // Verifica si está captura el Texto de Botón
  si (entTexto.obtenerLongitudTexto() > 0)

     // Verifica si está capturado el nombre del archivo
     si (entImagenLibreria.obtenerLongitudTexto()>0)
     {  
        // Crea el botón con la imagen              
        btnNuevo.crear(entImagenLibreria.obtenerTexto(),VERDAD);     

        // Agrega el botón a la barra
        tmpBarra.agregarBoton(btnNuevo.obtenerManejadorItem(),-1,entTexto.obtenerTexto());

        // Muestra todo
        tmpBarra.mostrarTodo();

        // Mensaje
        xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Se ha creado un nuevo botón para la Barra"); 
     }  
     else
        // Mensaje
        xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Captura el nombre de la Imagen en Librería"); 
  else
     // Mensaje
     xsVentana::mensajeInformacion("xsEasyCpp Demo BarraHerramientas","Captura el nombre el Texto para el Botón");   
}