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.
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");
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.