Részek példányosítása

A részekkel kapcsolatos minden együttműködés egy ISite felületen keresztül történik. Egy részt létrehozó személy szemszögéből az ISite maga a rész. Egy ISite létrehozható egy IPartFactory felületből vagy a Site osztály közvetlen példányosításával.

Egy rész megsemmisítéséhez fejezze be a hozzá tartozó ISite felület vezérlését.

Részek példányosítása IPartFactory használatával

A nézetek és szerkesztők normális esetben egy IPartFactory használatával kerülnek létrehozásra és az IPartFactory csak a nézetek vagy szerkesztők kiterjesztési pontjával bejegyzett részeket hozhatnak létre. . Az IPartFactory által létrehozott részek egy IWorkbenchPage felülettől függnek és nem élhetnek tovább, mint az IWorkbenchPage. Az IPartFactory a részeket azonosító alapján hozza létre és a részek megvalósítási osztályának nem kell API-nak lennie. Egy IPartFactory az IWorkbenchPage felületből megszerezhető meg. A részek egy IPartFactory felületet is fogadhatnak a konstruktorukban egymásba ágyazott utódok létrehozásához.

Ezen példa egy nézet IPartFactory felület használatával létrehozásának módját mutatja be.

/**
 * Szerkesztők és nézetek példányainak létrehozására használható.
 *
 * A 3.1 változat óta
 */
public interface IPartFactory {
    /**
     * Egy nézet példányát hozza létre. Egy <code>ISite</code> felületet ad vissza az újonnan létrehozott nézet számára.
     * Amikor a hívó végzett a résszel, akkor meg kell szüntetni a rész fő vezérlőelemét. Ez az
     * <code>ISite.getControl().dispose()</code> hívással vagy a szülőösszetétel
     * megszüntetésével tehető meg.
     *
     * @param viewId - A nézet org.eclipse.ui.views kiterjesztési ponttal bejegyezett azonosítója
     * @param parentComposite - A nézet szülőösszetétele. Ha a nézet sikeresen létrehozásra került, akkor
     *        pontosan egy új utódot fog létrehozni ebben az összetételben.
     * @param context - A nézet helyi környezete. Ez az objektum újradefiniálhatja a nézet néhány vagy összes függőségét.
     *        Ha a nézet rendelkezik egy olyan függőséggel, amely nem található a helyi környezetben, akkor egy alapértelmezett megvalósítást
     *        fog biztosítani az org.eclipse.core.component.types kiterjesztési pont.
     * @param savedState - A rész korábban elmentett állapota, vagy null, ha nincs ilyen
     * Egy ISite felületet ad vissza az újonnan létrehozott nézethez
     * CoreException kivételt dob, ha a rész nem hozható létre
     */
    public ISite createView(String viewId, Composite parentComposite, IContainerContext context, IMemento savedState) throws CoreException;
   
    /**
     * Egy szerkesztő példányát hozza létre. Egy <code>ISite</code> felületet ad vissza az újonnan létrehozott szerkesztő számára.
     * Amikor a hívó végzett a résszel, akkor meg kell szüntetni a rész fő vezérlőelemét. Ez az
     * <code>ISite.getControl().dispose()</code> hívással vagy a szülőösszetétel
     * megszüntetésével tehető meg.
     *
     * @param editorId - A szerkesztő org.eclipse.ui.editors kiterjesztési ponttal bejegyezett azonosítója
     * @param parentComposite - A szerkesztő szülőösszetétele. Ha a szerkesztő sikeresen létrehozásra került, akkor
     *        pontosan egy új utódot fog létrehozni ebben az összetételben.
     * @param context - A szerkesztő helyi környezete. Ez az objektum újradefiniálhatja a rész néhány vagy összes függőségét.
     *        Ha a rész rendelkezik egy olyan függőséggel, amely nem található a helyi környezetben, akkor egy alapértelmezett megvalósítást
     *        fog biztosítani az org.eclipse.core.component.types kiterjesztési pont.
     * @param input - IEditorInput ezen szerkesztőhöz
     * @param savedState - A rész korábban elmentett állapota, vagy null, ha nincs ilyen
     * Egy ISite felületet ad vissza az újonnan létrehozott szerkesztőhöz
     * CoreException kivételt dob, ha a rész nem hozható létre
     */
    public ISite createEditor(String editorId, Composite parentComposite, IContainerContext context, IEditorInput input, IMemento savedState) throws CoreException;
}


Egy példa látható egy műveletre, amely létrehoz egy nézetet az IPartFactory használatával

/**
 * Egy nézet megnyitási módjának bemutatása az azonosítója alapján egy IWorkbenchPage felületből.
 */
public class CreateViewByIdAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        IWorkbenchPage page = window.getActivePage();
       
        if (page == null) {
           
// ...a nem érdekes hibakezelési kód eltávolítva...
            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) {
           
// ...a nem érdekes hibakezelési kód eltávolítva...
        }
       
        // Párbeszédablak megnyitása
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }

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

    // ...a hátralévő (üres) metódusok eltávolítva...
}

Részek példányosítása a Site osztály használatával

Nem minden rész nézet vagy szerkesztő. Az ügyfelek a rész API-t a saját újra felhasználható komponenseik létrehozására is használhatják. Az ilyen részek nem kerülnek bejegyzésre a nézet vagy szerkesztő kiterjesztési pontokkal, de használhatják a nézetekhez és szerkesztőkhöz elérhető legtöbb API-t. Bár semmi sem akadályozza az ügyfeleket az újra felhasználható komponensek saját API felületeinek kitalálásában, a részminták használatával a komponensek beágyazhatók bármibe, ami a nézetek vagy szerkesztők beágyazását támogatja.

A Site osztály használatával létrehozott részek az alábbi tulajdonságokkal rendelkeznek: A Site konstruktort át kell adni a rész megvalósítási osztályának és a hozzá tartozó bedolgozókötegnek. A bedolgozóköteg meghatározza, hogy a napló hibaüzenetei hol kerüljenek naplózásra és a résznek hol kell keresnie a saját bedolgozójában az erőforrásokat.

Az alábbi példa a rész Site osztály használatával közvetlen példányosításának módját mutatja be. Ebben a példában a NameTestView részt példányosítjuk egy párbeszédablakban. Bár a NameTestView elemet nézetnek hívjuk és használhatja a nézet API-t, valójában csak akkor szükséges az org.eclipse.ui.views kiterjesztési ponttal bejegyezni, ha a munkaterületnek ténylegesen nézetként kell használnia.


/**
 * Egy rész programból megnyitási módjának bemutatása a Site osztály használatával.
 */
public class ProgrammaticViewCreationExampleAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        // Parancsértelmező létrehozása
        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 {
            // A NameTestView rész példányosítása (ez a sor a példa lényege)
            // Annak bemutatása, hogy a Site osztály hogyan használható a NameTestView konstruktorának meghívása helyett.
            Site testPart = new Site(tempShell, new ContainerContext(),
                    thisPlugin,
                    NameTestView.class);           
           
        } catch (CoreException e) {
            // ...a nem érdekes hibakezelési kód eltávolítva...
        }
       
        // Modális párbeszédablak megnyitása
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }
\
    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

   
// ...a hátralévő (üres) metódusok eltávolítva...
}