Abstraction Concrète : Module Menu


Le module de menus fait appel aux modules ecran et fenetres.

Le type menu défini dans le module interface comporte un champ nommé fen qui décrit la fenêtre associée au menu, le champ nommé liste_commandes qui contient la liste des commandes du menu et le champ mutable nommé selection qui conserve le numéro de la dernière commande activée du menu, initialisé à 0.
Le type barre_menu comporte un champ nommé table_menus correspondant à un type vecteur pour tous les menus de la barre, le champ mutable menu_actif qui indique true si un menu est ouvert sinon false et le champ mutable menu_sel. Lorsque la barre de menu est inactive, le champ menu_sel contient la valeur -1. Et, lorsque la barre de menu est active, le champ menu_sel indique le numéro du dernier menu activé.

La fonction ini_barre liste_menus_titres initialise une barre de menus contenant les titres des menus définis à partir de la liste de titres liste_menus_titres.
La fonction definir_menus b listecom_liste construit les menus à partir des listes de commandes de la liste listecom_liste. La liste listecom_liste doit contenir autant de listes de commandes qu'il existe de menus installés dans la barre des menus b.
La fonction affiche_menu b affiche le menu actif de la barre b et place la sélection courante de commande du menu activé à la position indiquée par le champ sélection dans le menu table_menus.(b.menu_sel)de la barre b.
La fonction installe_barre_des_menus b installe la barre des menus b à l'écran.
La fonction barre_est_active b retourne true si la barre des menus b est activée et sinon false.
La fonction active_barre b active la barre des menus b si celle-ci était auparavant inactive et la désactive dans le cas contraire. Sa valeur de retour est true si la barre des menus b est activée et sinon false.
La fonction active_titre_menu b n place la sélection courante du menu à la position du menu numéro n sur la barre des menus.
La fonction titre_menu_actif b retourne la valeur du champ correspondant à la sélection courante du menu dans le vecteur table_menus des menus de la barre.
La fonction selection_menu_fleche b sens déplace la sélection courante du titre de menu de la barre b à la position de menu suivante ou précédente selon la valeur de sens. En poursuivant après le dernier menu, la sélection retourne au début de la barre au premier menu. En continuant avant la première commande, la sélection reprend à la fin de la barre au dernier menu.
La fonction selection_commande_fleche b sens déplace la sélection courante de commande du menu actif de la barre b à la position de la commande suivante ou précédente dans le même menu selon la valeur de sens. En poursuivant après la dernière commande, la sélection retourne au début du menu. En remontant avant la première commande, la sélection reprend à la fin du menu.

Exemple


(***** Menu : Exemple, phrases d'implémentation et résultats *****)

let la_barre = ini_barre		(* initialise une nouvelle barre *)
   ["Immeubles et lots"; "Propriétaires"; "Transactions"; "Travaux"];;

definir_menus la_barre [		(* construit la barre *)
(* Immeubles et lots *)   [
			"Loyers" ;
			"Locataires" ;
			"Charges" ;
			"Copropriétaires" ;
			"Impôts et taxes" ;
			"Dossier des lots" ;
			"Descriptifs" ;
			"Gestion prévisionnelle" ;
			"Travaux" ;
			"Commercialisation" ;
			"Emprunts"
			] ;
(* Propriétaires *)   [
			"Nouveau";
			"Modifier";
			"Precedent" ;
			"Suivant" ;
			"Rechercher"
			] ;
(* Transactions *) [
			"Achats" ;
			"Ventes" ;
			"Publicité" ;
			"Corrélations" ;
			"Analyse"
			] ;
(* Travaux *)              [
			"Echéancier" ;
			"Emprunts travaux" ;
			"Marchés" ;
			"Chantiers" ;
			"Corps d'état"
			] ] ;;

installe_barre_des_menus b ;			(* affiche la barre *)
b.menu_sel <- 0 ;					(* sélectionne le menu 0 *)
b.table_menus.(b.menu_sel) <- 3 ;		(* sélectionne la commande 3 *)
affiche_menu b ;					(* affiche le menu ouvert *)
cur_pos(20,1) ;;

  Immeubles et lots   Propriétaires   Transactions   Travaux
Loyers
Locataires
Charges
Copropriétaires
Impôts et taxes
Dossier des lots
Descriptifs
Gestion prévisionnelle
Travaux
Commercialisation
Emprunts