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