/***************************************************************************** Gestionnaire de terminal Unix: listbox.h (c) Pierre Adriaans fevrier 1994 ------------------------------------------------------------------------------ Include de listbox.c Gestion d'un boite de liste fonctionnant un peu comme celles de Borland Object Windows Library. - Les differents items de la boite de liste doivent d'abord etre groupes dans une Liste Lineaire Bidirectionelle de structures ListBoxItem_t. - un pointeur de tete doit etre declare dans le programme appelant, puis initialise par un appel a la fonction InitListBoxItem(). Cette fonction elimine toute liste prealablement attachee a ce pointeur de tete et l'initialise a NULL. Il est donc possible de conserver plusieurs listes d'items en declarant plusieurs pointeurs de tete. Aucun n'est ratache a une boite de liste en particulier, comme c'est le cas en OWL. - l'insertion des differents items (sous forme de strings uniquement) se fait par une serie d'appels a la fonction AddListBoxItem(). Il faut lui passer le pointeur de tete par adresse ainsi que la string a ajouter a la liste. Toute la gestion des pointeurs vers l'element suivant et precedent est prise en charge par la fonction (c'est le AddString() de OWL). Il est a noter que le buffer contenant la string est reserve de facon dynamique en fonction de la longueur de la string - une fois tous les elements entres dans la liste, la boite proprement dite peut etre ouverte. Les parametres sont: - Ligne du haut - Colonne de gauche - Hauteur en lignes - Largeur en colonnes - Attribut de la boite - Attribut de la barre inversee - Titre de la boite de liste (si pas de titre, passer "") - Pointeur de tete de la liste d'items - Type de boite: si ce type est LB_SIMPLE, le cadre est dessine sur le bord externe de la boite (simple fenetre). Si le type est LB_DOUBLE, il est laisse trois colonnes de part et d'autre du cadre et une ligne au dessus et en dessous. Il faut faire attention aux longueurs et hauteurs dans ce cas. La boite est affichee a l'ecran et la barre en inverse est placee par defaut sur le premier item de la liste. Si la liste est plus grande que la capacite de la fenetre, la fonction se chargera du scrolling haut et bas lorsque ce sera necessaire. - Les touches utilisables: - Fleches Haut et Bas: deplacent la barre d'une ligne avec eventuellment un scrolling d'une ligne vers le haut ou le bas. Le wraparound est gere: si cruseur up et barre sur le premier, on se place sur le dernier, avec mise a jour de la portion de liste affichee si c'est necessaire. Meme chose si curseur down et barre sur le dernier item. - PgUp (ou Ctrl-U) et PgDn (ou Ctrl-D): deplacent la barre inverse dans la liste par pas d'une fenetre moins un item (testez pour voir) - Home ou Ctrl-B (beginning): replace la barre inverse sur le premier item de la liste avec eventuellement mise a jour de la portion de liste affichee - End ou Ctrl-E (end): place la barre sur le dernier item de la liste avec eventuellement mise a jour de la portion de liste affichee - Enter: valide la saisie. Le code de retour est le numero d'ordre de l'item choisi, le premier de la liste portant le numero 1 - Esc ou Ctrl-C ou Delete: annule la saisie: code de retour -1 - La fonction GetLBNbreEntries() permet de recuperer le nombre d'items inseres dans une liste de ListBoxEntry. Il est plus sur d'initialiser le pointeur de tete de la liste a NULL lors de la reservation. *****************************************************************************/ #ifndef _LISTBOX_H_ #define _LISTBOX_H_ #define LB_SIMPLE 1 #define LB_DOUBLE 2 struct ListBoxItem_s { char *Str; struct ListBoxItem_s *Prec; struct ListBoxItem_s *Suivant; }; typedef struct ListBoxItem_s ListBoxItem_t; void InitListBoxItem(ListBoxItem_t **Liste); int AddListBoxItem(ListBoxItem_t **Liste,char *Str); int GetLBNbreItems(ListBoxItem_t *Liste); int ListBox(int Lig,int Col,int Height,int Length,char AttBox,char AttInv, char *Titre,ListBoxItem_t *Liste,int Type,int Frame); #endif