Las vistas y los editores se crean normalmente utilizando un IPartFactory, e IPartFactory sólo puede crear los componentes registrados con el punto de extensión de vistas o editores. . Los componentes creados por IPartFactory dependen de un IWorkbenchPage y no pueden existir independientemente del mismo. IPartFactory crea componentes por ID y no es necesario que la clase de implementación del componente sea API. Un IPartFactory puede obtenerse de IWorkbenchPage. Los componentes también pueden tomar un IPartFactory en su constructor para crear hijos anidados.
Este ejemplo muestra cómo crear una vista mediante IPartFactory.
/**
* Utilizado para crear instancias de editores y vistas.
*
* @since 3.1
*/
public interface IPartFactory {
/**
* Crea una instancia de una vista. Devuelve
<code>ISite</code> para la vista recién creada.
* Cuando el llamante ha terminado con el
componente, debe desechar el control principal del componente. Esto puede
* realizarse llamando a
<code>ISite.getControl().dispose()</code>,
o desechando el
* compuesto padre.
*
* @param viewId ID de la vista como está
registrado con el punto de extensión org.eclipse.ui.views
* @param parentComposite compuesto padre para la
vista. Si la vista se crea satisfactoriamente,
* creará
exactamente un nuevo control hijo en este compuesto.
* @param context contexto local para la vista. Este
objeto puede alterar temporalmente cualquiera de las dependencias de la vista o
todas ellas.
* Si la
vista tiene una dependencia que no se encuentra en el contexto local, se
proporcionará una implementación por omisión
* por
parte del punto de extensión org.eclipse.core.component.types.
* @param savedState estado guardado anteriormente
del componente, o null si no hay ninguno
* @return devuelve un ISite para la vista recién
creada
* @throws envía CoreException si no puede crear el componente
*/
public ISite createView(String viewId, Composite parentComposite,
IContainerContext context, IMemento savedState) throws CoreException;
/**
* Crea una instancia de un editor. Devuelve un
<code>ISite</code> para el editor recién creado.
* Cuando el llamante ha terminado con el
componente, debe desechar el control principal del componente. Esto puede
* realizarse llamando a
<code>ISite.getControl().dispose()</code>,
o desechando el
* compuesto padre.
*
* @param editorId ID del editor como está
registrado con el punto de extensión org.eclipse.ui.editors
* @param parentComposite compuesto padre para el
editor. Si el editor se crea satisfactoriamente,
* creará
exactamente un nuevo control hijo en este compuesto.
* @param context contexto local para el editor.
Este objeto puede alterar temporalmente cualquiera de las dependencias del
componente o todas ellas.
* Si el
componente tiene una dependencia que no se encuentra en el contexto local, se
proporcionará una implementación por omisión
* por
parte del punto de extensión org.eclipse.core.component.types.
* @param input IEditorInput para este editor
* @param savedState estado guardado anteriormente
para el componente, o null ni no hay ninguno
* @return devuelve un ISite para el editor recién
creado
* @throws envía CoreException si no puede crear el componente
*/
public ISite createEditor(String editorId, Composite parentComposite,
IContainerContext context, IEditorInput input, IMemento savedState) envía
CoreException;
}
Éste es un ejemplo de una acción que crea una vista utilizando IPartFactory
/**
* Muestra cómo abrir una vista por su ID desde un IWorkbenchPage.
*/
public class CreateViewByIdAction implements IWorkbenchWindowActionDelegate
{
private IWorkbenchWindow window;
public void run(IAction action) {
IWorkbenchPage page = window.getActivePage();
if (page == null) {
//
...código de manejo de errores no interesante eliminado...
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) {
//
...código de manejo de errores no interesante eliminado...
}
// Abrir el diálogo
tempShell.open();
Display d = tempShell.getDisplay();
while (!tempShell.isDisposed())
{
if (!d.readAndDispatch())
d.sleep();
}
}
public void init(IWorkbenchWindow window) {
this.window = window;
}
// ...métodos restantes (vacíos) eliminados...
}
/**
* Mostrar cómo abrir un componente programáticamente utilizando
la clase Site.
*/
public class ProgrammaticViewCreationExampleAction implements IWorkbenchWindowActionDelegate
{
private IWorkbenchWindow window;
public void run(IAction action) {
// Crear un shell
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 {
// Crear instancia del componente NameTestView (esta línea es el
elemento fundamental del ejemplo)
// Muestra cómo puede utilizarse la clase Site en vez de llamar al
constructor de NameTestView.
Site testPart = new Site(tempShell, new ContainerContext(),
thisPlugin,
NameTestView.class);
} catch (CoreException
e) {
// ...código
de manejo de errores no interesante eliminado...
}
// Abrir un diálogo modal
tempShell.open();
Display d = tempShell.getDisplay();
while (!tempShell.isDisposed())
{
if (!d.readAndDispatch())
d.sleep();
}
}
public void init(IWorkbenchWindow window) {
this.window = window;
}
// ...métodos restantes (vacíos) eliminados...
}