Tutoriel sur l'interaction entre plug-ins / Vues avec la plateforme Eclipse (Leçon 3)

Mickael BARON

Le but de cette troisième leçon est d'apprendre à communiquer entre des plug-ins et des vues.

Buts pédagogiques : Service OSGi, service de sélection et IAdaptable.

Codes sources : les codes sources et la solution de la leçon sont disponibles à l'adresse suivante : lesson3-ressources.zip.

Pour réagir à ce support de cours, un espace de dialogue vous est proposé sur le forum Commentez .

- Titre : Tutoriel sur l'interaction entre plug-ins / Vues avec la plateforme Eclipse (Leçon 3)

- Auteur : Mickael BARON

- Parution : 2 février 2010

- Mise à jour : 27 mai 2013

- Licence : Le contenu de cet article est rédigé par Mickael BARON et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Sommaire

- Exercice 1 : Interaction entre plug-ins

- But

- Description

- Etapes à suivre

- Exercice 2 : Interaction entre vues via le service de sélection

- But

- Description

- Etapes à suivre

- Exercice 3 : Interaction entre vues via le service de sélection et IAdaptable

- But

- Description

- Etapes à suivre

- Pour aller plus loin ...

Exercice 1 : Interaction entre plug-ins

But

- Réaliser une communication entre deux plug-ins en utilisant les mécanismes OSGi

- Ajouter une dépendance entre plug-ins

Description

Le plug-in eclipse.labs.jugercp.quizz requiert des informations stockées dans le plug-in eclipse.labs.jugercp.attendees comme le nombre de participants et le nom d'un participant pour un index donné.

Etapes à suivre

Si vous n'avez pas complètement terminé le développement des plug-ins eclipse.labs.jugercp.attendees et eclipse.labs.jugercp.quizz lors de la fin de la leçon 2, vous pouvez récupérer les codes complets dans le répertoire ressources\lesson 2 - Perspectives\solution.

Ajoutez une dépendance du plug-in eclipse.labs.jugercp.attendees dans le plug-in eclipse.labs.jugercp.quizz. Editez le fichier MANIFEST.MF du plug-in eclipse.labs.juercp.quizz via l'outil PDE et sélectionnez l'onglet Dependencies.

Ajoutez via le bouton " Add … " le plug-in eclipse.labs.jugercp.attendees (s'il n'est pas visible, vérifiez que le plug-in est présent dans la liste des projets et que son projet est en ouverture).

Si tout s'est correctement déroulé, vous devriez voir afficher le nom du plug-in eclipse.labs.jugercp.attendees dans la liste des dépendances.

Tous les services proposés par le plug-in eclipse.labs.jugercp.attendees sont désormais accessibles par le plug-in eclipse.labs.jugercp.quizz.

La classe QuizzViewPart a été complétée de telle sorte à récupérer le nombre de participants et à afficher le nom du participant qui a gagné. Recopiez la nouvelle version de la classe QuizzViewPart située dans le répertoire " ressources\lesson 3 - Interaction Vue\exercice1-4 " en respectant le chemin défini par le package.

Exécutez la configuration d'exécution pour tester le nouveau résultat attendu. Vous devriez voir afficher un résultat similaire à la capture d'écran ci-dessous.

Exercice 2 : Interaction entre vues via le service de sélection

But

- Utilisation du service de sélection pour la communication entre deux vues

Description

Lorsqu'un élément de la vue Liste Participants est sélectionné, les informations sont affichées dans la vue Edition Participant. De cette manière, un participant peut être édité. Cet exercice exploite le service de sélection pour notifier la vue Edition Participant.

Etapes à suivre

Editez la classe AttendeesViewPart de manière à associer le composant TableViewer au service de sélection. Ce composant TableViewer est en fait un fournisseur de sélection (appelé Provider). Pour diffuser la sélection vers le service de sélection vous devez le connecter au niveau de la méthode createPartControl(…) de la façon suivante :

1. for (int i = 0, n = table.getColumnCount(); i < n; i++) {

2. table.getColumn(i).setWidth(100);

3. }

5. table.setHeaderVisible(true);

6. table.setLinesVisible(true);

8. Activator.getDefault().getAttendeesManager().addAttendeeListener(new IAttendeeListener() {

9. @Override

10. public void attendeeRemoved(IAttendee p) {

11. viewer.refresh(p);

12. }

14. @Override

15. public void attendeeAdded(IAttendee p) {

16. viewer.refresh();

17. }

19. @Override

20. public void allAttendeeRemoved() {

21. viewer.refresh();

22. }

24. @Override

25. public void attendedUpdated(IAttendee p) {

26. viewer.refresh(p);

27. }

28. });

30. this.getSite().setSelectionProvider(viewer);

A chaque modification de la sélection du composant TableViewer de la vue Liste Participants, le service de sélection est notifié des changements. Il vous est demandé dans les prochaines étapes de modifier la vue Edition Participant pour faire apparaître le participant sélectionné.

Modifiez la classe AttendeeViewPart de manière à ajouter un écouteur sur les sélections qui proviennent de la vue Edition Participant. L'accès au service de sélection est obtenu comme ceci : this.getSite().getWorkbenchWindow().getSelectionService(). Complétez le code de la classe comme indiqué ci-dessous.

1. this.getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(

2. "eclipse.labs.jugercp.attendees.listattendeesid", new ISelectionListener() {

4. @Override

5. public void selectionChanged(IWorkbenchPart part, ISelection selection) {

6. if (selection == null) {

7. currentSelection = null;

8. return;

9. }

10. if (selection instanceof IStructuredSelection) {

11. IStructuredSelection structuredSelection = (IStructuredSelection)selection;

12. Object firstElement = structuredSelection.getFirstElement();

13. if (firstElement != null) {

14. currentSelection = (IAttendee)firstElement;

15. attendeeNameValue.setText(currentSelection.getName());

16. companyNameValue.setText(currentSelection.getCompany());

18. }

19. }

20. }

21. });

Ajoutez par ailleurs un attribut currentSelection à cette classe qui est de type IAttendee. Cela permettra de stocker la sélection courante.

Complétez le traitement du bouton "Mise à jour" qui permet de mettre à jour le contenu de la sélection en cours. Saisissez le code proposé ci-dessous.

Exécutez la configuration d'exécution pour tester le nouveau résultat attendu. Créez deux participants puis sélectionnez en un participant à partir de la vue Liste Participants.

Exercice 3 : Interaction entre vues via le service de sélection et IAdaptable

But

- Utilisation du service de sélection

- Manipulation de l'interface IAdaptable

- Ré-utilisation des fonctionnalités proposées par la vue Properties

Description

Lorsqu'un élément de la vue Liste Participants est sélectionné, son contenu est également affiché dans la vue Properties. Cet exercice montre comment adapter un objet de type IAttendee en un objet compréhensible par la vue Properties en utilisant le mécanisme d'extension.

Etapes à suivre

Editez le fichier plugin.xml en utilisant l'outil PDE et sélectionnez l'onglet Extensions.

Créez une nouvelle extension à partir du point d'extension org.eclipse.core.runtime.adapters.

Un sous élément factory est créé implicitement à partir de l'élément org.eclipse.core.runtime.adapters, veuillez saisir les valeurs pour les attributs adaptableType et class comme indiqué sur la figure ci-dessous :

Une classe doit être normalement créée : AttendeeAdapterFactory.

Veuillez également construire un sous élément adapter à partir de l'élément factory, veuillez saisir les valeurs pour l'attribut type comme indiqué sur la figure ci-dessous :

Editez le contenu de la classe AttendeeAdapterFactory puis recopiez le code ci-dessous.

La classe IPropertySource est disponible dans le plugin org.eclipse.ui.views. Veuillez l'ajouter dans les dépendances.

1. public class AttendeeAdapterFactory implements IAdapterFactory {

3. @SuppressWarnings("rawtypes")

4. private static final Class[] TYPES = { IPropertySource.class };

6. @SuppressWarnings({ "rawtypes" })

7. public Object getAdapter(Object adaptableObject, Class adapterType) {

8. if (adapterType == IPropertySource.class) {

9. if (adaptableObject instanceof IAttendee) {

10. return new AttendeePropertySourceAdapter((IAttendee) adaptableObject);

11. }

12. }

14. return null;

15. }

17. @SuppressWarnings("rawtypes")

18. public Class[] getAdapterList() {

19. return TYPES;

20. }

21. }

Editez le contenu de la classe AttendeePropertySourceAdapter puis recopiez l'extrait du code ci-dessous.

1. public class AttendeePropertySourceAdapter implements IPropertySource {

3. private IAttendee attendee;

5. public AttendeePropertySourceAdapter(IAttendee attendee) {

6. this.attendee = attendee;

7. }

9. @Override

10. public Object getEditableValue() {

11. return this;

12. }

14. @Override

15. public IPropertyDescriptor[] getPropertyDescriptors() {

16. List<PropertyDescriptor> descriptors = new ArrayList<PropertyDescriptor>();

18. PropertyDescriptor descriptorId = new PropertyDescriptor("id", "Identifiant");

19. descriptorId.setAlwaysIncompatible(true);

20. PropertyDescriptor descriptorName = new PropertyDescriptor("name", "Nom");

21. descriptorName.setAlwaysIncompatible(true);

22. PropertyDescriptor descriptorCompany = new PropertyDescriptor("company", "Société");

23. descriptorCompany.setAlwaysIncompatible(true);

24. descriptors.add(descriptorId);

25. descriptors.add(descriptorName);

26. descriptors.add(descriptorCompany);

28. return descriptors.toArray(new IPropertyDescriptor[0]);

29. }

Créer la classe AttendeePropertySourceAdapter puis complétez là par l'extrait du code ci-dessous.

1. @Override

2. public Object getPropertyValue(Object id) {

3. if (id instanceof String) {

4. String idString = (String) id;

6. if (idString.equals("id")) {

7. return this.attendee.getId();

8. } else if (idString.equals("name")) {

9. return this.attendee.getName();

10. } else if (idString.equals("company")) {

11. return this.attendee.getCompany();

12. } else {

13. return "...";

14. }

15. } else {

16. return null;

17. }

18. }

20. @Override

21. public boolean isPropertySet(Object id) {

22. return false;

23. }

24. @Override

25. public void resetPropertyValue(Object id) {

26. }

27. @Override

28. public void setPropertyValue(Object id, Object value) {

29. }

30. }

Exécutez de nouveau la configuration d'exécution et vérifiez que le contenu d'un élément sélectionné dans la vue Liste Participants est affiché dans la vue Properties.

Pour aller plus loin ...

- https://mbaron.developpez.com/eclipse/views/ : support de cours relatif à la construction de vues