RCP Preferences Editor erstellen

antimon

Mitglied
Hallo zusammen,

für meine RCP-Anwendung möchte ich gerne einen Einstellungseditor ähnlich der Seite von "about:config" beim Firefox erstellen.
Allerdings verwirren mich die schier unendlichen Möglichkeiten, auf Preference Stores zuzugreifen, deswegen wende ich mich hilfesuchend an Euch.

Mein Ziel ist es, nicht nach ConfigurationScope oder InstanceScope zu unterscheiden, sondern diese quasi übereinanderzulegen. Der Bearbeiter sieht dann in einer Spalte der Tabelle, aus welchem Scope die Einstellung kommt. Geordnet werden sollen alle Einstellungen nach dem Schlüssel, also z.B. "org.eclipse...", dann "org.pluginxyz..." usw.
Die Defaulteinstellungen würde ich gerne auch zu jedem Schlüssel hinterlegen, damit man sieht ob die Defaulteinstellung aktiv ist oder den Wert auf default zurücksetzen kann (eben wie bei Firefox ;) )

Wie sollte ich da am besten vorgehen? Über Platform.getPreferencesServices() ? Bzw. wo ist denn der "Ursprung" aller Preferences, der Root Node? ConfigurationScope beispielsweise beginnt doch bei "/configuration", oder?

Ich hoffe, Ihr könnt mir helfen, ein wenig Licht in den Dschungel zu bekommen! Danke im Voraus!
 
Hallo,

ich denke hiermit wirds etwas klarer:
http://www.vogella.de/articles/EclipsePreferences/article.html

Mein Ziel ist es, nicht nach ConfigurationScope oder InstanceScope zu unterscheiden, sondern diese quasi übereinanderzulegen.
Das kannst du beispielsweise so machen:
In deiner Tabelle zeigst du für jedes Konfigurierbare Property eine Zeile mit den Spalten
path, key, value, defaultValue an. Als versteckte Spalten kommt nun noch ein config kind qualifier (string) der angibt woraus der Value-Eintrag bezogen wurde (default/config/instance) und eventuell ein type (string) der den EditorTyp des Values bestimmt (könnte man auch aus dem typ des default Werts herleiten...). Damit kannst du dann default Einstellungen / gespeicherte Einstellungen / nicht gespeicherte aber aktive Einstellungen beispielsweise farblich oder durch unterschiedliche Fonts unterscheiden.

Zur Erzeugung der Einträge für die Tabelle brauchst du ja Auflistung aller relevanten Preferences, die bekommst du beispielsweise so:
Java:
try {

			final List<IEclipsePreferences> prefs = new ArrayList<IEclipsePreferences>();

			Platform.getPreferencesService().getRootNode().accept(
					new IPreferenceNodeVisitor() {
						@Override
						public boolean visit(IEclipsePreferences node)
								throws BackingStoreException {
							if (node.keys().length > 0) {
								prefs.add(node);
							}

							return true;
						}
					});

			System.out.println(prefs);
		} catch (Exception e) {
			e.printStackTrace();
		}


Gruß Tom
 
Hallo Tom,


leider war das nicht ausreichend - ich habe verschiedenste Quellen recherchiert, auch die vom Lars - aber so richtig verstanden habe ich das Ganze leider noch nicht. Aber jetzt bin ich auf einem guten Weg.

Die Auflistung der Preferences ist sehr elegant gelöst - das gefällt mir, da habe ich wieder was dazugelernt!

Ich würde ausgehend von obigem Ansatz wie folgt vorgehen, falls das Ganze eleganter geht würde ich mich über entsprechende Hinweise freuen.

Obiger Code macht ja prinzipiell aus dem zweidimensionalen Baum eine eindimensionale Liste - wobei in dieser Liste Schlüssel mehrmals vorkommen können - für Default, Configuration und Instance. Das heisst, ich müsste eine zusätzliche Liste erstellen, die als Modell für die Tabelle dient. In dieser Liste sind Objekte gespeichert, die neben dem Schlüssel und dem Wert zusätzliche Infos bereitstellen wie Default-Wert, Typ der Variablen etc. - wie du oben eben schon geschrieben hast.

Die Liste mit den Preferences würde ich durchrattern und schauen ob die Schlüssel im Tabellen-Modell vorhanden sind, entsprechende Default-Werte setzen bzw. aktuelle Werte ergänzen.

Ändert man in der Tabelle dann Werte, so wird geprüft, wo der Schlüssel hinkommen soll, ob er vielleicht noch nicht angelegt wurde (wenn nur ein Default-Wert vorhanden ist) und ändert die Daten entsprechend ab.

Das scheint mir jetzt der einfachste Weg zu sein, oder gibt es vielleicht noch einen einfacheren, ohne zusätzliche Liste oder eigene Objekte?
 
Zurück