Ansichten und Editoren werden üblicherweise unter Verwendung von IPartFactory und IPartFactory erstellt. Sie können nur Abschnitte erstellen, die bei dem Erweiterungspunkt der Ansichten oder Editoren registriert sind. . Abschnitte, die von IPartFactory erstellt werden, hängen von einer IWorkbenchPage ab und können die IWorkbenchPage nicht überleben. IPartFactory erstellt Abschnitte nach ID und die Implementierungsklasse des Abschnitts muss keine API sein. Eine IPartFactory kann von IWorkbenchPage erlangt werden. Abschnitte können auch eine IPartFactory in ihren Konstruktor aufnehmen, um verschachtelte untergeordnete Elemente zu erstellen.
Dieses Beispiel veranschaulicht, wie eine Ansicht unter Verwendung von IPartFactory erstellt wird.
/**
* Dient zur Erstellung von Exemplaren von Editoren und Ansichten.
*
* @Ab 3.1
*/
public interface IPartFactory {
/**
* Erstellt ein Exemplar einer Ansicht. Gibt eine <code>ISite</code>
für die neu erstellte Ansicht zurück.
* Wenn der Aufruf mit dem Abschnitt erfolgt, sollte er das Hauptsteuerzeichen des Abschnitts entfernen. Dies kann
* durch Aufruf von <code>ISite.getControl().dispose()</code> erfolgen,
oder durch Entfernen der
* übergeordneten Kombination.
*
* @param viewId ID der Ansicht, wie beim Erweiterungspunkt org.eclipse.ui.views registriert
* @param parentComposite Übergeordnete Kombination für die Ansicht. Wenn die Ansicht erfolgreich erstellt wurde,
* wird sie exakt ein neues Steuerzeichen für ein untergeordnetes Element in dieser Kombination erstellen.
* @param context Lokaler Kontext für die Ansicht. Dieses Objekt kann jedes oder alle Abhängigkeiten der Ansicht außer Kraft setzen.
* Wenn die Ansicht eine Abhängigkeit hat, die in dem lokalen Kontext nicht gefunden wurde, wird eine standardmäßige Implementierung
* durch den Erweiterungspunkt org.eclipse.core.component.types zur Verfügung gestellt.
* @param savedState Zuvor gespeicherter Status des Abschnitts, oder Null, falls keiner
* @gibt eine ISite für die neu erstellte Ansicht zurück
* @löst CoreException aus, wenn der Abschnitt nicht erstellt werden konnte
*/
public ISite createView(String viewId, Composite parentComposite,
IContainerContext context, IMemento savedState) throws CoreException;
/**
* Erstellt ein Exemplar eines Editors. Gibt eine <code>ISite</code>
für den neu erstellten Editor zurück.
* Wenn der Aufruf mit dem Abschnitt erfolgt, sollte er das Hauptsteuerzeichen des Abschnitts entfernen. Dies kann
* durch Aufruf von <code>ISite.getControl().dispose()</code> erfolgen,
oder durch Entfernen der
* übergeordneten Kombination.
*
* @param editorId ID des Editors, wie beim Erweiterungspunkt org.eclipse.ui.editors registriert
* @param parentComposite Übergeordnete Kombination für den
Editor. Wenn der Editor erfolgreich erstellt wurde,
* wird er exakt ein neues Steuerzeichen für ein untergeordnetes Element in dieser Kombination erstellen.
* @param context Lokaler Kontext für den Editor. Dieses Objekt kann jedes oder alle Abhängigkeiten der Ansicht außer Kraft setzen.
* Wenn der Abschnitt eine Abhängigkeit hat, die in dem lokalen Kontext nicht gefunden wurde, wird eine standardmäßige Implementierung
* durch den Erweiterungspunkt org.eclipse.core.component.types zur Verfügung gestellt.
* @param input IEditorInput für diesen Editor
* @param savedState Zuvor gespeicherter Status des Abschnitts, oder Null, falls keiner
* @gibt eine ISite für den neu erstellten Editort zurück
* @löst CoreException aus, wenn der Abschnitt nicht erstellt werden konnte
*/
public ISite createEditor(String editorId, Composite parentComposite,
IContainerContext context, IEditorInput input, IMemento savedState) throws
CoreException;
}
Das folgende Beispiel zeigt eine Aktion, die eine Ansicht unter Verwendung von IPartFactory erstellt
/**
* Veranschaulicht, wie eine Ansicht durch ihre ID von einer IWorkbenchPage aus zu öffnen ist.
*/
public class CreateViewByIdAction implements IWorkbenchWindowActionDelegate
{
private IWorkbenchWindow window;
public void run(IAction action) {
IWorkbenchPage page = window.getActivePage();
if (page == null) {
//
...uninteressanter Fehlerbehandlung-Code entfernt...
return;
}
final Shell tempShell = new Shell(window.getShell(),
SWT.DIALOG_TRIM | SWT.RESIZE);
tempShell.setLayout(new FillLayout());
tempShell.setText("Problems");
IPartFactory factory = page.getPartFactory();
try {
factory.createView(IPageLayout.ID_PROBLEM_VIEW, tempShell, new ContainerContext(),
null);
} catch (CoreException e) {
//
...uninteressanter Fehlerbehandlung-Code entfernt...
}
// Öffnet den Dialog
tempShell.open();
Display d = tempShell.getDisplay();
while (!tempShell.isDisposed())
{
if (!d.readAndDispatch())
d.sleep();
}
}
public void init(IWorkbenchWindow window) {
this.window = window;
}
// ...verbleibende (leere) Methoden entfernt...
}
/**
*Veranschaulicht, wie ein Abschnitt über das Programm unter Verwendung der Site-Klasse geöffnet wird.
*/
public class ProgrammaticViewCreationExampleAction implements IWorkbenchWindowActionDelegate
{
private IWorkbenchWindow window;
public void run(IAction action) {
// Erstellt eine Shell
final Shell tempShell =
new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
tempShell.setLayout(new
FillLayout());
tempShell.setText("Name
test view");
Bundle thisPlugin = ComponentExamplesPlugin.getDefault().getBundle();
try {
// Erstellt ein Exemplar des Abschnitts NameTestView (diese Zeile ist der Kernpunkt des Beispiels)
// Sie zeigt, wie die Site-Klasse verwendet werden kann statt den Konstruktor von NameTestView aufzurufen.
Site testPart = new Site(tempShell, new ContainerContext(),
thisPlugin,
NameTestView.class);
} catch (CoreException
e) {
// ...uninteressanter Fehlerbehandlungscode wird entfernt...
}
// Öffnet ein Modaldialogfensterobjekt
tempShell.open();
Display d = tempShell.getDisplay();
while (!tempShell.isDisposed())
{
if (!d.readAndDispatch())
d.sleep();
}
}
public void init(IWorkbenchWindow window) {
this.window = window;
}
// ...verbleibende (leere) Methoden werden entfernt...
}