/*--------------------------------------------------------------------
 * FICHERO:  MenEscr3.c
 * OBJETIVO: Definir las funciones privadas Men_EscribeHorizontal(),
 *           Men_EscribeVerticalFijo() y Men_EscribeVerticalMovil(),
 * AUTOR:    Pedro Reina
 * FECHA:    J.18.5.1995
 *------------------------------------------------------------------*/

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

#include "Menu.h"

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

/*--------------------------------------------------------------------
 * FUNCION:  Men_EscribeHorizontal()
 * OBJETIVO: Escribir las opciones de un men horizontal
 * ENTRADAS: El men, la opcin que debe aparecer seguro y si hay que
 *           resaltarla o no
 * SALIDAS:  Ninguna
 * EJEMPLO:  Men_EscribeHorizontal ( MenuPrincipal, 7, SI )
 *------------------------------------------------------------------*/
void Men_EscribeHorizontal (Menu, Opcion, HayQueResaltar)
menu   Menu;
entero Opcion;
logico HayQueResaltar;
  {
  entero i;

  Pan_Borra (Men_Papel(Menu), Men_FilSup(Menu), Men_ColIzq(Menu),
                              Men_FilInf(Menu), Men_ColDer(Menu));

  for ( i=1 ; i<=Men_Total(Menu) ; i++ )
    {
    if ( i == Opcion && HayQueResaltar )
      { Men_EscribeResaltado (Menu, i, Men_FilSup(Menu),
        Men_Columna(Menu,i), Men_TextoVector(Menu,i)); }
    else
      { Men_EscribeNormal (Menu, i, Men_FilSup(Menu),
        Men_Columna(Menu,i), Men_TextoVector(Menu,i)); }
    }
  }

/*--------------------------------------------------------------------
 * FUNCION:  Men_EscribeVerticalFijo()
 * OBJETIVO: Escribir las opciones de un men vertical en el que todas
 *           sus opciones caben en la parte de pantalla asignada
 * ENTRADAS: El men, la opcin que debe aparecer seguro y si hay que
 *           resaltarla o no
 * SALIDAS:  Ninguna
 * EJEMPLO:  Men_EscribeVerticalFijo ( MenuPrincipal, 7, SI )
 *------------------------------------------------------------------*/
void Men_EscribeVerticalFijo (Menu, Opcion, HayQueResaltar)
menu   Menu;
entero Opcion;
logico HayQueResaltar;
  {
  entero i;
  lista  L;
  cadena Texto;
  caracter Aux[MEN_MAXLONG];

  Pan_Borra (Men_Papel(Menu), Men_FilSup(Menu), Men_ColIzq(Menu),
                              Men_FilInf(Menu), Men_ColDer(Menu));

  if ( Men_Tipo(Menu) == MEN_LISTA )
    { L = (lista) Men_DatoOpcion(Menu); }

  for ( i=1 ; i<=Men_Total(Menu) ; i++ )
    {
    switch ( Men_Tipo(Menu) )
      {
      case MEN_VECTOR: Texto = Men_TextoVector(Menu,i);
                       break;
      case MEN_LISTA:  Texto = (cadena) Lis_Contenido(L);
                       L = Lis_Siguiente (L);
                       break;
      case MEN_PROPIO: ((men_funcion)(Men_DatoOpcion(Menu)))(i, Aux);
                       Texto = Aux; 
                       break;
      }

    if ( i == Opcion && HayQueResaltar )
      { Men_EscribeResaltado (Menu, i, Men_FilSup(Menu)+(octeto)i-1,
        Men_ColIzq(Menu), Texto); }
    else
      { Men_EscribeNormal (Menu, i, Men_FilSup(Menu)+(octeto)i-1,
        Men_ColIzq(Menu), Texto); }
    }
  }

/*--------------------------------------------------------------------
 * FUNCION:  Men_EscribeVerticalMovil()
 * OBJETIVO: Escribir las opciones de un men vertical en el que no todas
 *           sus opciones caben en la parte de pantalla asignada
 * ENTRADAS: El men, la opcin que debe aparecer seguro y si hay que
 *           resaltarla o no
 * SALIDAS:  Ninguna
 * EJEMPLO:  Men_EscribeVerticalMovil ( MenuPrincipal, 7, SI )
 * ALGORITMO:
 *     Calcular la primera y ltima opcin que se pueden mostrar
 *     Si alguna es inadmisible, rectificar
 *     Para cada fila disponible
 *       Si es la primera y no se muestra la primera opcin
 *          Indicar que arriba hay ms opciones
 *       Si es la ltima y no se muestra la ltima opcin
 *          Indicar que arriba hay ms opciones
 *       Si la opcin no hay que resaltarla, escribirla normal
 *       Si la opcin hay que resaltarla, escribirla resaltada
 *------------------------------------------------------------------*/
void Men_EscribeVerticalMovil (Menu, Opcion, HayQueResaltar)
menu   Menu;
entero Opcion;
logico HayQueResaltar;
  {
  entero   Primero, Ultimo, i;
  octeto   Pos;
  lista    L;
  cadena   Texto;
  caracter Aux[MEN_MAXLONG];

  Pan_Borra (Men_Papel(Menu), Men_FilSup(Menu), Men_ColIzq(Menu),
                              Men_FilInf(Menu), Men_ColDer(Menu));

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

  if ( Men_Tipo(Menu) == MEN_LISTA )
    {
    L = (lista) Men_DatoOpcion(Menu);
    for ( i=1 ; i<Primero ; i++ , L=Lis_Siguiente(L) )
      ;
    }

  for ( Pos=Men_FilSup(Menu) , i=Primero ; i<=Ultimo ; Pos++ , i++ )
    {
    switch ( Men_Tipo(Menu) )
      {
      case MEN_VECTOR: Texto = Men_TextoVector(Menu,i); break;
      case MEN_LISTA:  Texto = (cadena) Lis_Contenido(L);
                       L = Lis_Siguiente (L);
                       break;
      case MEN_PROPIO: ((men_funcion)(Men_DatoOpcion(Menu)))(i, Aux);
                       Texto = Aux; 
                       break;
      }

    if  ( i==Primero && Primero!=1 )
         { Men_IndicaHayMas (Menu, Pos, CAR_FLECHA_ARRIBA); }
    else if ( i==Ultimo && Ultimo!=Men_Total(Menu) )
         { Men_IndicaHayMas (Menu, Pos, CAR_FLECHA_ABAJO); }
    else if ( i==Opcion && HayQueResaltar )
         { Men_EscribeResaltado (Menu, i, Pos, Men_ColIzq(Menu), Texto); }
    else
         { Men_EscribeNormal (Menu, i, Pos, Men_ColIzq(Menu), Texto); }
    }
  }