# PreferenceStore und unterschiedliche Plugins



## stefan. (25. Mai 2010)

Hallo,

Ich verwalte meine Konfiguration mit dem Eclipse PreferenceStore. 


```
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 
	
	
	
	





```
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 ???


----------



## Wildcard (25. Mai 2010)

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.

```
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.


----------



## stefan. (25. Mai 2010)

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 
	
	
	
	





```
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.


----------



## Wildcard (25. Mai 2010)

> 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.


----------



## stefan. (26. Mai 2010)

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


----------

