5. Primitives Graphiques. PrologIA HERITAGE II+
A!ociation
Prolog
HERITAGE
5. Primitives Graphiques
5.1. Description du système graphique
5.2. Primitives de gestion des fenêtres
5.3. Primitives élémentaires de gestion des objets attachés à une fenêtre
5.4. Primitives spécifiques pour la gestion de menu
5.5. Mode de dessin et d'écriture
5.6. Dessin et positionnement
5.7. Position de la souris dans une zone graphique
5.8. Primitives spéciales de saisie
5.9. Règles pour gérer des objets structurés
5.10. Envoi d'événements à Prolog depuis un objet externe
Le système Prolog II+ comporte un dispositif asynchrone de gestion des
événements permettant le fonctionnement de l'environnement (fenêtrage, menus, ...) sans que l'utilisateur ait à réorganiser son programme sous la forme d'une boucle de gestion des événements. La plupart des événements tels que le redimensionnement d'une fenêtre, le défilement des fenêtres de texte ..., sont gérés automatiquement.
L'utilisateur peut associer des procédures Prolog à certains événements comme la sélection d'un menu, ou le rafraîchissement d'une fenêtre graphique… Les
événements de type clic souris ou action clavier peuvent être testés par programme, ce qui permet de faire réagir le programme en conséquence.
L'ensemble des primitives graphiques de Prolog II+ offrent également la possibilité de créer des fenêtres, supports d'objets graphiques n'étant pas eux-mêmes des fenêtres. Les primitives de création et manipulation d'objets agissent uniquement sur des objets Prolog. Tous ces objets doivent être créés par les prédicats Prolog, et non par un outil externe (de type générateur d'écran, par exemple). Par contre, les primitives de gestion des événements peuvent aussi manipuler des événements survenus sur des objets externes à Prolog.
Les descriptions des différents environnements ont été regroupées dans un seul document pour mettre en évidence les différences qui existent encore entre ces environnements.
Le signe ! dans la marge indique une primitive ou une caractéristique spécifique au
Macintosh.
Le signe s signale les nouvelles primitives disponibles sous Window3, sous OS/2-
PM et sous Motif 1 . Elles ne sont pas encore implémentées sur Macintosh.
1
La partie graphique PrologII+ sous l'environnement Motif a été développée en collaboration avec Digital Equipment Corporation.
U 5 - 2
Manuel d'Utilisation Windows
Vous ne devez pas utiliser les règles marquées, donc spécifiques à une machine ou un environnement graphique, si vous désirez porter vos programmes sur d'autres configurations.
A!ociation
Prolog
HERITAGE
5.1. Description du système graphique
Ce chapitre décrit une bibliothèque de primitives pour la réalisation d'interfaces graphiques. Il suppose du lecteur une certaine pratique des environnements multifenêtres et de leur boîte à outils. Plus précisément, il suppose du lecteur la connaissance des caractéristiques de l'environnement graphique de la machine hôte.
En effet, l'aspect général du graphique ou le comportement des fenêtres et des objets graphiques, ainsi que le maniement de la souris sont standard à l'environnement hôte; pour toute information sur ce fonctionnement, se référer au manuel correspondant.
Tous les effets graphiques obtenus ici doivent être considérés, du point de vue de
Prolog, comme des effets de bord. En particulier, un objet dessiné n'est jamais effacé au backtracking. De même, la position du point d'écriture est une variable globale.
5.1.1. Evénements
Les événements sont les conséquences d'interruptions matérielles générées par le clavier ou la souris, traités à différents niveaux (système d'exploitation, système graphique…) et donc propagés jusqu'à différents niveaux (…utilisateur final). Nous nous intéressons à ceux qui arrivent jusqu'à Prolog.
Un certain nombre d'objets graphiques Prolog sont sensibles aux événements et les transmettent au programmeur Prolog, qui peut décider trois traitements différents:
- les traiter immédiatement en attachant un programme Prolog sur l'objet;
- les envoyer automatiquement dans la queue d'événements de Prolog pour les traiter ultérieurement;
- les ignorer.
5.1.2. Objets graphiques
Tout d'abord parlons des objets principaux que sont les fenêtres. Toutes les fenêtres peuvent ou non avoir un cadre, une barre de titre, des menus. Elles peuvent
êtres redimensionnées, iconifiées, invisibles. Les fenêtres de texte peuvent avoir des barres de défilement horizontal ou vertical, et peuvent sauvegarder leur contenu.
Il existe quatre types de fenêtre, avec des caractéristiques et des fonctions différentes:
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 3
Les fenêtres EDIT:
ce sont des fenêtres de texte, destinées à l'édition de texte. Tout le contenu de la fenêtre est modifiable directement, au moyen du clavier, de la souris, des menus; par programme, via les primitives d'entrées sorties de Prolog, le point d'écriture se trouve à la fin du texte; le point de lecture est initialement au début de la fenêtre, ensuite après la dernière position lue. Noter que si une lecture est demandée, Prolog copie dans un tampon toute une ligne.
Ces fenêtres ont une capacité limitée, certaines manipulations ayant pour effet l'augmentation de la taille du texte au delà de la limite seront ignorées.
Les fenêtres FRAMEPANEL:
ce sont des fenêtres "vides" dont le seul rôle est d'accueillir des objets. Elles ne possèdent pas de partie dessinable, éditable…
Les fenêtres GRAPHICS:
ce sont des fenêtres destinées au dessin, sensibles aux actions clavier et souris, qui peuvent éventuellement recevoir des objets. Elles peuvent contenir du texte par les moyens classiques d'écriture. Par défaut, l'image bitmap n'est pas sauvegardée, ce qui veut dire que le rafraîchissement n'est pas assuré. Elles peuvent être dotées d'un bitmap qui permettrait leur retraçage automatique.
Il existe toujours, par compatibilité, le type MODAL qui est un sous ensemble du type GRAPHICS et qui désigne les fenêtres GRAPHICS qui ont l'attribut
MODAL, attribut qui donne le focus à la fenêtre, restreint les événements utilisateur à cette seule fenêtre, et donc rend la saisie obligatoire dans cette fenêtre.
Par convention, les primitives qui n'ont d'effet que dans un objet GRAPHICS sont préfixées par gr_.
Les fenêtres TTY:
ce sont des fenêtres de texte qui fonctionnent en écriture et en lecture, toujours
à la fin de la fenêtre. Elles ont un rôle de trace ou listing et fonctionnent à la manière des terminaux. C'est à dire, tout ce qui est affiché n'est pas modifiable, la saisie est en mode ligne et donc, tant que la ligne de saisie n'est pas terminée, elle est modifiable.
Ces fenêtres ont une capacité limitée, une troncature automatique se fait lorsque c'est nécessaire par le haut de la fenêtre.
Voyons maintenant les autres objets; ils sont conçus pour être placés sur une fenêtre qui est alors appelée : parent. Ils se déplacent avec leur parent et ne peuvent exister après sa destruction. Leur taille et leur position sont définies par des coordonnées relatives au coin intérieur supérieur gauche du parent.
Qu'advient-il si le parent change de dimension?
Pour déterminer le comportement d'un objet lors du redimensionnement de son parent, on définira l'attachement de l'objet à un bord de sa fenêtre parent :
© PrologIA
U 5 - 4
Manuel d'Utilisation Windows
Un objet est attaché à un bord de son parent signifie que l'écart (défini au moment de la création) entre ce bord et l'objet est constant quelles que soient les évolutions des dimensions du parent.
Il faut noter que :
- un objet est toujours attaché dans les deux directions (au minimum à un bord pour chaque direction). Par défaut, il s'agit du bord haut et du bord gauche.
- les objets dont la dimension n'est pas fixée par le système, peuvent être attachés aux deux bords pour la même direction. Dans ce cas, l'objet sera redimensionné en même temps que son parent.
Les objets qui doivent avoir un parent sont les suivant :
Check button:
bouton de choix à deux états, quand il est activé, il change d'état et génère un
événement.
Push button:
bouton qui génère un événement quand il est activé.
Radio button:
bouton de choix exclusif; c'est un bouton à deux états qui fait partie d'un groupe de boutons dont un seul peut être sélectionné à la fois. En particulier, dès qu'un bouton du groupe est activé, il génère un événement, il prend la sélection et celui qui l'avait la perd. Par défaut, à la création, c'est le premier bouton du groupe qui est sélectionné.
Drawing area:
zone graphique destinée au dessin, sensible aux actions clavier et souris. Elle peut contenir du texte par les moyens classiques d'écriture. Par défaut, l'image bitmap n'est pas sauvegardée, mais la zone peut être dotée d'un bitmap pour son retraçage automatique. Les primitives préfixées par gr_ agissent dans cette zone si elle a été précédemment définie comme la zone graphique courante (voir gr_window).
Editfield:
zone de texte éditable monoligne ou multiligne, génère un événement lors de la frappe d'un caractère ou de la perte ou du gain de focus.
Label :
zone de texte non éditable, non sensible aux événements, sert uniquement à l'affichage d'un texte dont le retraçage est géré automatiquement. Si le texte est vide, cela permet d'obtenir un rectangle.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 5
Listbox:
liste d'items, inscrits dans un rectangle, avec barre de défilement verticale.
Chaque item peut prendre deux valeurs : sélectionné ou non. A chaque sollicitation d'un item de la listbox, un événement est généré.
Popup menu:
Pulldown menu:
Un menu regroupe une suite d'items disposés verticalement. Un item peut
être soit terminal, soit lui-même un menu, on parlera dans ce cas de menu hiérarchique. La sélection d'un item terminal du menu génère un événement et fait disparaître le menu. On distingue deux formes de menus qui se différencient par la façon de les activer et par les caractéristiques des fenêtres auxquelles ils peuvent être attachés.
Il est possible d'attacher un 'popup menu' particulier à n'importe quelle unité fenêtre. L'activation du 'popup menu' (également appelé menu flottant) d'une fenêtre se fait, alors que le curseur de la souris est dans la fenêtre, soit en appuyant sur le bouton menu de la souris si la souris comporte plusieurs boutons, soit en appuyant simultanément une touche d'option et le bouton de la souris si la souris possède un seul bouton. Le menu apparaît sous le curseur de la souris.
Il est possible d'attacher un ou plusieurs 'pulldown menu' (également appelé
menu déroulant) à n'importe quelle unité fenêtre possédant une barre de titre
(ne convient pas aux fenêtres de forme cadre). Le titre du menu s'insère alors dans la barre de menu de la fenêtre et l'activation du menu se fait en réalisant un clic sur son titre. La liste d'items est alors déroulée au dessous. Noter que le titre du menu n'est pas un item du menu.
Scrollbar:
barre de défilement dont l'ascenseur (curseur qui se déplace dans la barre) exprime par sa position une valeur comprise dans l'intervalle associé à la barre. Peut servir de "doseur". A chaque activation de la 'scrollbar', elle génère un événement.
5.1.3. Configuration du graphique Prolog II+ au démarrage
Au lancement Prolog compte une barre de menus, trois fenêtres prédéfinies dont une seule est visible, il s'agit de :
- la fenêtre "console" de type TTY qui est par défaut, l'unité courante de lecture et d'écriture. L'unité de lecture et l'unité d'écriture peuvent être changées respectivement par les primitives input et output.
Les deux autres fenêtres sont :
- la fenêtre "graphic" de type GRAPHICS, qui est l'unité graphique courante par défaut. L'unité graphique est l'unité sur laquelle agissent les primitives préfixées par gr_. L'unité graphique peut être changée par la primitive
gr_window.
- la fenêtre "trace" de type TTY utilisée en mode debug ou trace.
© PrologIA
U 5 - 6
Manuel d'Utilisation Windows
La barre de menus comporte des menus prédéfinis:
- le menu File qui permet de créer des fenêtres d'édition et sortir de Prolog.
- le menu Windows qui permet de rendre visibles ou invisibles les fenêtres existantes.
- le menu Control qui permet de générer une interruption utilisateur, passer en mode debug, exécuter rapidement certains prédicats prédéfinis Prolog.
- le menu Tools qui permet d'activer certains outils.
- certains menus du système hôte.
Nous avons regroupé ici des primitives très générales du graphisme.
init_screen
initialise le mode graphique. Ce prédicat est automatiquement lancé au chargement du module graphic.mo.
end_screen
désinstalle le graphique, c'est à dire, ferme les fenêtres, supprime les menus, supprime l'accès aux prédicats graphiques.
get_screen(x,y) get_screen(x,y,N)
Unifie x et y respectivement avec la largeur et la hauteur de l'écran en pixels.
Dans la forme à trois arguments, N est unifié avec 1 si l'écran ne possède que deux couleurs (noir et blanc), un nombre supérieur à 1 sinon.
graphic_system(s)
Unifie s avec une chaîne de caractères qui est fonction du système graphique hôte : "M" pour Motif, "W" pour Windows3 ou "P" pour
Presentation Manager.
Le fichier int_edit.mo permet, si on le désire, l'utilisation de l'éditeur intégré par les prédicats edit et editm à la place de l'éditeur défini par la variable d'environnement
PrologEdit. Il faut pour cela effacer les buts suivants:
> reload("int_edit.mo");
> exit("initial.po");
(pour éviter de refaire la même commande à chaque lancement de Prolog).
5.1.4. Conventions utilisées dans ce chapitre
Dans les règles exposées dans ce chapitre, x et y représentent les coordonnées horizontales (x) et verticales (y). L'axe positif des x est dirigé vers la droite. L'axe positif des y est dirigé vers le bas. Se rappeler que l'origine par défaut (i.e. x=0, y=0) coïncide avec le coin intérieur supérieur gauche de l'élément de référence.
Celui-ci est la fenêtre graphique courante pour un tracé, la fenêtre parente pour un objet qui n'est pas une fenêtre, et l'écran pour une fenêtre.
Les coordonnées x ou y peuvent être exprimées indifféremment par des nombres entiers ou réels.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 7
De même les variables commençant par r représenteront des arbres définissant un rectangle. Cet arbre doit être de la forme:
<x1,y1>.<x2,y2> ou bien <x1,y1,x2,y2> où x1,y1 sont les coordonnées du coin supérieur gauche, et x2,y2 celles du coin inférieur droit.
On appellera booléen, un entier qui prend les valeurs 0 ou 1 et qui sert de valeur de vérité pour une propriété (visibilité d'un objet,…).
L'utilisateur peut nommer un objet à l'aide d'une chaîne, cette identification pourra servir pour toutes les primitives de création ou gestion de l'objet. Il peut également laisser Prolog attribuer à l'objet une identification par défaut (ce sera un entier) au moment de sa création (en laissant une variable libre), cette identification pourra être utilisée ultérieurement pour toutes les primitives de gestion de l'objet. Ou encore, pour les objets qui ne sont pas des fenêtres, il peut les nommer à l'aide d'un identificateur qui sera valable pour toutes les primitives agissant sur ces objets.
5.2. Primitives de gestion des fenêtres
5.2.1. Création, destruction d'une fenêtre
s s s s
new_window(s,t) new_window(s,t,s') new_window(s,t,v,r) new_window(s,t,v,s',r) new_window(s,t,v,x1,y1,x2,y2) new_window(s,t,v,s',x1,y1,x2,y2)
Créent une nouvelle fenêtre, et une nouvelle unité d'entrée/sortie de nom s et de type t, où s est l'identification de la fenêtre qui doit être différente de celles des unités existant déjà. s peut être une chaîne. Si s est une variable libre au moment de l'appel, elle sera unifiée avec une identification de fenêtre fournie par Prolog.
La chaîne de caractères s' est affichée dans le bandeau de la fenêtre, comme titre de la fenêtre; si s' n'est pas spécifiée c'est s qui est inscrite.
v est un booléen (1 ou 0) indiquant si la fenêtre doit être visible ou pas. Par défaut, la fenêtre est créée visible.
x1,y1 sont les coordonnées du coin intérieur supérieur gauche de la nouvelle fenêtre par rapport à l'écran.
x2,y2 sont les coordonnées du coin intérieur inférieur droit de la nouvelle fenêtre, l'origine étant située au coin supérieur gauche de l'écran.
t est de la forme type, ou bien type.liste_attributs, où type détermine le type de la fenêtre, et donc les opérations qui peuvent lui être appliquées.
Les valeurs possibles pour type sont:
"EDIT" ou :edit pour la création d'une fenêtre EDIT.
"FRAMEPANEL" ou :framepanel
© PrologIA
U 5 - 8
!
!
s
Manuel d'Utilisation Windows
pour la création d'une fenêtre FRAMEPANEL.
"GRAPHICS" ou :graphics pour la création d'une fenêtre GRAPHICS.
"MODAL" ou :modal pour la création d'une fenêtre GRAPHICS avec l'attribut MODAL.
"TTY" ou :tty pour la création d'une fenêtre TTY.
Les valeurs possibles pour un attribut de liste_attributs sont:
<"DISTANCE", n> ou < :distance, n>
n est un entier et désigne une portion de la partie dessinable de la fenêtre réservée pour une zone de création de boutons. Cette zone se situe en haut de la fenêtre, sur toute la largeur et sur une hauteur égale à
n % de la hauteur totale. Cet attribut est valable pour tout type de fenêtre, mais n'a pas d'utilité pour les fenêtres FRAMEPANEL.
<"FONT", n > ou < :font, n >
Définit le numéro n de la police de caractères utilisée pour le texte d'une fenêtre type texte. La fonte associée à n est dépendante du système hôte.
<"FONTSIZE", n > ou < :fontsize, n >
Définit la taille de la police de caractères utilisée dans une fenêtre de texte.
<"MODAL", b> ou < :modal, b>
b est un booléen indiquant si la fenêtre est bloquante ou pas. La valeur par défaut est b = 0. Cet attribut est valable pour tout type de fenêtre.
Cette fenêtre si elle est bloquante, reste au dessus de toutes les autres fenêtres, et tous les événements extérieurs à la fenêtre sont désactivés
(excepté l'interruption utilisateur). Les événements extérieurs à la fenêtre sont réactivés lorsque la fenêtre est tuée. Les fenêtres modales peuvent
être empilées.
<"NO_RESIZE", b> ou < :no_resize, b>
b est un booléen indiquant si le redimensionnement de la fenêtre au moyen de la souris (ou d'une combinaison de touches prédéfinie pour certaines machines) est interdit ou pas. Par défaut b vaut 0. Quelle que soit la valeur de b, une fenêtre peut toujours être redimensionnée par programme.
<"SHAPE", n> ou < :shape, n>
n est un entier déterminant la forme de la fenêtre. Les formes standard sont 0: fenêtre avec titre, barre de menus et barres de défilement; 1: fenêtre cadre. Par défaut les fenêtres graphiques modales ont l'attribut 1, et les autres types de fenêtres ont l'attribut 0. Cet attribut est valable pour tout type de fenêtre. On notera que les fenêtres GRAPHICS et
FRAMEPANEL n'ont pas de barres de défilement.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 9
!
<"SAVE", r > ou < :save, r >
Cet attribut ne peut être appliqué qu'à une fenêtre graphique ou modale.
Il définit le rectangle r de la fenêtre auquel est associé un bitmap de rafraîchissement (dans le cas de machines couleur une grande zone peut demander une place mémoire importante).
<"SAVE", b > ou < :save, b >
b est un booléen indiquant si un bitmap de rafraîchissement est associé
à la fenêtre. La valeur par défaut est b = 0.
Si b =1, un bitmap de rafraîchissement de la taille de la fenêtre est créé.
Exemple de création d'une fenêtre graphique avec sauvegarde automatique :
> new_window("query","GRAPHICS".<"SAVE",1>.nil);
Les deux buts suivants sont équivalents:
> new_window("fen","MODAL");
> new_window("fen","GRAPHICS".<"MODAL",1>.nil);
create_window(s,t,s',r1) create_window(s,t,v,s',r1) create_window(s,t,v,s',r1,r2)
Similaire à new_window, mais permet de définir un système de coordonnées avec échelle.
r1
est de la forme <x1,y1,x2,y2> où x1,y1,x2,y2 sont des réels indiquant les coordonnées de la partie 'dessinable' de la fenêtre dans un écran
[0,1] * [0,1].
r2
est de la forme <x1,y1,x2,y2> où x1,y1,x2,y2 sont des entiers définissant un système de coordonnées locales propre à l'utilisateur. Ce paramètre n'est à préciser que pour des fenêtres GRAPHICS et
FRAMEPANEL. Si le paramètre r2 n'est pas spécifié, les coordonnées graphiques dans la fenêtre seront données en pixels.
Par exemple si une fenêtre est créée par l'appel suivant:
> create_window("mywindow", "GRAPHICS", 1, "mywindow",
<0.1E0,0.1E0,0.6E0,0.7E0>, <0,0,100,100>);
quelle que soit la taille de l'écran, un rectangle dessiné par
gr_rect(1,0,0,100,100) la remplira, gr_moveto(50,50) positionnera au centre etc...
Autre exemple:
> create_window("ww","GRAPHICS",1,"mywindow",
<1e-1,1e-1,5e-1,5e-1);
© PrologIA
U 5 - 10
Manuel d'Utilisation Windows kill_window(s)
Détruit la fenêtre de nom s. Le nom s ne peut pas être celui d'une fenêtre prédéfinie, ce doit être une fenêtre créée par new_window ou create_window.
Si la fenêtre détruite était l'entrée ou la sortie courante, l'unité d'entrée ou de sortie précédemment active redevient l'unité courante d'entrée ou de sortie. Si la fenêtre détruite était la fenêtre graphique courante, c'est la fenêtre prédéfinie
"graphic" qui redevient l'unité graphique courante. Voir aussi le prédicat
kill_object.
5.2.2. Configuration, manipulation d'une fenêtre
clear_window(s)
Efface le contenu de la fenêtre de nom s. Ne modifie pas ses objets éventuels et ne supprime pas les événements liés à la fenêtre qui pouvaient être dans la queue Prolog. Est valable pour tout type de fenêtre (Sans effet sur une fenêtre
FRAMEPANEL).
s
file_window(s1) file_window(s1,s2)
Créent, si elle n'existe pas déjà, une fenêtre EDIT de nom s2 initialisée avec le texte contenu dans le fichier de nom s1. file_window(s1) équivaut à
file_window(s1,s1).
front_window(s)
Unifie s avec le nom de la fenêtre Prolog se trouvant au premier plan et ayant le focus.
get_window(s,v) get_window(s,v,x1,y1,x2,y2) get_window(s,t,v,x1,y1,x2,y2)
Renseigne sur le type, les attributs, la visibilité et les coordonnées de la fenêtre
s. La forme à deux arguments renseigne uniquement la visibilité. Unifie successivement par backtracking les paramètres s,t,v,x1,y1,x2,y2 avec les valeurs correspondant à chacune des fenêtres. Voir la primitive
new_window(s,t,v,x1,y1,x2,y2) pour la signification des paramètres. Le type et les attributs sont rendus sous la forme identificateur. La valeur de l'attribut
:distance est donnée en pixel et non plus en pourcentage de la partie dessinable.
gr_window(s)
La fenêtre ou la zone graphique s devient l'unité graphique courante.
gr_window_is(s)
Unifie s avec le nom de l'unité graphique courante.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 11
!
option fermeture
Lorsque l'on clique dans la case de fermeture d'une fenêtre, l'unité correspondante est fermée et son nom est retiré du menu contenant les noms des fenêtres, excepté pour les fenêtres prédéfinies. Il est possible de rendre une fenêtre invisible sans la fermer en appuyant sur la touche option en même temps que la case de fermeture est cliquée.
!
print_window(s)
!
print_window(s,f,t)
Imprime le contenu de la fenêtre de texte s avec la fonte f de taille t. Mêmes conventions que gr_text(f,t,l) (Voir 5.5. Mode de dessin et d'écriture). La forme avec un seul argument imprime la fenêtre avec la fonte courante de la fenêtre.
!
gr_print(s)
!
gr_print(s,_rx,_ry,x0,y0)
!
gr_print(s,r1,r2)
Imprime le contenu de la fenêtre graphique s. On peut spécifier, grâce à la troisième forme, la zone à imprimer, qui est le contenu du rectangle r1, le résultat sur papier se situant dans le rectangle r2. Les réductions et translations éventuelles sont automatiques. La forme avec un seul argument imprime la fenêtre sans modification de format. La forme à 5 arguments permet de spécifier la réduction selon les axes des X, des Y sous la forme de deux nombres _rx et _ry compris entre 0e0 et 1e0. On peut donner, en x0 et
y0 la position de l'origine de l'impression sur le papier.
> gr_print("graphic",0.5e0,0.5e0,0,0); imprimera la fenêtre "graphic", réduite au quart (chaque dimension étant réduite de moitié).
reset_window(s)
Repositionne le pointeur de lecture au début de la fenêtre EDIT de nom s.
Echoue si s n'est pas une fenêtre EDIT créée par new_window ou
create_window. Le point d'écriture reste toujours à la fin du texte.
save_window(s1) save_window(s1, s2)
Sauve le contenu de la fenêtre de texte de nom s1 dans le fichier de nom s2.
save_window(s1) équivaut à save_window(s1,s1).
set_window(s,b)
Permet de modifier les attributs ou la visibilité d'une fenêtre. s est l'identification de la fenêtre. b peut être soit un booléen: il indique alors si la fenêtre sera visible (0 : invisible, 1 : visible), soit un attribut (voir
new_window).
Les attributs possibles sont pour les fenêtres graphiques et modales:
<"SAVE", v > où v est un booléen
© PrologIA
U 5 - 12
Manuel d'Utilisation Windows
!
!
!
Ce prédicat avec cet attribut peut aussi être employé pour une 'drawing area'. s est alors son identification.
Si v =1, un bitmap de rafraîchissement de la taille de l'objet est créé.
<"SAVE", r > où r est un rectangle.
Pour une fenêtre de texte:
<"FONT", n >
<"FONTSIZE", n >
Exemple:
> set_window("console",<"FONTSIZE",12>);
set_window(s,b,x1,y1,x2,y2) s
Permet de modifier la visibilité, les dimensions et l'emplacement des fenêtres existantes.
est l'identification (chaîne de caractères ou entier) de la fenêtre, notamment "console", "graphic", "trace" pour les fenêtres prédéfinies.
b
est un booléen, indique si la fenêtre sera visible (0: invisible, 1: visible).
x1,y1 sont les nouvelles coordonnées, par rapport à l'écran, du coin intérieur supérieur gauche de la fenêtre.
x2,y2 sont les nouvelles coordonnées du coin intérieur inférieur droit de la fenêtre, l'origine étant située au coin supérieur gauche de l'écran.
Exemple:
> set_window("graphic",1,50,50,300,300);
5.2.3. Rafraîchissement des zones graphiques
Les fenêtres GRAPHICS ou les 'drawing area' peuvent être rafraîchies automatiquement en leur associant un bitmap auxiliaire (voir les primitives
new_window ou set_window ou new_drawing_area).
Dans le cas contraire, il existe une coroutine attachée aux zones graphiques, et qui est toujours déclenchée lorsque ces zones nécessitent un rafraîchissement. Cette coroutine est: exec(:gr_update(u)) où u représente le nom de l'unité à rafraîchir. La règle :gr_update n'est pas définie dans l'environnement standard, et n'est pas lancée si l'utilisateur ne la définit pas.
L'utilisateur peut donc, en écrivant une règle :gr_update/1, définir par programme ce que doit être le rafraîchissement d'une zone graphique sans utiliser de bitmap auxiliaire.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 13
5.3. Primitives élémentaires de gestion des objets attachés à une fenêtre
Nous les avons qualifiées de primitives élémentaires car elles servent à réaliser des opérations élémentaires telles que la création, la configuration et l'interrogation d'un objet. Ensuite elles manipulent des éléments très simples, à savoir: un objet ou un attribut d'objet ou un événement survenu sur un objet.
L'ensemble des ces primitives ne permet pas de manipuler et configurer complètement les menus, il y a en plus de celles-ci, des primitives spécifiques aux menus, décrites au paragraphe 5.4.
5.3.1. Création, destruction d'objets
L'identification d'un objet peut être soit une chaîne, soit un identificateur Prolog II+, soit, quand elle est générée automatiquement par Prolog, un entier. Pour ce dernier cas, il suffit d'appeler le prédicat de création de l'objet avec une variable libre à la place de l'identification, la variable sera alors unifiée avec un entier attribué à l'objet, qui permettra de l'identifier par la suite.
Certains objets attendent un titre ou un texte, il est déterminé par une chaîne de caractères Prolog qui peut être vide.
Une constante entière est utilisée pour spécifier la visibilité de l'objet à sa création :
0 signifie non visible, 1 signifie visible.
Il est possible de modifier l'attachement par défaut des objets, à l'aide des attributs
:top_attach, :left_attach, :bottom_attach, :right_attach (qui définissent respectivement l'attachement de l'objet au bord haut, gauche, bas, droit) à ajouter dans la liste des options de création. Si l'un des (ou les deux) attributs :top_attach et
:bottom_attach est mentionné, cela redéfinit l'attachement vertical et(ou) si l'un des
(ou les deux) attributs :left_attach et :right_attach est mentionné, cela redéfinit l'attachement horizontal.
Un programme Prolog peut être lié aux événements (s'il en existe) de l'objet créé, qui dès qu'ils se produisent provoquent la suspension du programme Prolog en cours pour lancer le prédicat associé à l'objet, avec en premier argument, l'identification de l'objet et éventuellement en deuxième argument une information supplémentaire (caractère tapé…). Lorsque le prédicat se termine, la démonstration suspendue reprend son cours normalement. Cela permet de gérer "en direct" la saisie dans les écrans graphiques.
Il est également possible de différer le traitement des données saisies ou des
événements. Pour cela il suffit de spécifier sys:get_event à la place du prédicat, ce qui aura pour effet de mettre simplement cet événement dans la queue d'événements de Prolog (elle peut être scrutée par get_event ou vidée par clear_events).
Ou encore, il est possible de ne rien faire. Pour cela il suffit de spécifier nil à la place du prédicat, ce qui aura pour effet d'ignorer les événements de l'objet.
© PrologIA
U 5 - 14
Manuel d'Utilisation Windows
s s s s s s s
kill_object(o)
Détruit l'objet o. Est valable pour tout type d'objet.
new_check_button(o,p,v,s,b,<x1,y1,x2,y2>)
Crée un 'check button' identifié par o, dont le texte est s. Le bouton et le texte seront inscrits dans un rectangle de coordonnées x1, y1, x2, y2 dans la fenêtre parente p. Il sera visible selon la valeur de v.
x2 et y2 doivent être libres ils seront alors unifiés avec les coordonnées effectives du coin inférieur droit de l'objet après création.
b peut être nil, sys:get_event ou un identificateur de règle. Dans ce dernier cas,
à chaque activation du bouton le but b(o) est lancé.
new_drawing_area(o,p,v,<x1,y1,x2,y2>,r2,l) new_drawing_area(o,p,v,<x1,y1,x2,y2>,l)
Crée une 'zone graphique' identifiée par o. Elle est inscrite dans un rectangle de coordonnées x1, y1, x2, y2 dans la fenêtre parente p. Elle sera visible selon la valeur de v. r2 a la même signification que dans le prédicat create_window
(système de coordonnées locales). l est une liste d'options, éventuellement vide
(nil), formée à partir des identificateurs :
:no_border si l'on ne veut pas de bordure autour de la zone.
:save
pour avoir un bitmap de sauvegarde.
:top_attach, :left_attach, :right_attach, :bottom_attach
new_push_button(o,p,v,s,b,<x1,y1,x2,y2>) new_push_button(o,p,v,s,b,<x1,y1,x2,y2>,l)
Crée un 'push button' identifié par o, dont le texte est s, dont les coordonnées sont x1, y1, x2, y2 dans la fenêtre parente p. Il sera visible selon la valeur de v.
Si x2 et y2 sont libres ils seront alors unifiés avec les coordonnées effectives du coin inférieur droit de l'objet après création. b peut être nil, sys:get_event ou un identificateur de règle. Dans ce dernier cas, à chaque activation du bouton, le but b(o) est lancé. l est une liste d'options, éventuellement vide (nil), formée à partir des identificateurs :
:buttonD
permet de le définir comme 'bouton par défaut', c'est à dire que tout carriage return qui ne sera pas capté par un autre objet activera ce bouton. Ces boutons sont conçus pour qu'il n'y en ait qu'un seul par fenêtre. Si ce n'est pas le cas, le comportement n'est pas garanti et est dépendant du système hôte.
:top_attach, :left_attach, :right_attach, :bottom_attach
new_radio_button(o,g,p,v,s,b,<x1,y1,x2,y2>)
Crée un 'radio button' identifié par o, dont le texte est s. g est un identificateur
Prolog qui représente le groupe auquel appartient le bouton. Le bouton et le texte seront inscrits dans un rectangle de coordonnées x1, y1, x2, y2 dans la fenêtre parente p. Il sera visible selon la valeur de v.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 15 s s s
x2 et y2 doivent être libres ils seront alors unifiés avec les coordonnées effectives du coin inférieur droit de l'objet après création.
b peut être nil, sys:get_event ou un identificateur de règle. Dans ce dernier cas,
à chaque activation du bouton le but b(o) est lancé.
new_edit_field(o,p,v,b,<x1, y1, x2, y2>,l)
Crée un 'editfield' identifié par o, dont les coordonnées sont x1, y1, x2, y2 dans la fenêtre parente p. Il sera visible selon la valeur de v.
b peut être nil, sys:get_event ou un identificateur de règle. Dans ce dernier cas,
à chaque caractère tapé dans l'editfield, le but b(o,c) est lancé où c est le caractère tapé, et à chaque événement de gain ou perte de focus le but b(o) est lancé.
l est une liste d'options, éventuellement vide (nil), formée à partir des identificateurs :
:multiple
:hscroll
:vscroll
<chars_nb,n>
si le champ peut comporter plusieurs lignes.
pour avoir une barre de défilement horizontale.
pour avoir une barre de défilement verticale.
si le champ est limité à n caractères (n entier).
:top_attach, :left_attach, :right_attach, :bottom_attach
Par défaut l'editfield est monoligne, sans barre de défilement, et le nombre de caractères est limité à 1024.
new_label(o,p,v,s,<x1,y1,x2,y2>,l)
Crée un 'label' identifié par o, dont le texte est s, inscrit dans un rectangle de coordonnées x1, y1, x2, y2 dans la fenêtre parente p. Il sera visible selon la valeur de v.
Si x2 et y2 sont libres ils seront alors unifiés avec les coordonnées effectives du coin inférieur droit de l'objet après création.
l est une liste d'options, éventuellement vide (nil), formée à partir des identificateurs :
:left
:right
si le texte doit être cadré à gauche dans le rectangle.
si le texte doit être cadré à droite dans le rectangle.
:no_border si le texte ne doit pas être encadré.
:top_attach, :left_attach, :right_attach, :bottom_attach
Pour obtenir un texte centré, il faut les deux attibuts :left et :right.
Par défaut le texte est encadré et son alignement est dépendant du système graphique hôte.
new_listbox(o,p,v,b,<x1, y1, x2, y2>,l)
Crée une 'listbox' identifiée par o, dont les coordonnées sont x1, y1, x2, y2 dans la fenêtre parente p. Elle sera visible selon la valeur de v. La définition des items de la listbox devra se faire par la primitive set_attribute.
b peut être nil, sys:get_event ou un identificateur de règle. Dans ce dernier cas,
à chaque action de sélection dans la listbox, le but b(o,n,m) est lancé où n est le numéro de l'item affecté et m le modifieur utilisé.
l est une liste d'options, éventuellement vide (nil), formée à partir des identificateurs :
:multiple
si la sélection peut comporter plusieurs items.
© PrologIA
U 5 - 16
Manuel d'Utilisation Windows
s s s
:hscroll
si la barre de défilement horizontale est souhaitée.
:top_attach, :left_attach, :right_attach, :bottom_attach
Par défaut la listbox est en mode sélection simple (au plus 1 item sélectionné) et possède une barre de défilement verticale qui peut être invisible si le nombre d'items de la boite est insuffisant.
new_popup_menu(o,p)
Crée un support de 'popup menu' identifié par o, attaché à la fenêtre p. Aucun item n'est encore créé, il faut pour cela utiliser la primitive set_menu.
Remarque : il n'est pas nécessaire de créer un support de 'popup menu' avant d'utiliser la primitive set_menu. En effet si set_menu est utilisé avec un nom de fenêtre, cela fait référence au 'popup menu' de cette fenêtre. S'il n'existe pas, set_menu le crée, mais son identification n'est pas connue.
En supposant que mygraph est l'identification d'une fenêtre graphique déjà créée, la suite de buts ci-dessous crée un popup menu composé de la liste d'items : "doLine", "doRect", "doOval" avec, attachée à chacun des items, respectivement la procédure : doLine/1, doRect/1, doOval/1.
> new_popup_menu(popgraph,mygraph);
> set_menu(popgraph,nil,doLine.doRect.nil);
> set_menu(mygraph,"new".nil,doOval);
new_pulldown_menu(o,p,s)
Crée un support de 'pulldown menu' identifié par o, de nom s (chaîne de caractères), attaché à la fenêtre p. Ses items seront ensuite créés par la primitive set_menu. N'est pas valable pour les fenêtres de forme cadre.
La suite de buts ci-dessous crée un pulldown menu de titre "custom" composé de la liste d'items : "myColor", "myMode", "myFont", "myPen" avec, attachée
à chacun des items, respectivement la procédure : myColor/1, myMode/1, myFont/1, myPen/1.
> new_pulldown_menu(mymenu,mygraph,"custom");
> set_menu(mymenu,nil,myColor.myMode.myFont.miPen.nil);
> set_menu(mymenu,"miPen".nil,myPen);
new_scrollbar(o,p,v,b,<x1,y1,x2,y2>,l)
Crée une 'scrollbar' identifiée par o, dont les coordonnées sont x1, y1, x2, y2 dans la fenêtre parente p. Elle sera visible selon la valeur de v.
Si x2 et y2 sont libres ils seront alors unifiés avec les coordonnées effectives du coin inférieur droit de l'objet après création.
b peut être nil, sys:get_event ou un identificateur de règle. Dans ce dernier cas,
à chaque activation de la barre de défilement, le but b(o) est lancé.
l est une liste d'options, éventuellement vide (nil), formée à partir des identificateurs :
:vscroll si la barre doit être verticale.
:hscroll si la barre doit être horizontale.
:top_attach, :left_attach, :right_attach, :bottom_attach
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 17
L'orientation par défaut est déterminée par les coordonnées, sachant qu'une barre est plus longue que large.
5.3.2. Configuration d'objets
s
get_attribute(o,a,v)
Permet de se renseigner sur l'état des objets ou leurs propriétés.
o est l'identification de l'objet.
a est l'identification de l'attribut.
v sera unifié avec la valeur de l'attribut interrogé.
Les attributs possibles sont les mêmes que ceux de la primitive set_attribute, excepté les attributs focus et customColor, complétés des attributs suivants qui sont des propriétés de création non modifiables :
:parent : v est unifié avec l'identification du parent de l'objet o.
:type : v est unifié avec un identificateur représentant le type de l'objet o. Les valeurs possibles sont: :graphics, :tty, :edit, :framepanel, :label,
:push_button, :check_button, :radio_button, :scrollbar, :edit_field,
:popup_menu, :pulldown_menu, :listbox, :drawing_area.
:fontheight : v est la hauteur en pixels de la fonte utilisée par l'objet. La hauteur de la fonte est la hauteur du rectangle dans lequel s'inscrivent les caractères (l'interligne est compris).
:group : v est unifié avec l'identificateur de groupe du 'radio button' o.
:items_nb : v est unifié avec le nombre d'items de la 'listbox' o.
s
set_attribute(o,a,v)
Permet de modifier ou de préciser la configuration des objets.
o est l'identification de l'objet.
a est l'identification de l'attribut.
v est la valeur de l'attribut.
Les attributs possibles dépendent du type de l'objets. Les attributs généraux sont les suivants :
:activity : indique si l'objet ou l'item de menu réagit aux événements ou pas. v vaut respectivement 1 ou 0. N'est pas valable pour les labels.
:background : concerne la couleur de fond de l'objet. v est un entier ou un identificateur et suit les mêmes conventions que dans la primitive
gr_color2 (Voir 5.5. Mode de dessin et d'écriture).
:bottom_right : concerne la position du coin extérieur inférieur droit de l'objet.
v est de la forme <p1, p2> où p1 est l'abscisse, p2 est l'ordonnée. A pour effet le redimensionnement de l'objet. N'est pas valable pour les menus.
:cursor : concerne la forme du curseur de la souris quand il est à l'intérieur de la fenêtre o. v est un des identificateurs suivants : :default, :wait, :cross.
Pour set_attribute, si o vaut nil, la définition se rapporte à toutes les fenêtres.
© PrologIA
U 5 - 18
Manuel d'Utilisation Windows
:customColor : définit la couleur utilisateur pour l'objet o. v est de la forme
<_r, _v, _b> où _r, _v, _b sont des entiers ou des réels et représentent la couleur en composantes rouge, vert, bleu comme défini dans la primitive gr_color3 (Voir 5.5. Mode de dessin et d'écriture). Cet attribut n'est pas valable pour la primitive get_attribute.
:focus : donne le focus à l'objet o. v est ignoré. N'est pas un attribut valide pour la primitive get_attribute.
:font : concerne la fonte utilisée par l'objet. v a la même signification que dans la primitive gr_font (Voir 5.5. Mode de dessin et d'écriture). La fonte définit un style et une taille. La taille pourra être obtenue par la primitive
get_attribute avec l'attribut :fontheight.
:foreground : concerne la couleur de traçage (texte ou dessin) de l'objet. v est un entier ou un identificateur et suit les mêmes conventions que dans la primitive gr_color2 (Voir 5.5. Mode de dessin et d'écriture).
:predicate : v est le prédicat Prolog attaché à l'objet. N'est pas valable pour les labels (puisqu'ils ne sont pas sensibles), ni pour les menus et leurs items (voir pour ça la primitive set_menu).
Remarque : il peut être utilisé pour les unités graphiques, il correspond alors au prédicat qui doit être lancé, si l'unité n'a pas de bitmap, sur un
événement "expose" (nécessité de retracer une partie de l'unité). La valeur attribuée par défaut est gr_update.
Remarque : ne pas confondre avec le prédicat qui est lancé sur un
événement clic, il est lui lié à une portion de l'unité (Voir le prédicat
gr_sensitive). Il n'est pas modifiable par set_attribute.
:protected permet de désactiver l'option de fermeture dans le menu par défaut d'une fenêtre.
:rank : concerne la numérotation des objets dans leur parent. v est le rang local de l'objet dans son parent, ce numéro est unique pour un parent donné. Implicitement c'est le numéro d'ordre de création. Cet attribut n'est pas valable pour les fenêtres.
:state : concerne l'état de l'objet: sélectionné ou non sélectionné. v vaut respectivement 1 ou 0. Est valable uniquement pour les check buttons et les radio buttons.
:text : concerne le texte d'un champ d'édition, le titre d'une fenêtre, le libellé d'un objet de type bouton ou d'un label. Dans le cas général, v est une chaîne de caractères. Pour un champ d'édition, v peut être de la forme
<s, 1> ce qui signifie que la chaîne de caractères s doit être ajoutée
(mode append) au contenu du champ d'édition.
:text_selection : concerne la sélection dans un champ d'édition. v est de la forme <p1, p2> où p1 est l'indice du premier caractère sélectionné
(débute à 0), p2 est l'indice suivant le dernier caractère sélectionné,
p2 >= p1.
:top_left : concerne la position du coin supérieur gauche de l'objet. v est de la forme <p1, p2> où p1 est l'abscisse, p2 est l'ordonnée. A pour effet le déplacement de l'objet. N'est pas valable pour les menus.
:user_field : concerne le champ utilisateur qui n'est pas du tout géré par
Prolog. v est un entier. Le programmeur peut s'en servir par exemple, comme variable globale associée à l'objet.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 19
:visibility : concerne la visibilité de l'objet. v vaut 0 si l'objet est invisible, 1 si l'objet est visible. N'est pas valable pour les menus.
:width_height : v est de la forme <p1, p2> où p1 est la largeur de l'objet, p2 sa hauteur. N'est pas valable pour les menus.
Les attributs spécifiques aux 'listbox' sont les suivants :
:items : concerne la liste des items d'une listbox. v est une liste de chaînes
Prolog qui décrit, dans le même ordre, tous les items (par leur texte) de la listbox.
:selected_items : concerne la liste des items sélectionnés d'une listbox. v est la liste des rangs des items sélectionnés. Le premier item a le rang 1. S'il est mentionné un rang qui n'existe pas, il est ignoré. S'il est mentionné plus d'un rang pour une listbox en sélection simple, c'est la dernière sélection qui est prise en compte.
:state(i) : concerne l'état d'un item de listbox : sélectionné ou non sélectionné.
v vaut respectivement 1 ou 0. i est un entier pour le numéro de l'item concerné dans la listbox. Le premier item de listbox est représenté par l'entier 1.
:text(i) : concerne le texte d'un item de listbox. i est un entier pour le numéro de l'item concerné dans la listbox. Le premier item de listbox est représenté par l'entier 1. v peut avoir différentes valeurs selon les situations suivantes:
– Interrogation sur le texte de l'item: v est une chaîne de caractères. Si l'item n'existe pas , v est la chaîne vide.
– Modification du texte de l'item : i est un numéro d'item existant, v est une chaîne de caractères non vide.
– Suppression de l'item : i est un numéro d'item existant, v est la chaîne vide.
– Création de l'item : i est un numéro d'item qui n'existe pas, v est une chaîne de caractères éventuellement vide.
– Insertion de l'item : v est de la forme <p1, 1> où p1 est une chaîne de caractères éventuellement vide pour désigner le texte de l'item créé à la position indiquée par i.
:toplist : v est le numéro du premier item visible dans la listbox.
Les attributs spécifiques aux 'scrollbar' sont les suivants :
:scrollb_page : concerne l'amplitude du déplacement du curseur lorsqu'un saut est demandé (clic entre une flèche et le curseur). v est un entier.
:scrollb_pos : v désigne la position du curseur dans la 'scrollbar'. v est une des valeurs entières de l'intervalle de valeurs de la 'scrollbar'. Le 0 est en haut pour les barres verticales, à gauche pour les barres horizontales.
:scrollb_range : concerne l'intervalle de valeurs de la 'scrollbar'. v est un entier. S'il est positif, les valeurs seront comprises entre 0 et v. S'il est négatif, les valeurs seront comprises entre v et –v.
© PrologIA
U 5 - 20
Manuel d'Utilisation Windows
s s
:scrollb_step : v est un entier, il désigne l'amplitude du déplacement
élémentaire du curseur lorsqu'une flèche de 'scroll' est activée.
L'amplitude minimum est 1, c'est aussi la valeur par défaut. Pour obtenir la nouvelle position il faut enlever ou ajouter v à la position actuelle.
get_local_object(p, n, o)
Unifie o avec l'identification de l'objet de parent p et de rang local n dans p.
get_objects(p, l_o)
Unifie l_o avec la liste des objets dont le parent est p.
5.3.3. Gestion des événements
s
get_event(b,e,o)
Teste si un événement de type défini par e concernant l'objet o est présent dans la queue d'événements de Prolog. Si c'est le cas, le premier événement correspondant (le plus ancien dans le temps) est lu donc supprimé de la queue et l'unification des arguments est tentée. Sinon get_event agit en fonction de b qui doit être connu à l'appel.
Si b vaut 0, get_event n'est pas bloquant et génère un backtracking.
Si b vaut 1, get_event est bloquant et un tel événement est attendu, puis lu et enfin l'unification tentée.
o est soit l'identification d'un objet, soit une variable libre. Dans ce dernier cas tous les objets sont concernés.
e est soit une variable libre, dans ce cas tous les événements sont concernés, soit de la forme:
:char(c) : pour les 'edit_field' et les unités (fenêtres ou zones de dessin)
GRAPHICS, où c est le code du caractère.
:click : pour un bouton ("push", "check", "radio") ou une 'scrollbar'. Aucun résultat n'est transmis, simplement un succès ou un échec.
:click(i,m) : pour les menus ou les listbox, où i est le numéro de l'item désigné et m donne l'état des principales touches de modification. m est la somme des valeurs :
1 si la touche SHIFT est appuyée,
2 si la touche CONTROLE est appuyée,
32 s'il s'agit d'un DO UBLE-CLIC
Remarque: Un double clic souris sur un item va générer la séquence d'événements suivante: :click(i,0) :click(i,32).
:click_down(x,y,m) : pour les fenêtres GRAPHICS et FRAMEPANEL et les
'drawing area', où x,y sont les coordonnées du clic relatives à l'objet, m donne l'état des principales touches de modification.
:click_up(x,y,m) : pour les unités (fenêtres ou zones de dessin) GRAPHICS, où x,y sont les coordonnées du clic relatives à l'objet, m donne l'état des principales touches de modification.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 21 s s
Remarque : Un double clic souris dans une unité graphique va générer la séquence d'événements suivante: :click_down(x,y,0) :click_up(x,y,0)
:click_down(x,y,32) :click_up(x,y,0).
:focus_in : pour les 'edit_field'. Aucun résultat n'est transmis, simplement un succès ou un échec.
:focus_out : pour les 'edit_field'. Aucun résultat n'est transmis, simplement un succès ou un échec.
:update : pour les unités (fenêtres ou zones de dessin) GRAPHICS qui n'ont pas de bitmap et qui ont toujours le prédicat par défaut sys:get_event lié
à l'unité.
:extern_event(s, i1, i2): pour les objets externes. s, i1 et i2 sont des données envoyées par l'utilisateur en même temps que l'événement, grace à la procédure send_external_event.
peek_event(b,e,o)
Même principe et mêmes valeurs que la primitive get_event(b,e,o), mais ne fait que consulter la queue d'événements, sans la modifier. L'événement e pour l'objet o n'est pas supprimé de la queue.
clear_events(e,o)
Supprime tous les événements définis par e concernant l'objet o, aucune unification n'est faite, ce prédicat n'échoue jamais. e suit les mêmes conventions que pour get_event(b,e,o).
5.4. Primitives spécifiques pour la gestion de menu
La primitive set_menu décrite dans cette section, permet de définir ou redéfinir des menus hiérarchiques.
Tous les menus, popup ou pulldown, sont attachés à une fenêtre. Il existe néanmoins un support particulier, pour accueillir des menus généraux à l'application, appelé la barre de menus de Prolog.
5.4.1. Sauvegarde et changement de la barre de menu
La barre de menu générale de Prolog est identifiée par :prolog. Pour connaître les identifications de ses menus, il faut effacer sys:get_objects(:prolog,l) qui en rendra la liste.
clear_menubar
Efface la barre de menus standard. Cette primitive permet la redéfinition complète de la barre de menus.
clear_menubar(s)
Efface la barre de menus de la fenêtre s.
© PrologIA
U 5 - 22
Manuel d'Utilisation Windows
s
restore_sysmenus(s,f,e)
Ajoute dans la barre de menus de la fenêtre s les menus prédéfinis "File" et
"Edit" en unifiant leur nom avec f et e. (La variable reste libre, si le menu n'existe pas sur la machine hôte).
!
save_menubar
Mémorise la barre de menus courante. Cette règle ne peut être appelée qu'une fois.
restore_menubar
!
s
Restaure la barre de menus sauvée avec save_menubar.
Initialise la barre de menus de Prolog avec les menus généraux.
!
add_stdmenu(s)
Cette primitive permet de réinsérer un ou plusieurs menus standard après un appel à clear_menubar. s doit être l'une des chaînes suivantes:
"apple"
"file"
"edit"
"find"
"control"
"window"
: pour reinsérer le menu pomme
: pour reinsérer le menu Fichier
: pour reinsérer le menu Editer
: pour reinsérer le menu Recherche
: pour reinsérer le menu Contrôle
: pour reinsérer le menu Fenêtres
5.4.2. Description d'un menu
set_menu(u,c,v)
Permet de définir ou redéfinir par v la valeur de l'item indiqué par c, dans le menu désigné par u.
Signification des arguments:
u (unité) Représente le menu concerné: 0 pour un menu de la barre de menu, l'identification d'une fenêtre pour le popup menu qui lui est associé ou encore l'identification d'un menu (popup ou pulldown).
c (chemin) Liste de chaînes indiquant un chemin de sélection dans le menu
u. L'item correspondant dans ce chemin est remplacé par v. Si une telle hiérarchie n'existe pas, elle est créée. Si la liste est nil, c'est tout le menu qui est concerné. Attention: le titre d'un pulldown menu n'est pas un item, ne pas le mentionner dans le chemin.
v (valeur) Arbre de description de la valeur remplaçant l'item à la position indiquée par c, dans le menu u. Cette valeur peut être une feuille, ou une hiérarchie.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 23
Valeur de type feuille
Une feuille est représentée par :
<"Nom item",Identificateur,n>
La chaîne "Nom item" vient remplacer le texte de l'item indiqué par le chemin.
Ou bien, si la chaîne est vide, l'item désigné est supprimé. Un caractère '&' dans la chaîne "Nom Item" n'apparaitra pas dans le texte de l'item et désignera le caractère qui le suit, comme raccouci clavier pour activer l'item.
Identificateur est l'identificateur d'accès d'une règle d'arité 1 attachée à l'item.
n est un booléen indiquant si l'item est coché ou non.
Il est possible d'utiliser pour v, à la place de ce triplet, les formes simplifiées :
nil
pour indiquer un trait de séparation horizontal
Identificateur
pour
<"Identificateur",Identificateur,0>
<"Nom item",Identificateur> pour
<"Nom item",Identificateur,0>
Lorsque le menu est sélectionné, le programme en cours est suspendu, et le but Identificateur(u) est immédiatement activé. Si le but se termine sans erreur, le programme reprend normalement, sinon l'erreur est propagé par le mécanisme block_exit.
Exemple, en supposant que la fenêtre d'édition "menu.p2" soit ouverte:
>
set_menu( 0
, ["Compilation","Compiler la fenêtre"]
,<"Compiler la fenêtre",compilation_fen>) set_menu( "menu.p2"
, ["Compiler"]
,<"Compiler",compilation_fen>);
{}
>
insert; compilation_fen(0) -> front_window(u) reinsert(u); compilation_fen(u) -> string(u) reinsert(u);;
{}
>
Valeur de type hiérarchie
Une hiérarchie est représentée par un tuple à deux arguments de la forme:
<"Nom item", Liste_de_valeurs>
Chaque valeur représente elle-même une feuille ou une hiérarchie. Il est possible d'utiliser à la place de ce doublet une forme simplifiée:
Liste_de_valeurs
Dans ce cas le nom de l'item est celui indiqué à la fin du chemin c. Ceci revient à apposer la hiérarchie sous l'item indiqué.
Exemple:
> set_menu("graphic",[],
[ <"File", [quit]>
, <"Do", [goal1,<"Stop",goal2>]>
, <"Size", [ <"1",size1>
, <"2",size2,1>
, <"3",size3>
]>
] ); insert; size1(u) -> gr_window(u) gr_text(1,10,nil);
© PrologIA
U 5 - 24
Manuel d'Utilisation Windows size2(u) -> gr_window(u) gr_text(1,12,nil);
...
File
Do
Size
1
2
3
File
Do
Size goal1
Stop
Lorsque l'on utilise set_menu pour la barre de menu, c'est à dire avec u égal à
0, le menu créé sur la barre est un 'pulldown menu'. La première chaîne du chemin c ou bien, si c vaut nil, la première chaîne de la valeur v, représente le titre du pulldown menu. L'identification de ce menu est une chaîne: la chaîne de titre à la création du menu. Les modifications ultérieures du titre ne modifient pas l'identification du menu. L'identification du menu peut être utile pour d'autres primitives telles que kill_object, get_attribute…
Exemple:
>set_menu(0,"new".nil,<"colors",black.grey.white.nil>);
L'identification du menu créé par cet appel est "new", son titre est "colors".
>set_menu(0,nil,colors.black.grey.white.nil);
L'identification du menu créé par cet appel est "colors", son titre est "colors".
>set_menu(0,"colors"."black"."white"."else".nil,else);
L'identification du menu créé par cet appel est "colors", son titre est "colors".
Dans les primitives qui suivent, le premier et le deuxième argument suivent les mêmes conventions que pour set_menu :
!
check_item(u,c,v)
Cette primitive positionne ou enlève le cochage de l'item, suivant les valeurs de
v : 0 indique non coché, 1 indique coché avec la marque standard de la machine.
Si v est un entier plus grand que 1, le caractère de la machine hôte ayant le code v est utilisé comme marque.
Exemple:
> check_item(0,"colors"."black".nil,1);
!
command_menu(u,c,v)
v est le code du caractère utilisé en conjonction de la touche de commande
( ), utilisée comme raccourci pour activer l'item spécifié par les deux premiers arguments.
Exemple de création du raccourci T pour activer la trace Prolog:
> char_code("T",n)
command_menu(0,"Contrôle"."trace".nil,n);
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 25 s Le caractère utilisé comme raccourci clavier est un caractère appartenant au texte de l'item du menu, il est désigné au moment de la définition du menu ou de l'item.
enable_menu(u,c,v)
Permet de désactiver (v =0) ou de réactiver (v =1) un menu ou un item.
L'exemple suivant désactive tout le menu d'édition:
> enable_menu(0,"Editer".nil,0);
!
style_menu(u,c,v)
Spécifie le style d'un item de menu. v est un entier dont chaque bit représente un des styles spécifiés avec l'ordre défini dans la primitive gr_text.
Exemple mettant en italique souligné l'item trace du menu Fenêtres (bit 1 + bit 2 positionnés) :
> style_menu(0,"Fenêtres"."trace".nil,6);
5.5. Mode de dessin et d'écriture
L'ensemble des primitives décrites ici, agit sur des propriétés de l'unité graphique courante (qui peut être une fenêtre de type GRAPHICS ou une 'drawing area').
gr_color3(r,v,b)
Définit la couleur du crayon de l'unité graphique courante en composantes r rouge, v vert, b bleu. Si les valeurs sont réelles, elles correspondent à des pourcentages d'intensité pour chaque composante, elles doivent être comprises entre 0e0 et 1e0, et sont portables d'une machine à l'autre. Si les valeurs sont entières, elles doivent être comprises entre 0 et 65535. Cette couleur est mémorisée comme la :customColor de l'unité graphique courante.
s
!
gr_color(d,c)
Définit la couleur du fond (si d= 0) ou du crayon (si d=1) de l'unité graphique courante. L'argument c est un entier représentant une des 8 couleurs possibles parmi les valeurs: 33:noir, 30:blanc, 205:rouge, 341:vert, 409:bleu, 273:cyan,
137:magenta, 69:jaune.
gr_color1(d,c)
Définit la couleur du fond (si d= 0) ou du crayon (si d=1) de l'unité graphique courante. L'argument c représente une couleur selon les mêmes conventions que celles de la primitive gr_color2.
gr_color2(f,c)
0
1
Définit la couleur f du fond et c du crayon de l'unité graphique courante. Les arguments f et c sont des entiers ou des identificateurs représentant une des couleurs possibles parmi les valeurs : couleur
:white
:red blanc rouge
© PrologIA
U 5 - 26
Manuel d'Utilisation Windows
8
9
6
7
4
5
2
3
:green
:blue
:pink
:orange
:brown
:magenta
:purple
:cyan vert bleu rose orange marron magenta violet cyan
10
11
12
13
:yellow jaune
:lightGrey gris clair
:darkGrey gris foncé
:black
14
15 noir
:defaultColor couleur système
:customColor couleur utilisateur définie par gr_color3.
Remarque: la forme entière est moins explicite que la forme identificateur.
Dans les primitives d'interrogation de la configuration (get_attribute(ob1,
:background, x)), Prolog retourne les valeurs sous forme d'identificateur.
!
gr_choosecolor(p,s,i,f)
Affiche le dialogue de sélection de couleur au point p (de la forme <x,y>) de l'écran. s est une chaîne qui sera affichée dans le dialogue. i et f sont des triplets d'entiers compris entre 0 et 65535; un triplet <r, v, b> représentant une couleur en composantes r rouge, v vert, b bleu. i est la couleur initiale du dialogue et doit être connu au moment de l'appel, f sera unifié avec la couleur choisie. Echoue si l'utilisateur clique sur le bouton Annuler.
gr_pen(l,m)
!
gr_pen(l,h,m)
!
3
4
1
2
Définit la taille en pixels du crayon de l'unité graphique courante et son motif .
l = largeur,
h = hauteur,
m = motif , est un entier ou un identificateur.
m m
0 :clear
:solid motif trame du fond trame pleine
:halfPattern trame demi-teinte
:lightPattern trame claire
:darkPattern trame foncée
Remarque: la forme entière est moins explicite que la forme identificateur.
Dans les primitives d'interrogation de la configuration (gr_get_pen(l, h, m)),
Prolog retourne les valeurs sous forme d'identificateur.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 27 s s
gr_get_pen(l,m) gr_get_pen(l,h,m)
Renseigne sur la taille et le motif du crayon de l'unité graphique courante.
l,h,m ont la même signification que dans la primitive gr_pen(l,h,m). Prolog retourne un identificateur pour le motif du crayon.
gr_stringwidth(s,n)
Unifie n avec la longueur en pixels de la chaîne s en fonction de la fonte, de la taille et du style définis pour l'unité graphique courante.
gr_mode(b,m)
Définit le mode d'application du motif sur le fond, pour l'unité courante graphique.
b=0 Concerne le dessin et donc le motif du crayon.
b=1 Concerne le texte et donc le motif correspondant à chaque caractère.
Il existe quatre opérations de base: Copy, Or, Xor et Bic.
L'opération Copy remplace simplement les pixels de destination par les pixels du motif ou de la source, dessinant sur la destination sans se préoccuper de son état initial.
Les opérations Or, Xor, et Bic laissent inchangés les pixels de destination situés sous la partie blanche du motif ou de la source. Elles traitent différemment les pixels situés sous la partie noire:
Or (ajout) les remplace par des pixels noirs.
Xor (inversion) les remplace par leur contraire.
Bic (effacement) les remplace par des pixels blancs.
Suivant le mode, l'opération est réalisée à partir du motif lui-même (src), ou bien à partie de son inverse (notSrc).
Pour les machines couleur, la partie blanche du motif correspond à la partie couleur du fond, la partie noire du motif correspond à la partie couleur du crayon, la détermination de la couleur inverse est dépendante de la machine.
Voici les valeurs de m pour les différents modes.
m m
2
3
0
1
:srcCopy
:srcOr
:srcXor
:srcBic modes d'application srcCopy srcOr srcXor srcBic
:notSrcCopy notSrcCopy
6
7
4
5 :notSrcOr notSrcOr
:notSrcXor notSrcXor
:notSrcBic notSrcBic
Remarque: la forme entière est moins explicite que la forme identificateur.
Dans les primitives d'interrogation de la configuration (gr_get_mode(1, x)),
Prolog retourne les valeurs sous forme d'identificateur.
© PrologIA
U 5 - 28
Manuel d'Utilisation Windows
s s
gr_get_mode(b,m)
Renseigne sur le mode d'application du motif dans l'unité graphique courante.
b, m ont la même signification que dans gr_mode(b,m). Prolog retourne le mode comme un identificateur.
!
gr_text(f,t,s)
Permet de définir la fonte, la taille et le style des sorties dans l'unité graphique courante. f = numéro de la fonte; t = taille de la fonte; s = liste de numéros de style.
N° fonte
0
1
2
3
4
5
6
7
8 systemFont | applFont newYork geneva monaco venice london athens san Franscico |
|
|
|
|
|
|
|
| N° style
4
5
6
2
3
0
1 gras italique souligné relief ombré condensé
étalé
...
La liste vide représente le texte normal. La combinaison par défaut est
gr_text(4,12,nil).
Par exemple gr_text(3,18,1.3.4.nil) correspond à geneva taille 18, italique, relief et ombré.
Il est possible d'appeler cette règle en donnant en argument des identificateurs auxquels on a assigné les constantes appropriées :
> assign(Geneva,3) assign(Italic,1) assign(Relief,3);
{}
> gr_text(Geneva,18,Italic.Relief.nil)
output("graphic") outm("Hello") output("console");
affiche
Hello
dans l'unité graphique.
gr_font(f)
Charge la fonte représentée par f pour l'unité graphique courante. La fonte de base qui est la fonte proposée par le système est désignée par :ftdefault ; les autres fontes proposées sont de la forme:ft(i) ou bien i, où i est un entier compris entre 1 et 50. La correspondance entre l'entier et le nom de la fonte du système hôte est définie dans le fichier fonts.usr. La totalité des fontes disponibles sur la machine peut être examinée aprés un premier lancement de
Prolog, dans le fichier fonts.all (créé au démarrage du graphisme).
Exemple:
> gr_font(:ft(2));
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 29
5.6. Dessin et positionnement
s
Les primitives décrites ci-dessous agissent sur l'unité graphique courante (qui peut
être une fenêtre de type GRAPHICS ou une 'drawing area'). Elles permettent d'y définir un système de coordonnées, et d'y réaliser des dessins.
gr_setorigin(x,y)
Change l'origine des axes de sorte que x,y représentent les coordonnées du coin intérieur haut et gauche de l'unité graphique courante. L'aspect de l'unité n'est pas modifié.
gr_getorigin(x,y)
Renseigne sur les coordonnées du coin intérieur supérieur gauche de l'unité graphique courante installées par gr_setorigin
gr_penloc(x,y)
Donne en coordonnées entières la position du crayon dans l'unité graphique courante.
gr_penlocr(x,y)
Identique à gr_penloc(x,y) mais donne un résultat de type réel.
gr_erase
Efface le contenu de l'unité graphique courante, repositionne le crayon en haut et à gauche et supprime tous les événements liés à la fenêtre et à ses objets.
gr_move(x,y)
Modifie la position du crayon de x pixels dans le sens horizontal et y pixels dans le sens vertical par rapport à la position courante.
gr_moveto(x,y)
Positionne le point d'écriture (crayon) de l'unité graphique courante en x,y.
gr_line(x,y)
Tire un trait depuis la position courante jusqu'à la nouvelle position du crayon, déplacé horizontalement de x pixels et verticalement de y pixels.
gr_lineto(x,y)
Tire un trait depuis la position courante jusqu'au point x,y, en déplaçant le crayon.
gr_rect(n,r) gr_rect(n,x1,y1,x2,y2)
Permettent d'appeler les routines basiques de dessin inscrit dans un rectangle.
r est l'arbre désignant le rectangle. x1,y1 sont les coordonnées du coin supérieur gauche, et x2,y2 celles du coin inférieur droit du rectangle.
© PrologIA
U 5 - 30
Manuel d'Utilisation Windows
Le premier argument n, où n est un entier ou un identificateur, détermine la procédure appelée:
0, :frameRect, :frame
Dessine le périmètre du rectangle.
1, :paintRect, :paint
Remplit le rectangle avec le motif associé au crayon.
2, :eraseRect, :erase
Efface le contenu et le périmètre du rectangle.
3, :invertRect, :invert
Inverse la couleur de chaque point de l'intérieur du rectangle. Si le rectangle a un coloriage autre que noir et blanc, le résultat est dépendant de la machine.
4, :frameOval
Dessine le périmètre de l'ovale inscrit dans le rectangle.
5, :paintOval
Remplit l'ovale avec le motif associé au crayon.
6, :eraseOval
Efface le contenu et le périmètre de l'ovale.
7, :invertOval
Inverse les bits de l'ovale. Si l'ovale a un coloriage autre que noir et blanc, le résultat est dépendant de la machine.
8, :frameRoundRect
Identique à :frameRect mais avec des coins arrondis.
9, :paintRoundRect
Identique à :paintRect, mais avec des coins arrondis.
10, :eraseRoundRect
Identique à :eraseRect mais avec des coins arrondis.
11, :invertRoundRect
Identique à :invertRect mais avec des coins arrondis.
12, :clipRect
Les dessins ultérieurs traceront uniquement ce qui est à l'intérieur du rectangle. Autrement dit, définit un rectangle de visibilité de tous les dessins à venir. Pour en annuler l'effet, le refaire avec les coordonnées de l'écran.
gr_polygon(n,L)
Dessine un polygone dans l'unité graphique courante. L est une liste de doublets <x,y> indiquant les coordonnées des points définissant le polygone.
Le premier argument n, où n est un entier ou un identificateur, détermine la procédure appelée:
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 31
0, :frame
Dessine le périmètre du polygone.
1, :paint
Remplit le polygone avec le motif associé au crayon.
2, :erase
Efface le contenu du polygone (certaines des lignes brisées formant le contour du polygone peuvent subsister).
3, :invert
Inverse la couleur de chaque point de l'intérieur du polygone. Le résultat est dépendant de la machine si le polygone a un coloriage autre que noir et blanc.
gr_arc(n,r,a1,a2) gr_arc(n,x1,y1,x2,y2,a1,a2)
Dessine un arc d'ellipse inscrit dans le rectangle r entre les angles a1 et a2.
Les angles a1 et a2 sont donnés en degrés.
Le premier argument n, où n est un entier ou un identificateur, détermine la procédure appelée:
0, :frame
Dessine l'arc d'ellipse.
1, :paint
Remplit le secteur défini par l'arc d'ellipse avec le motif associé au crayon.
2, :erase
Efface l'arc et le secteur.
3, :invert
Inverse la couleur de chaque point de l'intérieur du secteur d'ellipse. Le résultat est dépendant de la machine si le coloriage est autre que noir et blanc.
> gr_arc(:frame,100,100,200,170,20,110);
a2
x1,y1
a1
x2,y2
© PrologIA
U 5 - 32
Manuel d'Utilisation Windows gr_arc'(n,r,a1,a2) gr_arc'(n,x1,y1,x2,y2,a1,a2)
Dessine un arc d'ellipse inscrit dans le rectangle r entre les angles a1 et a2. a1 et a2 sont donnés en degrés. Les arguments sont les mêmes que pour gr_arc mais l'origine est sur l'axe vertical, a2 est relatif à la position a1, le sens positif est dans le sens des aiguilles d'une montre.
> gr_arc'(:frame,100,100,200,170,20,30); a1 a2 x1,y1
A!ociation
Prolog
HERITAGE x2,y2
!
gr_icon(n,x1,y1,x2,y2)
!
gr_icon(n,r)
Dessine dans l'unité graphique courante, et inscrit dans le rectangle indiqué une icône décrite dans une ressource 'ICON' de numéro n. Cette ressource est recherchée d'abord dans l'exécutable Prolog II+, puis dans le fichier système.
Le système contient toujours les icônes :
0 Panneau stop.
1 Notification.
2 Panneau danger.
Le meilleur résultat est obtenu en donnant comme rectangle un carré de coté
égal à 32.
gr_load(s)
Dessine dans l'unité graphique courante le contenu d'un fichier graphique de nom s. Ce fichier graphique est un fichier externe à PrologII+ réalisé à l'aide d'un quelconque éditeur graphique du système hôte. Il est possible de dessiner à des endroits différents des parties sélectionnées du fichier, en jouant sur les primitives gr_setorigin et gr_rect(:clipRect,..).
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 33
5.7. Position de la souris dans une zone graphique
!
!
!
s s
Un événement 'clic' peut être utilisé pour sélectionner, pour déclencher un traitement de manière asynchrone, ou encore, simplement pour désigner un point d'un objet de type GRAPHICS. Les primitives décrites ci-dessous concernent l'unité graphique courante (qui peut être une fenêtre de type GRAPHICS ou une 'drawing area').
!
gr_click(b,x,y)
Teste si un bouton de la souris a été pressé depuis le dernier appel de
gr_erase ou gr_click. Si c'est le cas, x et y sont unifiés avec les coordonnées, dans l'unité graphique courante, du point où se trouvait la souris lorsque cet
événement, appelé "clic", s'est produit. Sinon agit selon b. b est un booléen qui doit être connu au moment de l'appel, avec la signification :
b=1 Attendre qu'un nouveau clic se produise dans l'unité graphique courante.
b=0 Ne pas attendre et réaliser un backtracking.
gr_click(b,x,y)
Teste si un événement "clic" dans l'unité graphique courante est présent dans la queue des événements. Si c'est le cas, x et y sont unifiés avec les
"coordonnées du clic" dans l'unité graphique courante et l'événement est supprimé de la queue. Sinon agit selon b. b est un booléen qui doit être connu au moment de l'appel, avec la signification :
b=1 Attendre qu'un nouveau clic se produise dans l'unité graphique courante.
b=0 Ne pas attendre et réaliser un backtracking.
Voir aussi la primitive get_event.
gr_click(b,x,y,m)
4
8
1
2
Identique à gr_click(b,x,y) mais donne en plus l'état des principales touches de modification en unifiant m avec la somme des valeurs :
La touche MAJ USC ULE est appuyée.
La touche CONTROLE 1 est appuyée.
Une touche option est appuyée (OPTION sur Mac).
La touche COMMANDE est appuyée.
16 La touche MAJ USC ULES-VERRO UILLEES est enfoncée.
32 Il s'agit d'un DO UBLE_CLIC.
On a donc m=0 si aucune touche modificatrice n'est appuyée pendant le clic.
gr_clickr(b,x,y)
Identique à gr_click(b,x,y) mais x et y sont de type réel.
1
Cette touche est absente sur le clavier du Macintosh +.
© PrologIA
U 5 - 34
Manuel d'Utilisation Windows
s
gr_sensitive(x1,y1,x2,y2,p)
Définit le rectangle de coordonnées x1,y1,x2,y2 dans l'unité graphique courante f, comme zone sensible aux événements clic, à laquelle est attaché le prédicat p. Si p est un identificateur différent de nil et get_event, à chaque clic
à l'intérieur du rectangle le but p(f) sera lancé. Par défaut toutes les zones sont définies avec get_event et donc tous les clics dans l'unité sont envoyés dans la queue d'événements de Prolog. gr_sensitive(x,y,x',y',nil) permet d'ignorer les clics dans la zone définie.
Les différents rectangles définis doivent être disjoints. Dans le cas contraire, pour un clic dans la partie commune, le comportement n'est pas garanti. C'est une des zones qui le capte, mais on ne sait pas laquelle.
gr_getmouse(x,y) gr_getmouse(x,y,b)
Donne la position actuelle de la souris dans l'unité graphique courante en coordonnées entières relatives à l'origine de l'unité. b=0 si le(s) bouton(s) de la souris sont relevés au moment de l'appel, sinon le numéro du bouton pressé en commençant par la gauche pour une souris à plusieurs boutons (le premier bouton a le numéro 1).
gr_getmouser(x,y)
Identique à gr_getmouse(x,y) mais donne un résultat réel.
A!ociation
Prolog
HERITAGE
5.8. Primitives spéciales de saisie
5.8.1. Simulation de boutons
!
L'utilisation des deux primitives qui suivent nécessite le chargement préalable du module de dessin dessin.mo.
Elles permettent de simuler des boutons dans l'unité graphique courante.
gr_draw_buttons(b)
-
-
-
Dessine tous les boutons de la base de données dont l'identificateur d'accès est b. La base de données de boutons est construite par l'utilisateur. Il attribuera un nom de règle à chaque groupement de boutons. Les règles doivent avoir trois arguments: le rectangle dans lequel le bouton s'inscrit.
la chaîne affichée dans le bouton.
un terme à associer au bouton.
Par exemple les boutons suivants définis par l'utilisateur:
wtButton(<5,160>.<50,175>,"Edit",edit)->; wtButton(<5,180>.<50,195>,"Set",nil)->;
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 35 sont dessinés en lançant le but:
> gr_draw_buttons(wtButton);
gr_button_hit(b,<x,y>,t)
b est l'identificateur d'accès à la base de données de boutons. Cette règle s'efface si x,y sont les coordonnées d'un point à l'intérieur d'un des boutons de la base b. t est alors unifié avec le troisième argument de la règle pour le bouton concerné.
La primitive gr_click combinée avec gr_button_hit permet d'écrire facilement une boucle de scrutation des boutons.
5.8.2. Affichage de message avec validation
s
message_box(t,s,m,b,x)
Crée une fenêtre graphique modale pour afficher un message. Après saisie, la fenêtre est détruite et x est unifié avec le numéro du bouton de sortie. La fenêtre comporte:
- un titre donné par la chaîne de caractères s,
- une icone définie par l'identificateur t parmi les valeurs: :warning, :info,
:question, :wait, :error, dont le dessin dépend de l'environnement graphique de la machine
- un message donné par la chaîne de caractères m,
- une ligne de boutons (au plus 3) telle que: si b est un entier, il y aura b boutons dont les textes sont fonction de leur nombre et du type d'icone, et dépendent de l'environnement graphique de la machine.
si b est une liste de chaînes, chaque chaîne définit le texte d'un bouton. Ceci peut être sans effet sur certains environnements.
5.8.3. Saisie de texte
gr_editf(<s1,p1,p2>,r,s,k) gr_editf(<s1,p1,p2>,x1,y1,x2,y2,s,k)
Créent un rectangle d'édition dans l'unité graphique courante, qui doit être une fenêtre. Dans le cas contraire (drawing area), une erreur est générée.
La fin d'édition est provoquée par un retour chariot, un caractère de tabulation, ou un clic dans la fenêtre en dehors du rectangle d'édition et en dehors d'un objet. Si k n'est pas une variable, le rectangle et son texte sont seulement dessinés sans édition.
s1 est la chaîne qui sert à initialiser l'édition.
p1, p2 sont des entiers définissant les indices des caractères de début
(inclus) et de fin (non inclus) de la sélection dans le texte (représentée en vidéo inverse). Le premier indice est 0. Initialiser avec un champ vide correspond aux valeurs:<"",0,0>.
© PrologIA
U 5 - 36
Manuel d'Utilisation Windows
s
r s
définit la position du rectangle englobant. Le texte est cadré à gauche.
x1,y1,x2,y2
sont les coordonnées des coins supérieur gauche et inférieur droit du rectangle dans la fenêtre.
est la variable qui sera unifiée avec la chaîne éditée.
k
si k est une variable, celle-ci est unifiée en sortie avec le mode de terminaison:
0 si retour chariot,
1 si clic souris dans la fenêtre 1 en dehors du rectangle d'édition,
2 si caractère TAB.
Si k est une constante en entrée, sortie immédiate après affichage de la zone.
Une forme plus simple de la règle est également utilisable pour une chaîne initiale vide: gr_editf(<>,x1,y1,x2,y2,s,k)
Remarque : cette fonction peut également être réalisée avec les primitives de création et manipulation des objets editfield ou label.
!
get_key(c)
!
get_key(a,t,m)
get_key sert à prendre un caractère au vol. Il n'y a aucun écho de ce caractère dans aucune fenêtre que ce soit. Cette primitive permet donc de saisir un motde-passe. Le fonctionnement détaillé est donné dans la description de stty .
get_key(c) rend dans c un caractère.
get_key(a, t, m) rend trois entiers :
- dans a le code ascii étendu
- dans t le numéro de touche (virtual key code décrit dans Inside Macintosh vol. V p.192))
- dans m l'état des touches de modifications (voir la primitive gr_click)
!
stty(" USEGETKEY", t)
réglemente l'usage du prédicat get_key.
t = 0
A!ociation
Prolog
HERITAGE mode par défaut, dans lequel get_key échoue toujours. Les caractères tapés sont insérés dans les fenêtres texte le cas échéant. Dans ce mode, l'utilisateur peut éditer des fenêtres texte pendant que Prolog II+ travaille.
t < 0
1
On peut lire sa position avec gr_click(0,x,y).
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 37
get_key prendra un caractère qui ne peut être plus âgé que t ticks (1/60sec) avant l'appel. Echoue si, au moment de l'appel, aucun caractère n'est disponible, ou si le caractère est trop “vieux” .
t > 0
get_key attendra un caractère pendant au plus t ticks. Echouera si aucun caractère n'est disponible au bout de ce laps de temps. get_key n'attend pas que le délai soit écoulé pour réussir, si on lui fournit un caractère dans les temps. Un caractère peut avoir été tapé à l'avance. Ce mode permet de saisir un mot-de-passe en un temps donné.
Exemples :
> stty(" USEGETKEY", -60);
Le prochain appel à get_key échouera si aucun caractère non lu n'a été tapé moins d'une seconde avant cet appel (1 s = 60 ticks).
> stty(" USEGETKEY", 300);
Le prochain appel à get_key échouera si aucun caractère non lu ne peut être obtenu dans les cinq secondes suivant cet appel (1 s = 60 ticks). Le caractère peut avoir été tapé à l'avance. get_key réussira de suite après avoir obtenu le caractère sans attendre que le délai soit écoulé.
!
stty("FL USH")
Enlève tous les caractères de la queue d'événements. Ils ne sont plus disponibles pour get_key. (permet à get_key de saisir une réponse qui n'a pas
été tapée à l'avance.)
!
gtty(s, v)
Récupère la valeur d'un paramètre concernant le terminal : gtty(" USEGETKEY", v) rend 0 ou un nombre signé de ticks. gtty("TERM", x) rend actuellement "TTY" ou "MPW".
5.8.4. Boites de choix
gr_list(r, l, l_i, v_i, l_o, v_o, o) l r
La règle gr_list gère un choix d'élément(s) dans une liste. Cette liste s'affiche dans l'unité graphique courante, qui doit être une fenêtre. Dans le cas contraire
(drawing area), une erreur est générée.
Description des paramètres :
Le rectangle englobant (ascenseurs compris) de la forme
<x1,y1>.<x2,y2> ou <x1,y1,x2,y2>.
La liste d'items. Elle doit être une liste de constantes (éventuellement mixtes : chaîne, entier, réel, identificateur, <>).
l_i
Est la sélection initiale, sous la forme d'une liste éventuellement vide d'entiers qui sont les rangs (à partir de 1) dans l des éléments que l'on veut sélectionner.
© PrologIA
U 5 - 38
Manuel d'Utilisation Windows
s
v_i
C'est le rang de l'élément qui doit apparaître en première position en haut du rectangle.
l_o
Donne en sortie la liste des rangs des items sélectionnés (même convention que pour l_i).
v_o
Donne en sortie le rang du premier item visible dans le rectangle.
o
Décrit l'opération à réaliser parmi 4 possibles :
<0> Dessine seulement (pas de saisie possible).
<1,k> Dessine et prend la main jusqu'à ce qu'un événement de type frappe de caractère ou clic dans la fenêtre à l'extérieur de la liste ne se produise. NI LE CLIC, NI LE CARACTERE NE SONT L US.
Rend pour k :
0 : Retour Chariot tapé
1 : clic en dehors de la liste
<2,x,y,m>
2 : TAB tapé
Dessine la liste et traite le clic x,y,m (donné par exemple par gr_click(?,x,y,m) ). Sort tout de suite après.
<3,x,y,m,k>
Dessine, traite le clic x,y,m (donné par exemple par gr_click(?,x,y,m)) et prend la main jusqu'à ce qu'un événement de type clavier ou un clic dans la fenêtre à l'extérieur du rectangle se produise. Ni le clic ni le caractère ne sont lus.
Rend pour k :
0 : Retour Chariot tapé
1 : clic en dehors de la liste
2 : TAB tapé
On peut lire le clic de fin de sélection par gr_click(0,x,y).
Remarque : cette fonction peut également être réalisée avec les primitives de création et manipulation des objets listbox.
!
gr_popupItem(r,L,n1)
!
gr_popupItem(r,L,n1,n2)
Crée un champ à valeurs proposées.
L est une liste de constantes. r est le rectangle dans lequel est affiché l'item numéro n1 de la liste L. Si n2 est absent, l'item est simplement dessiné. Si n2 est présent, un menu présentant la liste des choix L vient recouvrir l'item, et l'inversion des champs est gérée tant que le bouton de la souris reste appuyé.
Lorsque le bouton est relaché, le champ sélectionné est dessiné dans le rectangle à la place du précédent, et n2 est unifié avec son numéro (n1 si aucun champ n'est sélectionné). Exemple: rendre la fenêtre graphique visible et taper dans la console l'exemple suivant :
> gr_popupItem(<20,20,120,40>, ["aa","bb","cc","dd",3,4], 2)
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 39
gr_click(1,x,y) gr_popupItem(<20,20,120,40>, ["aa","bb","cc","dd",3,4], 2, i);
Lorsque vous cliquez dans la fenêtre en maintenant le bouton appuyé :
3
4 a a bb cc dd
5.8.5. Choix de fichier
input(x) output(x)
C'est une facilité ajoutée aux primitives input et output, avec x variable libre au moment de l'appel. Cette facilité consiste à demander à l'utilisateur, le nom du fichier par une boite de dialogue. Ensuite le changement d'unité d'entrée ou de sortie est réalisé normalement (voir input output), avec ouverture éventuelle du fichier. En sortie, unifie x avec le nom complet du fichier. Il y a échec et aucune action réalisée si, dans le dialogue de sélection de fichier, le bouton
Annuler est cliqué.
s
sfgetfile(s) sfgetfile(s,Filter,NomInitial,Point)
Affiche une zone de dialogue permettant de visualiser, parmi les noms des fichiers se trouvant sur le(s) disque(s), ceux compatibles avec Filter et d'en sélectionner un.
Point est un point de format <x,y> indiquant l'endroit où est affiché le dialogue.
Ce dialogue comporte une liste de choix pour les fichiers proposés, et un champ d'édition initialisé avec la chaîne NomInitial.
s est unifié avec la sélection faite par l'utilisateur, il s'agit du nom complet du fichier (comprend le chemin d'accès et le nom selectionné). Le fichier n'est pas ouvert. La règle échoue si le bouton Annuler est pressé.
!
sfgetfile(Point,Ltypes,Filter,S)
Affiche une zone de dialogue permettant de visualiser, parmi les fichiers se trouvant sur le(s) disque(s), les noms de ceux dont le type est mentionné dans la liste Ltypes et d'en sélectionner un.
© PrologIA
U 5 - 40
Manuel d'Utilisation Windows
Point est un point de format <x,y> indiquant l'endroit où est affiché le dialogue.
Ltypes est une liste de types précisant les fichiers à proposer. Un type est une chaîne de 4 caractères tel que défini dans Inside Macintosh. Exemple:
"TEXT"."APPL".nil sélectionne tous les fichiers de type texte seul ou application.
Filter est une procédure de filtrage pour l'acceptation des fichiers sélectionnés.
Ce doit être nil pour l'instant.
S est unifié avec la sélection faite par l'utilisateur. Il est de la forme : <C,T,N> où C est le créateur (chaîne de 4 caractères), T est le type du fichier (chaîne de
4 caractères), et N est une chaîne indiquant le chemin d'accès et le nom du fichier sélectionné (le fichier n'est pas ouvert).
La règle échoue si le bouton Annuler est pressé.
sfputfile(s)
Affiche une zone de dialogue permettant de choisir un nom de fichier à créer.
Unifie s avec le nom avec chemin de ce fichier. Le fichier n'est pas ouvert. La règle échoue si le bouton Annuler est pressé.
!
sfputfile(Point,Prompt,NomInitial,s)
Affiche une zone de dialogue permettant à l'utilisateur de choisir un nom, un volume, et un répertoire pour un fichier.
Le nom du fichier se saisit au clavier dans une zone d'édition qui est initialisée avec la chaîne (éventuellement vide) NomInitial qui doit être un nom de fichier sans chemin.
Si l'utilisateur tape un nom de fichier déjà existant, une alerte le prévient. Le fichier n'est ni créé ni ouvert.
s est unifié avec le nom avec chemin validé par l'utilisateur.
Point est un point de format <x,y> indiquant l'endroit où est affiché le dialogue.
Prompt est une chaîne (éventuellement vide) contenant un message destiné à l'utilisateur, ajouté en tête du dialogue.
La règle échoue si le bouton Annuler est pressé.
A!ociation
Prolog
HERITAGE
5.8.6. Choix d'un noeud d'un arbre
gr_tree_click(a,l,n)
L'utilisation de cette primitive nécessite le chargement préalable du module de dessin dessin.mo
Dessine dans l'unité graphique courante l'arbre a, et attend que l'utilisateur clique sur un des noeuds de l'arbre. Lorsque ceci est fait, l est unifié avec le chemin conduisant au noeud, et n est unifié avec le noeud. Le chemin est la liste des numéros des fils à parcourir en partant de la racine. Par exemple, le noeud dd de l'arbre aa(bb,cc(ee(dd),ff)) est représenté par le chemin 2.1.1.nil.
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 41
5.9. Règles pour gérer des objets structurés
gendialog(D,l1,l2) gendialog(P,D,l1,l2)
L'utilisation de cette primitive nécessite le chargement préalable du module
obdialog.mo. Cette primitive donne à l'utilisateur un moyen trés rapide de créer des sources d'écrans graphiques, pouvant être ensuite intégrés à des applications.
P, D et l1 ont la même signification que dans la primitive gr_dialog décrite dans cette section.
Génère dans l2 une liste de buts permettant de créer l'écran de dialogue défini par D.
Exemple :
gendialog(<100,100>.3.nil,"Hello".buttonD,nil, b_uts) b_uts;
va unifier b_uts avec la liste des buts à effectuer pour la création de ce dialogue et ensuite effacer ces buts.
gr_dialog(D,l1,l2) gr_dialog(P,D,l1,l2)
-
-
L'utilisation de cette primitive nécessite le chargement préalable du module
obdialog.mo. Ce module contient le gestionnaire de dialogue Prolog II+ permettant de créer et activer les dialogues décrits par l'argument D.
Dans sa deuxième forme, la primitive gr_dialog accepte un argument
supplémentaire P, qui est une liste formée au choix par : un doublet d'entiers <x,y> pour déterminer la position du coin supérieur gauche du dialogue; un entier i pour choisir la fonte du texte du dialogue. i est comme précisé dans la primitive gr_font.
le terme :title(s) où s est une chaîne de caractères désignant le titre de la fenêtre de dialogue.
D est soit un arbre décrivant un dialogue, soit l'identificateur d'une règle unaire avec un tel arbre en argument. l1 est une liste (éventuellement vide) de paires
(nom_de_zone . valeur_initiale) cette liste est utilisée pour définir ou redéfinir le contenu des zones. En sortie, si l2 est une variable, elle est unifiée avec la liste des couples (nom_de_zone .
valeur_finale) du dialogue. Si l2 est une liste de paires (nom_de_zone . X), chaque paire est unifiée avec le couple correspondant.
Un dialogue est décrit avec des objets primitifs (zone de texte, zone d'édition, boutons, ...) et des primitives d'agencement en colonne ou en rangée. Ces primitives réalisent un ajustement dynamique de la taille des zones en fonction de leur contenu. Les zones dont la valeur peut être modifiée sont identifiées par un nom, ce qui permet de redéfinir leur valeur au moment de l'appel.
Exemple:
© PrologIA
U 5 - 42
Manuel d'Utilisation Windows
> load("obdialog.mo");
> gr_dialog("Hello".buttonD("OK"),nil,L);
A!ociation
Prolog
HERITAGE
> gr_dialog(
"Name:"
.editf(10,field1)
.buttonD("OK")
, (field1."John").nil, L);
Les primitives de description d'objet sont les suivantes:
:text(s) , :text(s,f), :text(s,f,c) ou s
Décrit une ligne de texte non éditable représenté par s où s est une chaîne.f désigne le numéro de fonte à la manière du prédicat gr_font, et
c la couleur du texte à la manière de l'attribut :foreground du prédicat
set_attribute.
:text(i)
Décrit une ligne de texte non éditable dont le nom de zone est i où i est un identificateur. Si une valeur est associée à i dans l1 c'est cette valeur qui est la valeur initiale du champ, sinon c'est la chaîne vide. Il n'est jamais associé de valeur finale à cette zone, puisqu'elle n'est pas modifiable.
:cb(i), :cb(i,v), :cb(i,v,s)
Décrit une boîte, dont le nom de zone est i, de type choix oui/non qui sont représentés respectivement par les deux valeurs possibles de v: 1/0.
Si la valeur de v n'est fournie ni en argument, ni dans la liste l1, c'est la valeur 0 qui est donnée par défaut. Lorsque v est redéfini dans l1, c'est toujours cette dernière valeur qui est prise en compte. s est une chaîne qui définit le texte qui accompagne la boite.
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 43
:rb(<g,i>), :rb(<g,i>,v), :rb(<g,i>,v,s)
Décrit un radio-bouton i d'un groupe g (où g est un identificateur, et i une constante quelconque). Ce radio-bouton de valeur 0/1, fait partie du groupe g, avec au plus une valeur possible à 1 dans le groupe. Si la valeur de v n'est fournie ni en argument, ni dans la liste l1, c'est la valeur
0 qui est prise par défaut. Lorsque v est redéfini dans l1, c'est toujours cette dernière valeur qui est prise en compte. s est une chaîne qui définit le texte qui accompagne le radio-bouton. En sortie, nom_de_zone est représenté par g(i), et valeur_finale par 0 ou 1, et ceci pour chacun des radio-boutons du groupe.
:rb1(<g,i>), :rb1(<g,i>,v), :rb1(<g,i>,v,s)
Sensiblement identique à rb mais avec la contrainte que les éléments du groupe ne peuvent être tous à zéro. Seul l'élément ayant la valeur 1 figure dans la liste de sortie. nom_de_zone est alors représenté par g, et
valeur_finale par i. Ce format de sortie est donc différent et plus simple que celui fourni par rb.
:editf(n,i), :editf(n,i,s)
Décrit une zone d'une ligne de texte éditable de nom i, où i est un identificateur. s représente la valeur initiale de la zone d'édition. Cette valeur initiale est la chaîne vide si elle n'est spécifiée ni en argument, ni dans la liste l1. n est un entier représentant le nombre minimum de caractères de la zone. Si s est plus grand, la zone est dynamiquement expansée.
:button(s,i)
Décrit un bouton avec le label s auquel est associé l'action i. Lorsque le bouton est pressé, une action est réalisée:
- Si i est fail, le dialogue est terminé, et gr_dialog échoue.
- Si i est nil, rien n'est fait.
- Sinon, le but i(l) est activé, l étant la liste des paires nom.valeur des zones du dialogue au moment où le bouton est cliqué.
Lorsque le but i a été exécuté, la gestion du dialogue reprend en l'état.
Pour arrêter le dialogue en cours, l'utilisateur peut programmer dans i un block_exit(<fail,L>) qui provoquera un backtracking de gr_dialog, ou un block_exit(<nil,L>) qui conduira à une terminaison normale, l2
étant construite à partir de la liste des couples nom.valeur indiquée par
L.
:button2(s,i)
Cet item a le même comportement que l'item :button, mais cette fois-ci la règle i est appelée avec deux arguments. Le premier est une liste décrivant l'état des items du dialogue. Le deuxième est à l'appel une variable qui doit être instanciée par la règle i/2 avec la liste des items dont la valeur est modifiée. Cette règle est écrite par l'utilisateur, et permet donc d'attacher une sémantique quelconque aux boutons. La règle définit une relation entre le premier argument (argument d'entrée représentant la liste des valeurs actuelles), et le deuxième argument
(argument de sortie représentant la liste des nouvelles valeurs).
© PrologIA
U 5 - 44
Manuel d'Utilisation Windows
:buttonD, :buttonD(s), :buttonD(s,i)
Décrit un bouton de terminaison de dialogue avec le label s auquel est associé l'action i. Usuellement s est la chaîne "OK", et i est nil. Ce bouton est activable par un clic ou par la frappe d'un Retour Chariot.
:glist(Lignes,Colonnes,Identificateur,ListeValeurs)
Définit un item de type liste de valeurs avec barre de défilement. La signification des arguments est :
Lignes
Entier représentant le nombre d'items devant être visibles. La hauteur du rectangle est calculée automatiquement en fonction de ce paramètre.
Colonnes
Entier représentant le nombre de caractères devant être visible pour un item. La largeur du rectangle est calculée automatiquement en fonction de ce paramètre.
Identificateur
Identificateur servant à donner un nom interne au gestionnaire. Il est utilisé pour donner le résultat en sortie.
ListeValeurs
Liste quelconque de constantes (chaînes, identificateurs, nombres) qui représente la liste des valeurs présentées, ou bien un triplet décrivant l'état initial du gestionnaire. Ce triplet doit alors avoir la forme :
<ListeValeurs, ListeDesNoSelectionnés, NoEnHaut>
Le premier argument est une liste quelconque de constantes (chaînes, identificateurs, nombres).
Le deuxième argument est la liste ordonnée des numéros d'ordre des items composant la sélection initiale. Cette liste peut comporter 0 (pas de sélection), 1, ou plusieurs éléments.
Le troisième argument indique le numéro de l'item à présenter en haut du rectangle d'affichage.
En sortie, donc dans l2, le résultat est donné sous la forme habituelle d'un couple :
(identificateur.listeDesItemsSélectionnés)
Tandis que dans la représentation interne, l'état du gestionnaire est désigné par le triplet décrit ci-dessus. C'est sous cette forme que doit
être manipulée la valeur de la glist dans les programmes liés aux boutons. C'est à dire c'est le couple (identificateur . < ListeValeurs,
ListeDesNoSelectionnés, NoEnHaut >) qui doit apparaître dans les listes manipulées par ces programmes.
Les primitives d'agencement sont basées sur la notion de combinaison de rectangles: mettre deux rectangles en colonne définit un nouveau rectangle englobant les deux autres.
A!ociation
Prolog
HERITAGE
© PrologIA
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 45
:col(l) ou l
Décrit une colonne alignée à gauche, dont le contenu est décrit par l. Si l est une séquence, la primitive calcule la taille de chaque élément de la séquence, et constitue une colonne d'éléments disposés les uns au dessus des autres, et alignés sur leur côté gauche.
:ccol(l)
Décrit une colonne centrée verticalement, dont le contenu est décrit par la séquence l.
:row(l)
Décrit une rangée horizontale décrite par la (séquence de) primitive(s) l, et dont les éléments sont alignés sur leur bord supérieur: si l est une séquence, la primitive calcule la taille de chaque élément de la séquence, et constitue une rangée d'éléments disposés côte à côte alignés sur leur bord supérieur.
:crow(l)
Décrit une rangée d'objets décrits par l et centrés horizontalement, c'est à dire disposés de manière à ce que leurs points médians soient tous alignés sur une même horizontale.
:vfill(n)
Décrit un espacement vertical de n pixels, où n est un entier.
:hfill(n)
Décrit un espacement horizontal de n pixels, où n est un entier.
La primitive de groupement suivante permet de gérer l'activation ou la désactivation de zones entières pendant la saisie du dialogue.
:group(identificateur.valeur,DescriptionDesItems)
Permet d'associer un identificateur à un ensemble d'items regroupés géographiquement et sémantiquement. valeur indique si le groupe est actif ou non (0 pour inactif, 1 pour actif). Lorsque le groupe est inactif, il est dessiné en grisé et l'état de ses items ne peut être modifié. L'état d'un groupe ne peut être modifié dans la version actuelle que par les actions associées aux boutons. L'état d'un groupe n'est pas donné dans la liste de sortie, il est par contre fourni, dans la liste des états passée aux boutons, sous la forme d'un couple :
(identificateur.valeur)
Exemples:
> gr_dialog( ccol("Voulez-vous recommencer le test?"
.buttonD
.button("Annuler",fail))
, nil
, L);
© PrologIA
U 5 - 46
Manuel d'Utilisation Windows
> gr_dialog( "Choose the color you want"
.crow( rb(rb_1(red),1,"Red").
rb(rb_1(green),0,"Green"))
.crow( cb(cb_1,0,"Extended colors"))
.ccol( buttonD("Show Color")
.button("Cancel",fail)
)
, (cb_1.1).nil
, (cb_1.C).(rb_1(red).R).(rb_1(green).G).nil );
A!ociation
Prolog
HERITAGE
{C=1, R=1, G=0}
> gr_dialog( :crow( "abcdefgh"
.:ccol( :button("Stop",fail)
.:buttonD("OK",nil)
.:button("Cancel",fail)
."HELLO WORLD"
)
."ijklmnopq"
)
, nil,l);
> gr_dialog( glist( 5, 10, list1
, < [rouge,vert,bleu,jaune
,violet,noir,blanc,orange]
, [4,6]
, 2
© PrologIA
A!ociation
Prolog
HERITAGE
>)
.buttonD
, nil
, L);
{L=(list1.jaune.noir.nil).nil}
Primitives graphiques
U 5 - 47
> insert;
enable( l1, l3 ) ->
set_item(l1, zone1, 1, l2)
set_item(l2, zone2, 0, l3); disable( l1, l3 ) ->
set_item(l1, zone1, 0, l2)
set_item(l2, zone2, 1, l3); set_item( nil, i, b, nil ) -> block_exit(816, "set_item, absent: ".i); set_item( (i._).l, i, b, (i.b).l ) -> ! ; set_item(e.l, i, b, e.l' ) -> set_item( l, i, b, l' ) ;;
{}
> gr_dialog( group(zone1.0, "Hello"
.crow(rb1(color(red),0,"Red"))
.crow(rb1(color(green),1,"Green"))
.editf(5,ed1,"aa")
.button2("Disable",disable)
)
.group(zone2.1, button2("Enable",enable))
.buttonD
, nil
, L);
© PrologIA
U 5 - 48
Manuel d'Utilisation Windows
{L=(color.green).(ed1."aa").nil}
5.10. Envoi d'événements à Prolog depuis un objet externe
Nous appellerons "objet externe", tout objet graphique créé d'une autre manière que par l'appel des prédicats graphiques. Cela peut être fait durant l'appel à un prédicat externe ou bien dans le programme principal avant de démarrer Prolog, par exemple en chargeant un objet décrit dans un fichier de ressources généré par un outil externe (par exemple Dialog Editor sous Windows).
La possibilité qui est offerte ici, est de faire communiquer cet objet avec Prolog, en utilisant le principe des événements.
par l'intermédiaire de l'appel à une fonction C:
send_external_event(no,str,bool,int1,int2)
envoie un événement à Prolog.
Les deux modes de gestion de l'événement sont possibles: traiter l'événement immédiatement, ou bien le mettre dans la queue d'événements.
La signification des arguments est la suivante:
bool, qui est de type int, à valeur booléenne, indique le mode de traitement désiré:
- si bool est non nul, on désire traiter l'événement immédiatement, et dans ce cas:
str, qui est de type char *, représente le but Prolog à appeler,
no, int1, int2, sont ignorés.
- si bool vaut 0, on veut poster l'événement dans la queue de Prolog et dans ce cas:
no, qui est de type int, pourra servir à identifier l'objet,
© PrologIA
A!ociation
Prolog
HERITAGE
A!ociation
Prolog
HERITAGE
Primitives graphiques
U 5 - 49
int1, int2, qui sont de type int, et str ont des valeurs dont les significations sont laissées libres à l'utilisateur.
Cet évenement sera accessible par les prédicats de lecture d'événements:
get_event(b, e, o) et peek_event(b, e, o) où :
o sera unifié avec no,
e sera unifié avec le terme Prolog :extern_event(str, int1, int2)
© PrologIA
U 5 - 50
Manuel d'Utilisation Windows
A!ociation
Prolog
HERITAGE
© PrologIA

Link público atualizado
O link público para o seu chat foi atualizado.