// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto DialogoFuente
// g++ -g DialogoFuente.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 DialogoFuente.exe
// g++ -g DialogoFuente.cpp %PKG-XSEASYCPP% -o DialogoFuente.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 la Ventana de Diálogo
Vacio fnMostrarDialogoFuente(xsObjetoGUI* objeto, xsApuntador editor);

// Define Etiqueta y Editor Global
xsEtiqueta oEtiqueta;
xsEditor oEditor;

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

  // Coloca el Título
  oVentana.colocarTitulo("xsEasyCpp Demo Diálogo Fuente");

  // Establecer margen de la Ventana
  oVentana.colocarBordeVentana(10);

  // Centra la Ventana
  oVentana.centrar();

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

  // Crea la Etiqueta 
  oEtiqueta.crear("Qué es Lorem Ipsum");

  // Agregar la Etiqueta al Contenedor de la Ventana
  oVentana.agregarAlContenedor(oEtiqueta.obtenerManejador());

  // Declara un buffer de Texto
  xsBufferTexto buffer;
  buffer.crear();

  // Insertar texto en el Buffer
  buffer.insertarEnCursor("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
  
  // Crea el objeto editor y pasa el buffer
  oEditor.crear(buffer.obtenerTexto());

  // Establece sus dimensiones
  oEditor.colocarDimensiones(399,325);
  oEditor.colocarMargenInferior(10);

  // Crea la ventana de Desplazamiento (Scroll)
  xsVentanaDesplazamiento scrollEditor;

  // Crea una Ventana de Desplazamiento (scroll)
  xsVentanaDesplazamiento scroll(NULO,NULO);
  scroll.colocarDimensiones(290,350);

  // Insertar el editor en el Scroll
  scroll.agregarEn(oEditor.obtenerManejador());

  // Agregar el Editor a la Ventana
  oVentana.agregarAlContenedor(scroll.obtenerManejador());

  // Creamos el botón para cambiar la Fuente
  xsBoton btnFuente("Seleccionar Fuente",NO XS_CON_MNEMONICO);

  // Agregar el Botón al Contenedor
  oVentana.agregarAlContenedor(btnFuente.obtenerManejador());
  
  // Conecta una señal a la ventana
  btnFuente.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnMostrarDialogoFuente),oVentana.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 controlar la accción del MenuChekItem y Ocultar/Visualizar la Barra de Herramientas
Vacio fnMostrarDialogoFuente(xsObjetoGUI* objeto, xsApuntador ventana)
{  
  // Crea la Ventana de Dialogo Acerca de
  xsDialogoFuente dlg("Selecciona la Fuente",NULO);

  // Centra el Dialogo
  dlg.centrar(XS_OBJETOGUI(ventana));
  
  // Carga el Logo
  dlg.ejecutar();

  // Temporal para la Fuente
  xsCadena fuente;
  xsCadena familia;
  xsCadena tamanio;

  // Obtengo la Fuente Seleccionada
  fuente = dlg.obtenerNombreFuente();

  // Busca el último espacio
  Entero posUltimoEspacio = fuente.find_last_of(" ");
  
  // Valida con el ultimo espacio
  si (posUltimoEspacio>=0)
  {
    // Obtengo la familia
    familia = fuente.substr(0,posUltimoEspacio);
    tamanio = fuente.substr(posUltimoEspacio+1)+"px"; 
    
    // Creamos el Objeto CSS
    xsCSS oProveedorCSS;
    oProveedorCSS.crear();

    // Cargamos las reglas CSS
    oProveedorCSS.cargarReglas(".etiqueta\n"   
                              "{\n"
                              "   color:red;" //(El Color no funciona para el Editor)
                              "   font-size:"+tamanio+";\n"
                              "   font-family:"+familia+";\n"
                              "}\n");


    // Agregamos una Clase al Contexto del Editor
    oEditor.agregarClaseCSS("etiqueta");
    oEtiqueta.agregarClaseCSS("etiqueta");

    // Agrego la Ventana al Proveedor de CSS 
    oProveedorCSS.agregarContexto(xsObjeto_obtener_contexto(oEditor.obtenerManejador()));      
    oProveedorCSS.agregarContexto(xsObjeto_obtener_contexto(oEtiqueta.obtenerManejador()));      

  }

  // Destruye el Objeto
  xsObjeto_destruir(dlg.obtenerManejador());    
}

