/*--------------------------------------------------------------------
 * FICHERO:  MenMuest.c
 * OBJETIVO: Definir la funcin Men_Muestra()
 * AUTOR:    Pedro Reina
 * FECHA:    L.7.8.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Men_MuestraVerticalMovil()
 *------------------------------------------------------------------*/

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

#include "Menu.h"

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

static logico Men_MuestraVerticalMovil();

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Men_Muestra()
 * OBJETIVO: Mostrar las opciones de un men
 * ENTRADAS: El men, la opcin que debe aparecer seguro al
 *           comenzar y el texto que debe aparecer en la primera
 *           lnea de mensajes
 * SALIDAS:  Lgica, que indica cmo ha salido el usuario
 * EJEMPLO:  Men_Muestra ( MenuPrincipal, 7 , "Mira la relacin")
 *------------------------------------------------------------------*/
logico Men_Muestra (Menu, Opcion, Texto)
menu   Menu;
entero Opcion;
cadena Texto;
  {
  cadena MensajeCorto, MensajeLargo, Mensaje;
  logico Respuesta;

  MensajeCorto = "ENTER: acepta. ESC: anula.";
  MensajeLargo = " ARRIBA, ABAJO, REPAG, AVPAG: mueve.";

  Pan_CursorVisible (NO);

  if ( Men_Modo(Menu) == MEN_HORIZONTAL || Men_Cabe(Menu) )
    {
    if ( Men_Modo(Menu) == MEN_HORIZONTAL )
      { Men_EscribeHorizontal (Menu, Opcion, NO); }
    else
      { Men_EscribeVerticalFijo (Menu, Opcion, NO); }

    Usr_Indica (Texto, MensajeCorto);
    Respuesta = Men_Tecla (Menu, (tecla *)NIL);
    }

  else
    {
    Mensaje = Cad_Une (MensajeCorto, MensajeLargo, CAD_FIN);
    Usr_Indica (Texto, Mensaje);
    Cad_Destruye (Mensaje);
    Respuesta = Men_MuestraVerticalMovil (Menu, Opcion);
    }

  Usr_BorraZona (NEGRO);

  return ( Respuesta );
  }

/*--------------------------------------------------------------------
 * FUNCION:  Men_MuestraVerticalMovil()
 * OBJETIVO: Mostrar las opciones de un men vertical que tiene ms
 *           opciones de las que caben en pantalla
 * ENTRADAS: El men y la opcin que debe aparecer seguro al comenzar
 * SALIDAS:  Lgica, que indica cmo ha salido el usuario
 * EJEMPLO:  Men_Muestra ( MenuPrincipal, 7 )
 *------------------------------------------------------------------*/
static logico Men_MuestraVerticalMovil (Menu, Opcion)
menu   Menu;
entero Opcion;
  {
  static tecla TeclaTrata[] = { TEC_ARRIBA, TEC_ABAJO, TEC_REPAG,
                                TEC_AVPAG, NIL };
  entero   Primero, Ultimo;
  octeto   Estado;
  caracter Texto [MEN_MAXLONG];
  logico   Sigue=SI, Respuesta;

  Men_CalculaPrimeroUltimo (Menu, Opcion, &Primero, &Ultimo);
  Men_EscribeVerticalMovil (Menu, Opcion, NO);

  while ( Sigue )
    {
    Estado = Men_Tecla (Menu, TeclaTrata);
    
    if ( Estado == MEN_SI )
      { 
      Sigue = NO;
      Respuesta = SI;
      }

    else if ( Estado == MEN_NO )
      { 
      Sigue = NO;
      Respuesta = NO;
      }
      
    else
      {
      switch ( Tec_Ultima() )
        {  
        case TEC_ABAJO:
          if ( Ultimo != Men_Total(Menu) )
            {
            Primero++;
            Ultimo++;
            Pan_Papel (Men_Papel(Menu));
            Pan_Mueve (PAN_ARRIBA, 1, Men_FilSup(Menu)+1, Men_ColIzq(Menu),
                                      Men_FilInf(Menu)-1, Men_ColDer(Menu));
            if ( Primero == 2 )  
              { Men_IndicaHayMas (Menu, Men_FilSup(Menu), CAR_FLECHA_ARRIBA); }
            Men_Texto (Menu, Ultimo-1, Texto);
            Men_EscribeNormal (Menu, Ultimo-1, Men_FilInf(Menu)-1,
                               Men_ColIzq(Menu), Texto);
            if ( Ultimo == Men_Total(Menu) )
              {
              Men_Texto (Menu, Ultimo, Texto);
              Pan_Borra (Men_Papel(Menu), Men_FilInf(Menu), Men_ColIzq(Menu),
                                          Men_FilInf(Menu), Men_ColDer(Menu));
              Men_EscribeNormal (Menu, Ultimo, Men_FilInf(Menu),
                                 Men_ColIzq(Menu), Texto);
              }
            }
          else  { Son_MalaTecla(); }
          break;

        case TEC_ARRIBA:
          if ( Primero != 1 )
            {
            Primero--;
            Ultimo--;
            Pan_Papel (Men_Papel(Menu));
            Pan_Mueve (PAN_ABAJO, 1, Men_FilSup(Menu)+1, Men_ColIzq(Menu),
                                     Men_FilInf(Menu)-1, Men_ColDer(Menu));
            if ( Ultimo == Men_Total(Menu)-1 )  
              { Men_IndicaHayMas (Menu, Men_FilInf(Menu), CAR_FLECHA_ABAJO); }
            Men_Texto (Menu, Primero+1, Texto);
            Men_EscribeNormal (Menu, Primero+1, Men_FilSup(Menu)+1,
                               Men_ColIzq(Menu), Texto);
            if ( Primero == 1 )
              {
              Men_Texto (Menu, (entero)1, Texto);
              Pan_Borra (Men_Papel(Menu), Men_FilSup(Menu), Men_ColIzq(Menu),
                                          Men_FilSup(Menu), Men_ColDer(Menu));
              Men_EscribeNormal (Menu, (entero)1, Men_FilSup(Menu),          
                                 Men_ColIzq(Menu), Texto);
              }
            }
          else  { Son_MalaTecla(); }
          break;

        case TEC_AVPAG:                                        
          if ( Ultimo != Men_Total(Menu) )
            {
            Opcion = Min ( Primero/2 + Ultimo/2 + Men_Alto(Menu) - 2, 
                           Men_Total(Menu) );
            Men_CalculaPrimeroUltimo (Menu, Opcion, &Primero, &Ultimo);
            Men_EscribeVerticalMovil (Menu, Opcion, NO);
            }

          else  { Son_MalaTecla(); }
          break;

        case TEC_REPAG:                                        
          if ( Primero != 1 )
            {
            Opcion = Max ( Primero/2 + Ultimo/2 - Men_Alto(Menu) + 2, 1 );
            Men_CalculaPrimeroUltimo (Menu, Opcion, &Primero, &Ultimo);
            Men_EscribeVerticalMovil (Menu, Opcion, NO);
            }

          else  { Son_MalaTecla(); }
          break;
        }                                           
      }
    } /* Fin while Sigue */
    
  return ( Respuesta );
  }