/*--------------------------------------------------------------------
 * FICHERO:  UsrTexto.c
 * OBJETIVO: Definir la funcin Usr_Texto()
 * AUTOR:    Pedro Reina
 * FECHA:    V.14.7.1995
 *------------------------------------------------------------------*/

#include "Usuario.h"

/*--------------------------------------------------------------------
 * Definicin de funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Usr_Texto()
 * OBJETIVO: Devolver una cadena determinada por el usuario 
 *           despus de editar la que se le ofrece
 * ENTRADAS: La cadena que hay que editar, el ancho asignado,
 *           las coordenadas donde se edita y los colores
 * SALIDAS:  Una cadena
 * NOTA:     La cadena devuelta hay que destruirla cuando no 
 *           sea necesaria
 * EJEMPLO:  Usr_Texto ("Artesonado",20,1,1,BLANCO,NEGRO)
 * ALGORITMO:
 *     Formar la lista de teclas admitidas
 *     Decir al usuario lo que puede hacer
 *     Guardar la cadena
 *     Hacer Pos 0, posicin del cursor relativa al comienzo de la cadena
 *     Hacer Ultimo la posicin del ltimo caracter de la cadena
 *     Hacer modo insertar
 *     Escribir y recordar la situacin del sujeta-maysculas
 *     Poner el cursor
 *     Repetir mientras el usuario no se decida
 *       Pedir una tecla en el rango admitido con validacin rpida
 *       Si hay tecla
 *         Si es ENTER, terminar
 *         Si es ESC, tomar la cadena original y terminar
 *         Si es DERECHA, IZQUIERDA, INICIO o FIN, mover el cursor
 *         Si es INSERTAR, cambiar el modo
 *         Si es RETROCESO, mover el cursor a la izquierda y quitar un car.
 *         Si es SUPRIMIR, quitar un caracter
 *         En cualquier otro caso, ser una letra y
 *            Si el modo es insertar, hacer un hueco en la cadena
 *            Colocar el nuevo carcter
 *            Mover el cursor
 *         Poner los colores
 *         Limpiar la zona asignada
 *         Escribir la cadena
 *       Si no hay tecla
 *         Mirar la posicin del sujeta-maysculas
 *         Si es necesario, escribir la nueva situacin
 *     Copiar la cadena editada en Cadena y devolverla
 *------------------------------------------------------------------*/
cadena   Usr_Texto (Cadena,Ancho,Fil,Col,Papel,Tinta)
cadena   Cadena;
contador Ancho,Fil,Col;
octeto   Papel,Tinta;
  {
  cadena   Respuesta;
  logico   Decidido,Insertar,EstadoMayus,NuevoMayus;
  cadena   Linea1, Linea2;
  tecla    Tecla, ListaTecla[Tec_Max()-Tec_Min()+13];
  contador Pos,Ultimo,i,j=0;
  char     Car;

  ListaTecla[j++] = TEC_ENTER;
  ListaTecla[j++] = TEC_ESC;
  ListaTecla[j++] = TEC_IZQUIERDA;
  ListaTecla[j++] = TEC_DERECHA;
  ListaTecla[j++] = TEC_INICIO;
  ListaTecla[j++] = TEC_FIN;
  ListaTecla[j++] = TEC_INSERTAR;
  ListaTecla[j++] = TEC_RETROCESO;
  ListaTecla[j++] = TEC_SUPRIMIR;
  ListaTecla[j++] = TEC_F4;
  ListaTecla[j++] = TEC_F5;
  for ( i=0 ; i<=Tec_Max()-Tec_Min() ; i++ )
    { ListaTecla[j++] = (tecla)(Tec_Min()+i); }
  ListaTecla[j] = NIL;

  Linea1 = "Escribe y edita el texto. Puedes usar CURSOR, RETROCESO, SUPRIMIR";
  Linea2 = "ENTER: acepta. ESC: anula. F4: original. F5: borra";
  Usr_Indica (Linea1,Linea2);
  Cdr_Linea (CDR_SIMPLE,USR_MENSAJE,70,USR_MENSAJE+1,70,VERDE,NEGRO);

  Respuesta = Cad_Crea (Ancho);
  Cad_Copia (Respuesta,Cadena);
  Pos = 0 ; Ultimo = Cad_Longitud (Cadena);
  Insertar = SI; Usr_IndicaModo(Insertar);

  if ( Tec_FijadoMayus() ) { EstadoMayus = NuevoMayus = SI; }
  else                     { EstadoMayus = NuevoMayus = NO; }
  Usr_IndicaMayus ( EstadoMayus );
  Pan_CursorVisible (SI);

  Pan_Color (Papel,Tinta);
  Pan_Borra (Papel,Fil,Col,Fil,Col+Ancho-1);
  Pan_PonTexto (Fil,Col,Respuesta);

  Decidido = NO;
  while ( !Decidido )
    {
    Pan_Cursor (Fil,Col+Pos);
#ifdef OLIMPO_PC
    if ( Pan_Modo() == PAN_GRAFICO )
      {
      if ( ! (Car = Respuesta[Pos]) ) { Car = ' '; }
      Pan_Color (Tinta,Papel);
      Pan_Caracter (Car);
      }
#endif
    Tecla = Tec_ValidadaRapido (ListaTecla);
    if ( Tecla )
      {
      switch ( Tecla )
        {
        case TEC_ENTER :
                 Decidido = SI; break;
        case TEC_ESC :
                 Decidido = SI; Cad_Copia(Respuesta,Cadena); break;
        case TEC_F4 :
                 Pos = 0;
                 Cad_Copia(Respuesta,Cadena); break;
        case TEC_F5 :
                 Pos = 0;
                 Cad_Copia(Respuesta,""); break;
        case TEC_IZQUIERDA :
                 if (Pos) { Pos--; } break;
        case TEC_DERECHA :
                 if ( Respuesta[Pos] && ( Pos+1 != Ancho ) )
                   { Pos++; }
                 break;
        case TEC_INICIO :
                 Pos = 0; break;
        case TEC_FIN :
                 Pos = Min(Ultimo,Ancho-1); break;
        case TEC_INSERTAR :
                 if ( Insertar ) { Insertar = NO; }
                 else            { Insertar = SI; }
                 Usr_IndicaModo(Insertar); break;
        case TEC_RETROCESO :
                 if (Pos) { Pos--; } /* No se pone break */
        case TEC_SUPRIMIR :
                 if ( Respuesta[Pos] )
                   {
                   Cad_QuitaCar(Respuesta,Pos);
                   Ultimo--;
                   }
                 break;
        default :
                 if ( Respuesta[Pos] )
                   {
                   if ( Insertar )
                     {
                     Cad_Mueve(Respuesta,Pos,Ancho);
                     Ultimo = Min(Ultimo+1,Ancho);
                     }
                   Respuesta[Pos] = (char)Tecla;
                   }
                 else
                   {
                   Respuesta[Pos+1] = NULO;
                   Respuesta[Pos] = (char)Tecla;
                   Ultimo = Min(Ultimo+1,Ancho);
                   }
                 Pos = Min(Pos+1,Ancho-1);
                 break;
        } /* Fin switch */
      Pan_Color (Papel,Tinta);
      Pan_Borra (Papel,Fil,Col,Fil,Col+Ancho-1);
      Pan_PonTexto (Fil,Col,Respuesta);
      } /* Fin if Tecla */
    else
      {
      if ( Tec_FijadoMayus() ) { NuevoMayus = SI; }
      else                     { NuevoMayus = NO; }
      if ( EstadoMayus != NuevoMayus )
        {
        EstadoMayus = NuevoMayus;
        Usr_IndicaMayus ( EstadoMayus );
        }
      }
    } /* Fin while !Decidido */

  Usr_BorraZona (NEGRO);
  return ( Respuesta );
  }