Pourquoi toujours vouloir utiliser un afficheur lorsque vous savez que les contributions de l'interface utilisateur du plan de travail, les vues, les éditeurs, les assistants et les dialogues par exemple, peuvent être implémentées directement avec les widgets SWT ?
Les afficheurs permettent de créer des widgets tout en utilisant les objets modèles. Si vous utilisez directement un widget SWT, vous devez convertir vos objets dans les chaînes et les images attendues par SWT. Les afficheurs agissent comme des adaptateurs sur les widgets SWT, traitant le code commun pour le traitement des événements de widget que vous devriez sinon implémenter vous-même.
Nous avons vu un afficheur dans la contribution de la vue de l'outil readme, dans ReadmeSectionsView.
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... }
Remarque : Les afficheurs peuvent être utilisés pour fournir l'implémentation des vues et des éditeurs du plan de travail. Le terme "afficheur" n'implique pas qu'ils sont utiles uniquement pour l'implémentation des vues. Par exemple, TextViewer est utilisé dans l'implémentation de nombreux éditeurs du plug-in et du plan de travail.
JFace fournit des afficheurs pour la plupart des widgets compliqués dans SWT. Les afficheurs sont plus couramment utilisés pour les widgets de liste, d'arborescence, de tableau et de texte.
Un widget SWT est associé à chaque afficheur. Ce widget peut être créé de manière implicite en fournissant le composite parent dans un constructeur d'afficheur d'accompagnement ou de manière explicite en le créant d'abord, puis en le fournissant à l'afficheur dans son constructeur.
Les listes, les arborescences et les tableaux partagent des capacités communes du point de vue de l'utilisateur, remplissage avec des objets, sélection, tri et filtrage.
Ces afficheurs conservent une liste des objets du domaine (appelés éléments) et les affichent dans leur widget SWT correspondant. Un afficheur de liste sait comment obtenir un libellé de texte à partir d'un élément de la liste. Il obtient le libellé d'une classe ILabelProvider qui peut être définie sur l'afficheur. Les afficheurs de liste savent comment mapper les rappels à partir du widget dans le monde des éléments connus par le client de l'afficheur.
Les clients qui utilisent un widget SWT doivent opérer au niveau SWT, où les éléments sont des chaînes et les événements font souvent référence à un index dans la liste des chaînes. Les afficheurs fournissent une sémantique de niveau supérieur. Les clients sont notifiés des sélections et des modifications de la liste à l'aide des éléments qu'ils ont fournis à l'afficheur. Ce dernier traite tout le travail nécessaire pour remapper les index sur les éléments, ajustant une vue filtrée des objets et les triant à nouveau si nécessaire.
La capacité de filtrage et de tri est traitée en désignant un trieur de vues (ViewerSorter) et/ou un filtreur de vues (ViewerFilter) pour l'afficheur. (Ils peuvent être spécifiés pour les afficheurs d'arborescence et de tableau en plus des afficheurs de liste.) Le client doit fournir uniquement une classe qui puisse comparer ou filtrer les objets dans la liste. L'afficheur traite les détails de remplissage de la liste en fonction de l'ordre et du filtre spécifiés, tout en gérant l'ordre et le filtre à mesure que des éléments sont ajoutés et supprimés.
Les afficheurs ne sont pas destinés à être étendus par les clients. Pour personnaliser un afficheur, vous devez le configurer avec vos propres fournisseurs de contenu et de libellé.
ListViewer mappe les éléments d'une liste sur une commande SWT List.
TreeViewer affiche les objets hiérarchiques dans un widget SWT Tree. Il traite les détails pour le développement et la réduction des éléments. Il existe plusieurs sortes d'afficheurs d'arborescence pour différentes commandes d'arborescence SWT (arborescence, arborescence de tableaux, arborescence de cases à cocher).
TableViewer est très similaire à un afficheur de liste, mais ajoute la possibilité d'afficher plusieurs colonnes d'informations pour chaque élément du tableau. Les afficheurs de tableau étendent de manière importante la fonction de tableau SWT en introduisant le concept d'édition d'une cellule. Des éditeurs de cellule spécifiques peuvent être utilisés pour permettre à l'utilisateur d'éditer une cellule de tableau à l'aide d'un widget de boîte de dialogue mixte, de boîte de dialogue ou de texte. L'afficheur de table traite la création et le placement de ces widgets à la demande pour l'édition par l'utilisateur. Ceci est réalisé à l'aide des classes CellEditor, telles que TextCellEditor et CheckboxCellEditor.
Les widgets de texte ont une sémantique commune, par exemple le comportement du double clic, l'annulation et la navigation par index ou par ligne. Un TextViewer est un adaptateur pour un widget SWT StyledText. Les afficheurs de texte fournissent un modèle de document au client et gèrent la conversion du document en informations de texte stylisé fournies par le widget de texte.
Les afficheurs de texte sont expliqués en détails à la section Editeurs du plan de travail.
Pour comprendre un afficheur, vous devez connaître les relations entre un élément d'entrée de l'afficheur, son contenu, sa sélection et les informations réellement déployées dans le widget qu'il manipule.
Un élément d'entrée est l'objet principal que l'afficheur présente (ou édite). Du point de vue de l'afficheur, il peut s'agir de n'importe quel objet. Il ne présume pas qu'une interface spécifique soit implémentée par l'élément en entrée. (Nous verrons pourquoi dans un moment lorsque nous aborderons les fournisseurs de contenu.)
Un afficheur doit être capable de traiter une modification de l'élément d'entrée. Si un nouvel élément d'entrée est défini dans un afficheur, il doit à nouveau remplir son widget en fonction du nouvel élément et le dissocier de l'élément d'entrée précédent. Les sémantiques pour l'enregistrement en tant qu'écouteur sur un élément d'entrée et le remplissage du widget en fonction de l'élément sont différentes pour chaque sorte d'afficheur.
Un afficheur de contenu est un afficheur ayant un protocole bien défini pour obtenir des informations de son élément d'entrée. Il utilise deux classes auxiliaires spécialisées, IContentProvider et ILabelProvider pour remplir son widget et afficher les informations relatives à l'éléments d'entrée.
IContentProvider fournit un protocole de cycle de vie de base pour associer un fournisseur de contenu à un élément d'entrée et traiter un changement d'élément d'entrée. Des fournisseurs de contenu plus spécialisé sont implémentés pour différentes sortes d'afficheurs. Le fournisseur de contenu le plus courant est IStructuredContentProvider qui peut fournir une liste des objets selon un élément d'entrée. Il est utilisé dans les afficheurs de type liste, tels que listes, tableaux ou arborescences. En règle générale, le fournisseur de contenu sait comment mapper entre l'élément d'entrée et le contenu de l'afficheur attendu.
ILabelProvider effectue une étape de plus. Selon le contenu d'un afficheur (dérivé de l'élément d'entrée et du fournisseur de contenu), il peut produire les éléments de l'interface utilisateur spécifiques, tels que les noms et les icônes, requis pour afficher le contenu dans l'afficheur. Les fournisseurs de libellé peuvent aider à économiser les ressources d'icône du fait qu'ils peuvent garantir que la même instance de l'icône est utilisée pour tous les types similaires dans un afficheur.
Remarque : Les instances de fournisseurs de contenu et de libellé spécifiques ne sont pas destinées à être partagées par plusieurs afficheurs. Même si tous vos afficheurs utilisent le même type de fournisseur de contenu ou de libellé, chaque afficheur doit être initialisé avec sa propre instance de classe de fournisseur. Le protocole de cycle de vie du fournisseur est conçu pour une relation bi-univoque entre un fournisseur et son afficheur.
Les éléments d'entrée, les fournisseurs de contenu et les fournisseurs de libellé permettent aux afficheurs de masquer la plupart des détails d'implémentation pour le remplissage des widgets. Les clients d'un afficheur ne doivent s'inquiéter que du remplissage de l'afficheur avec le bon type de fournisseur d'entrée et de contenu. Le fournisseur de libellé doit savoir comment extraire les informations de l'interface utilisateur du contenu de l'afficheur.
La flexibilité fournie par les afficheurs, les fournisseurs de contenu et les fournisseurs de libellé peut être mise en évidence en observant comment le plan de travail les utilise.
WorkbenchContentProvider est un fournisseur de contenu structuré qui obtient le contenu d'un élément d'entrée en demandant ses enfants. Le concept des adaptateurs est de nouveau utilisé pour implémenter une fonction générique. Lors de la demande de la liste des éléments de la part de son élément d'entrée, WorkbenchContentProvider reçoit un IWorkbenchAdapter comme élément d'entrée. Si un IWorkbenchAdapter a été enregistré pour l'élément d'entrée, le fournisseur de contenu peut alors assumer que l'élément peut être demandé pour ses enfants. WorkbenchContentProvider effectue également le travail nécessaire pour maintenir son afficheur à jour lorsque l'espace de travail change.
WorkbenchLabelProvider est un fournisseur de libellé qui obtient un IWorkbenchAdapter d'un objet afin de trouver son texte et son image. Le concept d'un fournisseur de libellé est particulièrement utile pour les objets du plan de travail car il permet à un seul fournisseur de libellé de mettre en cache les images couramment utilisées dans un afficheur. Par exemple, dès que WorkbenchLabelProvider obtient une image à utiliser pour un IProject, il peut la mettre en cache et l'utiliser pour tous les objets IProject illustrés dans l'afficheur.
En définissant un adaptateur commun, IWorkbenchAdapter, et en l'enregistrant pour de nombreux types de plateforme, ces types peuvent être représentés correctement dans un grand nombre d'afficheurs courants et dans les vues du plan de travail qui les contiennent.