// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto MenuPopUp
// g++ -g MenuPopUp.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 MenuPopUp.exe
// g++ -g MenuPopUp.cpp %PKG-XSEASYCPP% -o MenuPopUp.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 mostrar el Menu PopUp
Entero fnMostrarMenuPopUp(xsObjetoGUI* menu, xsEvento* evento) ;

// Función para Grabra
Vacio fnGrabar(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(500,400);

  // Centrar la Ventana
  oVentana.centrar();

  // Coloca el Título
  oVentana.colocarTitulo("xsEasyCpp Demo MenuPopUp (Presione Click Derecho)");

  // 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;
  oMenuArchivo.crear();
  
  // Creamos los objetos para las opciones del Menu Archivo
  xsMenuOpcion opcArchivoGuardar("Guardar",xsTexto);
  opcArchivoGuardar.mostrar();
  xsMenuOpcion opcArchivoSalir("_Salir",xsMnemonic);
  opcArchivoSalir.mostrar();
  xsMenuOpcion opcArchivoSeparador("",xsSeparador);
  opcArchivoSeparador.mostrar();

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

  // Asocia la función de salida
  opcArchivoGuardar.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnGrabar),NULO);
  opcArchivoSalir.conectarSenal(XS_EVENTO_ACTIVADO,XS_FUNCION_RETORNO (fnSalida),NULO);

  
  // Agregamos un acelerador a la opción de Salir
  opcArchivoSalir.agregarAcelerador(XS_EVENTO_ACTIVADO,oVentana.obtenerManejadorAceleradores(),XS_ACEL_CTRL_B);
  
  // 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);

  // Conecta la señal intercambiada a la ventana
  oVentana.conectarSenalIntercambiada(XS_EVENTO_BOTON_PRESIONADO,
                                      XS_FUNCION_RETORNO(fnMostrarMenuPopUp),oMenuArchivo.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)
{
  retorna Falso; // Para que se cierre, lo contrario para que no se cierre
}

// Función para mostrar el Menu PopUp
Entero fnMostrarMenuPopUp(xsObjetoGUI* menu, xsEvento* evento) 
{
    // Creación de una variable global
    xsMenu oMenuTemporal;

    // Asigna el Manejador
    oMenuTemporal.asignarManejador(menu);

    // Constante
    Constante Entero CLICK_DERECHO = 3;
    
    // Verifica si el evento es el del botón presionado
    si (evento->type == XS_BOTON_PRESIONADO) 
    {      
       // Obtiene el evento convertido a Evento del Boton
       xsEventoBoton *eventoBoton = (xsEventoBoton *) evento;
      
       // Verifica si es el botón derecho el presionado
       si (eventoBoton->button == CLICK_DERECHO) 
       {      
          // Usando la variable temporal       
          oMenuTemporal.popUp();
       }

       // Retorna Verdad    
       retorna VERDAD;
    }
    deOtroModo
       // Devuelve falso
       retorna FALSO;
}

// Detiene el Ciclo Principal iniciado por gtk_main
Vacio fnGrabar(xsObjetoGUI* objeto, xsApuntador datos)
{
  // Mensaje
  xsVentana::mensajeInformacion("Demo MenuPopUp","Has Seleccionado Grabar");
}