org.eclipse.ui.elementFactories

Mit Factory-Dienstprogrammen für Elemente können Workbench-Modellobjekte aus Daten erneut erstellt werden, die während der Beendigung der Workbench gespeichert wurden.

Bevor näher auf die Erweiterung für die Factory-Dienstprogramme für Elemente eingegangen werden soll, erhalten Sie einen Überblick über die allgemeine Technik, mit der in der gesamten Plattform ein Plug-in-spezifisches Verhalten zu allgemeinen Plattformmodellobjekten hinzugefügt werden kann.

Schnittstellen "IAdaptable" und Workbench-Adapter

Beim Anzeigen der unterschiedlichen Workbench-Klassen werden Sie feststellen, dass viele Workbench-Schnittstellen die Schnittstelle IAdaptable erweitern.

Plug-ins verwenden Adapter, um bereits im System vorhandenen Typen ein spezifisches Verhalten hinzuzufügen. Die Workbench könnte beispielsweise Ressourcen ein Verhalten hinzufügen, damit diese ein Anzeigenelement und ein Image zur Verfügung stellen, mit denen sie selbst in der Benutzerschnittstelle dargestellt werden. Sie wissen bereits, dass das Hinzufügen von einem spezifischen Verhalten für Benutzerschnittstellen zu maschinennahen Objekten wenig sinnvoll ist. Daher stellt sich nun aber die Frage, wie Sie ein solches Verhalten zu Ressourcentypen hinzufügen können.

Die Plattform definiert eine Technik, mit der die Implementierung einer bestimmten Schnittstelle aus einem Objekt dynamisch abgefragt werden kann. Plug-ins können Adapter registrieren, die bereits vorhandenen Typen ein Verhalten hinzufügen können. Auf diese Weise kann der Anwendungscode später den bestimmten Adapter für ein Objekt abfragen, wenn es in einem spezifischen Kontext verwendet wird. Wenn ein Adapter für das Objekt registriert ist, kann der Adapter abgerufen und das neue, im Adapter definierte Verhalten verwendet werden.

Durch das Bereitstellen einer Funktion, die einen Adapter für ein Objekt dynamisch abfragen kann, kann auch die Flexibilität des Systems im Zuge seiner weiteren Entwicklung verbessert werden. Neue Adapter können durch neue Plug-ins für Plattformtypen registriert werden, ohne dass die Definitionen der Originaltypen geändert werden müssen. Hierbei wird das Muster befolgt, dass ein Objekt nach einem bestimmten Adapter abgefragt wird.

// Für ein bestimmtes Objekt sollen Workbench-Operationen ausgeführt werden
if (!(o instanceof IAdaptable)) {
    return null;
}
IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
if (adapter == null)
    return null;
// Behandlung als IWorkbenchAdapter ist jetzt möglich
...

Wenn für das betreffende Objekt kein Adapter registriert ist, wird als Adapter ein Nullwert zurückgegeben. Clients müssen auf die Verarbeitung dieses Falls vorbereitet sein, damit ein Fall, in dem ein erwarteter Adapter nicht registriert wurde, ordnungsgemäß verarbeitet werden kann.

Die Workbench verwendet Adapter, um aus den Basistypen der Plattform wie beispielsweise IResource Informationen zur Benutzerschnittstelle abzufragen. Hierdurch müssen die Basistypen nicht über spezielle Kenntnis der Benutzerschnittstelle verfügen, und die Workbench kann ihre Schnittstellen weiterentwickeln, ohne die Definitionen der Basistypen zu ändern.

Ohne Adapter müssten alle Klassen, die in der Workbench-API übergeben werden können, die Schnittstellen für die Benutzerschnittstelle implementieren. Dies führt zu einem Übermaß an Klassendefinitionen und führt enge Verbindungen ein. Auf diese Weise werden Schleifenabhängigkeiten zwischen dem Kern und den Benutzerschnittstellenklassen geschaffen. Werden hingegen Adapter verwendet, implementiert jede Klasse die Schnittstelle IAdaptable und verwendet die Adapterregistrierung, damit das Verhalten der Basistypen durch Plug-ins ergänzt werden kann.

An vielen Stellen im Workbench-Code können Sie Fälle finden, in denen ein Typ nach einem Adapter abgefragt wird. Dies geschieht, um ein Objekt abzurufen, das benutzerschnittstellenorientierte Informationen zu einem Plattformkerntyp bereitstellen kann.

Factory-Dienstprogramme für Elemente

Wenn die Workbench durch den Benutzer beendet wird, muss sie den aktuellen Status der in der Workbench angezeigten Objekte IAdaptable speichern. Dies erfolgt, indem Basisdatenparameter des Objekts in einem speziellen Format (Objekt IMemento) gespeichert werden, das ganz einfach im Dateisystem gespeichert werden kann. Außerdem wird die ID eines Factory-Dienstprogramms gespeichert, die das Objekt aus einem Objekt IMemento erneut erstellen kann.

Wenn die Plattform erneut gestartet wird, sucht die Workbench das Factory-Dienstprogramm für das Element, dessen ID im Objekt "IMemento" angegeben ist. Zu diesem Zweck wird geprüft, ob die Plug-in-Registrierung Ergänzungen für die Erweiterung org.eclipse.ui.elementFactories enthält.

Die Befehlsdatei ist ziemlich einfach. Es müssen lediglich die ID des Factory-Dienstprogramms und die entsprechende Klasse angegeben werden, die das Factory-Dienstprogramm implementiert.

Der folgende Code-Ausschnitt stammt aus der Datei plugin.xml für die Workbench.

<extension
    point = "org.eclipse.ui.elementFactories">
    <factory id ="org.eclipse.ui.internal.model.ResourceFactory"
        class="org.eclipse.ui.internal.model.ResourceFactory">
    </factory>
    <factory id ="org.eclipse.ui.internal.model.WorkspaceFactory"
        class="org.eclipse.ui.internal.model.WorkspaceFactory">
    </factory>
    <factory id ="org.eclipse.ui.part.FileEditorInputFactory"
        class="org.eclipse.ui.part.FileEditorInputFactory">
    </factory>
    <factory id ="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
        class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
    </factory>
</extension>