25.07.2013 Views

IDL et ses widgets

IDL et ses widgets

IDL et ses widgets

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 1<br />

(aide à l’apprentissage - Jean Aboudarham)


<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 2<br />

Table des matières<br />

I. RAPPELS <strong>IDL</strong> ..................................................................................................................................................... 3<br />

1) PASSAGES DE VALEURS ENTRE PROGRAMMES .................................................................................................... 3<br />

2) LES STRUCTURES............................................................................................................................................... 3<br />

3) QUELQUES RAPPELS DE REGLES D’ECRITURE...................................................................................................... 4<br />

II. PRINCIPE GENERAL DES WIDGETS........................................................................................................... 4<br />

1) GENERALITES.................................................................................................................................................... 4<br />

a) Qu’est-ce qu’un « widg<strong>et</strong> » ?........................................................................................................................ 4<br />

b) Qu’est-ce qu’un « compound widg<strong>et</strong> » ?....................................................................................................... 4<br />

2) HIERARCHIE...................................................................................................................................................... 4<br />

3) LES DIFFERENTS WIDGETS ................................................................................................................................. 5<br />

4) LES CONTROLES ................................................................................................................................................ 6<br />

III. PRATIQUE SIMPLE ....................................................................................................................................... 7<br />

1) LES WIDGETS, LEURS ARGUMENTS DE BASE ET LES STRUCTURES ASSOCIEES....................................................... 8<br />

a) widg<strong>et</strong>_base ................................................................................................................................................. 8<br />

b) widg<strong>et</strong>_button .............................................................................................................................................. 8<br />

c) widg<strong>et</strong>_draw................................................................................................................................................. 9<br />

d) widg<strong>et</strong>_droplist ............................................................................................................................................ 9<br />

e) widg<strong>et</strong>_label................................................................................................................................................. 9<br />

f) widg<strong>et</strong>_list .................................................................................................................................................. 10<br />

g) widg<strong>et</strong>_slider ............................................................................................................................................. 10<br />

h) widg<strong>et</strong>_table............................................................................................................................................... 11<br />

i) widg<strong>et</strong>_text ................................................................................................................................................. 11<br />

2) ROUTINE DE TRAITEMENT DES EVENEMENTS.................................................................................................... 12<br />

a) Widg<strong>et</strong>_control .......................................................................................................................................... 12<br />

b) La gestion des événements ......................................................................................................................... 13<br />

3) TRANSFERT D’ARGUMENTS ............................................................................................................................. 14<br />

4) UN EXEMPLE SIMPLE ....................................................................................................................................... 15<br />

IV. UN PEU DE COMPLEXITE.......................................................................................................................... 18<br />

1) ARGUMENTS COMPLEXES DES WIDGETS ........................................................................................................... 18<br />

a) Mots clés communs à la plupart des widg<strong>et</strong>s .............................................................................................. 18<br />

b) Widg<strong>et</strong>_base............................................................................................................................................... 19<br />

c) Widg<strong>et</strong>_button............................................................................................................................................ 20<br />

d) Widg<strong>et</strong>_draw.............................................................................................................................................. 20<br />

e) widg<strong>et</strong>_label............................................................................................................................................... 20<br />

f) widg<strong>et</strong>_table ............................................................................................................................................... 21<br />

g) widg<strong>et</strong>_text................................................................................................................................................. 21<br />

2) LES COMPOUND WIDGETS ................................................................................................................................ 22<br />

a) cw_bgroup ................................................................................................................................................. 22<br />

b) cw_defroi................................................................................................................................................... 23<br />

c) cw_field...................................................................................................................................................... 23<br />

d) cw_form..................................................................................................................................................... 24<br />

e) cw_fslider................................................................................................................................................... 24<br />

f) cw_pdmenu................................................................................................................................................. 24<br />

g) cw_zoom .................................................................................................................................................... 25<br />

3) REPRISE DE L'EXEMPLE DU DEBUT AVEC UN COMPOUND WIDGET...................................................................... 26<br />

4) WIDGET_INFO.................................................................................................................................................. 27<br />

5) UN EXEMPLE PLUS COMPLET DE WIDGET.......................................................................................................... 28<br />

INDEX ................................................................................................................................................................... 32


I. Rappels <strong>IDL</strong><br />

1) Passages de valeurs entre programmes<br />

Il existe trois façons de passer des arguments entre procédures (ou fonctions) :<br />

• Les arguments, qui sont des noms de variables, déterminés par leur nombre <strong>et</strong> leur position.<br />

Par exemple :<br />

plot,tab Un seul argument : tab. C’est le tableau de points à tracer<br />

plot,val_x,tab Deux arguments : val_x <strong>et</strong> tab. Le 1 er comporte le tableau de valeurs de<br />

l’axe des abcis<strong>ses</strong>, <strong>et</strong> le second le tableau des points à tracer.<br />

• Les mots-clés, sont caractérisés par leur nom auquel est associée une valeur grâce au signe ‘=‘.<br />

Leur position n’a aucune importance.<br />

Par exemple :<br />

tit=‘Tracé de la fonction tab’<br />

plot,tab,title=tit title est un mot-clé<br />

Rappelons que la syntaxe /keyword est équivalente à keyword = 1.<br />

• Les commons s’écrivent sous la forme common suivi d’un espace puis du nom du common<br />

séparé de noms de variables par des virgules. Par exemple :<br />

common mon_com,var1,var2,var3<br />

• Les commons passent de façon instantanée les valeurs des variables entre les programmes, y<br />

compris avec l’instance principale de <strong>IDL</strong> (celle où on peut entrer les commandes en ligne), alors<br />

que les arguments ne se passent qu’au début puis à la fin du programme appelé. Par contre, une<br />

fois qu’il a été déclaré (dans un programme ou en mode interactif), il est impossible de modifier<br />

le contenu d’un common (attention, il s’agit des variables qui le composent : leur nom, leur ordre,<br />

... ; pas du contenu des variables). Il faut alors quitter la <strong>ses</strong>sion <strong>IDL</strong> puis la relancer pour pouvoir<br />

le corriger.<br />

2) Les structures<br />

Les structures sont un format spécial de variable qui perm<strong>et</strong> de mélanger les types <strong>et</strong> les<br />

dimensions au sein d’un même nom. L’avantage est de pouvoir ainsi regrouper des éléments<br />

ayant des points communs ensemble, <strong>et</strong> de pouvoir les transférer entre des modules sous un nom<br />

unique de variable. Une structure se définit soit avec un nom, soit de façon « anonyme » :<br />

a={nom_structure, champ1:val1,champ2,val2,...} ou<br />

a={champ1:val1,champ2,val2,...}<br />

Pour connaître le contenu du champ i de la structure a, il suffit de taper :<br />

print,a.champi<br />

Une structure peut être un tableau. Pour créer un tableau b de 100 éléments de même structure<br />

que la structure a, il faut faire :<br />

b=replicate(a,100) ou, directement :<br />

b=replicate({champ1:val1,champ2:val2,...},100)<br />

Les valeurs des champs vont être soit des variables mi<strong>ses</strong> à 0 ou vides (dans le cas des chaînes de<br />

caractères) - ou directement leur contenu définitif - soit des déclarations de tableau. Par exemple :<br />

a={champ1:0,champ2:0.,champ3:’’,champ4:0L,champ5:strarr(12)}<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 3


Ici, champ1 est un entier, champ2 un réel, champ3 une chaîne de caractères, champ4 un<br />

entier long, champ5 un tableau de chaînes de caractères à 12 éléments.<br />

Si b = replicate(a,100), on peut accéder à la 5 ème structure par :<br />

print,b[4]<br />

On peut également accéder au champ2 de la 6 ème structure par :<br />

print,b[5].champ2<br />

Et on peut accéder à la 3 ème chaîne du champ5 de la 7 ème structure par :<br />

print,b[6].champ5[2]<br />

Pour obtenir le descriptif de la structure, il faut faire :<br />

help,b,/structure<br />

3) Quelques rappels de règles d’écriture<br />

Pour un mot-clé, faire précéder son nom de / équivaut à m<strong>et</strong>tre sa valeur à 1<br />

Les fonctions s’écrivent sous la forme : res = nom_fonction(param)<br />

Les tableaux s’écrivent avec des croch<strong>et</strong>s : tab[i,j]<br />

II. Principe général des widg<strong>et</strong>s<br />

1) Généralités<br />

a) Qu’est-ce qu’un « widg<strong>et</strong> » ?<br />

Un widg<strong>et</strong> est une fonction qui perm<strong>et</strong> de tracer un « obj<strong>et</strong> » graphique <strong>et</strong> de lui associer certaines<br />

actions. Ces obj<strong>et</strong>s graphiques peuvent être du texte, des fenêtres graphiques, des boutons, des<br />

menus, ... Quant aux actions associées, il peut s’agir de n’importe quelle commande <strong>IDL</strong>.<br />

Les widg<strong>et</strong>s perm<strong>et</strong>tent donc de construire des interfaces graphiques de programmes <strong>IDL</strong>, dont<br />

les widg<strong>et</strong>s sont les briques élémentaires.<br />

Leur fonctionnement est cependant légèrement différent de celui des procédures <strong>et</strong> fonctions<br />

standard <strong>IDL</strong>. <strong>IDL</strong> ne gère pas directement les widg<strong>et</strong>s. Ce travail est effectué par l’intermédiaire<br />

d’une procédure (XMANAGER), qui va gérer les interruptions <strong>et</strong> les événements générés par les<br />

widg<strong>et</strong>s pour les envoyer à une routine de traitement.<br />

Le résultat d’un widg<strong>et</strong> (car il s’agit d’une fonction) est un numéro d’identificateur.<br />

b) Qu’est-ce qu’un « compound widg<strong>et</strong> » ?<br />

Un compound widg<strong>et</strong> regroupe les actions de plusieurs widg<strong>et</strong>s de telle façon que sa gestion<br />

apparaisse aussi simple à l’utilisateur que celle d’un widg<strong>et</strong> de base. Par exemple, l’une de ceux<br />

fourni par <strong>IDL</strong> perm<strong>et</strong> de construire un groupe de boutons aussi simplement que si on en créait un<br />

seul.<br />

2) Hiérarchie<br />

La hiérarchie d’un widg<strong>et</strong> est définie par sa décomposition en éléments horizontaux <strong>et</strong> verticaux.<br />

Un widg<strong>et</strong> est formé d’une base qui correspond au cadre extérieur de ce que l’on veut tracer.<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 4


Ensuite, on définit des sous-ba<strong>ses</strong>, en fonction des découpages horizontaux ou verticaux<br />

compl<strong>et</strong>s dont on a besoin. La figure ci-dessous représente un widg<strong>et</strong> dont la base est le cadre.<br />

Il est structuré verticalement : un premier groupe formé de diver<strong>ses</strong> fenêtres <strong>et</strong> de boutons, une<br />

deuxième avec le texte ‘Info’ <strong>et</strong> une fenêtre de texte, <strong>et</strong> un troisième avec le bouton ‘Quitter’.<br />

Le premier groupe est structuré horizontalement : un premier sous groupe est formé du label <strong>et</strong> du<br />

bouton ainsi que du label <strong>et</strong> de la fenêtre ; le deuxième sous-groupe est constitué de boutons, <strong>et</strong> le<br />

troisième sous-groupe d’une fenêtre graphique.<br />

Le premier groupe est lui-même structuré verticalement, ainsi que le second.<br />

Et on décompose ce que l’on veut obtenir ainsi de suite, jusqu’à ne plus avoir besoin de changer<br />

de sens entre horizontal <strong>et</strong> vertical.<br />

3) Les différents widg<strong>et</strong>s<br />

Le nombre de widg<strong>et</strong>s qui existent est très limité. Il y en a 8 qui perm<strong>et</strong>tent de dessiner divers<br />

obj<strong>et</strong>s. Un qui perm<strong>et</strong> de définir les ba<strong>ses</strong> <strong>et</strong> sous-ba<strong>ses</strong>, un qui perm<strong>et</strong> de modifier ou créer des<br />

widg<strong>et</strong>s définis par ailleurs, <strong>et</strong> deux qui jouent un rôle spécial.<br />

Un certain nombre de « dialogues » ressemblent à des widg<strong>et</strong>s, mais leur utilisation est différente.<br />

Les principaux sont<br />

res=dialog_pickfile() <strong>et</strong><br />

res=dialog_message(‘message à afficher’)<br />

La distribution standard d’<strong>IDL</strong> contient enfin 13 compound widg<strong>et</strong>s d’intérêt divers, ainsi qu’un<br />

modèle (« template ») de compound widg<strong>et</strong> destiné à faciliter la création d’une telle fonction.<br />

Nous les verrons plus loin.<br />

Les principaux widg<strong>et</strong>s sont :<br />

widg<strong>et</strong>_base perm<strong>et</strong> de créer une base principale <strong>et</strong> des sous ba<strong>ses</strong><br />

widg<strong>et</strong>_button perm<strong>et</strong> de créer un bouton<br />

widg<strong>et</strong>_draw perm<strong>et</strong> de créer une fenêtre graphique<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 5


widg<strong>et</strong>_droplist affiche l’élément par défaut d’une liste. Quand on clique<br />

dessus, la liste complète apparaît, perm<strong>et</strong>tant une autre sélection qui<br />

remplace la précédente<br />

widg<strong>et</strong>_label affiche un texte statique (un label)<br />

widg<strong>et</strong>_list affiche une fenêtre contenant une liste d’éléments que l’on peut<br />

sélectionner individuellement. Si besoin est, un ascenseur l’accompagne<br />

widg<strong>et</strong>_slider affiche un curseur perm<strong>et</strong>tant de sélectionner une valeur entière entre deux<br />

bornes<br />

widg<strong>et</strong>_table affiche des éléments sous forme d’un tableau<br />

widg<strong>et</strong>_text affiche une fenêtre contenant du texte, soit statique, soit modifiable<br />

4) Les contrôles<br />

La façon dont sont gérés les widg<strong>et</strong>s, comme nous l’avons mentionné plus haut, ne ressemble pas<br />

à ce à quoi on est habitué avec <strong>IDL</strong>.<br />

Chaque widg<strong>et</strong> r<strong>et</strong>ourne des « événements » (‘events’) qu’il va falloir gérer comme on va le voir.<br />

Tout d’abord, une procédure contenant des widg<strong>et</strong>s n’est pas composée de la même façon que les<br />

procédures classiques, elle contient deux parties : l’une qui sert à composer, à l’aide de widg<strong>et</strong>s,<br />

l’interface graphique que l’on désire, <strong>et</strong> l’autre qui sert à interpréter en termes de commandes<br />

<strong>IDL</strong> l’eff<strong>et</strong> des événements renvoyés par les widg<strong>et</strong>s.<br />

Si le nom de la routine principale est ‘toto’, la routine de traitement des événements devra<br />

s’appeler ‘toto_event’. On peut s’affranchir de c<strong>et</strong>te contrainte, mais cela complique les cho<strong>ses</strong>.<br />

L’interface graphique que l’on crée se construit à l’aide d’un widg<strong>et</strong> spécial nommé<br />

widg<strong>et</strong>_control. Puis l’activation de c<strong>et</strong>te interface se fait à l’aide de la procédure<br />

xmanager qui va envoyer la main à un autre widg<strong>et</strong>, widg<strong>et</strong>_event, qui va perm<strong>et</strong>tre de<br />

récupérer <strong>et</strong> de pré-traiter les événements générés par les widg<strong>et</strong>s, avant de les renvoyer dans la<br />

routine de traitement des événements. C<strong>et</strong>te avant-dernière routine, widg<strong>et</strong>_event, est<br />

totalement transparente à l’utilisateur (qui peut l’appeler directement s’il le désire, mais <strong>IDL</strong> ne le<br />

recommande pas), car son nom n’apparaît nulle part de façon visible.<br />

La procédure xmanager, appelée dans la procédure de création de l’interface, perm<strong>et</strong> de gérer<br />

plusieurs interfaces en même temps. Il s’agit en quelque sorte d’une routine de gestion des<br />

interruptions (clic ou déplacement de souris, frappe de clavier).<br />

Quand, à la suite d’un plantage, on veut reprendre la main pour tuer un widg<strong>et</strong> qui reste dans un<br />

état commateux, il faut taper :<br />

xmanager<br />

sans aucun argument.<br />

La forme générale d’une procédure de création d’une interface par widg<strong>et</strong> est la suivante :<br />

pro nom_procédure_event,ev C’est la procédure de traitement des événements. ev<br />

est un élément spécial (une structure caractéristique,<br />

comme on le verra plus loin)<br />

routine de traitement des événements<br />

end<br />

pro nom_procédure, arguments procédure de création de l’interface<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 6


construction de l’interface<br />

widg<strong>et</strong>_control,nom_de_base,/realize on construit l’interface<br />

graphique<br />

xmanager,’nom_procédure’,nom_de_base on active l’interface pour gérer les<br />

interruptions<br />

end<br />

On remarquera que la routine de gestion des événements est placée dans le même fichier que la<br />

routine de création des widg<strong>et</strong>s, en première position. De plus, le nom du fichier doit être le nom<br />

de la routine de création, suivi de l’extension .pro. Dans notre exemple, ce serait<br />

nom_procédure.pro.<br />

Tous les événements renvoyés par les widg<strong>et</strong>s à la routine de traitement d’événements sont des<br />

structures. Et toutes ces structures ont leurs trois premiers champs identiques.<br />

La définition de la structure renvoyée par les widg<strong>et</strong>s commence par :<br />

ev = {id:0L,top:0L,handler:0L, ...}<br />

Le premier élément de c<strong>et</strong>te structure, ev.id, contient l’identificateur du widg<strong>et</strong>, c’est-à-dire un<br />

élément perm<strong>et</strong>tant de l’identifier. Le second, ev.top, contient l’identificateur du widg<strong>et</strong> de<br />

base de plus haut niveau contrôlant c<strong>et</strong>te interface. Le troisième, ev.handler, contient<br />

l’identificateur d’une éventuelle routine d’événements, comme nous le verrons plus loin. Pour<br />

l’instant, seuls les deux premiers champs nous intéressent parmi ces trois champs communs à<br />

tous les widg<strong>et</strong>s.<br />

En ce qui concerne xmanager, on peut lui adjoindre le mot-clé NO_BLOCK que l’on m<strong>et</strong> à 1 afin<br />

de perm<strong>et</strong>tre l’accès à d’autres routines, ou à la ligne de commande d’<strong>IDL</strong> :<br />

xmanager,’nom_procédure_event’,/no_block<br />

Du point de vue du programmeur, la gestion d’une routine contenant des widg<strong>et</strong>s va se faire de la<br />

façon suivante. Les widg<strong>et</strong>s sont créés <strong>et</strong> activés dans la routine principale (via widg<strong>et</strong>_control <strong>et</strong><br />

xmanager), <strong>et</strong>, à chaque fois que l’utilisateur intervient (en cliquant sur un widg<strong>et</strong>, en entrant du<br />

texte, ...), un événement est généré. C<strong>et</strong> événement est intercepté par la routine de gestion des<br />

événements. Nous verrons un peu plus loin la façon dont c<strong>et</strong>te routine récupère les informations<br />

<strong>et</strong> les gère.<br />

III. Pratique simple<br />

Chaque widg<strong>et</strong> dispose d’un certain nombre d’arguments qui vont perm<strong>et</strong>tre de les caractériser au<br />

mieux, <strong>et</strong> génère une structure (l’événement) qui lui est propre, contenant tous les renseignements<br />

utiles à son traitement, en plus des 3 champs mentionnés plus haut. Rappelons que chaque widg<strong>et</strong><br />

est une fonction qui renvoie le numéro d’identification du widg<strong>et</strong>.<br />

Les arguments <strong>et</strong> mots-clés indiqués ci-dessous suffisent à l’utilisation courante de la plupart des<br />

widg<strong>et</strong>s.<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 7


1) Les widg<strong>et</strong>s, leurs arguments de base <strong>et</strong> les structures associées<br />

a) widg<strong>et</strong>_base<br />

Sous sa forme : id = widg<strong>et</strong>_base(), ce widg<strong>et</strong> indique qu’il s’agit de la base de plus haut<br />

niveau, c’est-à-dire le cadre général de l’interface. Si on a :<br />

base=widg<strong>et</strong>_base()<br />

une sous-base de ‘base’ va s’écrire :<br />

ss_base=widg<strong>et</strong>_base(base)<br />

Les mots-clés pouvant accompagner ce widg<strong>et</strong> sont :<br />

/column indique que les éléments dépendant de c<strong>et</strong>te base s’agenceront en<br />

colonne, les uns en dessous des autres<br />

/exclusive indique que la base ne contient que des boutons, <strong>et</strong> qu’un seul d’entre eux<br />

pourra être sélectionné<br />

group_leader=id id contient l’identificateur d’un widg<strong>et</strong> déjà créé qui, s’il est détruit,<br />

entraînera la destruction de tous les widg<strong>et</strong>s dont il est le ‘group_leader’<br />

/nonexclusive indique que la base ne contient que des boutons, <strong>et</strong> que plusieurs d’entre<br />

eux peuvent être sélectionnés simultanément<br />

/row indique que les widg<strong>et</strong>s dépendant de c<strong>et</strong>te base s’agenceront en ligne,<br />

c’est-à-dire les uns à côté des autres<br />

/scroll indique que si la base dépasse la taille disponible, des ascenseurs au bord<br />

perm<strong>et</strong>tront d’en faire défiler les différentes parties<br />

title=chaÎne indique le titre de la base (valable seulement pour la base de plus haut<br />

niveau)<br />

uvalue=val perm<strong>et</strong> de transférer une valeur que l’on pourra simplement récupérer<br />

dans la routine de traitement des événements<br />

Pour l’instant, seuls les 3 premiers champs de la structure d’événement généré sont utiles :<br />

{widg<strong>et</strong>_base, id:0L, top:0L, handler:0L}<br />

b) widg<strong>et</strong>_button<br />

Ce widg<strong>et</strong> contient comme argument obligatoire le nom de la base dans laquelle il se trouve.<br />

Ses principaux mots-clés sont :<br />

group_leader=id cf. widg<strong>et</strong>_base<br />

uvalue=‘texte’ le texte indiqué comme valeur d’utilisateur (user value), dont on verra<br />

plus loin la grande utilité, peut être récupéré dans la routine de traitement<br />

des événements, perm<strong>et</strong>tant ainsi de reconnaître facilement un widg<strong>et</strong><br />

grâce à sa ‘uvalue’<br />

value=‘texte’ le texte indiqué est celui qui s’affiche dans le bouton<br />

units=val la valeur indiquée dans val indique le système d’unités utilisé : 0 =<br />

pixels (valeur par défaut), 1 = inches, 2 = centimètres<br />

xsize=val indique la dimension horizontale du bouton, dans l’unité précisée par<br />

units<br />

ysize=val indique la dimension verticale du bouton, dans l’unité précisée par units<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 8


Structure générée par ce widg<strong>et</strong> :<br />

{widg<strong>et</strong>_button, id:0L, top:0L, handler:0L, select:0}<br />

ev.select vaut 1 si le bouton est appuyé.<br />

c) widg<strong>et</strong>_draw<br />

Ce widg<strong>et</strong> contient comme argument obligatoire le nom de la base dans laquelle il se trouve.<br />

Ses principaux mots-clés sont :<br />

group_leader=id cf widg<strong>et</strong>_base<br />

/scroll perm<strong>et</strong> d’ajouter des ascenseurs si le contenu de la fenêtre est plus grand<br />

qu’elle<br />

units=val cf widg<strong>et</strong>_button<br />

uvalue=‘texte’ cf widg<strong>et</strong>_button<br />

value=var var est une variable qui contiendra le numéro de la fenêtre graphique<br />

ainsi ouverte. Cela perm<strong>et</strong>, si plusieurs fenêtres graphiques sont ouvertes,<br />

de choisir celle que l’on veut avec ws<strong>et</strong>,var<br />

xsize=val cf widg<strong>et</strong>_button<br />

ysize=val cf widg<strong>et</strong>_button<br />

Structure générée par ce widg<strong>et</strong> :<br />

{widg<strong>et</strong>_draw, id:0L, top:0L, handler:0L,type:0, x:0, y:0,<br />

press:0B, release:0B, clicks:0}<br />

Les différents champs se rapportent à des mots-clés que nous n’avons pas encore vus. ils seront<br />

explicités plus loin.<br />

d) widg<strong>et</strong>_droplist<br />

Ce widg<strong>et</strong> contient comme argument obligatoire le nom de la base dans laquelle il se trouve.<br />

Ses principaux mots-clés sont :<br />

group_leader=id cf widg<strong>et</strong>_base<br />

title=‘texte’ perm<strong>et</strong> d’ajouter un titre à la liste déroulante<br />

units=val cf widg<strong>et</strong>_button<br />

uvalue=val cf widg<strong>et</strong>_button<br />

value=str str contient une ‘string’ ou ‘strarr’ contenant les éléments de la liste<br />

xsize=val cf widg<strong>et</strong>_button<br />

Structure générée par ce widg<strong>et</strong> :<br />

{widg<strong>et</strong>_droplist, id:0L, top:0L, handler:0L, index:0L}<br />

index contient l’indice de l’élément de la liste qui a été sélectionné.<br />

e) widg<strong>et</strong>_label<br />

Ce widg<strong>et</strong> contient comme argument obligatoire le nom de la base dans laquelle il se trouve.<br />

Ses principaux mots-clés sont :<br />

group_leader=id cf widg<strong>et</strong>_base<br />

units=val cf widg<strong>et</strong>_button<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 9


value=‘texte’ contient le texte du label à afficher<br />

xsize=val cf widg<strong>et</strong>_button<br />

ysize=val cf widg<strong>et</strong>_button<br />

Aucune structure n’est générée par ce widg<strong>et</strong>.<br />

f) widg<strong>et</strong>_list<br />

Ce widg<strong>et</strong> contient comme argument obligatoire le nom de la base dans laquelle il se trouve.<br />

Ses principaux mots-clés sont :<br />

group_leader=id cf widg<strong>et</strong>_base<br />

/multiple perm<strong>et</strong> de sélectionner plusieurs éléments de la liste<br />

units=val cf widg<strong>et</strong>_button<br />

uvalue=‘texte’ cf widg<strong>et</strong>_button<br />

value=tab contient le tableau de strings formant la liste<br />

xsize=val cf widg<strong>et</strong>_button<br />

ysize=val cf widg<strong>et</strong>_button<br />

Structure générée par ce widg<strong>et</strong> :<br />

{widg<strong>et</strong>_list, id:0L, top:0L, handler:0L,index:0L, clicks:0L}<br />

index contient le numéro de l’élément qui a été sélectionné.<br />

clicks vaut 1 si on a cliqué une fois sur l’élément, 2 s’il s’est agi d’un double clic.<br />

g) widg<strong>et</strong>_slider<br />

Ce widg<strong>et</strong> contient comme argument obligatoire le nom de la base dans laquelle il se trouve.<br />

Ses principaux mots-clés sont :<br />

/drag génère continuement des événements quand on déplace le curseur<br />

group_leader=id cf widg<strong>et</strong>_base<br />

maximum=val valeur maximum du curseur en entiers (défaut = 100)<br />

minimum=val valeur minimum du curseur en entiers (défaut = 0)<br />

title=‘texte’ titre à afficher<br />

units=val cf widg<strong>et</strong>_button<br />

uvalue=‘texte’ cf widg<strong>et</strong>_button<br />

value=val valeur initiale à laquelle se trouve le curseur<br />

/vertical crée un curseur vertical<br />

xsize=val cf widg<strong>et</strong>_button<br />

ysize=val cf widg<strong>et</strong>_button<br />

Structure générée par ce widg<strong>et</strong> :<br />

{widg<strong>et</strong>_slider, id:0L, top:0L, handler:0L, value:0L, drag:0}<br />

value contient la nouvelle valeur du curseur<br />

On peut m<strong>et</strong>tre le champ drag à 0, quand on a utilisé /drag afin que les événements ne soient<br />

générés que quand on relâche le curseur.<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 10


h) widg<strong>et</strong>_table<br />

Ce widg<strong>et</strong> contient comme argument obligatoire le nom de la base dans laquelle il se trouve.<br />

Ses principaux mots-clés sont :<br />

column_labels=‘texte’ perm<strong>et</strong> d’entrer des titres de colonnes (string ou strarr)<br />

column_widths=val définit la largeur des colonnes (scalaire ou tableau)<br />

group_leader=id cf widg<strong>et</strong>_base<br />

/no_headers ne m<strong>et</strong> pas d’en-têtes aux lignes <strong>et</strong> colonnes<br />

row_heights=val définit la hauteur des lignes (scalaire ou tableau)<br />

row_labels=‘string’ perm<strong>et</strong> d’entrer des titres de lignes (string ou strarr)<br />

/scroll perm<strong>et</strong> d’afficher un ascenseur pour faire défiler la partie de la table qui<br />

est hors de la vue<br />

units=val cf widg<strong>et</strong>_button<br />

uvalue=‘texte’ cf widg<strong>et</strong>_button<br />

value=tab tableau de valeurs destiné à emplir la table<br />

xsize=val cf widg<strong>et</strong>_button<br />

ysize=val cf widg<strong>et</strong>_button<br />

/all_events <strong>et</strong> /editable cf tableau ci-dessous pour les combinaisons de ces<br />

deux mots-clés<br />

Mot-clé Eff<strong>et</strong><br />

all_events editable Une entrée change-telle<br />

le contenu du<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 11<br />

widg<strong>et</strong> ?<br />

Type d’action<br />

générant des<br />

événements<br />

0 0 Non Aucun<br />

0 1 Oui Insertion d’une fin de<br />

ligne (carriage r<strong>et</strong>urn)<br />

1 0 Non Tous les événements<br />

1 1 Oui Tous les événements<br />

Structure générée par ce widg<strong>et</strong> :<br />

{widg<strong>et</strong>_table, id:0L, top:0L, handler:0L, type= 0, ...}<br />

Le champ type indique le type de structure renvoyé à l’utilisateur. Cela n’étant pas utile pour<br />

l’instant, nous en parlerons plus loin.<br />

i) widg<strong>et</strong>_text<br />

Ce widg<strong>et</strong> contient comme argument obligatoire le nom de la base dans laquelle il se trouve.<br />

Ses principaux mots-clés sont :<br />

group_leader=id cf widg<strong>et</strong>_base<br />

/scroll cf widg<strong>et</strong>_draw<br />

units=val cf widg<strong>et</strong>_button<br />

uvalue=‘texte’ cf widg<strong>et</strong>_button<br />

value=string texte contenu dans le widg<strong>et</strong><br />

/wrap coupe automatiquement les lignes trop longues


xsize=val cf widg<strong>et</strong>_button<br />

ysize=val cf widg<strong>et</strong>_button<br />

/all_events <strong>et</strong> /editable cf tableau ci-dessous pour les combinaisons de ces<br />

deux mots-clés<br />

Mot-clé Eff<strong>et</strong><br />

all_events editable Une entrée change-t- Type d’action<br />

elle le contenu du générant des<br />

widg<strong>et</strong> ?<br />

événements<br />

0 0 Non Aucun<br />

0 1 Oui Insertion d’une fin de<br />

ligne (carriage r<strong>et</strong>urn)<br />

1 0 Non Tous les événements<br />

1 1 Oui Tous les événements<br />

Structure générée par ce widg<strong>et</strong> :<br />

{widg<strong>et</strong>_list, id:0L, top:0L, handler:0L, type:0, ...}<br />

Le champ type indique le type de structure renvoyé. Nous verrons plus loin les autres champs.<br />

2) Routine de traitement des événements<br />

a) Widg<strong>et</strong>_control<br />

widg<strong>et</strong>_control est un widg<strong>et</strong> spécial comparé aux autres. Tout d’abord, il s’agit d’une<br />

procédure, <strong>et</strong> non pas d’une fonction. Son rôle est de réaliser, gérer <strong>et</strong> détruire les widg<strong>et</strong>s. Il<br />

s’applique à un identificateur de widg<strong>et</strong> :<br />

widg<strong>et</strong>_control,id<br />

suit alors un mot-clé qui va définir les actions de modification du widg<strong>et</strong> dont l’id est indiqué.<br />

Ces mots clés vont perm<strong>et</strong>tre de changer la valeur des mots-clés utilisés lors de la création du<br />

widg<strong>et</strong>.<br />

Les formes de base de widg<strong>et</strong>_control sont :<br />

widg<strong>et</strong>_control,id,/realize construit toute la hiérarchie de widg<strong>et</strong> dont id est<br />

l’élément le plus haut<br />

widg<strong>et</strong>_control,id,/destroy détruit toute la hiérarchie de widg<strong>et</strong> dont id est<br />

l’élément le plus haut<br />

Les principaux mots-clés pouvant accompagner widg<strong>et</strong>_control sont :<br />

all_table_events, ainsi que all_text_events, conjointement avec editable<br />

modifient le type de génération d’événements de widg<strong>et</strong>_table <strong>et</strong> widg<strong>et</strong>_text suivant<br />

les tables indiquées plus haut dans la description de ces widg<strong>et</strong>s.<br />

/append utilisé avec s<strong>et</strong>_value (voir plus loin), perm<strong>et</strong> d’ajouter le texte<br />

courant (défini par s<strong>et</strong>_value) au texte que contient déjà un<br />

widg<strong>et</strong>_text<br />

column_labels=‘texte’ perm<strong>et</strong> de changer les titres de colonnes dans un<br />

widg<strong>et</strong>_table<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 12


column_width=val perm<strong>et</strong> de changer les largeurs de colonnes dans un<br />

widg<strong>et</strong>_table<br />

edit_cell=[x,y] rend éditable la colonne x, ligne y d’une table d’un<br />

widg<strong>et</strong>_table<br />

g<strong>et</strong>_uvalue=var m<strong>et</strong> dans la variable var le contenu de la ‘user value’ uvalue du<br />

widg<strong>et</strong> impliqué<br />

g<strong>et</strong>_value=var m<strong>et</strong> dans la variable var le contenu défini par le mot-clé value du<br />

widg<strong>et</strong> impliqué (voir pour chaque widg<strong>et</strong> le contenu de value)<br />

group_leader=id perm<strong>et</strong> de rattacher le widg<strong>et</strong> courant à une hiérarchie (ainsi, un<br />

même widg<strong>et</strong> peut être rattaché à plusieurs hiérarchies, mais on ne<br />

peut pas le r<strong>et</strong>irer d’une hiérarchie)<br />

/hourglass affiche une p<strong>et</strong>ite montre indiquant que la machine travaille, jusqu’à<br />

ce qu’un nouvel événement soit généré. Utile par exemple quand on<br />

charge un gros fichier de données, pour que l’utilisateur ne croie<br />

pas la machine ‘plantée’<br />

/iconify transforme en icône le widg<strong>et</strong> courant <strong>et</strong> toute sa hiérarchie<br />

(iconify=0 le réagrandit)<br />

map=0 fait disparaître le widg<strong>et</strong> de l’écran, mais il existe toujours. Pour le<br />

faire réapparaître, m<strong>et</strong>tre /map<br />

row_labels=‘texte’ perm<strong>et</strong> de changer les titres de lignes d’un widg<strong>et</strong>_table<br />

row_heights=val perm<strong>et</strong> de changer la hauteur des lignes d’un widg<strong>et</strong>_table<br />

sensitive=0 rend ‘insensible’ un widg<strong>et</strong> <strong>et</strong> sa hiérarchie descendante. Pour le<br />

rendre à nouveau sensible, faire /sensitive<br />

s<strong>et</strong>_button=val si val = 0, désélectionne le bouton, sinon, le sélectionne (peut<br />

dépendre des mots-clés exclusive <strong>et</strong> non_exclusive de<br />

widg<strong>et</strong>_base)<br />

s<strong>et</strong>_text_top_line=val affiche le texte d’un widg<strong>et</strong>_text en commençant par la<br />

ligne val<br />

s<strong>et</strong>_uvalue=‘texte’ change la valeur de uvalue (user value)<br />

s<strong>et</strong>_value=val change le contenu de value du widg<strong>et</strong> impliqué<br />

tlb_s<strong>et</strong>_title=‘texte’ change le titre de la base la plus haute de la hiérarchie<br />

units=val change le type d’unités choisi pour le widg<strong>et</strong> courant<br />

xsize=val change la taille horizontale du widg<strong>et</strong><br />

ysize=val change la taille verticale du widg<strong>et</strong><br />

b) La gestion des événements<br />

La gestion des événements va se faire, comme on l'a vu, dans la routine qui va se trouver en tête<br />

de fichier, du type :<br />

pro nom_de_procédure_event,ev<br />

ev est l'événement engendré par le widg<strong>et</strong> qui a réagi ; <strong>et</strong> c'est grâce à la procédure<br />

widg<strong>et</strong>_control que nous allons pouvoir savoir ce qui s'est passé.<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 13


Le champ ev.id de la structure ev nous donne l’identificateur du widg<strong>et</strong> qui a réagi. Ainsi, on<br />

peut en extraire des informations. L’une des plus utiles que l’on peut espérer récupérer est la<br />

valeur utilisateur du widg<strong>et</strong>, uvalue. Cela se fait de la façon suivante, où var est une variable<br />

quelconque :<br />

widg<strong>et</strong>_control,ev.id,g<strong>et</strong>_uvalue=var<br />

Si on a pris soin de donner une valeur utilisateur explicite <strong>et</strong> différente pour chaque widg<strong>et</strong><br />

utilisé, la lecture de celle-ci nous indique immédiatement quel widg<strong>et</strong> a été sollicité.<br />

Ainsi, en testant c<strong>et</strong>te valeur (grâce à CASE, particulièrement), on peut diriger la gestion des<br />

événements vers telle ou telle partie du programme qui effectuera la tâche assignée au widg<strong>et</strong>.<br />

3) Transfert d’arguments<br />

Il est souvent utile de transférer des arguments (ie des variables) entre la procédure qui crée les<br />

widg<strong>et</strong>s, <strong>et</strong> celle qui gère les événements, ou entre des appels successifs à la routine de gestion<br />

des événements. Ces arguments peuvent être classiquement un numéro de fenêtre associé à<br />

widg<strong>et</strong>_draw, l’identificateur d’un widg<strong>et</strong> dont le contenu peut être modifié en cours de<br />

programme (comme une fenêtre de texte de widg<strong>et</strong>_text, par exemple), ou même des<br />

variables (comme quand on a chargé une image <strong>et</strong> que l’on veut pouvoir en faire une coupe…).<br />

Le problème est qu’après la création de l’interface, la main est passée à xmanager qui gère la<br />

queue des événements, puis à widg<strong>et</strong>_event qui « conditionne » les événements pour aboutir<br />

enfin à la routine de gestion des événements, <strong>et</strong> que ce cycle est permanent entre ces trois<br />

dernières routines. Le transfert d’arguments ou de variables n’est donc pas possible de façon<br />

directe.<br />

Deux solutions existent.<br />

• La première, la plus simple à m<strong>et</strong>tre en œuvre, mais moins « propre » <strong>et</strong> plus lourde, consiste à<br />

utiliser un common qui va se trouver à la fois dans la routine de création <strong>et</strong> dans la routine de<br />

gestion des événements. On y m<strong>et</strong> toutes les variables utiles. Avantage, on a directement sous les<br />

yeux ces variables. Inconvénient, un common qui a été compilé ne peut plus être modifié, ou<br />

alors, il faut quitter <strong>IDL</strong>, le relancer, modifier le contenu du common, <strong>et</strong> re-compiler le<br />

programme.<br />

• L’autre solution consiste à utiliser une valeur utilisateur pour transm<strong>et</strong>tre une structure<br />

contenant toutes les variables utiles. Comme on l’a vu au début de c<strong>et</strong>te section, les valeurs<br />

utilisateur peuvent être utilisées pour identifier les widg<strong>et</strong>s. En ce cas, rien n’empêche d’utiliser<br />

la valeur utilisateur de la base principale. Ou, si celle-ci est déjà utilisée (quand plusieurs<br />

interfaces simultanées sont affichées), créer une sous-base de la base principale à laquelle sera<br />

rattachée toute la hiérarchie :<br />

base=widg<strong>et</strong>_base()<br />

child=widg<strong>et</strong>_base(base,uval=ma_structure)<br />

...<br />

Ainsi, grâce à widg<strong>et</strong>_control, il est possible de récupérer la structure en question.<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 14


4) Un exemple simple<br />

Pour commencer, nous allons étudier un exemple simple de création de widg<strong>et</strong>. Le but est<br />

d’entrer un texte court dans une p<strong>et</strong>ite fenêtre. S’il nous convient, on l’ajoute dans une plus<br />

grande fenêtre au texte existant, sinon, on l’efface <strong>et</strong> rien ne se passe. On peut de plus, bien sûr,<br />

quitter l’application. L’image ci-dessous montre l’aspect de ce que l’on souhaite obtenir :<br />

La p<strong>et</strong>ite fenêtre du haut perm<strong>et</strong> d’entrer le texte (avec un label au-dessus), puis les trois boutons,<br />

perm<strong>et</strong>tant (de gauche à droite respectivement) de valider l’entrée, de l’annuler, <strong>et</strong> de quitter le<br />

logiciel. Enfin, le label ‘Affichage’ surmonte la fenêtre où l’ensemble des textes entrés va<br />

s’afficher.<br />

On remarque que la structure principale de ce widg<strong>et</strong> est en colonne (les éléments sont les uns au<br />

dessus des autres), mais que les boutons ont une structure en ligne.<br />

Voici le listing de c<strong>et</strong>te interface (une procédure appelée exo1.pro), la routine de gestion des<br />

événements précède la procédure de création de l’interface, comme expliqué plus haut :<br />

pro w_exo1_event,ev Routine de traitement des événements<br />

common ex1,txt,wintxt,txt2,txt1 On récupère les valeurs utiles grâce au common<br />

widg<strong>et</strong>_control,ev.id,g<strong>et</strong>_uvalue=uval On récupère la valeur utilisateur du widg<strong>et</strong> qui a réagi<br />

case uval of On teste c<strong>et</strong>te valeur<br />

'u_txt1':<br />

widg<strong>et</strong>_control,ev.id,g<strong>et</strong>_value=txt<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 15<br />

S’il s’agit de la p<strong>et</strong>ite fenêtre de texte, le texte entré<br />

s’accumule l<strong>et</strong>tre après l<strong>et</strong>tre (à cause du mot-clé<br />

/all_events utilisé à la création) dans la variable txt<br />

'u_bu_ok': begin S’il s’agit du bouton OK :<br />

wintxt=wintxt+txt On rajoute au texte contenu dans la grande fenêtre le<br />

contenu de txt<br />

txt='' On rem<strong>et</strong> txt à zéro pour la suite<br />

widg<strong>et</strong>_control,txt1,s<strong>et</strong>_value=txt On efface le contenu de la p<strong>et</strong>ite fenêtre de texte<br />

widg<strong>et</strong>_control,txt2,s<strong>et</strong>_value=wintxt On affiche le nouveau texte de la grande fenêtre<br />

end<br />

'u_bu_eff': begin S’il s’agit du bouton Effacer :<br />

txt='' On vide la variable txt<br />

widg<strong>et</strong>_control,txt1,s<strong>et</strong>_value=txt On efface la p<strong>et</strong>ite fenêtre de texte<br />

end


'u_bu_quit':<br />

widg<strong>et</strong>_control,ev.top,/destroy<br />

S’il s’agit du bouton Quitter, on détruit le widg<strong>et</strong><br />

endcase Fin du test sur la valeur de uval<br />

end Fin de la routine de traitement des événements<br />

pro w_exo1 Début de la routine de création de l’interface<br />

common ex1,txt,wintxt,txt2,txt1 Définition du common contenant toutes les valeurs<br />

qu’il est utile de transférer dans la routine de<br />

traitement des événements<br />

txt='' On initialise à vide le texte de la p<strong>et</strong>ite fenêtre de texte<br />

wintxt='' On initialise à vide le texte de la grande fenêtre de<br />

texte<br />

base=widg<strong>et</strong>_base(/column) On crée la base générale, <strong>ses</strong> “enfants“ seront en une<br />

colonne (les uns en dessous des autres)<br />

lbl1=widg<strong>et</strong>_label(base,value='Entrez un On affiche le label du haut<br />

texte')<br />

txt1=widg<strong>et</strong>_text(base,value='',uvalue= $ On crée la p<strong>et</strong>ite fenêtre de texte, vide, en lui donnant<br />

'u_txt1',xsize=40,ysize=1, $ une dimension fixe (en nombre de caractères), en lui<br />

/editable,/all_events)<br />

donnant une valeur utilisateur, éditable, <strong>et</strong> réagissant à<br />

chaque entrée de caractère (afin d’éviter d’attendre<br />

que la touche ‘R<strong>et</strong>urn’ ou ‘Entrée’ soit utilisée)<br />

b1=widg<strong>et</strong>_base(base,/row) On crée une sous-base en ligne pour les boutons<br />

bu_ok=widg<strong>et</strong>_button(b1,value='OK',uvalue Création du 1<br />

='u_bu_ok')<br />

er bouton avec son contenu <strong>et</strong> sa valeur<br />

utilisateur associée<br />

bu_eff=widg<strong>et</strong>_button(b1,value='Effacer',<br />

uvalue='u_bu_eff')<br />

Création du 2ème bouton<br />

bu_quit=widg<strong>et</strong>_button(b1,value='Quitter'<br />

,uvalue='u_bu_quit')<br />

Création du 3ème bouton<br />

lbl2=widg<strong>et</strong>_label(base,value='Affichage'<br />

)<br />

txt2=widg<strong>et</strong>_text(base,value='',xsize=20,<br />

ysize=5,/wrap,/scroll)<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 16<br />

Création du label de la grande fenêtre de texte<br />

Création de la grande fenêtre de texte (20 caractères<br />

sur 5 lignes), en demandant que les lignes soient<br />

automatiquement coupées entre les mots, <strong>et</strong> qu’un<br />

ascenseur apparaisse si le texte dépasse les 5 lignes<br />

widg<strong>et</strong>_control,base,/realize On construit le widg<strong>et</strong> d’ensemble<br />

xmanager,'w_exo1',base On passe la main pour la gestion des événements<br />

end<br />

On vient de voir une façon de concevoir ce programme en utilisant le common. Voici<br />

maintenant, ci-dessous, rigoureusement le même programme, mais utilisant c<strong>et</strong>te fois-ci le<br />

transfert d’une structure en uvalue de la base principale :<br />

pro w_exo1_1_event,ev Routine de gestion des événements<br />

widg<strong>et</strong>_control,ev.id,g<strong>et</strong>_uvalue=uval On récupère la uvalue du widg<strong>et</strong> qui a réagi<br />

widg<strong>et</strong>_control,ev.top,g<strong>et</strong>_uvalue=struc On récupère la structure mise en uvalue de la base


<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 17<br />

principale<br />

case uval of Test sur uval<br />

'u_txt1': begin P<strong>et</strong>ite fenêtre de texte :<br />

widg<strong>et</strong>_control,ev.id,g<strong>et</strong>_value=txt On récupère son contenu<br />

struc.txt=txt On le m<strong>et</strong> dans la structure<br />

widg<strong>et</strong>_control,ev.top,s<strong>et</strong>_uvalue= $ On m<strong>et</strong> la structure corrigée dans uvalue de la base<br />

struc<br />

end<br />

principale<br />

'u_bu_ok': begin Bouton OK :<br />

struc.wintxt=struc.wintxt+struc.txt On ajoute au champ de la structure contenant le texte<br />

de la grande fenêtre le contenu du champ de la<br />

structure contenant le texte de la p<strong>et</strong>ite fenêtre<br />

struc.txt='' On m<strong>et</strong> le champ contenant le texte de la p<strong>et</strong>ite<br />

fenêtre à vide<br />

widg<strong>et</strong>_control,struc.txt1, $ On m<strong>et</strong> dans le widg<strong>et</strong> de la p<strong>et</strong>ite fenêtre (dont l’ID<br />

s<strong>et</strong>_value=struc.txt<br />

est dans struc.txt1) la chaîne vide<br />

widg<strong>et</strong>_control,struc.txt2, $ On affiche la nouvelle chaîne de la grande fenêtre<br />

s<strong>et</strong>_value=struc.wintxt<br />

(dont l’ID est dans struc.txt2)<br />

widg<strong>et</strong>_control,ev.top,s<strong>et</strong>_uvalue= $ On sauvegarde la nouvelle valeur de la structure<br />

struc<br />

end<br />

'u_bu_eff': begin Bouton Effacer :<br />

struc.txt='' On m<strong>et</strong> le champ txt à vide (contenu de la p<strong>et</strong>ite<br />

fenêtre)<br />

widg<strong>et</strong>_control,struc.txt1, $ On remplace le texte de la p<strong>et</strong>ite fenêtre (dont l’ID est<br />

s<strong>et</strong>_value=struc.txt<br />

dans struc.txt1) par le contenu vide de struc.txt<br />

widg<strong>et</strong>_control,ev.top,s<strong>et</strong>_uvalue= $ On sauvegarde la nouvelle valeur de la structure<br />

struc<br />

end<br />

'u_bu_quit': $<br />

widg<strong>et</strong>_control,ev.top,/destroy<br />

endcase Fin du test du uval<br />

end<br />

Bouton Quitter : on détruit le widg<strong>et</strong><br />

pro w_exo1_1 Routine de création de l’interface<br />

struc={txt:'',wintxt:'',txt2:0L,txt1:0L} Définition de la structure contenant tous les éléments<br />

utiles<br />

base=widg<strong>et</strong>_base(/column,uval=struc) On définit la base (par colonne) avec la structure<br />

comme uvalue<br />

lbl1=widg<strong>et</strong>_label(base,value= $<br />

Création du label du haut<br />

'Entrez un texte')<br />

txt1=widg<strong>et</strong>_text(base,value='',uvalue= $ Création de la p<strong>et</strong>ite fenêtre de texte<br />

'u_txt1',xsize=40,ysize=1, $<br />

/editable,/all_events)<br />

b1=widg<strong>et</strong>_base(base,/row) Création de la sous-base (en ligne) pour les boutons<br />

bu_ok=widg<strong>et</strong>_button(b1,value='OK', $ Création du bouton ‘OK’


uvalue='u_bu_ok')<br />

bu_eff=widg<strong>et</strong>_button(b1,value= $<br />

'Effacer', uvalue='u_bu_eff')<br />

bu_quit=widg<strong>et</strong>_button(b1,value= $<br />

'Quitter',uvalue='u_bu_quit')<br />

lbl2=widg<strong>et</strong>_label(base,value= $<br />

'Affichage')<br />

txt2=widg<strong>et</strong>_text(base,value='', $<br />

xsize=20,ysize=5,/wrap,/scroll)<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 18<br />

Création du bouton ‘Effacer’<br />

Création du bouton ‘Quitter’<br />

Création du second label<br />

Création de la grande fenêtre de texte<br />

widg<strong>et</strong>_control,base,/realize Réalisation de l’interface (<strong>et</strong> donc assignation d’ID à<br />

chaque widg<strong>et</strong>)<br />

struc.txt2=txt2 L’ID de la grande fenêtre de texte va dans<br />

struc.txt2<br />

struc.txt1=txt1 L’ID de la p<strong>et</strong>ite fenêtre de texte va dans<br />

struc.txt1<br />

widg<strong>et</strong>_control,base,s<strong>et</strong>_uvalue=struc La structure mise à jour est sauvée dans la uvalue<br />

de la base principale<br />

xmanager,'w_exo1_1',base On passe la main pour la gestion des événements<br />

end<br />

IV. Un peu de complexité<br />

Nous allons maintenant voir quelques autres possibilités liées aux widg<strong>et</strong>s <strong>et</strong> à leur création. Nous<br />

ne les verrons pas toutes, bien sûr, car avant de pouvoir utiliser toutes les options possibles, il est<br />

indispensable d’être déjà bien familiarisé avec l’utilisation standard des widg<strong>et</strong>s.<br />

1) Arguments complexes des widg<strong>et</strong>s<br />

Nous allons examiner quelques mots clés supplémentaires (<strong>et</strong> quelques alternatives à certains que<br />

l’on a déjà vus).<br />

a) Mots clés communs à la plupart des widg<strong>et</strong>s<br />

/no_copy Ce mot clé est l'équivalent de la fonction <strong>IDL</strong><br />

temporary. C'est-à-dire qu'il perm<strong>et</strong> de ne pas<br />

recopier les valeurs de value, mais de les transférer<br />

directement, économisant ainsi de la mémoire<br />

frame=val Donne l'épaisseur du cadre. Attention, la valeur que l'on<br />

donne se réfère au choix d'unité précisé par unit<br />

event_function='nom_fonction' Envoie directement l'événement généré dans la<br />

fonction indiquée. Si c<strong>et</strong>te fonction r<strong>et</strong>ourne une<br />

structure dont les 3 premiers champs sont ID, TOP <strong>et</strong><br />

HANDLER, ce résultat est envoyé comme événement à<br />

la routine de traitement des événements. Sinon, la main<br />

revient à xmanager. Perm<strong>et</strong> donc d'intervenir avant<br />

d'effectuer le traitement (c'est la méthode utilisée,<br />

comme on le verra plus loin, pour créer des compound<br />

widg<strong>et</strong>s)


event_pro='nom_procédure' Envoie directement l'événement généré dans la<br />

procédure indiquée avant de rendre la main à<br />

xmanager. Perm<strong>et</strong> par exemple d'associer un bouton à<br />

la création d'une nouvelle interface<br />

func_g<strong>et</strong>_value='nom_fonction' Quand on lance la commande<br />

widg<strong>et</strong>_control,id,g<strong>et</strong>_value= ..., la<br />

fonction indiquée s'exécute avant de renvoyer le résultat<br />

comme valeur<br />

pro_s<strong>et</strong>_value='nom_procédure' Quand on lance la commande<br />

widg<strong>et</strong>_control,id,s<strong>et</strong>_value=..., la<br />

procédure indiquée s'exécute, ce qui perm<strong>et</strong> de m<strong>et</strong>tre<br />

dans value un nouveau résultat<br />

b) Widg<strong>et</strong>_base<br />

/align_bottom<br />

/align_top<br />

/align_center<br />

/align_left<br />

/align_right<br />

/base_align_bottom<br />

/base_align_top<br />

/base_align_center<br />

/base_align_left<br />

/base_align_right<br />

mbar=var<br />

app_mbar=var<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 19<br />

Ces cinq mots clés perm<strong>et</strong>tent de<br />

définir l'alignement de la base en cours<br />

par rapport à son parent. Les 3 premiers<br />

s'appliquent quand le mot clé /row du<br />

parent est mis, les 3 derniers quand le<br />

mot clé /column a été mis<br />

Identique à la série précédente, mais<br />

s'appliquent aux 'enfants' de la base en<br />

cours<br />

Ne fonctionne que sur la base de plus<br />

haut niveau. Perm<strong>et</strong> de m<strong>et</strong>tre un menu<br />

sur c<strong>et</strong>te base. app_mbar perm<strong>et</strong> sur<br />

Macintosh de remplacer la barre de<br />

menu système. Voir dans la section<br />

suivante, widg<strong>et</strong>_button, son<br />

fonctionnement. Incompatible avec<br />

/modal<br />

/floating Associé à group_leader=id : perm<strong>et</strong> de créer une<br />

base de plus haut niveau flottante, liée au<br />

group_leader indiqué<br />

map=0 ou 1 map=0 rend la base <strong>et</strong> <strong>ses</strong> enfants invisible ; map=1 la<br />

rend visible. Incompatible avec /modal<br />

/modal Perm<strong>et</strong> de créer une base qui contiendra un dialogue<br />

avec des boutons ; associée à un group_leader. Les<br />

boutons pourront être l'acceptation ou l'annulation de ce<br />

qui a été fait dans ce nouveau widg<strong>et</strong>. Une base 'modale'<br />

bloque tous les autres widg<strong>et</strong>s tant qu'elle n'a pas été<br />

détruite


tlb_frame_attr=val Définit les actions possibles sur la base :<br />

1 : ne peut être redimensionnée<br />

2 : supprime l'affichage du menu du système<br />

4 : supprime la barre de titre (sauf sur Mac)<br />

8 : ne peut être fermée<br />

16 : ne peut être déplacée<br />

On peut combiner ces actions en ajoutant les valeurs<br />

indiquées les unes aux autres<br />

c) Widg<strong>et</strong>_button<br />

/align_center<br />

/align_left<br />

/align_right<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 20<br />

Définit le type de justification du texte qui se<br />

trouve dans le bouton (défaut =<br />

/align_center)<br />

/separator Affiche un séparateur dans un menu déroulant<br />

value=tab tab est un tableau à deux dimensions, qui est une<br />

image bitmap. En ce cas, le texte du bouton est<br />

remplacé par l'image formée par tab<br />

/menu indique que le bouton en question est le titre d'un menu<br />

déroulant. Lié aux mots clés mbar <strong>et</strong> app_mbar de<br />

widg<strong>et</strong>_base. Exemple :<br />

base=widg<strong>et</strong>_base(mbar=bar)<br />

menu1=widg<strong>et</strong>_button(bar,value='Menu1',/menu<br />

)<br />

but1=widg<strong>et</strong>_button(menu1,value='Un')<br />

but2=widg<strong>et</strong>_button(menu1,value='Deux')<br />

d) Widg<strong>et</strong>_draw<br />

/motion_events Envoie des événements quand la souris se déplace sur la<br />

fenêtre graphique. Cela crée une structure de la forme :<br />

{widg<strong>et</strong>_draw, id:0L, top:0L,<br />

handler:0L, type:0, x:0, y:0,<br />

press:0B, release:0B, clicks:0}<br />

type = 0 : bouton appuyé, 1 : bouton relâché, 2 :<br />

mouvement, 3 : scrolling, 4 : changement de visibilité.<br />

x <strong>et</strong> y donnent la position en coordonnées de la fenêtre.<br />

clicks =1 si simple clic, =2 si double clic<br />

/button_events Génère des événements quand le bouton de la souris est<br />

cliqué sur la fenêtre graphique.<br />

e) widg<strong>et</strong>_label<br />

/align_center<br />

/align_left<br />

/align_right<br />

Définit le type de justification pour le label


f) widg<strong>et</strong>_table<br />

Suivant le type d'action qui a lieu avec ce widg<strong>et</strong> (dont les possibilités sont définies par<br />

/all_events <strong>et</strong> /editable), la structure renvoyée est différente. On a vu que le champ<br />

ev.type détermine la structure. Nous allons voir quelques-unes de ces structures, les autres<br />

sont à regarder dans la partie widg<strong>et</strong>_table de <strong>IDL</strong> Reference Guide (tome 2) :<br />

• Type = 0 : Insertion d'un caractère<br />

{widg<strong>et</strong>_table_ch, id:0L, top:0L, handler:0L, type:0, offs<strong>et</strong>:0L,<br />

ch:0B, x:0L, y:0L}<br />

offs<strong>et</strong> = position (de 0 à n) du caractère inséré ; ch est sa valeur ASCII, x <strong>et</strong> y sont les<br />

numéros de colonne <strong>et</strong> de ligne de la cellule où l'insertion a lieu.<br />

• Type = 1 : Collé de plusieurs caractères<br />

{widg<strong>et</strong>_table_str, id:0L, top:0L, handler:0L, type:1, offs<strong>et</strong>:0L,<br />

str='', x:0L, y:0L}<br />

offs<strong>et</strong>, x <strong>et</strong> y : même signification que ci-dessus. str = chaîne inserrée.<br />

• Type = 2 : Effacement de texte<br />

{widg<strong>et</strong>_table_del, id:0L, top:0L, handler:0L, type:2, offs<strong>et</strong>:0L,<br />

length:0L,x:0L, y:0L}<br />

offs<strong>et</strong>, x, y : idem. Length = nombre de caractères impliqués dans l'effacement.<br />

• Type = 3 : Sélection de texte<br />

{widg<strong>et</strong>_table_ch, id:0L, top:0L, handler:0L, type:3,<br />

offs<strong>et</strong>:0L,length:0L,x:0L, y:0L}<br />

Mêmes significations que ci-dessus<br />

• Type = 4 : Sélection de cellule<br />

{widg<strong>et</strong>_table_ch, id:0L, top:0L, handler:0L, type:4, sel_left:0L,<br />

sel_top:0L, sel_right:0L, sel_bottom:0L}<br />

sel_left, ... donnent les numéros de cellules (de 0 à n) extrêmes sélectionnées.<br />

• Type = 6 : Changement de hauteur de ligne.<br />

• Type = 7 : Changement de largeur de colonne.<br />

• Type = 8 : erreur dans le format de données entré par l'utilisateur.<br />

g) widg<strong>et</strong>_text<br />

/no_newline Empêche l'insertion automatique d'un r<strong>et</strong>our chariot à la<br />

fin de chaque ligne quand le texte est sur plusieurs<br />

lignes<br />

Suivant le type d'action qui a lieu avec ce widg<strong>et</strong> (dont les possibilités sont définies par<br />

/all_events <strong>et</strong> /editable), la structure renvoyée est différente. On a vu que le champ<br />

ev.type détermine la structure :<br />

• Type = 0 : Insertion d'un caractère<br />

{widg<strong>et</strong>_text_ch, id:0L, top:0L, handler:0L, type:0, offs<strong>et</strong>:0L,<br />

ch:0B}<br />

offs<strong>et</strong> est la position d'insertion (de 0 à n) du caractère, dont le code ASCII est dans ch.<br />

• Type = 1 : Insertion de plusieurs caractères<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 21


{widg<strong>et</strong>_text_ch, id:0L, top:0L, handler:0L, type:1, offs<strong>et</strong>:0L,<br />

str=''}<br />

offs<strong>et</strong> = position d'insertion. str= chaîne à insérer<br />

• Type = 2 : Effacement de texte<br />

{widg<strong>et</strong>_text_ch, id:0L, top:0L, handler:0L, type:2, offs<strong>et</strong>:0L,<br />

length:0L}<br />

offs<strong>et</strong> = position (de 0 à n) du 1 er caractère à effacer. Length = nombre de caractères effacés.<br />

• Type = 3 : Sélection de texte<br />

{widg<strong>et</strong>_text_ch, id:0L, top:0L, handler:0L, type:3, offs<strong>et</strong>:0L,<br />

length:0L}<br />

offs<strong>et</strong> = position du 1 er caractère à sélectionner. Length = nombre de caractères sélectionnés.<br />

2) Les compound widg<strong>et</strong>s<br />

Les compound widg<strong>et</strong>s (appelés ci-après CW) sont des programmes ayant l'apparence d'un<br />

widg<strong>et</strong>, mais regroupant en réalité plusieurs widg<strong>et</strong>s.<br />

Leur utilisation est semblable à celle des widg<strong>et</strong>s standards, <strong>et</strong> ils envoient des événements dont<br />

la structure est semblable à celle des widg<strong>et</strong>s (c'est-à-dire que les trois premiers champs sont id,<br />

top <strong>et</strong> handler).<br />

Les CW sont basés sur l'utilisation de fonction d'interception des événements générés pour les<br />

traiter <strong>et</strong> les décomposer avant de renvoyer l'information utile à l'utilisateur.<br />

Leur nom commence toujours par cw_ <strong>et</strong> on trouvera toute l'information les concernant dans <strong>IDL</strong><br />

Reference Guide (tome 1), à la rubrique de leur nom.<br />

Un utilisateur confirmé des widg<strong>et</strong>s pourra se m<strong>et</strong>tre à créer lui-même des CW au gré de <strong>ses</strong><br />

besoins. L'idée présidant à leur conception est qu'ils forment des regroupements utiles de widg<strong>et</strong>s<br />

que l'on peut utiliser dans des routines différentes comme s'il s'agissait de simple widg<strong>et</strong>s.<br />

Voici un bref descriptif des principaux CW.<br />

a) cw_bgroup<br />

Ce CW perm<strong>et</strong> de créer un groupe de boutons d'une seule commande. Sa forme d'appel est :<br />

id = cw_bgroup(parent, noms)<br />

où parent est l'ID du parent de ce CW, <strong>et</strong> noms est un tableau chaîne de caractères contenant<br />

le nom de chaque bouton. Nous verrons dans la section 3) ci-dessous un exemple d'utilisation de<br />

ce CW.<br />

L'événement ev r<strong>et</strong>ourné par ce CW renvoie entre autres le champ value qui donne, suivant le<br />

mot-clé associé lors de la création, l'indice du bouton, son ID, son nom, ou la valeur utilisateur<br />

correspondante.<br />

Les principaux mots-clés qui lui sont associés sont :<br />

button_uvalue=string_array Tableau contenant les uvalue de chaque bouton. Ce<br />

mot-clé l'emporte toujours sur les mots-clés de la forme<br />

/r<strong>et</strong>urn_xxx<br />

/column m<strong>et</strong> les boutons en colonne<br />

/exclusive identique à widg<strong>et</strong>_base<br />

label_left=txt m<strong>et</strong> un label à gauche du bouton<br />

label_top=txt m<strong>et</strong> un label au dessus du bouton<br />

/nonexclusive identique à widg<strong>et</strong>_base<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 22


<strong>et</strong>urn_id renvoie dans le champ value l'ID du bouton<br />

sélectionné<br />

/r<strong>et</strong>urn_index renvoie dans le champ value l'indice du bouton<br />

sélectionné<br />

/r<strong>et</strong>urn_name renvoie dans le champ value le nom du bouton<br />

sélectionné<br />

/row m<strong>et</strong> les boutons en ligne<br />

/scroll perm<strong>et</strong> d'afficher un ascenseur pour faire apparaître les<br />

boutons hors cadre<br />

b) cw_defroi<br />

Ce CW perm<strong>et</strong> de définir une région d'intérêt (id de la délimiter) sur une image. Il est modal, ce<br />

qui signifie qu'il bloque les autres widg<strong>et</strong>s. Son utilisation se fait sous la forme :<br />

res=cw_defroi(draw)<br />

où draw est l'id du widg<strong>et</strong>_draw où l'on délimite la région. res est un tableau d'indices<br />

définissant la région. On peut ainsi créer un nouveau tableau formé uniquement de la région<br />

choisie par :<br />

new_tab = old_tab(res)<br />

Le widg<strong>et</strong>_draw utilisé doit être accompagné des mots-clés /motion_events <strong>et</strong><br />

/button_events.<br />

c) cw_field<br />

Perm<strong>et</strong> de créer un ensemble formé d'un label plus un champ d'entrée de valeur (texte par défaut)<br />

:<br />

id=cw_field(parent)<br />

Notez que chaque interrogation widg<strong>et</strong>_control, id, g<strong>et</strong>_value=x renvoie le contenu<br />

du champ.<br />

Les principaux mots-clés pouvant lui être associés sont :<br />

/all_events génère un événement à chaque changement du contenu<br />

/r<strong>et</strong>urn_events génère un événement à chaque r<strong>et</strong>our chariot<br />

/column centre le label au-dessus du champ<br />

/floating convertit automatiquement l'entrée en réel<br />

/integer convertit automatiquement l'entrée en entier<br />

/long convertit automatiquement l'entrée en entier long<br />

/string convertit automatiquement l'entrée en chaîne<br />

/noedit rend le champ non éditable<br />

/row m<strong>et</strong> le label à gauche du champ (= défaut)<br />

title=str label (défaut = "Input Field")<br />

uvalue=str valeur utilisateur<br />

value=val contenu initial du champ (automatiquement converti<br />

suivant le type choisi)<br />

L'événement engendré par cw_field a la forme :<br />

ev={id:0L, top:0L, handler:0L, value:'', type:0, update:0}<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 23


value contient le contenu du champ. Type indique le type d'entrée (0 = string, 1 = float, 2 =<br />

interger, 3 = long integer) ; <strong>et</strong> update vaut 0 si rien n'a été modifié, 1 sinon.<br />

d) cw_form<br />

Ce CW perm<strong>et</strong> de créer des formulaires (mélange de texte, champs numériques, boutons, listes <strong>et</strong><br />

listes déroulantes). Son utilisation est relativement complexe suivant ce que l'on désire faire. Se<br />

reporter à <strong>IDL</strong> Reference Guide tome 1 pour plus d'informations.<br />

e) cw_fslider<br />

Crée un curseur perm<strong>et</strong>tant de choisir des valeurs réelles :<br />

id=cw_fslider(parent)<br />

Son utilisation est semblable à celle de widg<strong>et</strong>_slider. Ses principaux mots-clés sont :<br />

/drag cf widg<strong>et</strong>_slider<br />

/edit rend éditable le label du curseur<br />

Maximum = val cf widg<strong>et</strong>_slider<br />

Minimum = val cf widg<strong>et</strong>_slider<br />

Title=str Label du curseur<br />

uvalue=str valeur utilisateur<br />

/vertical cf widg<strong>et</strong>_slider<br />

value=val position initiale du curseur<br />

Le champ ev.value du l'événement engendré renvoie la valeur réelle choisie à l'aide du<br />

curseur.<br />

f) cw_pdmenu<br />

Perm<strong>et</strong> de créer un menu déroulant. ev.value renvoie l'indice du bouton sélectionné, son ID,<br />

son nom ou son nom compl<strong>et</strong>, suivant le mot-clé associé à ce CW.<br />

id = cw_pdmenu(parent,desc)<br />

desc est un tableau chaîne de caractère qui va décrire le menu déroulant. Chacun de <strong>ses</strong><br />

éléments s'écrit sous la forme :<br />

'flag\item_name' (attention, il s'agit d'un backslash)<br />

item_name est l'intitulé du bouton.<br />

flag = 0 Le bouton n'est ni le début ni la fin d'un niveau déroulant<br />

flag = 1 Le bouton est la racine d'un sous menu déroulant (le sous-menu commence avec le<br />

bouton suivant)<br />

flag = 2 Le bouton est le dernier du sous-menu déroulant actuel<br />

flag = 3 Le bouton est le dernier du sous-menu déroulant actuel, mais c'est aussi la racine<br />

d'un sous-menu déroulant.<br />

Exemple :<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 24


Desc=['1\Titre','0\zéro', $<br />

'1\un>','0\aa', $<br />

'0\bb','3\cc','0\0',<br />

$<br />

'2\1','2\deux']<br />

Les principaux mots-clés associés sont :<br />

/mbar Crée le menu déroulant sur la barre de menu. Le parent<br />

doit être la barre de menu de la base la plus haute<br />

/r<strong>et</strong>urn_id renvoie dans ev.value l'ID du bouton sélectionné<br />

/r<strong>et</strong>urn_index renvoie dans ev.value l'indice du bouton sélectionné<br />

/r<strong>et</strong>urn_name renvoie dans ev.value le nom du bouton sélectionné<br />

(cc> par exemple)<br />

/r<strong>et</strong>urn_full_name renvoie dans ev.value le nom compl<strong>et</strong> du bouton<br />

sélectionné (par exemple, pour le bouton '1',<br />

ev.value='Titre.un>.cc.1'). Chaque niveau<br />

de menu est séparé du précédent par un point.<br />

D'autres formes d'utilisation de cd CW existent. Consulter <strong>IDL</strong> Reference Guide, tome 1 pour<br />

plus d'informations.<br />

g) cw_zoom<br />

Affiche deux images : l'originale, <strong>et</strong> une portion zoomée de celle-ci dans une autre fenêtre.<br />

id = cw_zoom(parent)<br />

L'image se charge par :<br />

Widg<strong>et</strong>_control,id,s<strong>et</strong>_value=data<br />

Les principaux mots-clés l'accompagnant sont :<br />

max=val Valeur maximum de zoom (déf = 20), ≥ 1<br />

min=val Valeur minimum de zoom (déf = 1) ≥ 1<br />

sample=val Type d'échantillonnage. Défaut = 0 (bilinéaire) ; ≠ 0<br />

pour une interpolation avec le voisin le plus proche<br />

scale=val valeur entière de facteur d'échelle initial pour le zoom<br />

(défaut = 4) ≥ 1<br />

xsize=val <strong>et</strong> ysize=val Taille en pixels de la fenêtre initiale (défaut = 500x500)<br />

x_zsize=val <strong>et</strong> y_zsize=val Taille en pixels de la fenêtre de zoom (défaut =<br />

250x250)<br />

Pour récupérer l'image zoomée, il faut faire :<br />

widg<strong>et</strong>_control,id,g<strong>et</strong>_value=tab<br />

L'événement engendré par cw_zoom a l'aspect suivant :<br />

ev={zoom_event,id:0L, top:0L, handler:0L, xsize:0L, ysize:0L,<br />

x0:0L, y0:0L, x1:0L, y1:0L}<br />

xsize <strong>et</strong> ysize sont les dimensions de l'image zoomée ; x0 <strong>et</strong> y0 sont les coordonnées du<br />

coin inférieur gauche où commence le zoom ; <strong>et</strong> x1, y1 du coin supérieur droit.<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 25


3) Reprise de l'exemple du début avec un compound widg<strong>et</strong><br />

Voici ci-dessous l'exemple de widg<strong>et</strong> présenté dans le III 4). La série de boutons est ici créée par<br />

le compound widg<strong>et</strong> cw_bgroup.<br />

pro w_exo1_2_event,ev<br />

widg<strong>et</strong>_control,ev.id,g<strong>et</strong>_uvalue=uval<br />

widg<strong>et</strong>_control,ev.top,g<strong>et</strong>_uvalue=struc<br />

case uval of<br />

'u_txt1': begin<br />

widg<strong>et</strong>_control,ev.id,g<strong>et</strong>_value=txt<br />

struc.txt=txt<br />

widg<strong>et</strong>_control,ev.top,s<strong>et</strong>_uvalue=struc<br />

end<br />

'u_butt': begin<br />

val=ev.value<br />

case val of<br />

'u_bu_ok': begin<br />

struc.wintxt=struc.wintxt+struc.txt<br />

struc.txt=''<br />

widg<strong>et</strong>_control,struc.txt1,s<strong>et</strong>_value=struc.txt<br />

widg<strong>et</strong>_control,struc.txt2,s<strong>et</strong>_value=struc.wintxt<br />

widg<strong>et</strong>_control,ev.top,s<strong>et</strong>_uvalue=struc<br />

end<br />

'u_bu_eff': begin<br />

struc.txt=''<br />

widg<strong>et</strong>_control,struc.txt1,s<strong>et</strong>_value=struc.txt<br />

widg<strong>et</strong>_control,ev.top,s<strong>et</strong>_uvalue=struc<br />

end<br />

'u_bu_quit': widg<strong>et</strong>_control,ev.top,/destroy<br />

endcase<br />

end<br />

endcase<br />

end<br />

pro w_exo1_2<br />

struc={txt:'', wintxt:'',txt2:0L, txt1:0L, butt:0L}<br />

base=widg<strong>et</strong>_base(/column,uval=struc)<br />

lbl1=widg<strong>et</strong>_label(base,value='Entrez un texte')<br />

txt1=widg<strong>et</strong>_text(base,value='',uvalue='u_txt1',xsize=40,ysize=1,/editable,/all<br />

_events)<br />

b_val=['OK','Effacer','Quitter']<br />

b_uval=['u_bu_ok','u_bu_eff','u_bu_quit']<br />

butt=cw_bgroup(base,b_val,/row,button_uvalue=b_uval,uvalue='u_butt')<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 26


lbl2=widg<strong>et</strong>_label(base,value='Affichage')<br />

txt2=widg<strong>et</strong>_text(base,value='',xsize=20,ysize=5,/wrap,/scroll)<br />

widg<strong>et</strong>_control,base,/realize<br />

struc.txt2=txt2<br />

struc.txt1=txt1<br />

struc.butt=butt<br />

widg<strong>et</strong>_control,base,s<strong>et</strong>_uvalue=struc<br />

xmanager,'w_exo1_2',base<br />

end<br />

4) widg<strong>et</strong>_info<br />

Ce widg<strong>et</strong> est spécial : son seul but est de fournir des informations sur un widg<strong>et</strong> dont l’ID lui sert<br />

d’argument :<br />

res=widg<strong>et</strong>_info(id)<br />

Voici quelques uns des 46 mots-clés qui peuvent l’accompagner :<br />

Mot-clé Widg<strong>et</strong> concerné Description<br />

/child Tous Renvoie l’ID du 1 er ‘enfant’ (0 si aucun)<br />

/droplist_number Widg<strong>et</strong>_droplist Renvoie le nombre d’éléments dans la liste<br />

/droplist_select Widg<strong>et</strong>_droplist Renvoie le numéro de l’item sélectionné dans la liste<br />

/event_func Tous Renvoie le nom de la fonction d’interception de la<br />

gestion des événements<br />

/event_pro Tous Renvoie le nom de la procédure d’interception de la<br />

gestion des événements<br />

/geom<strong>et</strong>ry Tous Renvoie les dimensions diver<strong>ses</strong> du widg<strong>et</strong> sous<br />

forme d’une structure (cd <strong>IDL</strong> Reference Guide)<br />

/list_number Widg<strong>et</strong>_list Renvoie le nombre d’éléments de la liste<br />

/list_num_visible Widg<strong>et</strong>_list Renvoie le nombre d’éléments visibles dans la<br />

fenêtre<br />

/list_select Widg<strong>et</strong>_list Renvoie le nombre d’éléments sélectionnés dans la<br />

liste (-1 si aucun)<br />

/list_top Widg<strong>et</strong>_list Renvoie le numéro de l’élément du haut visible dans<br />

la fenêtre<br />

/name Tous Renvoie le nom du widg<strong>et</strong> (base, button, draw, ...)<br />

/parent Tous Renvoie l’ID du parent (0 si aucun)<br />

/slider_min_max Widg<strong>et</strong>_slider Renvoie un tableau à 2 éléments dont le premier est<br />

la valeur min du curseur, <strong>et</strong> le second la valeur max<br />

/text_number Widg<strong>et</strong>_text Renvoie le nombre de caractères contenu dans le<br />

widg<strong>et</strong>_text<br />

/unit Tous Renvoie le type d’unités : 0 = pixels, 1 = inches, 2 =<br />

centimètres<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 27


5) Un exemple plus compl<strong>et</strong> de widg<strong>et</strong><br />

Le but de c<strong>et</strong> exemple est de construire une interface perm<strong>et</strong>tant d'effectuer les opérations<br />

suivantes :<br />

Charger un fichier texte, d'extension .lst contenant une série de noms de fichiers précédée du<br />

nombre de fichiers. Sélectionner l'un de ces fichiers, le charger <strong>et</strong> l'afficher. Pouvoir en tracer la<br />

surface, la surface ombrée <strong>et</strong> l'isocontour, sauver le tracé au format jpeg. Puis recommencer avec<br />

un autre fichier. On souhaite de plus qu'une ligne d'informations renseigne sur les opérations en<br />

cours.<br />

Voici l'aspect général que l'on veut donner à l'interface (on l’a déjà vue dans le II) :<br />

On constate tout d'abord que la base générale est organisée en une colonne. Sa partie supérieure<br />

est organisée en ligne dont la partie gauche est en colonne, qui se décompose pour la partie haute<br />

en ligne ; <strong>et</strong> la partie centrale, avec les boutons est en colonne. C'est ainsi que l'on va définir les<br />

ba<strong>ses</strong> nécessaires à la construction de c<strong>et</strong>te interface.<br />

Voici le listing :<br />

pro w_exo2_event,ev ; Routine de traitement des événements<br />

common ex2, lst, txt, w_num,indice,ld,filen,data,jp ; Transfert d'arguments<br />

widg<strong>et</strong>_control,ev.id,g<strong>et</strong>_uvalue=uval ; On récupère la valeur utilisateur<br />

case uval of ; <strong>et</strong> on la teste<br />

'u_but1': begin ; Bouton de chargement fichier texte<br />

fn=dialog_pickfile(filter='*.lst')<br />

if strlen(fn) ne 0 then begin<br />

nb_el=0<br />

openr,lun,fn,/g<strong>et</strong>_lun<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 28


eadf,lun,nb_el<br />

filen=strarr(nb_el)<br />

readf,lun,filen<br />

free_lun,lun<br />

widg<strong>et</strong>_control,lst,s<strong>et</strong>_value=filen ; On affiche dans le widg<strong>et</strong>_list les<br />

; noms de fichiers<br />

endif<br />

end<br />

'u_lst': begin ; Un nom de fichier a été sélectionné<br />

indice=fix(ev.index)<br />

widg<strong>et</strong>_control,txt,s<strong>et</strong>_value='Fichier '+ filen[indice] + ' sélectionné'<br />

; Texte dans la fenêtre d'informations<br />

end<br />

'u_bu_load': begin ; On charge le fichier sélectionné<br />

if indice ne -1 then begin<br />

widg<strong>et</strong>_control,txt,s<strong>et</strong>_value="Chargement en cours"<br />

; Texte dans la fenêtre d'informations<br />

openr,lun,filen[indice],/g<strong>et</strong>_lun<br />

data=intarr(382,286)<br />

readf,lun,data<br />

free_lun,lun<br />

ws<strong>et</strong>,w_num<br />

tvscl,data<br />

ld=1<br />

widg<strong>et</strong>_control,txt,s<strong>et</strong>_value="Chargement terminé"<br />

; Texte dans la fenêtre d'informations<br />

endif<br />

end<br />

'u_bu_sav': begin ; Le bouton 'Save JPEG' est cliqué<br />

if ld then begin<br />

widg<strong>et</strong>_control,txt,s<strong>et</strong>_value="Sauvegarde en cours"<br />

; Texte dans la fenêtre d'informations<br />

ws<strong>et</strong>,w_num<br />

dat=tvrd()<br />

fn='exo2_'+strcompress(string(jp),/remove_all)+'.jpeg'<br />

write_jpeg,fn,dat<br />

jp=jp+1<br />

widg<strong>et</strong>_control,txt,s<strong>et</strong>_value="Fichier "+fn+' sauvé'<br />

; Texte dans la fenêtre d'informations<br />

endif<br />

end<br />

'u_bu_surf': begin ; Le bouton 'Surface' est cliqué<br />

if ld then begin<br />

ws<strong>et</strong>,w_num<br />

surface,data<br />

endif<br />

end<br />

'u_bu_shad': begin ; Le bouton 'Shade_surf' est cliqué<br />

if ld then begin<br />

ws<strong>et</strong>,w_num<br />

shade_surf,data<br />

endif<br />

end<br />

'u_bu_iso': begin ; Le bouton 'Isocontour' est cliqué<br />

if ld then begin<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 29


ws<strong>et</strong>,w_num<br />

image_cont,data<br />

endif<br />

end<br />

'u_bu_quit': widg<strong>et</strong>_control,ev.top,/destroy ; Pour quitter, on détruit la base<br />

; principale<br />

endcase<br />

end<br />

pro w_exo2 ; Routine de création de l'interface<br />

common ex2, lst, txt, w_num,indice,ld,filen,data,jp<br />

; On m<strong>et</strong> en common les données utiles : l'ID du widg<strong>et</strong>_list, l'ID de la fenêtre texte<br />

d'information, le<br />

; numéro de fenêtre (qui n'est pas indispensable puisqu'il n'y en a qu'une), l'indice du fichier<br />

; sélectionné dans la liste de noms de fichiers, un indicateur disant si un fichier est chargé ou non,<br />

la<br />

; liste des noms de fichiers, les données à manipuler quand elles ont été chargées, <strong>et</strong> un compteur<br />

qui<br />

; s'incrémente à mesure des sauvegardes en jpeg afin de ne pas écraser un ancien fichier.<br />

; Initialisation des valeurs<br />

filen=''<br />

indice=-1<br />

ld=0<br />

jp=0<br />

base=widg<strong>et</strong>_base(/column) ; Base de plus haut niveau<br />

b1=widg<strong>et</strong>_base(base,/row) ; Sous-base pour la partie supérieure<br />

b11=widg<strong>et</strong>_base(b1,/column) ; Sous-sous-base pour le haut-gauche<br />

b111=widg<strong>et</strong>_base(b11,/row) ; sous-sous-sous-base pour la 1 ère ligne<br />

lbl1=widg<strong>et</strong>_label(b111,value='Fichier texte')<br />

but1=widg<strong>et</strong>_button(b111,value='Lire',uvalue='u_but1')<br />

lbl2=widg<strong>et</strong>_label(b11,value="Liste d'images")<br />

lst=widg<strong>et</strong>_list(b11,value=filen,uvalue='u_lst',xsize=35,ysize=6)<br />

b12=widg<strong>et</strong>_base(b1,/column) ; Sous-base pour les boutons<br />

bu_load=widg<strong>et</strong>_button(b12,value='Load', uvalue='u_bu_load')<br />

bu_sav=widg<strong>et</strong>_button(b12,value='Save JPEG', uvalue='u_bu_sav')<br />

bu_surf=widg<strong>et</strong>_button(b12,value='Surface',uvalue='u_bu_surf')<br />

bu_shad=widg<strong>et</strong>_button(b12,value='Shade_surf',uvalue='u_bu_shad')<br />

bu_iso=widg<strong>et</strong>_button(b12,value='Isocontour',uvalue='u_bu_iso')<br />

w_gr=widg<strong>et</strong>_draw(b1,uvalue='u_w_gr',xsize=382,ysize=286) ; Fenêtre graphique<br />

b2=widg<strong>et</strong>_base(base,/row) ; Sous-base pour la fenêtre d'informations<br />

lbl3=widg<strong>et</strong>_label(b2,value='Infos')<br />

txt=widg<strong>et</strong>_text(b2,value='',xsize=40,ysize=1)<br />

bu_quit=widg<strong>et</strong>_button(base,value='Quitter',uvalue='u_bu_quit')<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 30


widg<strong>et</strong>_control,base,/realize ; Réalisation du widg<strong>et</strong><br />

widg<strong>et</strong>_control,w_gr,g<strong>et</strong>_value=w_num ; Récupération du numéro de fenêtre graphique<br />

xmanager,'w_exo2',base ; Passage du contrôle à xmanager<br />

end<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 31


no_copy ........................... 18<br />

arguments................................ 3<br />

commons................................. 3<br />

compound widg<strong>et</strong> .................... 4<br />

compound widg<strong>et</strong>s................. 22<br />

cw_bgroup ............................ 22<br />

/column......................... 22<br />

/exclusive .................. 22<br />

/nonexclusive ........... 22<br />

/r<strong>et</strong>urn_id .................. 23<br />

/r<strong>et</strong>urn_index ........... 23<br />

/r<strong>et</strong>urn_name ............. 23<br />

/row................................ 23<br />

/scroll......................... 23<br />

button_uvalue ........... 22<br />

label_left .................. 22<br />

label_top .................... 22<br />

cw_defroi .............................. 23<br />

cw_field ................................ 23<br />

/all_events................ 23<br />

/column......................... 23<br />

/floating .................... 23<br />

/integer....................... 23<br />

/long.............................. 23<br />

/noedit......................... 23<br />

/r<strong>et</strong>urn_events......... 23<br />

/row................................ 23<br />

/string......................... 23<br />

title.............................. 23<br />

Type................................ 24<br />

update ........................... 24<br />

uvalue ........................... 23<br />

value......................... 23,24<br />

cw_form................................ 24<br />

cw_fslider.............................. 24<br />

/drag.............................. 24<br />

/edit.............................. 24<br />

/vertical .................... 24<br />

Maximum......................... 24<br />

Minimum......................... 24<br />

Title.............................. 24<br />

uvalue ........................... 24<br />

value.............................. 24<br />

cw_pdmenu........................... 24<br />

/mbar.............................. 25<br />

/r<strong>et</strong>urn_full_name.. 25<br />

/r<strong>et</strong>urn_id .................. 25<br />

/r<strong>et</strong>urn_index ........... 25<br />

/r<strong>et</strong>urn_name ............. 25<br />

cw_zoom............................... 25<br />

max .................................. 25<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 32<br />

Index<br />

min .................................. 25<br />

sample ........................... 25<br />

scale.............................. 25<br />

x_zsize ......................... 25<br />

x0..................................... 25<br />

x1..................................... 25<br />

xsize.............................. 25<br />

y_zsize ......................... 25<br />

y0..................................... 25<br />

y1..................................... 25<br />

ysize.............................. 25<br />

ev.handler......................... 7<br />

ev.id .................................... 7<br />

ev.top.................................. 7<br />

event_function.............. 18<br />

event_pro ......................... 19<br />

frame .................................. 18<br />

func_g<strong>et</strong>_value.............. 19<br />

gestion des événements.......... 13<br />

help....................................... 4<br />

/structure............................. 4<br />

mots-clés ................................. 3<br />

pro_s<strong>et</strong>_value................ 19<br />

structures................................. 3<br />

template................................... 5<br />

temporary ......................... 18<br />

transfert d’arguments............. 14<br />

widg<strong>et</strong> ..................................... 4<br />

widg<strong>et</strong>_base .............. 5,8,19<br />

/align_bottom ........ Voir<br />

/align_center ........... 19<br />

/align_left................ 19<br />

/align_right.............. 19<br />

/align_top .................. 19<br />

/base_align_bottom 19<br />

/base_align_center 19<br />

/base_align_left .... 19<br />

/base_align_right.. 19<br />

/base_align_top....... 19<br />

/column............................... 8<br />

/exclusive .................... 8<br />

/floating .................... 19<br />

/modal ........................... 19<br />

/nonexclusive ............. 8<br />

/row.................................. 8<br />

/scroll ........................... 8<br />

app_mbar....................... 19<br />

group_leader................ 8<br />

map .................................. 19<br />

mbar................................ 19<br />

title................................ 8<br />

tlb_frame_attr......... 20<br />

uvalue ............................. 8<br />

widg<strong>et</strong>_button.......... 5,8,20<br />

/align_center ........... 20<br />

/align_left................ 20<br />

/align_right.............. 20<br />

/menu.............................. 20<br />

/separator .................. 20<br />

ev.select....................... 9<br />

group_leader................ 8<br />

units................................ 8<br />

uvalue ............................. 8<br />

value........................... 8,20<br />

xsize................................ 8<br />

ysize................................ 8<br />

widg<strong>et</strong>_control........... 6,12<br />

/append ......................... 12<br />

/destroy....................... 12<br />

/hourglass .................. 13<br />

/iconify....................... 13<br />

/realize....................... 12<br />

all_table_events .... 12<br />

all_text_events....... 12<br />

column_labels ........... 12<br />

column_width.............. 13<br />

edit_cell..................... 13<br />

editable....................... 12<br />

g<strong>et</strong>_uvalue .................. 13<br />

g<strong>et</strong>_value..................... 13<br />

group_leader.............. 13<br />

map .................................. 13<br />

row_heights................ 13<br />

row_labels .................. 13<br />

sensitive..................... 13<br />

s<strong>et</strong>_button .................. 13<br />

s<strong>et</strong>_text_top_line .. 13<br />

s<strong>et</strong>_uvalue .................. 13<br />

s<strong>et</strong>_value..................... 13<br />

tlb_s<strong>et</strong>_title ........... 13<br />

units.............................. 13<br />

xsize.............................. 13<br />

ysize.............................. 13<br />

widg<strong>et</strong>_draw............... 5,9,20<br />

/button_events......... 20<br />

/motion_events......... 20<br />

/scroll ........................... 9<br />

group_leader................ 9<br />

units................................ 9<br />

uvalue ............................. 9<br />

value................................ 9<br />

xsize................................ 9


ysize................................ 9<br />

widg<strong>et</strong>_droplist .......... 6,9<br />

group_leader ............... 9<br />

index................................ 9<br />

title................................ 9<br />

units................................ 9<br />

uvalue ............................. 9<br />

value................................ 9<br />

xsize................................ 9<br />

widg<strong>et</strong>_event .................... 6<br />

widg<strong>et</strong>_info ........................... 27<br />

/child ................................ 27<br />

/droplist_numbe................ 27<br />

/droplist_select.................. 27<br />

/event_func....................... 27<br />

/event_pro......................... 27<br />

/geom<strong>et</strong>ry.......................... 27<br />

/list_num_visible .............. 27<br />

/list_number...................... 27<br />

/list_select......................... 27<br />

/list_top............................. 27<br />

/name................................ 27<br />

/parent .............................. 27<br />

/slider_min_max ............... 27<br />

/text_number..................... 27<br />

/unit .................................. 27<br />

widg<strong>et</strong>_label ............ 6,9,20<br />

/align_center ........... 20<br />

/align_left................ 20<br />

/align_right ............. 20<br />

group_leader ............... 9<br />

units................................ 9<br />

value.............................. 10<br />

xsize.............................. 10<br />

<strong>IDL</strong> <strong>et</strong> <strong>ses</strong> widg<strong>et</strong>s 33<br />

ysize.............................. 10<br />

widg<strong>et</strong>_list ................. 6,10<br />

/multiple .................... 10<br />

clicks ........................... 10<br />

group_leader.............. 10<br />

index.............................. 10<br />

units.............................. 10<br />

uvalue ........................... 10<br />

value.............................. 10<br />

xsize.............................. 10<br />

ysize.............................. 10<br />

widg<strong>et</strong>_slider............. 6,10<br />

/drag.............................. 10<br />

/vertical .................... 10<br />

group_leader.............. 10<br />

maximum ......................... 10<br />

minimum ......................... 10<br />

title.............................. 10<br />

units.............................. 10<br />

uvalue ........................... 10<br />

value.............................. 10<br />

xsize.............................. 10<br />

ysize.............................. 10<br />

widg<strong>et</strong>_table .......... 6,11,21<br />

/all_events................ 11<br />

/editable .................... 11<br />

/no_headers................ 11<br />

/scroll ......................... 11<br />

ch..................................... 21<br />

column_labels ........... 11<br />

column_widths ........... 11<br />

group_leader.............. 11<br />

Length ........................... 21<br />

offs<strong>et</strong> ........................... 21<br />

row_heights................ 11<br />

row_labels .................. 11<br />

sel_bottom .................. 21<br />

sel_left....................... 21<br />

sel_right..................... 21<br />

sel_top ......................... 21<br />

str .................................. 21<br />

Type ................................ 21<br />

units.............................. 11<br />

uvalue ........................... 11<br />

value.............................. 11<br />

x 21<br />

xsize.............................. 11<br />

y 21<br />

ysize.............................. 11<br />

widg<strong>et</strong>_text............. 6,11,21<br />

/all_events................ 12<br />

/editable..................... 12<br />

/no_newline................ 21<br />

/scroll ......................... 11<br />

/wrap.............................. 11<br />

ch..................................... 21<br />

group_leader.............. 11<br />

Length ........................... 22<br />

offs<strong>et</strong> ........................... 21<br />

str .................................. 22<br />

Type ................................ 21<br />

units.............................. 11<br />

uvalue ........................... 11<br />

value.............................. 11<br />

xsize.............................. 12<br />

ysize.............................. 12<br />

xmanager ............................. 6

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!