Training „git“
07.10.2010 - 08.10.2010, Essen
Training „Eclipse RCP“
28.03.2011 - 01.04.2011, Dortmund
Eclipse RCP

Einstellungen und Konfiguration

Ordner zur Ablage von Anwendungskonfiguration

Eclipse-Anwendungen haben zwei Ordner, in denen Dateien zur Laufzeit gespeichert werden:

Zustand der Workbench speichern

Die Eclipse Workbench bietet die Möglichkeit, den Zustand der Workbench automatisch zu speichern. Dabei werden z.B. die Größe des Workbench-Fensters, das Layout aller geöffneten Perspektiven sowie die zuletzt aktive Perspektive gespeichert und beim nächsten Start wiederhergestellt. Um dieses Feature zu aktivieren, ergänzen Sie den WorkbenchAdvisor der Anwendung um die Konfigurationsoption saveAndRestore:

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {

    public void initialize(IWorkbenchConfigurer config) {
        config.setSaveAndRestore(true);
    }

}

Diese Zustandsinformationen werden in sogenannten Memento-Objekten abgelegt. Ein Memento repräsentiert den Zustand eines Objektes in einer persistierbaren Hierarchie von Key-Value-Paaren. Dieses Memento kann um weitere Informationen ergänzen werden, indem die Methoden saveState und restoreState der WorkbenchAdvisor bzw. WorkbenchWindowAdvisor-Klasse implementiert werden. Zum Beispiel:

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {

    @Override
    public void initialize(IWorkbenchConfigurer configurer) {
        configurer.setSaveAndRestore(true);
    }

    @Override
    public IStatus saveState(IMemento memento) {
        memento.createChild("myApp").putString(
            "lastOpenedDate", DateFormat.getDateTimeInstance().format(new Date()));
        return super.saveState(memento);
    }

    @Override
    public IStatus restoreState(IMemento memento) {
        if (memento != null) {
            IMemento myAppMemento = memento.getChild("myApp");
            if (myAppMemento != null)
                System.out.println("Last opened on: " +
                    myAppMemento.getString("lastOpenedDate"));
        }
        return super.restoreState(memento);
    }
}

Die Memento-Objekte werden im Anwendungs-Workspace unter .metadata/.plugins/org.eclipse.ui.workbench persistiert.

Nach der Aktivierung von saveAndRestore gilt es zu beachten, dass das Layout einer Perspektive gespeichert wird, sobald diese einmal geöffnet wurde. Änderungen an der PerspectiveFactory bzw. Contributions über perspectiveExtensions wirken daher erst nach einem Zurücksetzen der Perspektive. Dies kann direkt in der Anwendung mit dem Command “Perspektive zurücksetzen” (org.eclipse.ui.window.resetPerspective) oder über ein Zurücksetzen des gesamten Workspace in der Startkonfiguration geschehen.

Zustand von Views persistieren

Wird der saveAndRestore-Mechanismus der Workbench aktiviert, können auch Views durch Überschreiben der Methoden saveState und init Einstellungen in einem Memento-Objekt ablegen:

public class SomeViewPart extends ViewPart {

    @Override
    public void saveState(IMemento memento) {
        memento.putString("someViewState", "42");
    }

    @Override
    public void init(IViewSite site, IMemento memento) throws PartInitException {
        super.init(site, memento);
        if (memento != null) {
            System.out.println("State is: " + child.getString("someViewState"));
        }
    }

}

Eigene Dateien je Plug-in ablegen

Zur Ablage von eigenen Dateien in einem Plug-in kann über den Activator ein State-Ordner erreicht werden. Dieser bietet sich insbesondere an, wenn ein Plug-in seinen Zustand in einem eigenen Datenformat persistieren möchte. Die Daten werden im workspace unter .metadata/.plugins/<bundle-id>/ abgelegt.

IPath stateLocation = Activator.getDefault().getStateLocation();
File stateFile = stateLocation.append("state.txt").toFile();
PrintWriter writer = new PrintWriter(stateFile);
writer.println("some state");
writer.close();

Einstellungen

Plug-in-spezifische Konfigurationsoptionen können über den Eclipse-eigenen Preference Store verwaltet werden. Diese Optionen werden im Workspace unter .metadata/.plugins/org.eclipse.core.runtime/.settings/<bundle-id>.prefs abgelegt. Diese Variante bietet sich für Konfigurationsoptionen an, die vom Benutzer über den Einstellungsdialog der Anwendung konfiguriert werden sollen.

Der Eclipse-Einstellungsdialog kann der Anwendung mit dem Standard-Command org.eclipse.ui.window.preferences hinzugefügt werden:

Preference Page

Über den Extension Point org.eclipse.ui.preferencePages können Plug-ins diesen Dialog um eigene Einstellungsseiten ergänzen:

<extension point="org.eclipse.ui.preferencePages">
   <page
         class="com.example.SomePreferencePage"
         id="com.example.SomePreferencePage"
         name="Some preferences">
   </page>
</extension>

Neben eigenen Implementierungen des Interfaces IWorkbenchPreferencePage steht die Basisklasse FieldEditorPreferencePage zur Verfügung, die über FieldEditor-Objekte die Bearbeitung von Einstellungsoptionen abstrahiert, z.B.:

public class SomePreferencePage extends FieldEditorPreferencePage
    implements IWorkbenchPreferencePage {

    public final static String SOME_OPTION = "SomeOption";

    @Override
    protected void createFieldEditors() {
        // Felder der Einstellungsseite hinzufügen
        addField(new StringFieldEditor(SOME_OPTION, "Some Option", getFieldEditorParent()));
    }

    @Override
    public void init(IWorkbench workbench) {
        // Preference Store des eigenen Plug-ins setzen
        setPreferenceStore(Activator.getDefault().getPreferenceStore());
    }

}

Folgende Editor-Typen stehen dabei zur Verfügung: BooleanFieldEditor, IntegerFieldEditor, StringFieldEditor, RadioGroupFieldEditor, ColorFieldEditor, FontFieldEditor, DirectoryFieldEditor, FileFieldEditor und PathEditor

Der programmatische Zugriff auf diese Einstellungen erfolgt über den PreferenceStore des jeweiligen Plug-ins:

IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore();
String value = preferenceStore.getString(SomePreferencePage.SOME_OPTION);

Es ist empfehlenswert, Veränderungen an den Eigenschaften zu beobachten, um auf Änderungen an den Einstellungen zur Laufzeit reagieren zu können:

preferenceStore.addPropertyChangeListener(new IPropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent event) {
        if (SomePreferencePage.SOME_OPTION.equals(event.getProperty())) {
            // handle change from event.getOldValue() to event.getNewValue()
        }
    }
});

Vordefinierte Preference Pages

Die Klasse org.eclipse.ui.ExtensionFactory definiert unter anderem fertige Einstellungsseiten, die in eigene Anwendungen eingebunden werden können, z.B.:

<extension point="org.eclipse.ui.preferencePages">
    <page
        class="org.eclipse.ui.ExtensionFactory:newKeysPreferencePage"
        id="newKeysPreferencePage"
        name="Keys"/>
</extension>
Ingo Schult, 06. April, 17:59 Uhr

Ich finde diese Abhandlung gelungen. Was mir hier fehlt ist die genauere Betrachtung wenn Eclipse bzw. eine RCP-Anwendung von mehreren Anwendern verwendet wird (RCP-Anwendung liegt auf dem Server und Anwender greifen via Link darauf zu). Diese Problematik wird zu 90% erst gar nicht betrachtet. Es wird leider immer von einer 1-User-Anwendung ausgegangen.

Tim, 16. August, 19:45 Uhr

Die von Dir erwähnte Problematik greift das Eclipse Projekt "RAP" auf, was für Rich Ajax Platform steht. Interessant ist hier vor allem das Single-Sourcing Prinzip und die Ausführung von bereits entwickelte RCP-Anwendungen als Web-Anwendungen. D.h. man kann mit nur geringem Aufwand Desktop-RCP-Anwendungen als Web-Anwendungen betreiben. Eine sehr coole Sache wie ich finde.

Über Ihre Kommentare und Hinweise freue ich mich sehr:
Ralf Ebert | Eclipse RCP Buch | Einstellungen und Konfiguration