/*--------------------------------------------------------------------
 * FICHERO:  Vmmo.c
 * OBJETIVO: Probar el objeto Memo
 * AUTOR:    Pedro Reina
 * FECHA:    X.12.7.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "BaseDato.h"  /* Para las comprobaciones */
#include "Memo.h"

/*--------------------------------------------------------------------
 * Declaracin de funciones
 *------------------------------------------------------------------*/

void P_Mmo_Crea();
void P_Mmo_AbreL();
void P_Mmo_AbreA();
void P_Mmo_Cierra();
void P_Mmo_Lee();
void P_Mmo_Escribe();
void P_Mmo_Agrega();

cadena TrabajaTexto();

/*--------------------------------------------------------------------
 * Variables globales
 *------------------------------------------------------------------*/

basedato Base;
memo     Memo;

/*--------------------------------------------------------------------
 * Programa principal
 *------------------------------------------------------------------*/
void main()
  {
  int Opcion, Sigue=1;
  contador Fil, Col;

  Pan_Define (PAN_TEXTO);
  while ( Sigue )
    {
    Pan_Color (NEGRO,BLANCO);
    Pan_Limpia();
    Fil = 0, Col = 3;
    Pan_PonTexto (Fil++,Col,"Prueba del objeto Memo" );
    Pan_PonTexto (Fil++,Col,"======================" );
    Fil++;
    Pan_PonTexto (Fil++,Col,"0. Fin del programa" );
    Pan_PonTexto (Fil++,Col,"1. Paso a grfico" );
    Pan_PonTexto (Fil++,Col,"2. Paso a texto" );
    Pan_PonTexto (Fil++,Col,"3. Mmo_Crea()" );
    Pan_PonTexto (Fil++,Col,"4. Mmo_AbreL()" );
    Pan_PonTexto (Fil++,Col,"5. Mmo_AbreA()" );
    Pan_PonTexto (Fil++,Col,"6. Mmo_Cierra()" );
    Pan_PonTexto (Fil++,Col,"7. Mmo_Lee()" );
    Pan_PonTexto (Fil++,Col,"8. Mmo_Agrega()" );
    Pan_PonTexto (Fil++,Col,"9. Mmo_Escribe()" );
    Fil++;
    Pan_PonTexto (Fil++,Col,"Introduce nmero de opcin: " );
    scanf ( "%d", &Opcion );
    getchar();

    switch ( Opcion )
      {
      case 0:   Sigue = 0;               break;
      case 1:   Pan_Cierra();
                Pan_Define (PAN_GRAFICO);
                break;
      case 2:   Pan_Cierra();
                Pan_Define (PAN_TEXTO);
                break;
      case 3:   P_Mmo_Crea();            break;
      case 4:   P_Mmo_AbreL();           break;
      case 5:   P_Mmo_AbreA();           break;
      case 6:   P_Mmo_Cierra();          break;
      case 7:   P_Mmo_Lee();             break;
      case 8:   P_Mmo_Agrega();          break;
      case 9:   P_Mmo_Escribe();         break;
      }
    }
  Pan_Cierra();
  }

/*--------------------------------------------------------------------
 * Funcin P_Mmo_Crea()
 *------------------------------------------------------------------*/
void P_Mmo_Crea()
  {
  static cadena   Nombre[]   = { "NOMBRE", "COMENTARIO", NIL };
  static char     Tipo[]     = { 'C',      'M' };
  static contador Longitud[] = {  8,        10 };
  static contador Decimal[]  = {  0,        0  };

  cadena NombreBase, NombreMemo;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Mmo_Crea()");

  NombreBase = Fch_Nombre ("Vmmo","dbf");
  NombreMemo = Fch_Nombre ("Vmmo","dbt");
  Pan_PonTexto (2,0,"Creando la base de datos Vmmo");

  Base = Bdt_Crea (NombreBase, Nombre, Tipo, Longitud, Decimal);
  Memo = Mmo_Crea (NombreMemo, "Vmmo");

  if ( Base && Memo ) { Pan_PonTexto (4,0,"Creada."); }
  else                { Pan_PonTexto (4,0,"No se ha creado."); }

  Cad_Destruye (NombreBase);
  Cad_Destruye (NombreMemo);

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Mmo_Cierra()
 *------------------------------------------------------------------*/
void P_Mmo_Cierra()
  {
  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Mmo_Cierra()");

  if ( Base )
    {
    Bdt_Cierra (Base);
    Base = NIL;
    Pan_PonTexto (2,0,"Base de datos cerrada.");
    }
  else
    { Pan_PonTexto (2,0,"La base de datos no estaba abierta."); }

  if ( Memo )
    {
    Mmo_Cierra (Memo);
    Memo = NIL;
    Pan_PonTexto (3,0,"Fichero memo cerrado.");
    }
  else
    { Pan_PonTexto (3,0,"El fichero memo no estaba abierto."); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Mmo_AbreL()
 *------------------------------------------------------------------*/
void P_Mmo_AbreL()
  {
  cadena Nombre, NombreBase, NombreMemo;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Mmo_Abre() para leer");

  Pan_PonTexto (2,0,"Nombre de la base de datos para leer (sin extensin):");
  Nombre = Usr_Texto ("",30,4,0,BLANCO,NEGRO);
  Pan_Color (NEGRO,BLANCO);
  NombreBase = Fch_Nombre (Nombre,"dbf");
  NombreMemo = Fch_Nombre (Nombre,"dbt");
  Cad_Destruye (Nombre);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( (Base = Bdt_Abre (NombreBase, BDT_LECTURA)) &&
         (Memo = Mmo_Abre (NombreMemo, MMO_LECTURA)) )
      {
      Pan_PonTexto (6,0,"Registro disponible: ");
      Pan_Entero (Mmo_Disponible(Memo),1);
      }
    }

  Cad_Destruye (NombreBase);
  Cad_Destruye (NombreMemo);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Mmo_Lee()
 *------------------------------------------------------------------*/
void P_Mmo_Lee()
  {
  entero   Registro;
  contador Bloque;
  caracter Aux[11];
  cadena   Texto, Inutil;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Mmo_Lee()");

  Pan_PonTexto (2,4,"Nmero de registro de la base de datos:");
  Registro = Usr_Entero (0,3,0,(contador)(Bdt_TotalRegistro(Base)-1),
                         3,4,BLANCO,NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    Bdt_LeeRegistro (Base, Registro);
    Bdt_CampoNumero (Base, 0, Aux);
    Pan_PonTexto (4,4,"Campo NOMBRE: ");
    Pan_Texto (Aux);
    Bdt_CampoNumero (Base, 1, Aux);
    Pan_PonTexto (5,4,"Campo COMENTARIO: ");
    Pan_Texto (Aux);
    Bloque = atoi(Aux);
    Pan_PonTexto (6,4,"Bloque en el fichero memo: ");
    Pan_Entero (Bloque, 1);
    if ( Bloque )
      {
      if ( Texto = Mmo_Lee (Memo, Bloque) )
        {
        Inutil = TrabajaTexto (Texto);
        if ( Inutil )  { Cad_Destruye(Inutil); }
        Cad_Destruye (Texto);
        }
      else { Pan_PonTexto (7,4,"No se puede leer el campo memo"); }
      }
    else
      { Pan_PonTexto (7,4,"No hay campo memo"); }
    }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Mmo_AbreA()
 *------------------------------------------------------------------*/
void P_Mmo_AbreA()
  {
  cadena Nombre, NombreBase, NombreMemo;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Mmo_Abre() para actualizar");

  Pan_PonTexto (2,0,
      "Nombre de la base de datos para actualizar (sin extensin):");
  Nombre = Usr_Texto ("",30,4,0,BLANCO,NEGRO);
  Pan_Color (NEGRO,BLANCO);
  NombreBase = Fch_Nombre (Nombre,"dbf");
  NombreMemo = Fch_Nombre (Nombre,"dbt");
  Cad_Destruye (Nombre);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( (Base = Bdt_Abre (NombreBase, BDT_ACTUALIZACION)) &&
         (Memo = Mmo_Abre (NombreMemo, MMO_ACTUALIZACION)) )
      {
      Pan_PonTexto (6,0,"Registro disponible: ");
      Pan_Entero (Mmo_Disponible(Memo),1);
      }
    }

  Cad_Destruye (NombreBase);
  Cad_Destruye (NombreMemo);

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Mmo_Escribe()
 *------------------------------------------------------------------*/
void P_Mmo_Escribe()
  {
  entero   Registro;
  contador Bloque;
  caracter Aux[11];
  cadena   Texto, Nuevo;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Mmo_Escribe()");

  Pan_PonTexto (2,4,"Nmero de registro de la base de datos:");
  Registro = Usr_Entero (0,3,0,(contador)(Bdt_TotalRegistro(Base)-1),
                         3,4,BLANCO,NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    Bdt_LeeRegistro (Base, Registro);
    Bdt_CampoNumero (Base, 0, Aux);
    Pan_PonTexto (4,4,"Campo NOMBRE: ");
    Pan_Texto (Aux);
    Bdt_CampoNumero (Base, 1, Aux);
    Pan_PonTexto (5,4,"Campo COMENTARIO: ");
    Pan_Texto (Aux);
    Bloque = atoi(Aux);
    Pan_PonTexto (6,4,"Bloque en el fichero memo: ");
    Pan_Entero (Bloque, 1);
    if ( Bloque && (Texto = Mmo_Lee (Memo, Bloque)) )
      {
      Nuevo = TrabajaTexto (Texto);
      Cad_Destruye (Texto);
      if ( Nuevo )
        {
        if ( Tec_Ultima() != TEC_ESC )
          {
          Bloque = Mmo_Escribe (Memo, Bloque, Nuevo);
          Pan_PonTexto (7,4,"Nuevo bloque en el fichero memo: ");
          Pan_Entero (Bloque, 1);
          if ( Bloque )
            {
            sprintf (Aux, "%10d", Bloque);
            Bdt_PonCampoNumero (Base, 1, Aux);
            Bdt_EscribeRegistro (Base, Registro);
            }
          }
        Cad_Destruye(Nuevo);
        }
      }
    else { Pan_PonTexto (7,4,"No hay o no se puede leer el campo memo"); }
    }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Mmo_Agrega()
 *------------------------------------------------------------------*/
void P_Mmo_Agrega()
  {
  entero   Registro;
  contador Bloque;
  caracter Aux[11];
  cadena   Texto;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Mmo_Agrega()");

  Pan_PonTexto (2,4,"Campo NOMBRE: ");
  Texto = Usr_Texto ("",9,2,19,BLANCO,NEGRO);
  if ( Tec_Ultima() != TEC_ESC )
    {
    Bdt_LimpiaRegistro (Base);
    Bdt_PonCampoNumero (Base, 0, Texto);
    Cad_Destruye (Texto);
    Pan_Color (NEGRO,BLANCO);
    Pan_PonTexto (4,4,"Rellena el campo COMENTARIO: ");
    Texto = TrabajaTexto ("");
    if ( Tec_Ultima() != TEC_ESC )
      {
      Bloque = Mmo_Agrega (Memo, Texto);
      Pan_PonTexto (6,4,"Bloque en el fichero memo: ");
      Pan_Entero (Bloque, 1);
      if ( Bloque )
        {
        sprintf (Aux, "%10d", Bloque);
        Bdt_PonCampoNumero (Base, 1, Aux);
        if ( Bdt_AgregaRegistro (Base, &Registro) )
          {
          Pan_PonTexto (7,4,"Grabado el registro ");
          Pan_Entero (Registro,1);
          }
        else  { Pan_PonTexto (7,4,"No se puede grabar el registro"); }
        }
      }
    Cad_Destruye (Texto);
    }
  else  { Cad_Destruye (Texto); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin TrabajaTexto()
 *------------------------------------------------------------------*/
cadena TrabajaTexto(Texto)
cadena Texto;
  {
  static cadena Regleta = "....:....1....:....2....:....3....:....4";
  region Region;
  cadena Respuesta;

  if ( Region = Reg_Crea (13,19,19,58) )
    {
    Cdr_Caja (CDR_SIMPLE,12,18,20,59,NEGRO,ROJO);
    Pan_Color (NEGRO, BLANCO);
    Pan_PonTexto (11,19,Regleta);
    Respuesta = Usr_Edita (Region, Texto);
    Reg_Destruye (Region);
    }
  else  { Pan_PonTexto (13, 19, "No se puede crear region"); }

  return ( Respuesta );
  }
