PreferenceStore und unterschiedliche Plugins

stefan.

Mitglied
Hallo,

Ich verwalte meine Konfiguration mit dem Eclipse PreferenceStore.

Java:
public class MyPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {

public FixPreferencePage() {
		super(GRID);
		setPreferenceStore(Activator.getDefault().getPreferenceStore());
		setDescription("My preference page");
	}
	
	/**
	 * Creates the field editors. Field editors are abstractions of
	 * the common GUI blocks needed to manipulate various types
	 * of preferences. Each field editor knows how to save and
	 * restore itself.
	 */
	public void createFieldEditors() {
		addField(new StringFieldEditor(PreferenceConstants.P_DICTIONARYDIR, 
				"&Dictionary Directory:", getFieldEditorParent()));
		
		//FileFieldEditor
		addField(new StringFieldEditor(PreferenceConstants.P_FILENAME, 
				"&Filename:", getFieldEditorParent()));
		
	}
}

Mittels
Java:
Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.P_DICTIONARYDIR)
kann ich diese dann einfach wieder auslesen.
Leider funktioniert das nur innerhalb des Plugins, wo die Konfiguration definiert ist. Sobald ich die Konfig aus einem anderen Plugin versuche auszulesen kommt nur ein leerer String zurück. Ich muss doch aber auf die Konfiguration auch von anderen Plugins lesen können oder etwa nicht ???
 
Letztlich geht das zurück auf den Preferences Service der 3 unterschiedliche Scopes hat:
Installation - global pro Eclipse installation
Instance - pro Workspace
Project - pro Projekt

Die Preferences sind keine einfache Hashmap, sondern eine Baumstruktur.
Code:
Activator.getDefault().getPreferenceStore()
delegiert intern an den Instance Scope. Aus diesem Scope wird dann eine Preference Node mit dem Namen der plugin ID herausgegriffen und alle Settings werden unter diesem Knoten gespeichert. Die Settings des Plugins werden also durch die Plugin ID qualifiziert.
Wenn du auf die Preferences eines anderen Plugins zugreifen willst dann kannst du das tun indem du:
1) Code aus dem anderen Plugin aufrufst der die Werte zurückliefert
2) Dir den Instance vom Preferences Service besorgst, die Node mit Namen [pluginID] selektierst und dann den Wert abholst.
 
und jedes Plugin besitzt einen separaten Workspace?

1) Code aus dem anderen Plugin aufrufst der die Werte zurückliefert
Würde gehen aber wäre Designtechnisch eher ne Notlösung ... !?

2) Dir den Instance vom Preferences Service besorgst, die Node mit Namen [pluginID] selektierst und dann den Wert abholst.

Wie bekomme ich den Instance vom Preference Service?

Mit
Java:
Preferences preferences = new ConfigurationScope().getNode("PLUGIN_ID");
        Preferences sub1 = preferences.node("PLUGIN_ID");

        System.out.println("DICTIONARYDIR: "+sub1.get(PreferenceConstants.P_DICTIONARYDIR, "not found"));
hatte ich leider keinen Erfolg.
 
Zuletzt bearbeitet:
und jedes Plugin besitzt einen separaten Workspace?
Nein, es gibt immer nur einen Workspace (dort liegen deine Projekte).
Preferences preferences = new ConfigurationScope().getNode("PLUGIN_ID");
PLUGIN_ID war nicht wörtlich gemeint. Du musst das durch die konkrete Plugin ID ersetzen. Ausserdem ist es nicht der Configuration Scope, sondern der Instance Scope.
Der Configuration Scope ist global für die gesamte Eclipse Installation, der Instance Scope pro Workspace.
 
Statt PLUGIN_ID hatte ich schon die richtige ID eingesetzt 😉 Nach langem Probieren habe ich jetzt auch herraus gefunden, dass ich die Konfig nur auslesen kann, wenn vorher der Wert über den Konfig Dialog neu gesetzt wurde. (Obwohl ich Standard Werte angegeben habe).

Also Danke nochmal Wildcard 😉
 

Zurück
Oben