Pasar argumentos a un componente

Un padre pasa argumentos a sus hijos mediante un ContainerContext. El contexto puede pasar argumentos al constructor de un componente o especificar una fábrica para construir dichos argumentos. Por ejemplo, un ContainerContext determinado puede especificar reglas tales como:
Si el contexto no proporciona ninguna dependencia específica, el hijo utilizará la implementación por omisión del punto de extensión org.eclipse.core.component.types. Dado que el contexto puede alterar temporalmente cualquiera de los argumentos que un componente obtiene en su constructor, el padre puede alterar temporalmente cualquiera de las interfaces que el componente obtiene normalmente de su sitio. Por ejemplo, el padre puede forzar al hijo a utilizar una implementación de IActionBars distinta proporcionando un IActionBars en el contexto.

El padre tiene varias opciones para construir el contexto:

Los siguientes ejemplos de DefaultContextView, RedirectContextView y OverrideInstanceView demuestran cada una de estas posibilidades.

Contexto por omisión

El ejemplo siguiente muestra el origen de una vista que crea dos hijos anidados en el contexto por omisión. El hecho de que se creen los hijos en el contexto por omisión quiere decir que el padre no se encarga del nombre del hijo, la barra de herramientas, la selección, etc. y no está preparado para trabajar con ellos. Si el padre quisiera realizar alguna acción, por ejemplo, con la selección actual en uno de sus hijos, tendría que pasar un ISelectionHandler a ese hijo. El resultado final se muestra debajo del ejemplo.

/**
 * Vista que demuestra cómo crear dos hijos anidados
 * con el contexto por omisión.
 */
public class DefaultContextView {
    public DefaultContextView(Composite parent, IPartFactory factory) throws CoreException {
        // Crear un navegador de recursos
        ContainerContext viewContext1 = new ContainerContext();  
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
   
        // Crear vista de propiedades
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}

Captura de pantalla de DefaultContextView

Redirección de dependencias de un padre a un hijo

Este ejemplo muestra cómo redirigir una interfaz de sitio del padre a un hijo. Esta vista compuesta contiene un navegador de recursos y una vista de propiedades. Redirige el manejador de selección al navegador de recursos y redirige sus barras de acciones a la vista de propiedades. El resultado es una vista que proporciona una selección de recursos y contiene la barra de herramientas y el menú de la vista de propiedades, como se muestra a continuación.

public class RedirectContextView {
    /**
     * Constructor de componentes. No debe invocarse directamente.
     */
    public RedirectContextView(Composite parent, IPartFactory factory, ISelectionHandler selection, IActionBars actionBars) throws CoreException {
        // Crear un navegador de recursos. Redirigir la selección del navegador directamente al padre.
        ContainerContext viewContext1 = new ContainerContext()
            .addInstance(ISelectionHandler.class, selection);
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV,
                parent, viewContext1, null);
   
        // Crear vista de propiedades. Permitir que la vista de propiedades utilice directamente las barras de acciones.
        ContainerContext viewContext2 = new ContainerContext()
            .addInstance(IActionBars.class, actionBars);
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}


Captura de pantalla de RedirectContextView

Suministro directo de dependencias

Este ejemplo demuestra cómo proporcionar directamente a un hijo una de sus dependencias. En este ejemplo se crea una vista compuesta que contiene una vista de problemas y una vista de propiedades. Se proporciona la vista de problemas con un ISelectionHandler para visualizar el número de problemas seleccionados en la descripción de contenido. El resultado final se muestra más abajo.

public class OverrideInstanceView {
   
    /**
     * Constructor de componentes. No debe invocarse directamente.
     */
    public OverrideInstanceView(Composite parent, IPartFactory factory, final INameable name) throws CoreException {
        ContainerContext viewContext1 = new ContainerContext();
       
        // Añadir un ISelectionHandler al contexto de vista. Siempre que la vista cambie de selección,
        // visualizar el número de elementos seleccionados en la descripción de contenido
        viewContext1.addInstance(ISelectionHandler.class, new ISelectionHandler() {
            /* (no Javadoc)
             * @see org.eclipse.ui.part.services.ISelectionHandler#setSelection(org.eclipse.jface.viewers.ISelection)
             */
            public void setSelection(ISelection newSelection) {
                if (newSelection instanceof IStructuredSelection) {
                    IStructuredSelection sel = (IStructuredSelection)newSelection;
                    int selectionSize = sel.size();
                   
                    name.setContentDescription(MessageFormat.format("{0} problems selected",
                            new String[] {Integer.toString(selectionSize)}));
                }
            }
        });

        // Crear una vista de problemas
        ISite view1 = factory.createView(
                IPageLayout.ID_PROBLEM_VIEW, parent, viewContext1, null);
   
        // Crear vista de propiedades
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());
    }
}



Captura de pantalla de OverrideInstanceView