Tworzenie instancji części

Cała interakcja z częścią odbywa się za pomocą interfejsu ISite. Z punktu widzenia osoby tworzącej część, interfejs ISite jest tą częścią. Interfejs ISite można utworzyć za pomocą interfejsu IPartFactory lub przez bezpośrednie utworzenie instancji klasy Site.

Aby zniszczyć część, należy zutylizować element sterujący interfejsu ISite.

Tworzenie instancji części za pomocą interfejsu IPartFactory

Widoki i edytory tworzy się zazwyczaj za pomocą interfejsu IPartFactory. Może on tworzyć jedynie części zarejestrowane w punkcie rozszerzenia widoków lub edytorów. Części utworzone za pomocą interfejsu IPartFactory zależą od interfejsu IWorkbenchPage i nie mogą istnieć dłużej niż on. Interfejs IPartFactory tworzy części według identyfikatora, więc klasa implementacji części nie musi być interfejsem API. Interfejs IPartFactory można uzyskać z interfejsu IWorkbenchPage. Części mogą także przyjmować interfejs IPartFactory w swym konstruktorze, aby tworzyć zagnieżdżone elementy potomne.

Poniższy przykład ilustruje tworzenie widoku za pomocą interfejsu IPartFactory.

/**
 * Tworzenie instancji edytorów i widoków.
 *
 * @since 3.1
 */
public interface IPartFactory {
    /**
     * Tworzenie instancji widoku. Zwraca interfejs <code>ISite</code> dla nowo utworzonego widoku.
     * Po zakończeniu działania części program wywołujący powinien zutylizować jej główny element sterujący. Można tego
     * dokonać, wywołując metodę <code>ISite.getControl().dispose()</code> lub utylizując
     * złożony element macierzysty.
     *
     * @param viewId Identyfikator widoku zarejestrowany w punkcie rozszerzenia org.eclipse.ui.views extension point.
     * @param parentComposite Złożony element macierzysty widoku. Po poprawnym utworzeniu widoku
     *        dokładnie jeden element sterujący elementu potomnego zostanie utworzony w tym elemencie złożonym.
     * @param context Kontekst lokalny widoku. Ten obiekt może przesłonić dowolną lub wszystkie zależności widoku.
     *        Jeśli zależność widoku nie znajduje się w kontekście lokalnym, implementacja domyślna zostanie
     *        dostarczona przez punkt rozszerzenia org.eclipse.core.component.types.
     * @param savedState Poprzednio zapisany stan części. Parametr ma wartość null, jeśli brak stanu.
     * @return Interfejs ISite dla nowo utworzonego widoku
     * @throws Wyjątek CoreException, jeśli utworzenie części jest niemożliwe.
     */
    public ISite createView(String viewId, Composite parentComposite, IContainerContext context, IMemento savedState) throws CoreException;
   
    /**
     * Tworzenie instancji edytora. Zwraca interfejs <code>ISite</code> dla nowo utworzonego edytora.
     * Po zakończeniu działania części program wywołujący powinien zutylizować jej główny element sterujący. Można tego
     * dokonać, wywołując metodę <code>ISite.getControl().dispose()</code> lub utylizując
     * złożony element macierzysty.
     *
     * @param editorId Identyfikator edytora zarejestrowany w punkcie rozszerzenia org.eclipse.ui.editors
     * @param parentComposite Złożony element macierzysty edytora. Po poprawnym utworzeniu edytora
     *        dokładnie jeden element sterujący elementu potomnego zostanie utworzony w tym elemencie złożonym.
     * @param context Kontekst lokalny edytora. Ten obiekt może przesłonić dowolną lub wszystkie zależności części.
     *        Jeśli zależność części nie znajduje się w kontekście lokalnym, implementacja domyślna zostanie
     *        dostarczona przez punkt rozszerzenia org.eclipse.core.component.types.
     * @param input Właściwość IEditorInput dla tego edytora.
     * @param savedState Poprzednio zapisany stan części. Parametr ma wartość null, jeśli brak stanu.
     * @return Interfejs ISite dla nowo utworzonego edytora.
     * @throws Wyjątek CoreException, jeśli utworzenie części jest niemożliwe.
     */
    public ISite createEditor(String editorId, Composite parentComposite, IContainerContext context, IEditorInput input, IMemento savedState) throws CoreException;
}


Poniżej przedstawiono przykład akcji, która tworzy widok za pomocą interfejsu IPartFactory.

/**
 * Przykład otwierania widoku za pomocą identyfikatora w interfejsie IWorkbenchPage.
 */
public class CreateViewByIdAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        IWorkbenchPage page = window.getActivePage();
       
        if (page == null) {
           
// ...usunięto nieciekawy fragment kodu dotyczący obsługi błędów...
            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) {
           
// ...usunięto nieciekawy fragment kodu dotyczący obsługi błędów...
        }
       
        // Otwarcie okna dialogowego
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }

    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

    // ...usunięto pozostałe (puste) metody...
}

Tworzenie instancji części za pomocą klasy Site

Nie wszystkie części są widokami lub edytorami. Klienci mogą użyć interfejsu API części, aby utworzyć własne komponenty wielokrotnego użytku. Takich części nie rejestruje się w punkcie rozszerzenia widoku lub edytora, ale mogą one korzystać z większości interfejsów API przeznaczonych dla widoków lub edytorów. Chociaż klienci mogą tworzyć własne interfejsy API dla komponentów wielokrotnego użytku, użycie wzorca części pozwala na osadzanie komponentów wewnątrz wszystkich elementów, które obsługują osadzanie widoków lub edytorów.

Części utworzone za pomocą klasy Site mają następujące właściwości: Konstruktor klasy Site musi otrzymać klasę implementacji części oraz powiązany pakunek modułu dodatkowego. Pakunek modułu dodatkowego określa miejsce protokołowania komunikatów o błędach oraz ścieżki wyszukiwania zasobów dla modułów dodatkowych.

Na poniższym przykładzie pokazano sposób bezpośredniego tworzenia instancji części za pomocą klasy Site. Utworzona zostanie instancja części NameTestView w oknie dialogowym. Chociaż część NameTestView jest nazywana widokiem i może używać interfejsów API widoków, nie musi być zarejestrowana w punkcie rozszerzenia org.eclipse.ui.views, jeśli środowisko robocze nie będzie używało jej jako widoku.


/**
 * Przykład programowego otwierania części za pomocą klasy Site.
 */
public class ProgrammaticViewCreationExampleAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        // Tworzenie powłoki
        final Shell tempShell = new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
        tempShell.setLayout(new FillLayout());
        tempShell.setText("Widok NameTestView");
       
        Bundle thisPlugin = ComponentExamplesPlugin.getDefault().getBundle();
       
        try {
            // Tworzenie instancji części NameTestView (ta linijka to zasadnicza część tego przykładu)
            // Pokazano, w jaki sposób można użyć klasy Site zamiast wywoływać konstruktor części NameTestView.
            Site testPart = new Site(tempShell, new ContainerContext(),
                    thisPlugin,
                    NameTestView.class);           
           
        } catch (CoreException e) {
            // ...usunięto nieciekawy fragment kodu dotyczący obsługi błędów...
        }
       
        // Otwieranie modalnego okna dialogowego
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }
\
    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

   
// ...usunięto pozostałe (puste) metody...
}