Généralités sur les Widgets


Dernière modification : 3/11/96

Table des matières

Introduction

MOTIF possède deux grandes classes de Widgets: Primitive et Manager.

Plusieurs choses à savoir :

Les différents types de Widgets

Les widgets de la classe primitive

ArrowButton
Une bouton contenant non pas un label mais un pixmap en forme de flèche. Une ressource permet de choisir le sens de la flêche.

Exemple d'ArrowButtons :

Quatre ArrowButtons et un PushButton (au milieu)

Label
Un label est un Widget servant à afficher des informations sous la forme de texte ou d'image (Pixmap). Par défaut il n'est pas possible d'associer de CallBacks à des Labels. Ils ne réagissent donc pas aux événements. Ils peuvent servir pour les manipulations de type "drag and drop".
Exemple de label :
Sur la même ligne : un Label graphique (la clé) et un Label texte
La classe Label possède quatre sous-classes :
Scrollbar
Permet d'afficher le contenu d'une fenêtre partiellement. A l'aide d'une Scrollbar l'utilisateur peut séléctionner la partie de la fenêtre qui est visible à l'écran. On les utilisera peu directement, on leur préfèrera l'utilisation de Widgets de type ScrolledWindow qui les encapsulent.
Voici un exemple de Scrollbar :

Separator
Eléments graphiques permettant d'afficher des lignes verticales ou horizontales pour séparer différentes parties d'un menu par exemple. Ils peuvent etre utilisés également dans les menus déroulants.
Voici un exemple de Separator :

List
Une boîte contenant une liste d'éléments textuels que l'utilisateur peut choisir à la souris ou au clavier. Plusieurs comportements sont configurables : selection unique ou multiple, appartion de SCrollBars lorsque la liste ne tient plus dans la fenêtre de visualisation, etc... Les éléments de la liste peuvent être manipulés par les opérations de type "drag and drop".
Voici un exemple de List :

Text
Ce Widget est un petit éditeur de texte à lui tout seul. De très nombreuses fonctions de manipulation de texte leur sont associées : couper/coller, drag and drop, rechercher/remplacer, gestion des polices de caractère, etc...
Voici un exemple de Text :

TextField
Un éditeur de texte d'une seule ligne. Voici un exemple de TextField :

Les Widgets de la classe Manager

La classe Manager est divisée en de nombreuses sous-classes. On ne peut pas créer directement des objets de la classe Manager, seulement des objets de ses sous-classes.

Si vous regardez les diagramme des classes Motif et Xt, vous verrez que la classe Manager, qui est une classe Motif, hérite de la classe Xt Constraint, qui hérite elle-même de la classe Xt Composite.

La classe Composite fournit les mécanismes de base des Widgets capables de gérer la taille et la position de leurs enfants.

La classe Constraint ajoute à ces mécanismes la possibilité de donner des nouvelles ressources aux Widgets dont la taille et la position est prise en charge. Ces ressources servent à contraindre (constraint en anglais) leur taille et leur position à partir du moment ou ils sont fils d'un Widget de la classe Constraint.

Les différents Widgets de la classe Manager. Toutes ces classes héritent de la classe Manager :

Les Gadgets

Parfois, en lisant les manuels MOTIF, vous allez entendre parler de Gadgets. Les Gadgets sont des "Widgets simplifiés". Ils n'en existe que de trois types : ArrowButton, Label et Separator.

Ils ne disposent pas d'autant de ressources que les Widgets correspondants et leur gestion par les librairies Xm et Xt est plus rapide bien que leur comportement soit équivalent.

Nous ne nous attarderons pas sur les Gadgets car avec la puissance des machines actuelles et la complexité relativement faible des applications que nous allons développer dans ce cours, la différence entre Gadgets et Widgets est imperceptible.

Les Menus

Motif permet de manipuler trois sortes de menus.

Menus déroulants

Ces menus apparaissent lorsqu'on clique sur un CascadeButton d'une MenuBar.En général, la barre de menu se trouve en haut de la fenêtre principale d'une application et s'étend sur toute sa largeur. Le Motif Style Guide recommande de mettre un menu "help" sur la droite de la barre de menu et un menu "file" sur la gauche.

Le menu déroulant en lui-même se compose d'un PulldownMenu pouvant contenir des PushButtons, des ToggleButtons, des Separators, et des CascadeButtons (si le menu comprend des sous-menus).

Attention : Les widgets de type MenuBar et PulldownMenu sont en fait des RowColumns initialisées de manière particulière par Motif. On ne pourra donc pas les créer avec des fonctions Xt comme XtVaCreateManagedWidget() ou XtCreateManagedWidget(). Il faudra impérativement utiliser des fonctions Motif comme XmCreateMenuBar() ou XmCreatePulldownMenu()

Exemple de menu déroulant :

Option Menus

Il s'agit d'un menu qui se déroule par-dessus un CascadeButton. Une fois le choix effectué, le menu disparait et le texte affiché par le CascadeButton est modifié en fonction du choix.

Voici un exemple d'Option Menu . Cliquez dessus, vous verrez-bien!

Popup Menus

Les PopUpMenus se "poppent", c'est-à-dire apparaissent n'importe oú. Ils ne sont pas attachés à un CascadeButton comme les menus déroulants ou comme les Option menus. EN général on les déclenche lors d'un appui sur le bouton 3 de la souris. Ils sont très utiles pour proposer des raccourcis vers les fonctionnalités principales d'une application dans le contexte de la fenêtre oú a eu lieu le click souris.

Exemple de PopupMenu :

Dialogue avec le Window Manager, fenêtres indépendantes

Les Shells

Toutes les fenêtres d'une applications qui sont filles de la Root Window, la fenêtre en fond d'écran, sont manipulables par le Window Manager. Tous les widgets qu'elles contiennent sont leurs enfants. On les appelle des top-level car elles se trouvent au sommet de la hiérarchie des objets qu'elles contiennent.

Dans le monde Xt/Motif, chaque top-level repose sur un widget particulier appartenant à la classe Shell. Les Shell widgets sont invisbles car entièrement recouverts par les widgets qui composent la top-level.

Attention : un Shell ne peut contenir qu'un seul enfant. Ce dernier doit impérativement appartenir à la classe Manager ou à une de ses sous-classes.

A part servir de support pour les fenêtres top-levels, les widgets Shell servent d'interface avec le Window Manager. Les ressources des Shells permettent de spécifier une taille minimale pour le top-level, s'il est retaillable, si on désire lui affecter une icône, etc... on peut même personaliser les menus qui sont affichés par le Window Manager lorsqu'on clique dans les décorations de la fenêtre (barre de titre, bordures), désactiver certaines options (pas de destroy window sauvage sur mon application car elle doit impérativement libérer certaines ressources, etc....)

On utilisera jamais directement des objets de la classe Shell, on utilisera une des trois sous-classes disponibles :

Les fenêtre de type Dialog

Les fenêtres de dialogue sont temporaires et servent à établir une interaction ponctuelle avec l'utilisateur. Il existe deux classes de fenêtre de dialogue : MessageDialog et SelectionDialog. La première sert à informer l'utilisateur d'une action à faire d'urgence, typiquement répondre par oui ou par non à une question, lire un message et répondre Ok, etc.... La seconde sert à effectuer une sélection : choix d'un fichier, etc...


michel.buffa@essi.fr