MOTIF possède deux grandes classes de Widgets: Primitive et Manager.
Plusieurs choses à savoir :
Exemple d'ArrowButtons :
Quatre ArrowButtons et un PushButton (au milieu)
Voici des exemples de PushButton :
Voici un exemple de DrawnButton :
Voici un exemple de CascadeButtons :
On peut regrouper les ToggleButtons en "groupes". La première configuration, appelée RadioBox, seul un bouton d'un même groupe peut être "on" à la fois. La seconde, appelée CheckBox, autorise plusieurs ToggleButtons à être activés simultanément. C'est la configuration par défaut. On distingue les CheckBox des RadioBox grace à la forme de l'indicateur des boutons : carré pour les CheckBox, en forme de diamant pour les RadioBox.
Voici des exemples de ToggleButtons :
ToggleButtons regroupés en CheckBox
ToggleButtons regroupés en RadioBox
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 :
Exemples de frames
Remarque : MOTIF ne fournit aucune fonction de dessin. Il faudra faire appel à des fonctions de la Xlib.
Des callbacks sont disponibles pour gérer les événements de type entrée clavier ou click souris, Expose, Resize.
Attention : avec une DrawingArea, par défaut on ne peut pas traiter les déplacements de la souris.
Voici un exemple de DrawingArea :
Attention, ce Widget est utilisé par Motif de manière sous-entendue : les widgets de type MenuBar, PulldownMenu, CheckBox et RadioBox sont des RowColumns!!!
Exemple de MessageDialog (un MessageBox dans une fenêtre indépendante manipulable par lw Window Manager0
Exemple de FileSelectionDialog (un FileSelectionBox dans une fenêtre indépendante)
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.
Motif permet de manipuler trois sortes de menus.
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 :
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 choix 1 choix 2 choix 3 . Cliquez dessus, vous verrez-bien!
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 :
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ê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...
On distingue sept sous-classes de MessageDialog, chacune étant différenciée de l'autre par une icône correspondant au type d'interaction demandée (point d'interrogation pour un QuestionDialog, etc...)