Le packageorg.eclipse.core.runtime.preferences propose une infrastructure de stockage des préférences du plug-in. Les préférences mettent généralement en correspondance les paramètres contrôlés par l'utilisation dans la page Préférences, même si cela n'est pas requis par l'infrastructure sous-jacente. Les préférences de plug-in sont des paires clé/valeur, dans lesquelles la clé décrit le nom de la préférence et la valeur correspond à l'un des différents types possibles (booléen, double, flottant, entier, long ou chaîne). Les préférences peuvent être stockées et extraites par la plate-forme à partir du système de fichiers. L'emplacement exact des préférences sauvegardées dépend de la portée de la préférence.
Vous pouvez envisager la mémoire générale des préférences comme une hiérarchie de noeuds, dans laquelle chaque branche principale de la hiérarchie représente une portée en particulier. Les enfants d'un noeud déterminé dépendent de la manière dont est définie cette portée. Pour les portées de l'instance et de la configuration, les noeuds enfants sont les préférences d'un plug-in en particulier selon les indications d'un qualificateur de préférences, généralement l'ID du plug-in.
Si cela vous paraît confus, ne vous inquiétez pas. Si les portées et les noeuds ne vous intéressent pas, il n'est pas nécessaire de vous soucier d'une portée en particulier ou de noeud de l'arborescence qui contient la valeur de préférence. L'API de préférence place automatiquement les noeuds dans l'ordre adéquat (instance, configuration, par défaut) lorsque vous interrogez une valeur de préférence et que vous utilisez le qualificateur et le nom de préférence fournis pour rechercher le noeud qui contient réellement la valeur.
Les préférences sont accessibles à l'aide du protocole IPreferencesService. Le service de préférences par défaut de la plate-forme est accessible à l'aide de la classe Platform.
... IPreferencesService service = Platform.getPreferencesService(); ...
Une fois que le service de préférences est obtenu, les valeurs de préférence peuvent être interrogées par le nom à l'aide d'une des méthodes get... mises à disposition dans IPreferencesService. Par exemple, le fragment de code ci-dessous interroge la valeur de la préférence "MyPreference" dans le plug-in "com.example.myplugin".
... IPreferencesService service = Platform.getPreferencesService(); boolean value = service.getBoolean("com.example.myplugin", "MyPreference", true, null); // pour effectuer une opération avec cette valeur. ...
Le dernier paramètre de la méthode d'interrogation est un tableau de contextes de portée à utiliser lorsque vous recherchez le noeud de préférences. Si le tableau prend la valeur null, la plate-forme considère que l'ordre de recherche de la portée par défaut doit être suivi et détecte le noeud de préférences approprié. Si un tableau de contextes de portée est transmis, celui-ci détermine l'ordre de consultation de la portée à utiliser pour trouver le noeud de préférences. L'ordre de consultation de la portée par défaut est toujours examiné si aucun noeud n'est trouvé à l'aide des portées spécifiées.
Si un plug-in doit disposer d'un contrôle plus étroit de l'ordre de recherche de portée, les classes qui représentent les portées peuvent être utilisées pour accéder au noeud réel qui représente la préférence dans une portée particulière. Ainsi, il est possible de créer un tableau de noeuds qui spécifie l'ordre de recherche particulier requis. Le fragment de code ci-dessous recherche le service de préférences pour la préférence utilisée ci-dessus, mais recherche la portée de configuration puis la portée de l'instance du plug-in. Lorsque les noeuds sont spécifiés pour l'ordre de recherche, la portée par défaut n'est pas prise en compte. En d'autres termes, la plate-forme ne recherche que les noeuds exacts qui ont été indiqué.
... IPreferencesService service = Platform.getPreferencesService(); Preferences configurationNode = new ConfigurationScope().getNode("com.example.myplugin"); Preferences instanceNode = new InstanceScope().getNode("com.example.myplugin"); Preferences[] nodes = new Preferences[] {configurationNode, instanceNode}; stringValue = service.get("MyPreference", "true", nodes); // pour effectuer une opération avec cette valeur. ...
Un plug-in peut également implémenter son propre balayage par le biais des noeuds de l'arborescence de préférences. Le noeud principal de l'arborescence de préférences peut être obtenu à partir du service de préférences. Il est possible d'utiliser des classes de portée pour balayer l'arborescence. La fragment de code ci-dessous effectue un balayage jusqu'à atteindre un noeud spécifique et extrait la valeur de préférence dans le noeud lui-même.
... IPreferencesService service = Platform.getPreferencesService(); Preferences root = service.getRootNode(); Preferences myInstanceNode = root.node(InstanceScope.SCOPE).node("com.example.myplugin"); if (myInstanceNode != null) { value = node.getBoolean("MyPreference", "true"); // pour effectuer une opération avec cette valeur. } ...
Les plug-ins peuvent définir leurs propres portées spécialisées à l'aide de l'extension org.eclipse.core.runtime.preferences. Dans cette extension, le plug-in définit le nom de la nouvelle portée, ainsi qu'une classe qui peut créer des noeuds de préférence pour la nouvelle portée. Il peut définir, de manière facultative, le nom d'une classe qui initialise les valeurs de préférence par défaut de cette portée. Lorsqu'un plug-in définit une nouvelle portée, il revient à ce plug-in d'implémenter l'ordre de balayage pour une nouvelle portée par rapport à l'ordre de balayage de la plate-forme. Nous examinerons cette fonction plus en détail à l'aide de l'exemple spécifique de Préférences de portée de projet.