Abschnitte als Exemplar erstellen

Jede Interaktion mit einem Abschnitt erfolgt durch eine ISite. Vom Standpunkt von jemandem, der einen Abschnitt erstellt, ist die ISite der Abschnitt. Eine ISite kann entweder von einer IPartFactory oder durch direkte Exemplarerstellung der Site-Klasse erzeugt werden.

Um einen Abschnitt zu vernichten, entfernen Sie das Steuerelement für seine ISite.

Exemplarerstellung von Abschnitten unter Verwendung von IPartFactory

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...
}

Exemplarerstellung von Abschnitten unter Verwendung der Site-Klasse

Nicht alle Abschnitte sind Ansichten und Editoren. Clients können auch die API des Abschnitts verwenden, um ihre eigenen wieder verwendbaren Komponenten zu erstellen. Solche Abschnitte werden nicht bei dem Erweiterungspunkt der Ansicht oder des Editors registriert, können aber die meisten API, die den Ansichten oder Editoren zur Verfügung stehen, nutzen. Obschon es nichts gibt, was Clients davon abhält, ihre eigene API für wieder verwendbare Komponenten zu ersinnen, können ihre Komponenten durch die Verwendung des Abschnittmusters überall dort eingebettet werden, wo die Einbettung von Ansichten oder Editoren unterstützt wird.

Abschnitte, die unter Verwendung der Site-Klasse erstellt worden sind, haben folgende Merkmale: Dem Site-Konstruktor muss die Implementierungsklasse des Abschnitts und das zugehörige Plug-in-Produktpaket vorgegeben werden. Das Plug-in-Produktpaket bestimmt, wo Protokollfehlernachrichten protokolliert werden und wo der Abschnitt suchen soll, wenn er nach Ressourcen in seinem eigenen Plug-in sucht.

Das folgende Beispiel veranschaulicht, wie die Site-Klasse zu verwenden ist, um direkt ein Exemplar eines Abschnitts zu erstellen. In diesem Beispiel erstellen wir ein Exemplar des Abschnitts NameTestView in einem Dialog. Obschon NameTestView eine Ansicht genannt wird und die Ansicht-API verwenden kann, muss sie nicht bei dem Erweiterungspunkt org.eclipse.ui.views registriert werden, außer wenn angenommen wird, dass die Workbench sie als Ansicht verwendet.


/**
 *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...
}