Creación de instancias de componentes

Todas las interacciones con un componente tienen lugar a través de un ISite. Desde el punto de vista de quien crea un componente, el ISite es el componente. Un ISite puede crearse a partir de un IPartFactory o directamente creando una instancia de la clase Site.

Para destruir un componente, deseche el control de su ISite.

Creación de instancias de componentes mediante IPartFactory

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

Creación de instancias de componentes mediante la clase Site

No todos los componentes son vistas o editores. Los clientes también pueden utilizar la API de componente para crear sus propios componentes reutilizables. Estos componentes no se registran con los puntos de extensión de vista o editor, pero pueden utilizar casi toda la API disponible para vistas y editores. Aunque no hay nada que impida a los clientes inventar sus propias API para los componentes reutilizables, utilizar el patrón de componente permite incorporar sus componentes dentro de cualquier elemento que dé soporte a la incorporación de vistas o editores.

Los componentes creados utilizando la clase Site tienen las siguientes propiedades: Debe darse al constructor de sitio la clase de implementación del componente y el paquete de conector asociado. El paquete de conector determina dónde se anotarán los mensajes de error y dónde debe buscar el componente al buscar recursos en su propio conector.

El siguiente ejemplo muestra cómo utilizar la clase Site para crear directamente la instancia de un componente. En este ejemplo, creamos la instancia del componente NameTestView en un diálogo. Aunque NameTestView se denomina como vista y puede utilizar la API de vista, en realidad no es necesario registrarla con el punto de extensión org.eclipse.ui.views, a menos que se suponga que el entorno de trabajo la utilice como una vista.


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