/***************************************************************************** Gestionnaire de terminal Unix: answerbx.h (c) Pierre Adriaans 1994 ------------------------------------------------------------------------------ Include de answerbx.c La fonction AnswerBox() permet de realiser des boites de dialogues avec un nombre de messages quelconque et un nombre de choix quelconques, ceux-ci etant presentes horizontalement. La fonction AnswerBoxCB() permet la meme chose avec des check box en plus. Ces check box sont affiches entre les messages et les choix, justifies a gauches et entoures au dessus et en dessous par des lignes horizontales. La fonction InfoBox() permet de realiser des boites d'info: le seul choix possible est "OK" et il ne faut enfiler que des messages. Il n'est pas possible de faire des InfoBox avec des Check Box. Les choix et les messages doivent etre enfiles dans deux Listes Lineaires Unidirectionnelles par les fonctions InitAnswerBoxItem() qui reinitialise un pointeur de tete passe par adresse et AddAnswerBoxItem() qui recoit un pointeur de tete par adresse et une string. L'espace memoire reserve a la string est reserve en fonction de sa longueur. Le nombre d'items inseres dans une liste peut etre recupere par GetABNbreItems(). Lors de l'enfilage des messages, il est possible de preciser le type de justification a appliquer a chaque ligne lors de son affichage dans la boite: - si la chaine se termine par '\f' elle sera justifiee a gauche - si la chaibe se termina par '\r' elle sera justifiee a droite - dans tous les autres cas, elle sera centree Les intitules des check box devront egalement etre places dans une LLU, par utilisation des fonctions decrites dans checkbox.h: le principe est exactement le meme et le type de LLU aussi. Les noms sont differents uniquement pour des raisons semantiques. Parametres de la fonction AnswerBox() - attribut de la boite - attribut de l'inverse video - titre (si aucun, passer "") - pointeur de tete des messages - pointeur de tete des choix - decalage en lignes - decalage en colonnes - type de cadre Parametres de la fonction AnswerBoxCB() - attribut de la boite - attribut de l'inverse video - titre (si aucun, passer "") - pointeur de tete des messages - pointeur de tete des choix - pointeur de tete des intitules de check box - pointeur sur un tableau d'entiers d'un nombre de cases egal au nombre d'intitule de check box et contenant les valeurs initiales de ceux-ci. Un check Box est booleen: valeur 0 ou 1 !!! Le resultat des manipulations sera reporte dans ce tableau. - decalage en lignes - decalage en colonnes - type de cadre Les coordonnees de la boite sont calculees par la fonction en fonction du nombre de messages (pour la hauteur) et du nombre de choix ou de la longueur du plus grand message (pour la largeur), puis les coordonnees sont rectifiees en fonction des decalages demandes, ceux-ci pouvant etre positifs ou negatifs. Chaque message est affiche centre sur une ligne dans la boite, puis viennent l'ensemble des choix, tous sur une ligne centree. Aucun controle n'est fait sur la somme des longueurs des choix: il faut y faire attention. Un controle de longueur est effectue sur chaque message, qui sera tronque si il est trop long pour pouvoir etre affiche sur une ligne. Dans le cas d'une AnswerBoxCB, les checkbox sont places entre les messages et les choix. Une zone en inverse est placee par defaut sur le premier des choix et peut etre deplacee: - vers la gauche par la touche (avec wraparound) - vers la droite par la touche (avec wraparound) - sur le premier choix par la touche ou Ctrl-B - sur le dernier choix par la touche ou Ctrl-E S'il y a des check box, acces et deplacement se font par Tab. Le deplacement se fait de gauche a droite avec wraparound. La valeur du check box peut etre modifiee par la barre d'espacement. La saisie sera validee par : code de retour = numero d'ordre du choix en inverse, le premier portant le numero 1. Dans ce cas, les changement de valeur des check box sont reportes dans le tableau d'entiers. La saisie sera annulee par , ou Ctrl-C, code de retour -1. Il est possible de laisser des lignes vides entre les messages: pour ce faire, inserer un message vide ("") Il est possible de faire un Answer Box avec un seul choix, ce qui permet de realiser des boites d'info avec le seul choix "OK", par exemple Il est plus sur d'initialiser les pointeurs de tete des listes a NULL lors de la reservation. Les fonction AnswerBox() et InfoBox() sont en fait des appels particuliers a AnswerBoxCB(). *****************************************************************************/ #ifndef _ANSWERBX_H_ #define _ANSWERBX_H_ #include "checkbox.h" struct AnswerBoxItem_s { char *Str; struct AnswerBoxItem_s *Suivant; }; typedef struct AnswerBoxItem_s AnswerBoxItem_t; void InitAnswerBoxItem(AnswerBoxItem_t **Liste); int AddAnswerBoxItem(AnswerBoxItem_t **Liste,char *Str); int GetABNbreItems(AnswerBoxItem_t *Liste); int AnswerBox(char AttBox,char AttInv,char *Title,AnswerBoxItem_t *Msg, AnswerBoxItem_t *Choices,int LigShift,int ColShift, int Frame); int AnswerBoxCB(char AttBox,char AttInv,char *Title,AnswerBoxItem_t *Msg, AnswerBoxItem_t *Choices,CheckBoxItem_t *CheckStr, int *Check,int LigShift,int ColShift,int Frame); void InfoBox(char AttBox,char AttInv,char *Title,AnswerBoxItem_t *Msg, int LigShift,int ColShift,int Frame); #endif