// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto Menu
// g++ -g Menu.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 Menu.exe
// g++ -g Menu.cpp %PKG-XSEASYCPP% -o Menu.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 Estado
Vacio fnProcesaMenuOpcionCheck(xsObjetoGUI* objeto);

// Función para evento Guardar
Vacio fnClickOpcion(xsObjetoGUI* objeto, xsApuntador datos);

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

  // 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      oMenuEdicion;
  xsMenu      oMenuVista;
  oMenuArchivo.crear();
  oMenuEdicion.crear();
  oMenuVista.crear();

  // Creamos los objetos para las opciones del Menu Archivo
  xsMenuOpcion opcArchivo("Archivo",xsTexto);
  xsMenuOpcion opcArchivoGuardar("Guardar",xsTexto);
  xsMenuOpcion opcArchivoSalir("_Salir",xsMnemonic);

  // Asocia la función de salida
  opcArchivoSalir.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnSalida),NULO);
  xsCadena opcGuardar="Guardar";
  opcArchivoGuardar.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnClickOpcion),&opcGuardar);
  

  // Agregamos un acelerador a la opción de Salir
  opcArchivoSalir.agregarAcelerador(XS_EVENTO_ACTIVADO,oVentana.obtenerManejadorAceleradores(),XS_ACEL_CTRL_B);

  // Creamos una opción separador
  xsMenuOpcion opcArchivoSeparador("",xsSeparador);

  // Creamos los objetos para las opciones del Menu Edición
  
  xsMenuOpcion opcEdicion("Edicion",xsTexto);
  
  xsMenuOpcion opcEdicionBuscar("Buscar","edit-find",Verdad);
  xsMenuOpcion opcEdicionCopiar("Copiar","edit-copy",Verdad);
  xsMenuOpcion opcEdicionLogo("Logo","js16x16.jpg",Falso);

  xsCadena opcBuscar="Buscar";
  opcEdicionBuscar.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnClickOpcion),&opcBuscar);
  xsCadena opcCopiar="Copiar";
  opcEdicionCopiar.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnClickOpcion),&opcCopiar);
  xsCadena opcLogo="Logo";
  opcEdicionLogo.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnClickOpcion),&opcLogo);
  
  
  // Creamos los objetos para las opciones del Menu Vista
  xsMenuOpcion opcVista("Vista",xsTexto);
  xsMenuOpcionCheck opcVistaBarraHerramientas("Barra Herramientas",xsTexto);
  
  // Asocia la función para verificar si está activo
  opcVistaBarraHerramientas.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnProcesaMenuOpcionCheck),NULO);
  xsMenuOpcionCheck opcVistaBarraEstado("Barra Estado",xsTexto);
  
  // Activa la opción
  opcVistaBarraHerramientas.activar(Verdad);
  opcVistaBarraEstado.activar(Verdad);

  // Asignando las opciones a los menus
  oMenuArchivo.colocarSubMenu(opcArchivo.obtenerManejador());
  oMenuEdicion.colocarSubMenu(opcEdicion.obtenerManejador());
  oMenuVista.colocarSubMenu(opcVista.obtenerManejador());

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

  // Agrega las opciones al Menu Edicion
  oMenuEdicion.agregarOpcion(opcEdicionBuscar.obtenerManejador());
  oMenuEdicion.agregarOpcion(opcEdicionCopiar.obtenerManejador());
  oMenuEdicion.agregarOpcion(opcEdicionLogo.obtenerManejador());

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

  // Agregar las opciones al Menu Barra
  oMenuBarraPrincipal.agregarOpcion(opcArchivo.obtenerManejador());
  oMenuBarraPrincipal.agregarOpcion(opcEdicion.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);

  // 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 Estado
Vacio fnProcesaMenuOpcionCheck(xsObjetoGUI* objeto)
{
  // Verifica si está activo
  si (xsObjeto_MenuOpcionCheck_activo_obtener(XS_CHECK_MENU_OPCION(objeto)))  
     // Despliega Mensaje
     xsVentana::mensajeInformacion("Demo Menu","Se ha activado");
  
  deOtroModo  
     // Despliega Mensaje
     xsVentana::mensajeInformacion("Demo Menu","Se ha desactivado");
}

// Función para procesar click en opción del Menu
Vacio fnClickOpcion(xsObjetoGUI* objeto, xsApuntador datos)
{
    // Variable apuntador para obtener el dato en cadena
    xsCadena* xDato = (xsCadena*)datos;

    // Mensaje
    xsVentana::mensajeInformacion("Demo Menu","Opcion del Menu Seleccionada:"+(*xDato));
}
