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