Transmission d'arguments à un composant "part"

Un parent transmet des arguments à ses enfants en utilisant un ContainerContext. Le contexte peut transmettre des arguments au constructeur d'un composant "part" ou spécifier une fabrique pour construire ces arguments. Par exemple, un ContainerContext particulier peut spécifier des règles comme :
Si le contexte ne fournit pas une dépendance particulière, l'enfant utilisera l'implémentation par défaut depuis le point d'extension org.eclipse.core.component.types. Comme le contexte peut contourner tous les arguments qu'un composant "part" reçoit dans son constructeur, le parent peut contourner toutes les interfaces que le composant obtient normalement de son site. Par exemple, le parent peut forcer son enfant à utiliser une implémentation différente d'IActionBars en fournissant un IActionBars dans le contexte.

Le parent a plusieurs options pour construire le contexte :

Les exemples DefaultContextView, RedirectContextView et OverrideInstanceView qui suivent illustrent chaque possibilité.

Contexte par défaut

L'exemple suivant montre la source pour une vue qui crée deux enfants imbriqués dans le contexte par défaut. Le fait que les enfants soient créés dans le contexte par défaut implique que le parent ne s'occupe pas du nom de l'enfant, de sa barre d'outil, de sa sélection, etc., et n'est pas préparé pour les traiter. Si le parent voulait faire quelque chose avec la sélection en cours dans un de ses enfants par exemple, il devrait transmettre un ISelectionHandler à cet enfant. Le résultat final est montré sous l'exemple.

/**
 * View that demonstrates how to create two nested children
 * with the default context.
 */
public class DefaultContextView {
    public DefaultContextView(Composite parent, IPartFactory factory) throws CoreException {
        // Create a resource navigator
        ContainerContext viewContext1 = new ContainerContext();  
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
   
        // Create property view
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}

Copie d'écran de DefaultContextView

Rediriger des dépendances d'un parent vers un enfant

Cet exemple montre comment rediriger une interface de site d'un parent vers un enfant. Cette vue composite contient un navigateur de ressources et une vue propriétés. Elle redirige son gestionnaire de sélection vers le navigateur de ressources et ses barres d'action vers la vue propriétés. Le résultat est une vue qui fournit une sélection de ressources et contient la barre d'outils et le menu de la vue propriété, comme illustré ci-dessous.

public class RedirectContextView {
    /**
     * Component constructor. Do not invoke directly.
     */
    public RedirectContextView(Composite parent, IPartFactory factory, ISelectionHandler selection, IActionBars actionBars) throws CoreException {
        // Create a resource navigator. Redirect the navigator's selection directly to our parent.
        ContainerContext viewContext1 = new ContainerContext()
            .addInstance(ISelectionHandler.class, selection);
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV,
                parent, viewContext1, null);
   
        // Create property view. Allow the property view to use our action bars directly.
        ContainerContext viewContext2 = new ContainerContext()
            .addInstance(IActionBars.class, actionBars);
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}


Copie d'écran de RedirectContextView

Fournir directement des dépendances

Cet exemple montre comment fournir directement une de ses dépendances à un enfant. Dans cet exemple, on crée une vue composite contenant une vue problèmes et une vue propriétés. On fournit un ISelectionHandler à la vue problèmes de manière à afficher le nombre de problèmes sélectionnés dans la description de contenu. Le résultat final est montré ci-dessous.

public class OverrideInstanceView {
   
    /**
     * Component constructor. Do not invoke directly.
     */
   public OverrideInstanceView(Composite parent, IPartFactory factory, final INameable name) throws CoreException {
        ContainerContext viewContext1 = new ContainerContext();
       
        // Add an ISelectionHandler to the view's context. Whenever the view changes its selection,
        // display the number of selected items in the content description
        viewContext1.addInstance(ISelectionHandler.class, new ISelectionHandler() {
            /* (non-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)}));
                }
            }
        });

        // Create a problem view
        ISite view1 = factory.createView(
                IPageLayout.ID_PROBLEM_VIEW, parent, viewContext1, null);
   
        // Create property view
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());
    }
}



Copie d'écran de OverrideInstanceView