// -------------------------------------------------------------------------------------
// xsEasyCpp
// Demo de Objeto Entrada
// g++ -g Entrada.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 Entrada.exe
// g++ -g Entrada.cpp %PKG-XSEASYCPP% -o Entrada.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 acción de visualizar o no la entrada
Vacio fnEntradaOnOff(xsObjetoGUI* objeto,xsApuntador boton);

// Función para controlar el Enter en la Entrada
Vacio fnEntradaEnter(xsObjetoGUI* objeto);

// Función para controlar el Enter en la Entrada
Vacio fnEntradaBackSpace(xsObjetoGUI* objeto);

// Función para controlar el Enter en la Entrada
Vacio fnEntradaCopiarAlClipBoard(xsObjetoGUI* objeto);

// Función para controlar el Enter en la Entrada
Vacio fnEntradaCortarAlClipBoard(xsObjetoGUI* objeto);

// Función para controlar el Enter en la Entrada
Vacio fnEntradaElininarEnCursor(xsObjetoGUI* objeto);

// Función para controlar el Enter en la Entrada
Vacio fnEntradaInsertarEnCursor(xsObjetoGUI* objeto);

// Función para controlar el Enter en la Entrada
Vacio fnEntradaMoverCursor(xsObjetoGUI* objeto);

// Función para controlar el Enter en la Entrada
Vacio fnEntradaPegarDesdeClipBoard(xsObjetoGUI* objeto);

// Función para limpiar el
Entero fnEntradaKeyPress(xsObjetoGUI* objeto, xsEventoKey* evento);

// Función para Limpiar la Entrada
Vacio fnLimpiar(xsObjetoGUI* objeto,xsApuntador entrada);

// Función para Alinear a la Derecha
Vacio fnAlinearDerecha(xsObjetoGUI* objeto,xsApuntador entrada);

// Función para Alinear a la Izquierda
Vacio fnAlinearIzquierda(xsObjetoGUI* objeto,xsApuntador entrada);

// Función para Sea Visible o como Password
Vacio fnVisible(xsObjetoGUI* objeto,xsApuntador entrada);

// Función para Habilitar / Deshabilitar
Vacio fnHabilitar(xsObjetoGUI* objeto,xsApuntador entrada);

// Función para la Longitud del Texto
Vacio fnLongitudTexto(xsObjetoGUI* objeto,xsApuntador entrada);

// Función para colocar Texto Emergente
Vacio fnTextoEmergente(xsObjetoGUI* objeto,xsApuntador entrada);

// Boton Interruptor
xsBotonInterruptor btniNumeros; 
//xsBotonInterruptor btniHabilitar;

// 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(320,270);
  
  // Posiciona la ventana al Centro
  oVentana.colocarPosicion(XS_VENTANA_POSICION_CENTRO);

  // Establece el Borde
  oVentana.colocarBordeVentana(10);

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

  // 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 la Entrada con PlaceHolder
  xsEntrada oEntrada("");
  
  // Establece longitud maxima
  oEntrada.colocarLongitudMaximaTexto(30);

  // Crea los botones
  xsBoton btnLimpiar("Limpiar",FALSO);
  xsBoton btnAlinearDerecha("Alinear Derecha",FALSO);
  xsBoton btnAlinearIzquierda("Alinear Izquierda",FALSO);   
  xsBoton btnLongitud("Longitud del Texto",FALSO);
  xsBoton btnTextoEmergente("Texto Emergente",FALSO);
  xsBotonInterruptor btniHabilitar("Habilitar",FALSO); 
  btniHabilitar.colocarMargenSuperior(10);
  btniHabilitar.colocarActivo(Verdad);
  xsBotonInterruptor btniVisible("Visible",FALSO); 
  btniVisible.colocarActivo(Verdad);  
  btniNumeros.crear("Aceptar Números",FALSO); 
  btniNumeros.colocarActivo(Verdad);
  

  
  // Agregar la Etiqueta al Contenedor
  oVentana.agregarAlContenedor(oEntrada.obtenerManejador());

  // Agregar los Botones al Contenedor
  oVentana.agregarAlContenedor(btnLimpiar.obtenerManejador());
  oVentana.agregarAlContenedor(btnAlinearDerecha.obtenerManejador());
  oVentana.agregarAlContenedor(btnAlinearIzquierda.obtenerManejador());  
  oVentana.agregarAlContenedor(btnLongitud.obtenerManejador());
  oVentana.agregarAlContenedor(btnTextoEmergente.obtenerManejador());
  oVentana.agregarAlContenedor(btniHabilitar.obtenerManejador());
  oVentana.agregarAlContenedor(btniVisible.obtenerManejador());
  oVentana.agregarAlContenedor(btniNumeros.obtenerManejador());

  // Muestra todos los objetos
  oVentana.mostrarTodo();

  // Le pasa el foco; esto debe hacerse despues de que se han mostrado los objetos
  // Si se indica antes de que los objetos se muestren, no funciona
  oEntrada.colocarFoco();

  // Asocia la función para Controlar el Enter en la ntrada
  oEntrada.conectarSenal("activate",XS_FUNCION_RETORNO (fnEntradaEnter),NULO);
  oEntrada.conectarSenal("backspace",XS_FUNCION_RETORNO (fnEntradaBackSpace),NULO);
  oEntrada.conectarSenal("copy-clipboard",XS_FUNCION_RETORNO (fnEntradaCopiarAlClipBoard),NULO);
  oEntrada.conectarSenal("cut-clipboard",XS_FUNCION_RETORNO (fnEntradaCortarAlClipBoard),NULO);
  oEntrada.conectarSenal("delete-from-cursor",XS_FUNCION_RETORNO (fnEntradaElininarEnCursor),NULO);
  oEntrada.conectarSenal("insert-at-cursor",XS_FUNCION_RETORNO (fnEntradaInsertarEnCursor),NULO);
  oEntrada.conectarSenal("move-cursor",XS_FUNCION_RETORNO (fnEntradaMoverCursor),NULO);
  oEntrada.conectarSenal("paste-clipboard",XS_FUNCION_RETORNO (fnEntradaPegarDesdeClipBoard),NULO);
  oEntrada.conectarSenal("key-press-event",XS_FUNCION_RETORNO (fnEntradaKeyPress),NULO);

  // Los eventos de acuerdo a los botones
  btnLimpiar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnLimpiar),oEntrada.obtenerManejador());
  btnAlinearDerecha.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnAlinearDerecha),oEntrada.obtenerManejador());
  btnAlinearIzquierda.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnAlinearIzquierda),oEntrada.obtenerManejador());  
  btnLongitud.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnLongitudTexto),oEntrada.obtenerManejador());
  btnTextoEmergente.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnTextoEmergente),oEntrada.obtenerManejador());
  btniVisible.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnVisible),oEntrada.obtenerManejador());
  btniHabilitar.conectarSenal(XS_EVENTO_CLICKED,XS_FUNCION_RETORNO (fnHabilitar),oEntrada.obtenerManejador());

  // Ciclo
  xsAppCiclo;

  // Finaliza retornando 0
  retorna 0;

}


// Detiene el Ciclo Principal iniciado por gtk_main cuando la ventana es destruida
// Puede no ser estática
Estatica Vacio fnSalida(xsObjetoGUI* ventana, xsApuntador datos)
{
	// Mensaje de Salida
	xsImprimir("Saliendo del Sistema (Estatica Vacio)...");

  // Llama a la función de la Librería que sale del Ciclo Main  
  xsAppSalida;
}

// Función para controlar el Cierre de una Ventana
// Si se retorna FALSE se cerrará y posteriormente se destruirá la ventana
// Si se retorna TRUE, se cancela el cierre.
Estatica Entero fnCierre(xsObjetoGUI* ventana, xsEvento *evento)
{

  xsImprimir("Delete Event\n");
  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 fnEntradaOnOff(xsObjetoGUI* objeto, xsApuntador boton)
{
  // Verifica si está activo
  si (xsObjeto_MenuOpcionCheck_activo_obtener(XS_CHECK_MENU_OPCION(objeto)))
  {
       // Mostramos la Barra de Estado
       xsObjeto_mostrar(XS_OBJETOGUI(boton));       
       xsImprimir("Mostramos la Entrada \n");
  }
  // Está desactiva
  deOtroModo
  {
       // Oculta la Barra
       xsObjeto_ocultar(XS_OBJETOGUI(boton));
       xsImprimir("Ocultamos la Entrada \n");
  }
}

// Función para controlar el enter
Vacio fnEntradaEnter(xsObjetoGUI* objeto)
{    
    // Variable para el texto de Entrada
    xsCadena textoEnEntrada;

    // Obtengo el Texto de Entrada
    textoEnEntrada = xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto));  

    // Agrega el Mensaje
    textoEnEntrada = "Se ha presionado Enter.\nEl Texto en la Entrada es:\n"+textoEnEntrada;

    // Despliega la Ventana
    xsVentana::mensajeInformacion("Demo Entrada",textoEnEntrada);
}

// Función para controlar el Activate
Vacio fnEntradaBackSpace(xsObjetoGUI* objeto)
{
    // Variable para el texto de Entrada
    xsCadena textoEnEntrada;

    // Obtengo el Texto de Entrada
    textoEnEntrada = xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto));  

    // Agrega el Mensaje
    textoEnEntrada = "Se ha presionado BackSpace.\nEl Texto en la Entrada es:\n"+textoEnEntrada;

    // Despliega la Ventana
    xsVentana::mensajeInformacion("Demo Entrada",textoEnEntrada);
}

// Función para controlar el Copy al ClipBoard
Vacio fnEntradaCopiarAlClipBoard(xsObjetoGUI* objeto)
{    
    // Variable para el texto de Entrada
    xsCadena textoEnEntrada;

    // Obtengo el Texto de Entrada
    textoEnEntrada = xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto));  

    // Agrega el Mensaje
    textoEnEntrada = "Se ha copiado al ClipBoard.\nEl Texto en la Entrada es:\n"+textoEnEntrada;

    // Despliega la Ventana
    xsVentana::mensajeInformacion("Demo Entrada",textoEnEntrada);
}

// Función para controlar el Cut al ClipBoard
Vacio fnEntradaCortarAlClipBoard(xsObjetoGUI* objeto)
{    
    // Variable para el texto de Entrada
    xsCadena textoEnEntrada;

    // Obtengo el Texto de Entrada
    textoEnEntrada = xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto));  

    // Agrega el Mensaje
    textoEnEntrada = "Se ha cortado al ClipBoard.\nEl Texto en la Entrada es:\n"+textoEnEntrada;

    // Despliega la Ventana
    xsVentana::mensajeInformacion("Demo Entrada",textoEnEntrada);
}

// Función para controlar el Eliminar en el Cursor
Vacio fnEntradaElininarEnCursor(xsObjetoGUI* objeto)
{    
    // Variable para el texto de Entrada
    xsCadena textoEnEntrada;

    // Obtengo el Texto de Entrada
    textoEnEntrada = xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto));  

    // Agrega el Mensaje
    textoEnEntrada = "Se ha eliminado en el Cursor.\nEl Texto en la Entrada es:\n"+textoEnEntrada;

    // Despliega la Ventana
    xsVentana::mensajeInformacion("Demo Entrada",textoEnEntrada);
}

// Función para controlar el Insertar en el Cursor
Vacio fnEntradaInsertarEnCursor(xsObjetoGUI* objeto)
{    
    // Variable para el texto de Entrada
    xsCadena textoEnEntrada;

    // Obtengo el Texto de Entrada
    textoEnEntrada = xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto));  

    // Agrega el Mensaje
    textoEnEntrada = "Se ha insertado en el Cursor.\nEl Texto en la Entrada es:\n"+textoEnEntrada;

    // Despliega la Ventana
    xsVentana::mensajeInformacion("Demo Entrada",textoEnEntrada);
}

// Función para controlar el Insertar en el Cursor
Vacio fnEntradaMoverCursor(xsObjetoGUI* objeto)
{    
    // Variable para el texto de Entrada
    xsCadena textoEnEntrada;

    // Obtengo el Texto de Entrada
    textoEnEntrada = xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto));  

    // Agrega el Mensaje
    textoEnEntrada = "Se ha movido el Cursor.\nEl Texto en la Entrada es:\n"+textoEnEntrada;

    // Despliega la Ventana
    xsVentana::mensajeInformacion("Demo Entrada",textoEnEntrada);
}

// Función para controlar el Insertar en el Cursor
Vacio fnEntradaPegarDesdeClipBoard(xsObjetoGUI* objeto)
{    
    // Variable para el texto de Entrada
    xsCadena textoEnEntrada;

    // Obtengo el Texto de Entrada
    textoEnEntrada = xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto));  

    // Agrega el Mensaje
    textoEnEntrada = "Se ha pegado desde el ClipBoard.\nEl Texto en la Entrada es:\n"+textoEnEntrada;

    // Despliega la Ventana
    xsVentana::mensajeInformacion("Demo Entrada",textoEnEntrada);
}

// Función para controlar el Borrado en el Cursor
Entero fnEntradaKeyPress(xsObjetoGUI* objeto,GdkEventKey* evento)
{
    
    // Obtengo el texto
    xsCadena textoEnEntrada;
    
    // Mensaje
    textoEnEntrada ="Se ha presionado una tecla en la Entrada.\nLa Información es:\n";
    textoEnEntrada = textoEnEntrada + "Texto:" + xsObjeto_Entrada_obtener_texto(XS_ENTRADA(objeto))+"\n";
    textoEnEntrada = textoEnEntrada + "keyval:"+to_string(evento->keyval)+"\n";
    textoEnEntrada = textoEnEntrada + "hardware_keycode:"+to_string(evento->hardware_keycode)+"\n";
    textoEnEntrada = textoEnEntrada + "string:"+evento->string+ "\n\n";

    // Despliego la Ventana
    xsImprimir(textoEnEntrada);    

    // Verifica si acepta numeros
    si (btniNumeros.obtenerActivo())
       // Para que si acepte la tecla presionada, retorna Falso
       retorna Falso;
    deOtroModo
       si (evento->keyval>=48 && evento->keyval<=57)   
       {
           // Mensaje
           xsVentana::mensajeInformacion("Demo Entrada","No están permitido los números");
           retorna Verdad;
       }
       deOtroModo
          retorna Falso;       
}

// Función Limpiar
Vacio fnLimpiar(xsObjetoGUI* objeto, xsApuntador entrada)
{
    // Variable temporal de Entrada
    xsEntrada tmpEntrada("");    

    // Asigna el Manejador
    tmpEntrada.asignarManejador(XS_OBJETOGUI(entrada));

    // Limpia la Entrada
    tmpEntrada.limpiar();
}

// Función Alinear a la Derecha
Vacio fnAlinearDerecha(xsObjetoGUI* objeto, xsApuntador entrada)
{
    // Variable temporal de Entrada
    xsEntrada tmpEntrada("");    

    // Asigna el Manejador
    tmpEntrada.asignarManejador(XS_OBJETOGUI(entrada));

    // Establece orientación
    tmpEntrada.colocarAlineamientoTexto(XS_ALINEAMIENTO_DERECHA);    
}

// Función Alinear a la Izquierda
Vacio fnAlinearIzquierda(xsObjetoGUI* objeto, xsApuntador entrada)
{
    // Variable temporal de Entrada
    xsEntrada tmpEntrada("");    

    // Asigna el Manejador
    tmpEntrada.asignarManejador(XS_OBJETOGUI(entrada));

    // Establece orientación
    tmpEntrada.colocarAlineamientoTexto(XS_ALINEAMIENTO_IZQUIERDA);    
}

// Función Visible
Vacio fnVisible(xsObjetoGUI* objeto, xsApuntador entrada)
{
    // Variable temporal de Botón Interruptor
    xsBotonInterruptor tmpBtnInterruptor;

    // Asigna el Manejador
    tmpBtnInterruptor.asignarManejador(objeto);

    // Variable temporal de Entrada
    xsEntrada tmpEntrada("");    

    // Asigna el Manejador
    tmpEntrada.asignarManejador(XS_OBJETOGUI(entrada));

    // Verifica si está activo
    si (tmpBtnInterruptor.obtenerActivo())

        // Lo hace visible
        tmpEntrada.colocarVisibilidad(Verdad);

    deOtroModo

       // Lo hace visible
       tmpEntrada.colocarVisibilidad(Falso);
          
}

// Función Habilitar
Vacio fnHabilitar(xsObjetoGUI* objeto, xsApuntador entrada)
{
    // Variable temporal de Botón Interruptor
    xsBotonInterruptor tmpBtnInterruptor;

    // Asigna el Manejador
    tmpBtnInterruptor.asignarManejador(objeto);

    // Variable temporal de Entrada
    xsEntrada tmpEntrada("");    

    // Asigna el Manejador
    tmpEntrada.asignarManejador(XS_OBJETOGUI(entrada));

    // Verifica si está activo
    si (tmpBtnInterruptor.obtenerActivo())

        // Lo hace visible
        tmpEntrada.habilitar(Verdad);

    deOtroModo

       // Lo hace visible
       tmpEntrada.habilitar(Falso);
          
}

// Función para la Longitud del Texto
Vacio fnLongitudTexto(xsObjetoGUI* objeto, xsApuntador entrada)
{
// Variable temporal de Entrada
    xsEntrada tmpEntrada("");    

    // Asigna el Manejador
    tmpEntrada.asignarManejador(XS_OBJETOGUI(entrada));         

    // Obtengo la Longitud del Texto
    Entero longitudTexto = tmpEntrada.obtenerLongitudTexto();

    // Lo Despliega
    xsVentana::mensajeInformacion("Demo Entrda","La Longitud del Texto es:"+to_string(longitudTexto));
}

// Función para el Texto Emergente
Vacio fnTextoEmergente(xsObjetoGUI* objeto, xsApuntador entrada)
{
    // Variable temporal de Entrada
    xsEntrada tmpEntrada("");    

    // Asigna el Manejador
    tmpEntrada.asignarManejador(XS_OBJETOGUI(entrada));         

    // Variable para el Texto Emergente
    xsCadena textoEmergente;

    // Obtengo el Texto
    textoEmergente = tmpEntrada.obtenerTexto();

    // Coloca el Texto Emergente
    tmpEntrada.colocarTextoEmergente(textoEmergente);
}



