/*--------------------------------------------------------------------
 * FICHERO:       Menu.h
 * OBJETIVO:      Definir el objeto "Men"
 * IDENTIFICADOR: Men
 * AUTOR:         Pedro Reina
 * FECHA:         V.14.7.1995
 * OBJETOS UTILIZADOS: Memoria, Pantalla, Caracter, Lista, Cadena, 
 *                     Usuario, Tecla
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones pblicas
 *
 *   Men_Horizontal()             MenHoriz.c
 *   Men_Vertical()               MenVert.c
 *   Men_Crea()                   MenCrea.c
 *   Men_Color()                  MenCreOb.c
 *   Men_Destruye()               MenCreOb.c
 *   Men_TeclaSi()                Menu.h
 *   Men_TeclaNo()                Menu.h
 *   Men_Disponible()             Menu.h
 *   Men_Escribe()                MenEscri.c        
 *   Men_Texto()                  MenTexto.c        
 *   Men_Muestra()                MenMuest.c        
 *   Men_Ejecuta()                MenEjecu.c        
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones conocidas
 *
 *   Ninguna
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Men_TotalOpcion()            MenTotal.c
 *   Men_CreaObjeto()             MenCreOb.c
 *   Men_Modo()                   Menu.h
 *   Men_PonModo()                Menu.h
 *   Men_FilSup()                 Menu.h
 *   Men_PonFilSup()              Menu.h
 *   Men_FilInf()                 Menu.h
 *   Men_ColIzq()                 Menu.h
 *   Men_PonColIzq()              Menu.h
 *   Men_ColDer()                 Menu.h
 *   Men_Papel()                  Menu.h
 *   Men_PonPapel()               Menu.h
 *   Men_Tinta()                  Menu.h
 *   Men_PonTinta()               Menu.h
 *   Men_PapelResaltado()         Menu.h
 *   Men_PonPapelResaltado()      Menu.h
 *   Men_TintaResaltado()         Menu.h
 *   Men_PonTintaResaltado()      Menu.h
 *   Men_ColorCarNormal()         Menu.h
 *   Men_PonColorCarNormal()      Menu.h
 *   Men_ColorCarResaltado()      Menu.h
 *   Men_PonColorCarResaltado()   Menu.h
 *   Men_ColorNoDisponible()      Menu.h
 *   Men_PonColorNoDisponible()   Menu.h
 *   Men_ColorFlecha()            Menu.h
 *   Men_PonColorFlecha()         Menu.h
 *   Men_Tipo()                   Menu.h
 *   Men_PonTipo()                Menu.h
 *   Men_DatoOpcion()             Menu.h
 *   Men_PonDatoOpcion()          Menu.h
 *   Men_Total()                  Menu.h
 *   Men_PonTotal()               Menu.h
 *   Men_DirDisponible()          Menu.h
 *   Men_PonDirDisponible()       Menu.h
 *   Men_DiTeclaSi()              Menu.h
 *   Men_DiTeclaNo()              Menu.h
 *   Men_DiDisponible()           Menu.h
 *   Men_TextoVector()            Menu.h
 *   Men_PonTextoVector()         Menu.h
 *   Men_DirLugar()               Menu.h
 *   Men_PonDirLugar()            Menu.h
 *   Men_Lugar()                  Menu.h
 *   Men_PonLugar()               Menu.h
 *   Men_DirColumna()             Menu.h
 *   Men_PonDirColumna()          Menu.h
 *   Men_Columna()                Menu.h
 *   Men_PonColumna()             Menu.h
 *   Men_Ancho()                  Menu.h
 *   Men_Alto()                   Menu.h
 *   Men_PonAncho()               Menu.h
 *   Men_PonAlto()                Menu.h
 *   Men_Cabe()                   Menu.h
 *   Men_EscribeHorizontal()      MenEscr3.c
 *   Men_EscribeVerticalFijo()    MenEscr3.c
 *   Men_EscribeVerticalMovil()   MenEscr3.c
 *   Men_IndicaHayMas()           MenIndic.c
 *   Men_Tecla()                  MenTecla.c
 *   Men_CalculaPrimeroUltimo()   MenCalcu.c
 *   Men_EjecutaHorizontal()      MenEjeHo.c        
 *   Men_EjecutaVerticalFijo()    MenEjeVe.c        
 *   Men_EjecutaVerticalMovil()   MenEjeVe.c        
 *   Men_AgregaAtajo()            MenAgrAt.c        
 *------------------------------------------------------------------*/

#ifndef _MENU_
#define _MENU_

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

#include "Memoria.h"
#include "Pantalla.h"
#include "Caracter.h"
#include "Lista.h"
#include "Cadena.h"
#include "Usuario.h"
#include "Tecla.h"

/*--------------------------------------------------------------------
 * Definicin de macros constantes
 *------------------------------------------------------------------*/

/* Modos de un men */

#define MEN_HORIZONTAL  (octeto)0
#define MEN_VERTICAL    (octeto)1

/* Tipos de un men */
                      
#define MEN_VECTOR  (octeto)0
#define MEN_LISTA   (octeto)1
#define MEN_PROPIO  (octeto)2

/* Respuestas de Men_Tecla() */
                      
#define MEN_NO     (octeto)0
#define MEN_SI     (octeto)1
#define MEN_TRATA  (octeto)2

/* Mxima longitud de una cadena de un men */

#define MEN_MAXLONG  (octeto)81

/*--------------------------------------------------------------------
 * Definicin del tipo "menu"
 *------------------------------------------------------------------*/
typedef struct {
               octeto  Modo;
               octeto  FilSup;
               octeto  ColIzq;
               octeto  Ancho;
               octeto  Alto;
               octeto  Papel;
               octeto  Tinta;
               octeto  PapelResaltado;
               octeto  TintaResaltado;
               octeto  ColorCarNormal;
               octeto  ColorCarResaltado;
               octeto  ColorNoDisponible;
               octeto  ColorFlecha;
               octeto  Tipo;
               memoria DatoOpcion;
               entero  Total;
               tecla  *TeclaSi;
               tecla  *TeclaNo;
               logico *Disponible;
               octeto *Lugar;
               octeto *Columna;
               } Men_st, *menu;
                             
/*--------------------------------------------------------------------
 * Definicin del tipo "men_funcion"
 *------------------------------------------------------------------*/

typedef logico (*men_funcion)();  /* Puntero a funcion que devuelve 
                                     logico (recibir un entero y una
                                     cadena donde dejar el resultado) */

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

   /* Ninguna */

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

entero Men_Horizontal();
entero Men_Vertical();
entero Men_TotalOpcion();
menu   Men_Crea();
menu   Men_CreaObjeto();
void   Men_Color();
void   Men_Destruye();
void   Men_Escribe();
logico Men_Texto();
logico Men_Muestra();
void   Men_EscribeHorizontal();
void   Men_EscribeVerticalFijo();
void   Men_EscribeVerticalMovil();
void   Men_EscribeNormal();
void   Men_EscribeResaltado();
void   Men_IndicaHayMas();
octeto Men_Tecla();
void   Men_CalculaPrimeroUltimo();
entero Men_Ejecuta();
entero Men_EjecutaHorizontal();
entero Men_EjecutaVerticalFijo();
entero Men_EjecutaVerticalMovil();
tecla *Men_AgregaAtajo();

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

/*--------------------------------------------------------------------
 * MACRO:    Men_Modo()
 * OBJETIVO: Decir el modo de men
 * ENTRADAS: El men
 * SALIDAS:  El modo
 * EJEMPLO:  Men_Modo ( MenuPrincipal )
 * NOTA:     El modo puede ser MEN_HORIZONTAL y MEN_VERTICAL
 *------------------------------------------------------------------*/
#define Men_Modo(m)  ((m)->Modo)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonModo()
 * OBJETIVO: Poner el modo de men
 * ENTRADAS: El men y el modo
 * SALIDAS:  El modo
 * EJEMPLO:  Men_PonModo ( MenuPrincipal, MEN_HORIZONTAL )
 *------------------------------------------------------------------*/
#define Men_PonModo(m,d)  ((m)->Modo=(d))

/*--------------------------------------------------------------------
 * MACRO:    Men_FilSup()
 * OBJETIVO: Decir la fila superior de un men
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica la fila superior
 * EJEMPLO:  Men_FilSup ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_FilSup(m)  ((m)->FilSup)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonFilSup()
 * OBJETIVO: Poner la fila superior de un men
 * ENTRADAS: El men y un octeto que indica la fila superior
 * SALIDAS:  Un octeto que indica la fila superior
 * EJEMPLO:  Men_PonFilSup ( MenuPrincipal, 4 )
 *------------------------------------------------------------------*/
#define Men_PonFilSup(m,v)  ((m)->FilSup=(v))

/*--------------------------------------------------------------------
 * MACRO:    Men_ColIzq()
 * OBJETIVO: Decir la columna izquierda de un men
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica la columna izquierda
 * EJEMPLO:  Men_ColIzq ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_ColIzq(m)  ((m)->ColIzq)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonColIzq()
 * OBJETIVO: Poner la columna izquierda de un men
 * ENTRADAS: El men y un octeto que indica la columna izquierda
 * SALIDAS:  Un octeto que indica la columna izquierda
 * EJEMPLO:  Men_PonColIzq ( MenuPrincipal, 7 )
 *------------------------------------------------------------------*/
#define Men_PonColIzq(m,c)  ((m)->ColIzq=(c))

/*--------------------------------------------------------------------
 * MACRO:    Men_Ancho()
 * OBJETIVO: Decir la anchura de la parte de pantalla asignada a un men
 * ENTRADAS: El men
 * SALIDAS:  La anchura
 * EJEMPLO:  Men_Ancho ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_Ancho(m)  ((m)->Ancho)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonAncho()
 * OBJETIVO: Poner la anchura de la parte de pantalla asignada a un men
 * ENTRADAS: El men y la anchura
 * SALIDAS:  La anchura
 * EJEMPLO:  Men_PonAncho ( MenuPrincipal, 12 )
 *------------------------------------------------------------------*/
#define Men_PonAncho(m,a)  ((m)->Ancho=a)

/*--------------------------------------------------------------------
 * MACRO:    Men_Alto()
 * OBJETIVO: Decir la altura de la parte de pantalla asignada a un men
 * ENTRADAS: El men
 * SALIDAS:  La altura
 * EJEMPLO:  Men_Alto ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_Alto(m)  ((m)->Alto)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonAlto()
 * OBJETIVO: Poner la altura de la parte de pantalla asignada a un men
 * ENTRADAS: El men y la altura
 * SALIDAS:  La altura
 * EJEMPLO:  Men_PonAlto ( MenuPrincipal, 12 )
 *------------------------------------------------------------------*/
#define Men_PonAlto(m,a)  ((m)->Alto=a)

/*--------------------------------------------------------------------
 * MACRO:    Men_FilInf()
 * OBJETIVO: Decir la fila inferior de un men
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica la fila inferior
 * EJEMPLO:  Men_FilInf ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_FilInf(m)  (Men_FilSup(m)+Men_Alto(m)-1)

/*--------------------------------------------------------------------
 * MACRO:    Men_ColDer()
 * OBJETIVO: Decir la columna derecha de un men
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica la columna derecha
 * EJEMPLO:  Men_ColDer ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_ColDer(m)  (Men_ColIzq(m)+Men_Ancho(m)-1)

/*--------------------------------------------------------------------
 * MACRO:    Men_Papel()
 * OBJETIVO: Decir el color de papel de un men
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica el color de papel
 * EJEMPLO:  Men_Papel ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_Papel(m)  ((m)->Papel)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonPapel()
 * OBJETIVO: Poner el color de papel de un men
 * ENTRADAS: El men y un octeto que indica el color de papel
 * SALIDAS:  Un octeto que indica el color de papel
 * EJEMPLO:  Men_PonPapel ( MenuPrincipal, NEGRO )
 *------------------------------------------------------------------*/
#define Men_PonPapel(m,p)  ((m)->Papel=(p))

/*--------------------------------------------------------------------
 * MACRO:    Men_Tinta()
 * OBJETIVO: Decir el color de tinta de un men
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica el color de tinta
 * EJEMPLO:  Men_Tinta ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_Tinta(m)  ((m)->Tinta)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonTinta()
 * OBJETIVO: Poner el color de tinta de un men
 * ENTRADAS: El men y un octeto que indica el color de tinta
 * SALIDAS:  Un octeto que indica el color de tinta
 * EJEMPLO:  Men_PonTinta ( MenuPrincipal, BLANCO )
 *------------------------------------------------------------------*/
#define Men_PonTinta(m,t)  ((m)->Tinta=(t))

/*--------------------------------------------------------------------
 * MACRO:    Men_PapelResaltado()
 * OBJETIVO: Decir el color de papel para las opciones resaltadas
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_DiPapelResaltado ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_PapelResaltado(m)  ((m)->PapelResaltado)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonPapelResaltado() 
 * OBJETIVO: Poner el color de papel para las opciones resaltadas
 * ENTRADAS: El men y un octeto que indica el color
 * SALIDAS:  Un octeto que indica el color de papel
 * EJEMPLO:  Men_PapelResaltado ( MenuPrincipal, BLANCO )
 *------------------------------------------------------------------*/
#define Men_PonPapelResaltado(m,p)  ((m)->PapelResaltado=(p))

/*--------------------------------------------------------------------
 * MACRO:    Men_TintaResaltado() 
 * OBJETIVO: Decir el color de papel para las opciones resaltadas
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_DiTintaResaltado ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_TintaResaltado(m)  ((m)->TintaResaltado)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonTintaResaltado()
 * OBJETIVO: Poner el color de papel para las opciones resaltadas
 * ENTRADAS: El men y un octeto que indica el color
 * SALIDAS:  Un octeto que indica el color de papel
 * EJEMPLO:  Men_TintaResaltado ( MenuPrincipal, NEGRO )
 *------------------------------------------------------------------*/
#define Men_PonTintaResaltado(m,p)  ((m)->TintaResaltado=(p))

/*--------------------------------------------------------------------
 * MACRO:    Men_ColorCarNormal()
 * OBJETIVO: Decir el color de los caracteres que indican un atajo,
 *           cuando la opcin no est seleccionada
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_ColorCarNormal ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_ColorCarNormal(m)  ((m)->ColorCarNormal)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonColorCarNormal()
 * OBJETIVO: Poner el color de los caracteres que indican un atajo,
 *           cuando la opcin no est seleccionada
 * ENTRADAS: El men y un octeto que indica el color
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_PonColorCarNormal ( MenuPrincipal, VERDE )
 *------------------------------------------------------------------*/
#define Men_PonColorCarNormal(m,c)  ((m)->ColorCarNormal=(c))

/*--------------------------------------------------------------------
 * MACRO:    Men_ColorCarResaltado()
 * OBJETIVO: Decir el color de los caracteres que indican un atajo,
 *           cuando la opcin est seleccionada
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_ColorCarResaltado ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_ColorCarResaltado(m)  ((m)->ColorCarResaltado)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonColorCarResaltado()
 * OBJETIVO: Poner el color de los caracteres que indican un atajo,
 *           cuando la opcin est seleccionada
 * ENTRADAS: El men y un octeto que indica el color
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_PonColorCarResaltado ( MenuPrincipal, VERDE )
 *------------------------------------------------------------------*/
#define Men_PonColorCarResaltado(m,r)  ((m)->ColorCarResaltado=(r))

/*--------------------------------------------------------------------
 * MACRO:    Men_ColorNoDisponible()
 * OBJETIVO: Decir el color de la tinta para escribir las opciones
 *           que no estn disponibles
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_ColorNoDisponible ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_ColorNoDisponible(m)  ((m)->ColorNoDisponible)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonColorNoDisponible()
 * OBJETIVO: Poner el color de la tinta para escribir las opciones
 *           que no estn disponibles
 * ENTRADAS: El men y un octeto que indica el color
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_PonColorNoDisponible ( MenuPrincipal, ROJO )
 *------------------------------------------------------------------*/
#define Men_PonColorNoDisponible(m,n)  ((m)->ColorNoDisponible=(n))

/*--------------------------------------------------------------------
 * MACRO:    Men_ColorFlecha()
 * OBJETIVO: Decir el color de la tinta para escribir las flechas
 * ENTRADAS: El men
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_ColorFlecha ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_ColorFlecha(m)  ((m)->ColorFlecha)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonColorFlecha()
 * OBJETIVO: Poner el color de la tinta para escribir las flechas
 * ENTRADAS: El men y un octeto que indica el color
 * SALIDAS:  Un octeto que indica el color
 * EJEMPLO:  Men_PonColorFlecha ( MenuPrincipal, ROJO )
 *------------------------------------------------------------------*/
#define Men_PonColorFlecha(m,f)  ((m)->ColorFlecha=(f))

/*--------------------------------------------------------------------
 * MACRO:    Men_Tipo()
 * OBJETIVO: Decir el tipo de men
 * ENTRADAS: El men
 * SALIDAS:  El tipo
 * EJEMPLO:  Men_Tipo ( MenuPrincipal )
 * NOTA:     El tipo puede ser MEN_VECTOR, MEN_LISTA y MEN_PROPIO
 *------------------------------------------------------------------*/
#define Men_Tipo(m)  ((m)->Tipo)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonTipo()
 * OBJETIVO: Poner el tipo de men
 * ENTRADAS: El men y el tipo
 * SALIDAS:  El tipo
 * EJEMPLO:  Men_PonTipo ( MenuPrincipal, MEN_LISTA )
 *------------------------------------------------------------------*/
#define Men_PonTipo(m,t)  ((m)->Tipo=(t))

/*--------------------------------------------------------------------
 * MACRO:    Men_DatoOpcion()
 * OBJETIVO: Decir la direccin de memoria donde estn los datos que
 *           permiten obtener las opciones del men
 * ENTRADAS: El men
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_DatoOpcion ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_DatoOpcion(m)  ((m)->DatoOpcion)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonDatoOpcion()
 * OBJETIVO: Poner la direccin de memoria donde estn los datos que
 *           permiten obtener las opciones del men
 * ENTRADAS: El men y una direccin de memoria
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_PonDatoOpcion ( MenuPrincipal, DireccionOpciones )
 *------------------------------------------------------------------*/
#define Men_PonDatoOpcion(m,d)  ((m)->DatoOpcion=(d))

/*--------------------------------------------------------------------
 * MACRO:    Men_Total()
 * OBJETIVO: Decir el total de opciones disponibles en un men
 * ENTRADAS: El men
 * SALIDAS:  El total de opciones
 * EJEMPLO:  Men_Total ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_Total(m)  ((m)->Total)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonTotal()
 * OBJETIVO: Poner el total de opciones disponibles en un men
 * ENTRADAS: El men y un entero que indique el total
 * SALIDAS:  El total de opciones
 * EJEMPLO:  Men_PonTotal ( MenuPrincipal, 54 )
 *------------------------------------------------------------------*/
#define Men_PonTotal(m,t)  ((m)->Total=(t))

/*--------------------------------------------------------------------
 * MACRO:    Men_DirDisponible()
 * OBJETIVO: Decir la direccin de memoria donde est el vector que indica
 *           qu opciones estn disponibles
 * ENTRADAS: El men
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_DirDisponible ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_DirDisponible(m)  ((m)->Disponible)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonDirDisponible()
 * OBJETIVO: Poner la direccin de memoria donde est el vector que indica
 *           qu opciones estn disponibles
 * ENTRADAS: El men y una direccin de memoria
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_PonDirDisponible ( MenuPrincipal, DireccionDisponibles )
 *------------------------------------------------------------------*/
#define Men_PonDirDisponible(m,d)  ((m)->Disponible=(d))

/*--------------------------------------------------------------------
 * MACRO:    Men_DiDisponible()
 * OBJETIVO: Decir si una opcin de un men se encuentra disponible
 * ENTRADAS: El men y el nmero de opcin (de 1 a Total)
 * SALIDAS:  Lgica, que indica si la opcin est disponible
 * EJEMPLO:  Men_DiDisponible ( MenuPrincipal, 3 )
 *------------------------------------------------------------------*/
#define Men_DiDisponible(m,n)  (Men_DirDisponible(m)[(n)-1])

/*--------------------------------------------------------------Olimpo
 * MACRO:    Men_Disponible()
 * OBJETIVO: Especificar si una opcin de un men se encuentra
 *           disponible
 * ENTRADAS: El men, el nmero de opcin y el nuevo estado
 * SALIDAS:  Lgica, que indica si la opcin queda disponible
 * EJEMPLO:  Men_Disponible ( MenuPrincipal, 3, NO )
 * NOTAS:    1. Esta funcin slo se puede usar en mens de
 *              tipo MEN_VECTOR
 *           2. Las opciones se empiezan a numerar en 1
 *------------------------------------------------------------------*/
#define Men_Disponible(m,n,e)  (Men_DirDisponible(m)[(n)-1]=(e))

/*--------------------------------------------------------------------
 * MACRO:    Men_DiTeclaSi()
 * OBJETIVO: Decir el vector de teclas especiales que permiten al 
 *           usuario salir del men aceptando la opcin resaltada
 * ENTRADAS: El men
 * SALIDAS:  El vector de teclas
 * EJEMPLO:  Men_DiTeclaSi ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_DiTeclaSi(m)  ((m)->TeclaSi)

/*--------------------------------------------------------------Olimpo
 * MACRO:    Men_TeclaSi()
 * OBJETIVO: Anotar las teclas especiales que permiten al 
 *           usuario salir del men aceptando la opcin
 *           resaltada
 * ENTRADAS: El men y un vector de teclas terminado en NIL
 * SALIDAS:  La direccin de memoria donde comienza el vector
 * EJEMPLO:  Men_TeclaSi ( MenuPrincipal, {TEC_TAB, TEC_F3, NIL} )
 *------------------------------------------------------------------*/
#define Men_TeclaSi(m,t)  ((m)->TeclaSi=(t))

/*--------------------------------------------------------------------
 * MACRO:    Men_DiTeclaNo()
 * OBJETIVO: Decir el vector de teclas especiales que permiten al 
 *           usuario salir del men aceptando la opcin resaltada
 * ENTRADAS: El men
 * SALIDAS:  El vector de teclas
 * EJEMPLO:  Men_DiTeclaNo ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_DiTeclaNo(m)  ((m)->TeclaNo)

/*--------------------------------------------------------------Olimpo
 * MACRO:    Men_TeclaNo()
 * OBJETIVO: Anotar las teclas especiales que permiten al
 *           usuario salir del men sin aceptar ninguna opcin
 * ENTRADAS: El men y un vector de teclas terminado en NIL
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_TeclaNo ( MenuPrincipal, {TEC_MAY_F3, NIL} )
 *------------------------------------------------------------------*/
#define Men_TeclaNo(m,t)  ((m)->TeclaNo=(t))
           
/*--------------------------------------------------------------------
 * MACRO:    Men_TextoVector()
 * OBJETIVO: Decir el texto de una opcin de un men MEN_VECTOR
 * ENTRADAS: El men y el nmero de opcin (de 1 a Total)
 * SALIDAS:  Una cadena con el texto 
 * EJEMPLO:  Men_TextoVector ( MenuPrincipal, 3 )
 *------------------------------------------------------------------*/
#define Men_TextoVector(m,n)  (((cadena *)Men_DatoOpcion(m))[(n)-1])

/*--------------------------------------------------------------------
 * MACRO:    Men_PonTextoVector()
 * OBJETIVO: Anotar el texto de una opcin de un men MEN_VECTOR
 * ENTRADAS: El men, el nmero de opcin y la cadena con el texto
 * SALIDAS:  La cadena
 * EJEMPLO:  Men_Disponible ( MenuPrincipal, 3, Cad_Duplica(" Ayuda ") )
 * NOTAS:    1. Esta funcin slo se puede usar en mens de tipo MEN_VECTOR
 *           2. Las opciones se empiezan a numerar en 1
 *------------------------------------------------------------------*/
#define Men_PonTextoVector(m,n,t)  (((cadena *)Men_DatoOpcion(m))[(n)-1]=(t))

/*--------------------------------------------------------------------
 * MACRO:    Men_DirLugar()
 * OBJETIVO: Decir la direccin de memoria donde est el vector de octetos
 *           con las posiciones de los caracteres que indican los atajos
 *           de las opciones de un men MEN_VECTOR
 * ENTRADAS: El men
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_DirLugar ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_DirLugar(m)  ((m)->Lugar)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonDirLugar()
 * OBJETIVO: Poner la direccin de memoria donde est el vector de octetos
 *           con las posiciones de los caracteres que indican los atajos
 *           de las opciones de un men MEN_VECTOR
 * ENTRADAS: El men y una direccin de memoria
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_PonDirLugar ( MenuPrincipal, DireccionLugar )
 *------------------------------------------------------------------*/
#define Men_PonDirLugar(m,d)  ((m)->Lugar=(d))

/*--------------------------------------------------------------------
 * MACRO:    Men_Lugar()
 * OBJETIVO: Decir la posicin del carcter que indica el atajo
 *           de una opcin de un men MEN_VECTOR
 * ENTRADAS: El men y el nmero de opcin (de 1 a Total)
 * SALIDAS:  Una cadena con el texto 
 * EJEMPLO:  Men_Lugar ( MenuPrincipal, 3 )
 *------------------------------------------------------------------*/
#define Men_Lugar(m,n)  (Men_DirLugar(m)[(n)-1])

/*--------------------------------------------------------------------
 * MACRO:    Men_PonLugar()
 * OBJETIVO: Poner la posicin del carcter que indica el atajo
 *           de una opcin de un men MEN_VECTOR
 * ENTRADAS: El men, el nmero de opcin y la posicin
 * SALIDAS:  La posicin
 * EJEMPLO:  Men_PonLugar ( MenuPrincipal, 3, 2 )
 * NOTAS:    1. Esta funcin slo se puede usar en mens de tipo MEN_VECTOR
 *           2. Las opciones se empiezan a numerar en 1
 *------------------------------------------------------------------*/
#define Men_PonLugar(m,n,g)  (Men_DirLugar(m)[(n)-1]=(g))

/*--------------------------------------------------------------------
 * MACRO:    Men_DirColumna()
 * OBJETIVO: Decir la direccin de memoria donde est el vector de octetos
 *           con las columnas en las que hay que empezar a escribir
 *           las opciones de un men MEN_HORIZONTAL
 * ENTRADAS: El men
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_DirColumna ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_DirColumna(m)  ((m)->Columna)

/*--------------------------------------------------------------------
 * MACRO:    Men_PonDirColumna()
 * OBJETIVO: Poner la direccin de memoria donde est el vector de octetos
 *           con las columnas en las que hay que empezar a escribir
 *           las opciones de un men MEN_HORIZONTAL
 * ENTRADAS: El men y una direccin de memoria
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Men_PonDirColumna ( MenuPrincipal, DireccionColumna )
 *------------------------------------------------------------------*/
#define Men_PonDirColumna(m,d)  ((m)->Columna=(d))

/*--------------------------------------------------------------------
 * MACRO:    Men_Columna()
 * OBJETIVO: Decir la columna en la que hay que escribir el texto
 *           de una opcin de un men MEN_HORIZONTAL
 * ENTRADAS: El men y el nmero de opcin (de 1 a Total)
 * SALIDAS:  La columna
 * EJEMPLO:  Men_Columna ( MenuPrincipal, 3 )
 *------------------------------------------------------------------*/
#define Men_Columna(m,n)  (Men_DirColumna(m)[(n)-1])

/*--------------------------------------------------------------------
 * MACRO:    Men_PonColumna()
 * OBJETIVO: Poner la columna en la que hay que escribir el texto
 *           de una opcin de un men MEN_HORIZONTAL
 * ENTRADAS: El men, el nmero de opcin y la cadena con el texto
 * SALIDAS:  La columna
 * EJEMPLO:  Men_PonColumna ( MenuPrincipal, 3, 45 )
 * NOTAS:    1. Esta funcin slo se puede usar en mens de modo MEN_HORIZONTAL
 *           2. Las opciones se empiezan a numerar en 1
 *------------------------------------------------------------------*/
#define Men_PonColumna(m,n,c)  (Men_DirColumna(m)[(n)-1]=(c))

/*--------------------------------------------------------------------
 * MACRO:    Men_Cabe()
 * OBJETIVO: Decir si todas las opciones de un men caben en la 
 *           parte de pantalla asignada a un men
 * ENTRADAS: El men
 * SALIDAS:  Lgica
 * EJEMPLO:  Men_Cabe ( MenuPrincipal )
 *------------------------------------------------------------------*/
#define Men_Cabe(m)  (Men_Total(m)<=Men_Alto(m))

#endif /* _MENU_ */                                         
