Vytváření instance částí

Veškerou interakci s částmi zajišťuje ISite. Z perspektivy tvůrce části je částí ISite. ISite lze vytvořit z IPartFactory nebo přímo vytvořením instance třídy Site.

Část zlikvidujete likvidací obslužného prvku příslušného objektu ISite.

Vytváření instance části s použitím IPartFactory

Pohledy a editory se běžně vytvářejí s použitím IPartFactory a IPartFactory může vytvářet pouze části registrované bodem rozšíření pohledů nebo editorů. . Části vytvořené prostřednictvím IPartFactory závisejí na IWorkbenchPage a nelze uchovat IWorkbenchPage. IPartFactory vytváří části podle ID a implementační třída části nemusí mít podobu API. IPartFactory lze získat z IWorkbenchPage. Části mohou mít ve svém konstruktoru rovněž IPartFactory k vytvoření vnořených podřízených prvků.

Tento příklad ukazuje vytvoření pohledu s použitím IPartFactory.

/**
 * Vytváří instance editorů a pohledů.
 *
 * @od 3.1
 */
public interface IPartFactory {
    /**
     * Vytváří instanci pohledu. Vrací <code>ISite</code> pro nově vytvořený pohled.
     * Pokud volající objekt skončil svou činnost s částí, měl by zlikvidovat hlavní obslužný prvek části. Toto lze
     * zajistit voláním <code>ISite.getControl().dispose()</code> nebo likvidací
     * nadřazeného kompozitního prvku.
     *
     * @parametr viewId ID pohledu registrované bodem rozšíření org.eclipse.ui.views
     * @parametr parentComposite nadřazený kompozitní prvek pohledu. Je-li pohled vytvořen úspěšně,
     *        vytvoří v tomto kompozitním prvku přesně jeden nový podřízený obslužný prvek.
     * @parametr context lokální kontext pohledu. Tento objekt může potlačit kteroukoli nebo všechny závislosti pohledu.
     *        Pokud má pohled závislost, která není nalezena v lokálním kontextu, výchozí implementaci
     *        poskytne bod rozšíření org.eclipse.core.component.types.
     * @parametr savedState předchozí uložený stav části nebo null, pokud neexistuje
     * @vrací ISite nově vytvořeného pohledu
     * @spouští výjimku jádra, nelze-li část vytvořit
     */
    public ISite createView(String viewId, Composite parentComposite, IContainerContext context, IMemento savedState) throws CoreException;
   
    /**
    ¨ * Vytváří instanci editoru. Opětovně spouští <code>ISite</code> pro nově vytvořený editor.
     * Pokud volající objekt skončil svou činnost s částí, měl by zlikvidovat hlavní obslužný prvek části. Toto lze
     * zajistit voláním <code>ISite.getControl().dispose()</code> nebo likvidací
     * nadřazeného kompozitního prvku.
     *
     * @parametr editorId ID editoru registrované bodem rozšíření org.eclipse.ui.editors
     * @parametr parentComposite nadřazený kompozitní prvek pro editor. Pokud je editor vytvořen úspěšně,
     *        vytvoří v tomto kompozitním prvku právě jeden podřízený obslužný prvek.
     * @parametr context lokální kontext editoru. Tento objekt může potlačit kteroukoli nebo všechny závislosti části.
     *        Pokud má část závislost, která není nalezena v lokálním kontextu, výchozí implementaci
     *        poskytne bod rozšíření org.eclipse.core.component.types.
     * @parametr input IEditorInput tohoto editoru
     * @parametr savedState předchozí uložený stav části nebo null, pokud neexistuje
     * @vrací ISite nově vytvořeného editoru
     * @spouští výjimku jádra, nelze-li část vytvořit
     */
    public ISite createEditor(String editorId, Composite parentComposite, IContainerContext context, IEditorInput input, IMemento savedState) throws CoreException;
}


Zde uvádíme příklad akce, která vytváří pohled pomocí IPartFactory

/**
 * Postup otevření pohledu podle ID z IWorkbenchPage.
 */
public class CreateViewByIdAction implementuje IWorkbenchWindowActionDelegate {
    okno private IWorkbenchWindow;

    public void run(IAction action) {       
        IWorkbenchPage page = window.getActivePage();
       
        if (page == null) {
           
// ...zde je odebrán běžný kód obsluhy chyb...
            return;
        }
       
        final Shell tempShell = new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
       
        tempShell.setLayout(new FillLayout());
        tempShell.setText("Problémy");
       
        IPartFactory factory = page.getPartFactory();
        try {
            factory.createView(IPageLayout.ID_PROBLEM_VIEW, tempShell, new ContainerContext(), null);
        } catch (CoreException e) {
           
// ...zde je odebrán běžný kód obsluhy chyb...
        }
       
        // Otevře dialogové okno
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }

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

    // ...odebrány zbývající metody (prázdné)...
}

Vytváření instancí částí s použitím třídy Site

Určité části nejsou pohledy ani editory. Klienti mohou používat rovněž rozhraní API části k vytváření vlastních znovupoužitelných komponent. Takovéto části se neregistrují v bodech rozšíření pohledu ani editoru, avšak mohou používat většinu rozhraní API dostupného pohledům a editorům. I když nic nebrání klientům ve vytváření vlastních rozhraní API, použití struktury části vkládání jejích komponent do jakéhokoli kontextu, který podporuje vkládání pohledů nebo editorů.

Části vytvořené s použitím třídy Site mají tyto vlastnosti: Konstruktoru Site musí být poskytnuta implementační třída a přidružený balíček modulu plug-in. Balíček modulu plug-in určuje místo protokolování chybových zpráv a místo, kde má část vyhledávat prostředky ve vlastním modulu plug-in.

Následující příklad předvádí způsob použití třídy Site k přímému vytvoření instance části. V tomto příkladu vytvoříme část NameTestView v dialogovém okně. NameTestView sice nazýváme pohledem a může používat rozhraní API pohledu, ve skutečnosti však nemusí být registrován bodem rozšíření org.eclipse.ui.views, pokud jej pracovní plocha nebude používat jako pohled.


/**
 * Postup otevření části v programu s použitím třídy Site.
 */
public class ProgrammaticViewCreationExampleAction implementuje IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        // Vytvoří interpret textové konzoly
        final Shell tempShell = new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
        tempShell.setLayout(new FillLayout());
        tempShell.setText("Název testovacího pohledu");
       
        Bundle thisPlugin = ComponentExamplesPlugin.getDefault().getBundle();
       
        try {
            // Vytváří instanci části NameTestView (tento řádek je klíčovou částí ukázky)
            // Předvádí použití třídy Site místo volání konstruktoru NameTestView.
            Site testPart = new Site(tempShell, new ContainerContext(),
                    thisPlugin,
                    NameTestView.class);           
           
        } catch (CoreException e) {
            // ...zde je odebrán běžný kód obsluhy chyb...
        }
       
        // Otevírá modální dialogové okno
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }
\
    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

   
// ...odebrány zbývající metody (prázdné)...
}