// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de CSS
// g++ -g CSS.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 CSS.exe
// g++ -g CSS.cpp %PKG-XSEASYCPP% -o CSS.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 fnBarraEstadoOnOff(xsObjetoGUI *objeto,xsApuntador BarraEstado);

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

  // Mostramos la Ventana
  oVentana.centrar();

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

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

  // Creamos los objetos para los Menus
  xsMenu      oMenuArchivo;
  xsMenu      oMenuVista;
  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("activate",XS_FUNCION_RETORNO (fnSalida),NULO);
  
  // Creamos los objetos para las opciones del Menu Vista
  xsMenuOpcion opcVista("Vista",xsTexto);
  xsMenuOpcionCheck opcVistaBarraEstado("Barra Estado",xsTexto);
  
  // Activa la opción
  opcVistaBarraEstado.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(opcVistaBarraEstado.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);  

  // Creamos la Barra de Estado
  xsBarraEstado oBarraEstado;
  oBarraEstado.crear();

  // Agrega un Mensaje
  oBarraEstado.meterMensaje("Sistema listo ...");

  // Asocia la función para Controlar la Barra de Estado
  opcVistaBarraEstado.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnBarraEstadoOnOff),oBarraEstado.obtenerManejador());
  

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

  // Creamos el Objeto CSS
  xsCSS oProveedorCSS;
  oProveedorCSS.crear();
  
  // Cargamos las reglas CSS
  oProveedorCSS.cargarArchivo("css/reglas.css");
  // oProveedorCSS.cargarReglas(".ventanaPrincipal\n"   
  //                            "{\n"
  //                            "   background:orange;\n"
  //                            "   font-family: verdana;\n"
  //                            "   font-size: 14px;\n"
  //                            "   border: gray 1px inset;\n"
  //                            "}\n"
  //                            ".barraEstado\n"
  //                            "{\n"
  //                            "   background:green;\n"
  //                            "   font-family: verdana;\n"
  //                            "   font-size: 14px;\n"
  //                            "}\n"
  //                            ".barraMenu\n"
  //                            "{\n"
  //                            "   background:red;"
  //                            "   font-family: verdana;"
  //                            "   font-size: 14px;"
  //                            "}\n"
  //                            ".opcionMenu\n"
  //                            "{\n"
  //                            "   background:gray;\n"
  //                            "   font-family: verdana;\n"
  //                            "   font-size: 14px;\n"
  //                            "}\n");

  // Agregamos una Clase al Contexto de la Barra de Estado y a la de Menu
  oBarraEstado.agregarClaseCSS("barraEstado");
  oMenuBarraPrincipal.agregarClaseCSS("barraMenu");
  opcVistaBarraEstado.agregarClaseCSS("opcionMenu");
  oVentana.agregarClaseCSS("ventanaPrincipal");

  // Agregamos el Contexto al Proveedor
  oProveedorCSS.agregarContexto(oBarraEstado.obtenerContexto());
  oProveedorCSS.agregarContexto(oMenuBarraPrincipal.obtenerContexto());
  oProveedorCSS.agregarContexto(opcVistaBarraEstado.obtenerContexto());
  oProveedorCSS.agregarContexto(oVentana.obtenerContexto());

  // 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 controlar la accción del MenuChekItem y Ocultar/Visualizar la Barra de Herramientas
Vacio fnBarraEstadoOnOff(xsObjetoGUI *objeto,xsApuntador barraEstado)
{
  // Verifica si está activo
  si (xsObjeto_MenuOpcionCheck_activo_obtener(XS_CHECK_MENU_OPCION(objeto)))
  {
       // Mostramos la Barra de Estado
       xsObjeto_mostrar(XS_OBJETOGUI(barraEstado));
       xsVentana::mensajeInformacion("Demo CSS","Mostramos la Barra de Estado\n");
  }
  // Está desactiva
  deOtroModo
  {
       // Oculta la Barra
       xsObjeto_ocultar(XS_OBJETOGUI(barraEstado));
       xsVentana::mensajeInformacion("Demo CSS","Ocultamos la Barra de Estado\n");
  }
}