Erstellen einer Preferences-Seite

Aus Eclipse
Wechseln zu: Navigation, Suche


Problem

Ein Plugin ist parametriesierbar und die Parameter sollen unabhängig von der konkreten Verwendung des Plugins und über Sitzungen hinweg persistent eingestellt werden können.

Lösung

PropertyPages können für viele Elemente definiert werden, z.B. ist zwischen workbench-weiten und projektweiten Einstellungen zu unterscheiden. Properties werden von Eclispe selbst ein einem eigenen Speicherbereich verwaltet und über einen eindeutigen Bezeichner referenziert. Über diesen Bezeichner kann auf alle Properties (auch die eines anderen Plug-Ins oder einer anderen Ebene (workbench-weit vs. projektweit) zugegriffen werden. Siehe auch Property-Page aus der Abschlußarbeit von Markus Bach.

Definiert wird eine PropertyPage, indem der ExtensionPoint org.eclipse.ui.propertyPages erweitert wird. Der Eintrag in der Datei plugin.xml hat folgenden Aufbau:

1: <extension point="org.eclipse.ui.propertyPages">
2:     <page class="org.intoJ.project.ui.SamplePropertyPage"
3:           id="samplePropertyPage"
4:           name="Beispiel PropertyPage"
5:           objectClass="org.eclipse.core.resources.IProject"/>
6:           adaptable="true"
7: </extension>

Listing: Extension für PropertyPage

Die Extension kann mehrere PropertyPages definieren. Jede PropertyPage wird von einem separaten Element page angelegt. Das Element page kennt folgende Attribute:

  • class: Der vollqualifizierte Name der Klasse, welche die PropertyPage implementiert
  • id: Eindeutige Bezeichnung für die PorpertyPage, über den die Page referenziert wird
  • name: Lesbarer Name der PropertyPage, der in den Dialogen über die die Property Page aufgerufen werden kann sichtbar ist. Der Name kann auch lokalisiert werden.
  • objectClass: Vollqualifizierter Name der Klasse für welche die PropertyPage registriert wird. Verwendet man hier den Typ IProject gilt die PropertyPage projektweit, soll die PropertyPage workbench-weit verwendet werden, muss der Typ IWorkbench eingetragen werden.
  • adaptable: Das Flag steuert, ob die PropertyPage für Subtypen von IResource aufgerufen werden soll. Hier ist es true, da IProject Subtyp von IResource ist, aber IProject verwendet wurde anstatt des algemeineren Typs.

Die Implementierung der PropertyPage erfolgt in einer Klasse, welche die Klasse org.eclipse.ui.dialogs.PropertyPage erweitert. Dabei muss die Klasse zwingend die Methode createContents implementieren, die von der Workbench aufgerufen wird, wenn die PropertyPage betreten wird. Darüber hinaus muss auch eine Methode performOk implementiert werden, die aufgerufen wird, wenn der OK-Button auf der PropertyPage gedrückt wird:

1: public class SamplePropertyPage extends PropertyPage {
2:     public static final QualifiedName PROPERTY_KEY = new QualifiedName ("org.intoJ.project", "selectionProperty");
3:
4:     public SamplePropertyPage() {
5:         super();		
6:     }
7:
8:     protected Control createContents(Composite parent) {
9:         noDefaultAndApplyButton();
10:        Composite composite = new Composite(parent, SWT.NONE);
11:        GridLayout layout = new GridLayout();
12:        composite.setLayout(layout);
13:        GridData data = new GridData(GridData.FILL);
14:        data.grabExcessHorizontalSpace = true;
15:        composite.setLayoutData(data);
16:
17:        ...
18:    }
19:
20:    public boolean performOk() {
21:        ...
22:    }
23:
24:    private void setPersitentSelection (String name) throws CoreException {
25:        IResource resource = (IResource) getElement().getAdapter(IResource.class);
26:        resource.setPersistentProperty(PROPERTY_KEY, name);
27:	}
28:
29:    public static String getPersitentSelection (IProject project) throws CoreException {
30:        IResource resource = (IResource) project.getAdapter(IResource.class);
31:        String name = resource.getPersistentProperty(PROPERTY_KEY);
32:	
33:        return name;
34:	}
35: }

Listing: Implementierung einer PropertyPage

In der Methode createContents können alle Elemente aus SWT verwendet werden, um die Seite aufzubauen. Die Aufgabe der Methode performOk ist es, die Einstellungen die auf der PropertyPage gemacht wurden zu persistieren oder ggf. Aktionen auszulösen. Die Methoden setPersistentSelection und getPersistentSelection demonstrieren wie Werte abgespeichert werden können. Eclipse reserviert für diese Daten einen eigenen Speicherbereich und stellt entsprechende Methoden bereit, so dass man sich über die eigentliche Speicherung keine Gedanken zu machen braucht. Referenziert werden die Werte über einen eindeutigen Bezeichner, der als QualifiedName definiert werden muss.

Vorkommen

siehe auch

Aktivieren und deaktivieren von Plugins