Gérer les pages de préférences avec Eclipse 4
Les pages de préférences dans Eclipse 4
Si vous avez fait des pages de préférence avec Eclipse 3, vous avez du utiliser le point d’extension org.eclipse.ui.preferencePages qui permet de déclarer hiérarchiquement les pages et de les voir s’afficher dans le dialogue de préférence.
Avec Eclipse 4, ce point d’extension n’est plus disponible car il fait partie de org.eclipse.ui. et l’implémentation de IPreferenceStore que l’on utilise est également indisponible (la classe ScopedPreferenceStore est dans le package org.eclipse.ui.preferences).
On peut donc ‘ruser’, en mettant une dépendance sur org.eclipse.ui juste pour utiliser ces deux classes, sans utiliser le workbench Eclipse 3, mais ce n’est pas la solution idéale, car il faut encore initialiser le PreferenceManager (voir ci dessous). C’est toutefois cette solution que je proposais jusqu’à présent en attendant que cette fonctionnalité soit disponible dans E4. Le handler fournit relisait les extensions E3 pour afficher le dialogue.
J’ai quand même repris le problème en main, et j’ai développé un petit plugin pour résoudre tout ça, en attendant une implémentation définitive dans la plate forme.
Tout d’abord, il faut savoir que le dialogue (de base) de préférence est fourni par JFace (PreferenceDialog) et qu’il a besoin d’une instance de PreferenceManager pour s’initialiser.
Le plugin est disponible sur github à cet endroit et vous fournit donc les fonctionnalités suivantes :
- un point d’extension com.opcoach.e4.preferences.e4PreferencePages qui ressemble au point d’extension d’Eclipse 3 mais qui attend une classe qui étend FieldEditorPreferencePage
- un handler qui relit toutes ces extensions et qui affiche le dialogue de preferences
- une mise en relation automatique sur le PreferenceStore du plugin auquel appartient la page
- la recopie de la classe ScopedPreferenceStore venant du package E3 org.eclipse.ui.preferences
- un point d’extension com.opcoach.e4.preferences.e4PreferenceStoreProvider, pour gérer le preference store si la solution proposée par défaut ne vous convient pas
Cette solution vous permet d’écrire vos pages de préférences simplement. L’injection dans les champs est également appliquée (si vous en avez besoin) sur les pages que vous définissez.
Pour récupérer vos valeurs de préférence, vous pouvez toujours les injecter avec l’annotation @Preference.
Pour intégrer ce plugin dans votre développement E4, il faut :
- récupérer le plugin com.opcoach.e4.preferences à partir du github
- ajouter une dépendance de votre plugin sur com.opcoach.e4.preferences
- étendre le point d’extension com.opcoach.e4.preferences.e4PreferencePages pour ajouter vos pages
- ajouter la commande ‘org.eclipse.ui.window.preferences’ dans l’application model
- ajouter le handler E4PreferencesHandler et le relier à cette commande
- ajouter le HandledMenuItem pour faire afficher les préférences dans un menu ou toolbar
- éventuellement écrire une extension de com.opcoach.e4.preferences.e4PreferenceStoreProvider extension pour surcharger la gestion par défaut du PreferenceStore
Le projet d’example sur github montre comment l’utiliser. Je n’ai pas encore fait le processor qui ajoute automatiquement la commande dans votre modèle d’application..
Bien sur cette solution est temporaire et sera vraisemblablement remplacée par la gestion des dialogues dans l’application model, mais en attendant, cela permet d’avancer. Ecrire des pages de préférences avec JFace et l’injection devrait être disponible prochainement et donc le code écrit avec ce plugin devrait pouvoir être réutilisé totalement dans la future implémentation officielle.
N’hésitez pas à commenter ce post si vous avez des remarques.
Psyko
Merci pour le lien du bug.
Après un peu de recherche, l’annoation @Preference est liée à l’InstanceScope. J’utilise le ConfigurationScope… Il va falloir faire la gymnastique entre les deux.
OPCoach
Bonjour,
Oui l’annotation @Preference fonctionne toujours normalement avec ce plugin.
En ce qui concerne la prise en compte dans Eclipse 4 il y a des travaux de prévus pour la prochaine version concernant la gestion des dialogues et des wizards qui devraient être gérés hiérarchiquement dans l’application model. Ces travaux sont principalement décrits dans le bug 460826.
Olivier
Psyko
Bonjour,
Merci pour cette astuce. A priori, toujours rien du coté de e4 pour un support officiel… Avec votre solution, l’injection via le @Preference fonctionne-t-elle aussi lors de la mise à jour d’une des préférences ?
Je n’arrive pas à le reproduire de mon côté.
Merci,
OPCoach
Ce plugin est à ses débuts. Ce serait bien, sur le github, d’ajouter une issue sur le projet pour qu’on en discute.On peut tout à fait faire évoluer ce point en envisageant une API de PreferenceStoreProvider, par exemple, dans l’extension pour éventuellement en définir un autre… Je suis ouvert à toute évolution dans ce sens.
SwEB
Je noterai un petit bémol dans ce plugin après une utilisation un peu détournée de l’exemple où les préférences ne sont pas définies dans le plugin qui affiche la page de préférence.
Impossible de définir dans la page de préférence un autre PreferenceScope puisque celui-ci est écrasé par l’E4PreferenceRegistry (forcé au scope du plugin qui définit la page de préférence)
OPCoach
Merci pour ces encouragements.
Pour information, la gestion des dialogues dans l’application model semble partir dans tous les sens, et je pense que je vais tenter de proposer, la semaine prochaine, l’intégration de ce plugin dans la plateforme.
Sweb
Voilà un post (en français qui plus est) de très bonne facture ! Un vrai plaisir de trouver des moyens de commencer une application Eclipse4 tout en gardant la puissance de certaines features Eclipse3 mais avec le minimum d’interconnexion !
Merci pour cet excellent travail !