Einstellungen für Eclipse-Plugins: PreferencePage

Eine Einstellungsseite mit Gruppierungen in Eclipse

Viele wichtige Sachen kann man bei der Plugin-Entwicklung für Eclipse einfach über Wizards machen, die anhand eines kleines Beispiels meist ausreichend zeigen, wie man sich einem Thema nähern kann. Leider basiert das Beispiel für Einstellungsseiten auf FieldEditorPreferencePage. Diese Klasse ist zwar recht einfach zu erweitern und erzeugt schnell eine Einstellungsseite mit einigen Feldern, dafür ist diese leider alles andere als flexibel. Einträge gruppieren? Einen Beschreibungsabsatz hinzufügen? Hier muss man doch eine Stufe höher gehen und stattdessen von PreferencePage erben.

Der Plugin-Extension-Wizard von Eclipse

Festlegen von Namen und zuständigen Klassen

Zunächst ändern wir folglich den Kopf der automatisch erzeugten Klasse:

public class SamplePreferencePage
	extends PreferencePage
	implements IWorkbenchPreferencePage {

In Zeile 2 wurde nun FieldEditorPreferencePage ersetzt. Nun wird die Methode createFieldEditors, welche Änderungen an der Einstellungsseite mittels addField zulässt, durch createContents ersetzt. Hierin können wir wie üblich im SWT-Kontext alle Einstellungen selber vornehmen – müssen es aber auch. Man muss also wie üblich mit einem Layout beginnen:

@Override
protected Control createContents(Composite parent) {
	Composite top = new Composite(parent , SWT.LEFT);
        top.setLayout(new GridLayout());
	top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        // ...
}

Gruppieren von Einstellungsfeldern

Hierin können wir nun wie üblich Widgets hinzufügen. Zunächst wollen wir aber Gruppen erzeugen, welche einzelne Felder umranden und mit einer Überschrift versehen.

Group personal = new Group(parent, SWT.NULL);
personal.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
personal.setText("Information about Yourself");
Eine Einstellungsseite mit Gruppierungen in Eclipse

Die Klasse Group erbt von Composite und kann daher als Elternelement der einzelnen Felder verwendet werden.

Einstellungsfelder hinzufügen

Nun können wir wieder auf die FieldEditor-Klassen des Eclipse-Beispiels zurückgreifen, um einfache Felder zu erzeugen, die direkt mit den Einstellungen verknüpft sind.

nameField =
   new StringFieldEditor(PreferenceConstants.USER_NAME, "Your name:", personal);
nameField.setEmptyStringAllowed(false);
nameField.setPreferenceStore(getPreferenceStore());
nameField.load();

Da wir die Feldeditoren noch an anderer Stelle brauchen, sind diese als Klassenattribute angelegt. In Zeile 1 sieht man, dass das Textfeld in die Gruppe personal eingehängt wird. Zeile 2 verbietet es, das Feld leer zu lassen (Eclipse gibt in diesem Fall eine Fehlermeldung aus). Zeilen 3 und 4 sind noch etwas Verwaltungsarbeit: Welcher Einstellungsspeicher für dieses Feld verantwortlich ist und das Laden der aktuellen Werte werden so realisiert.

Leider war es das noch nicht an Verwaltung, nicht umsonst haben wir nameField als Attribut angelegt:

protected void performDefaults() {
	nameField.loadDefault();
	super.performDefaults();
}

public boolean performOk() {
	nameField.store();
	return super.performOk();
}

Hier wird festgelegt, dass bei einem Klick auf die Standardwert-Schaltfläche der Einstellungsseite eben diese Werte auch wieder hergestellt werden. Nach einem Klick auf OK sollen die Änderungen gespeichert werden. Dies muss mit allen Feldern geschehen.