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 :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
for
(
int
i =
0
, n =
table.getColumnCount
(
); i <
n; i++
) {
table.getColumn
(
i).setWidth
(
100
);
}
table.setHeaderVisible
(
true
);
table.setLinesVisible
(
true
);
Activator.getDefault
(
).getAttendeesManager
(
).addAttendeeListener
(
new
IAttendeeListener
(
) {
@Override
public
void
attendeeRemoved
(
IAttendee p) {
viewer.refresh
(
p);
}
@Override
public
void
attendeeAdded
(
IAttendee p) {
viewer.refresh
(
);
}
@Override
public
void
allAttendeeRemoved
(
) {
viewer.refresh
(
);
}
@Override
public
void
attendedUpdated
(
IAttendee p) {
viewer.refresh
(
p);
}
}
);
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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
this
.getSite
(
).getWorkbenchWindow
(
).getSelectionService
(
).addSelectionListener
(
"eclipse.labs.jugercp.attendees.listattendeesid"
, new
ISelectionListener
(
) {
@Override
public
void
selectionChanged
(
IWorkbenchPart part, ISelection selection) {
if
(
selection ==
null
) {
currentSelection =
null
;
return
;
}
if
(
selection instanceof
IStructuredSelection) {
IStructuredSelection structuredSelection =
(
IStructuredSelection)selection;
Object firstElement =
structuredSelection.getFirstElement
(
);
if
(
firstElement !=
null
) {
currentSelection =
(
IAttendee)firstElement;
attendeeNameValue.setText
(
currentSelection.getName
(
));
companyNameValue.setText
(
currentSelection.getCompany
(
));
}
}
}
}
);
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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public
class
AttendeeAdapterFactory implements
IAdapterFactory {
@SuppressWarnings
(
"rawtypes"
)
private
static
final
Class[] TYPES =
{
IPropertySource.class
}
;
@SuppressWarnings
({
"rawtypes"
}
)
public
Object getAdapter
(
Object adaptableObject, Class adapterType) {
if
(
adapterType ==
IPropertySource.class
) {
if
(
adaptableObject instanceof
IAttendee) {
return
new
AttendeePropertySourceAdapter
((
IAttendee) adaptableObject);
}
}
return
null
;
}
@SuppressWarnings
(
"rawtypes"
)
public
Class[] getAdapterList
(
) {
return
TYPES;
}
}
Editez le contenu de la classe AttendeePropertySourceAdapter puis recopiez l'extrait du code ci-dessous.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public
class
AttendeePropertySourceAdapter implements
IPropertySource {
private
IAttendee attendee;
public
AttendeePropertySourceAdapter
(
IAttendee attendee) {
this
.attendee =
attendee;
}
@Override
public
Object getEditableValue
(
) {
return
this
;
}
@Override
public
IPropertyDescriptor[] getPropertyDescriptors
(
) {
List<
PropertyDescriptor>
descriptors =
new
ArrayList<
PropertyDescriptor>(
);
PropertyDescriptor descriptorId =
new
PropertyDescriptor
(
"id"
, "Identifiant"
);
descriptorId.setAlwaysIncompatible
(
true
);
PropertyDescriptor descriptorName =
new
PropertyDescriptor
(
"name"
, "Nom"
);
descriptorName.setAlwaysIncompatible
(
true
);
PropertyDescriptor descriptorCompany =
new
PropertyDescriptor
(
"company"
, "Société"
);
descriptorCompany.setAlwaysIncompatible
(
true
);
descriptors.add
(
descriptorId);
descriptors.add
(
descriptorName);
descriptors.add
(
descriptorCompany);
return
descriptors.toArray
(
new
IPropertyDescriptor[0
]);
}
Créer la classe AttendeePropertySourceAdapter puis complétez là par l'extrait du code ci-dessous.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
@Override
public
Object getPropertyValue
(
Object id) {
if
(
id instanceof
String) {
String idString =
(
String) id;
if
(
idString.equals
(
"id"
)) {
return
this
.attendee.getId
(
);
}
else
if
(
idString.equals
(
"name"
)) {
return
this
.attendee.getName
(
);
}
else
if
(
idString.equals
(
"company"
)) {
return
this
.attendee.getCompany
(
);
}
else
{
return
"..."
;
}
}
else
{
return
null
;
}
}
@Override
public
boolean
isPropertySet
(
Object id) {
return
false
;
}
@Override
public
void
resetPropertyValue
(
Object id) {
}
@Override
public
void
setPropertyValue
(
Object id, Object value) {
}
}
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