// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto DialogoArchivos
// g++ -g DialogoArchivos.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 DialogoArchivos.exe
// g++ -g DialogoArchivos.cpp %PKG-XSEASYCPP% -o DialogoArchivos.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 Abrir el Archivo
Vacio fnAbrirArchivo(xsObjetoGUI* objeto, xsApuntador editor);

// Función para Guardar el Archivo
Vacio fnGuardarArchivo(xsObjetoGUI* objeto, xsApuntador editor);

// Función para obtener la ruta del Executable
xsCadena fnObtenerRutaExe(Constante Caracter* programa);

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

// Variable para la ruta del programa
xsCadena rutaPrograma;

// Función principal de xsEasyWindow
xsPrincipal
{
  // Iniciamos xsEasyWindows
  xsAppInicia; 

  // Obtiene la ruta del Programa
  rutaPrograma = fnObtenerRutaExe(argv[0]);  

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

  // 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 
  etqNombreArchivo.crear("SinTitulo");

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

  // Crea el objeto editor y pasa el buffer
  oEditor.crear();
  
  // 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 Abrir Archivo
  xsBoton btnAbrir("Abrir Archivo",NO XS_CON_MNEMONICO);
  btnAbrir.colocarImagen("document-open",XS_TAMANIO_ICONO_16PX);
  btnAbrir.colocarMargenInferior(10);

  // Agregar el Botón al Contenedor
  oVentana.agregarAlContenedor(btnAbrir.obtenerManejador());
  
  // Creamos el botón para Guardar el Archivo
  xsBoton btnGuardar("Guardar Archivo",NO XS_CON_MNEMONICO);
  btnGuardar.colocarImagen("document-save",XS_TAMANIO_ICONO_16PX);

  // Agregar el Botón al Contenedor
  oVentana.agregarAlContenedor(btnGuardar.obtenerManejador());
  
  // Conecta las señales
  btnAbrir.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnAbrirArchivo),oVentana.obtenerManejador());
  btnGuardar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO(fnGuardarArchivo),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 Abrir Archivo
Vacio fnAbrirArchivo(xsObjetoGUI *objeto, xsApuntador ventana)
{  
    // Crea el Dialgo de Archivos
    xsDialogoArchivos dlgAbrir("Selecciona Achivo",
                               XS_VENTANA(ventana),
                               XS_ACCION_ABRIR_ARCHIVO,
                               "Cancelar",
                               "Abrir");

    // Coloca la ruta para abrir el diálogo
    dlgAbrir.colocarRuta(rutaPrograma);

    // Ejecuta el Diálogo
    dlgAbrir.ejecutar();

    // Verifica que haya seleccionado el archivo
    si (dlgAbrir.obtenerArchivoSeleccionado().size()>0)               
       // Abrimos el archivo con el Editor
       si (oEditor.abrirArchivo(dlgAbrir.obtenerArchivoSeleccionado()))
          // Coloca el nombre del Archivo
          etqNombreArchivo.colocarTexto(dlgAbrir.obtenerArchivoSeleccionado());        
}

// Función para Guardar Archivo
Vacio fnGuardarArchivo(xsObjetoGUI* objeto, xsApuntador ventana)
{  
    // Crea el Dialgo de Archivos
    xsDialogoArchivos dlgGuardar("Selecciona Achivo",
                                 XS_VENTANA(ventana),
                                 XS_ACCION_GUARDAR_ARCHIVO,
                                 "Cancelar",
                                 "Guardar");

    // Coloca la ruta para abrir el diálogo
    dlgGuardar.colocarRuta(rutaPrograma);

    // Ejecuta el Diálogo
    dlgGuardar.ejecutar();

    // Verifica que haya seleccionado el archivo
    si (dlgGuardar.obtenerArchivoSeleccionado().size()>0)               
       // Grabamos el archivo con el Editor
       si (oEditor.grabarArchivo(dlgGuardar.obtenerArchivoSeleccionado()))
          // Coloca el nombre del Archivo
          etqNombreArchivo.colocarTexto(dlgGuardar.obtenerArchivoSeleccionado());

}

// Función para obtener la Ruta del Executable
xsCadena fnObtenerRutaExe(Constante Caracter* programa)
{
   // Variable para resultado
   xsCadena resultado;

   // Para posición
   Entero posicion;

   // Variable para obtener la Ruta
   Caracter  basePath[255] = "";

   // Obtiene la Cadena
   _fullpath(basePath, programa, longitudDe(basePath));

   // Coloca en la variable resultado
   resultado = basePath;

   // Obtiene la posición
   posicion = resultado.rfind(programa);

   // Recorta
   resultado = resultado.substr(0,posicion-1);

   // Retorna
   retorna resultado;
}

