Transmitindo Argumentos para uma Parte

Um pai transmite argumentos para seus filhos utilizando um ContainerContext. O contexto pode transmitir argumentos para o construtor de uma parte ou especificar um depósito de informações para construir esses argumentos. Por exemplo, um ContainerContext específico pode especificar regras como:
Se o contexto não fornecer uma dependência específica, o filho utilizará a implementação padrão do ponto de extensão org.eclipse.core.component.types. Como o contexto pode substituir qualquer um dos argumentos que uma parte obtém em seu construtor, o pai pode substituir qualquer uma das interfaces que a parte normalmente obtém de seu site. Por exemplo, o pai pode forçar o filho a utilizar uma implementação diferente de IActionBars, fornecendo um IActionBars no contexto.

O pai possui várias opções para construir o contexto:

Os seguintes exemplos de DefaultContextView, RedirectContextView e OverrideInstanceView demonstram cada possibilidade.

Contexto Padrão

O seguinte exemplo mostra a origem de uma visualização que cria dois filhos aninhados no contexto padrão. O fato dos filhos serem criados em um contexto padrão indica que o pai não se preocupa com o nome, barra de ferramentas, seleção, etc. do filho e não está preparado para lidar com eles. Se o pai desejar fazer alguma coisa a respeito, digamos, a respeito da seleção atual em um de seus filhos, ele precisaria transmitir um ISelectionHandler para aquele filho. O resultado final é mostrado abaixo do exemplo.

/**
 * Visualização que demonstra como criar dois filhos aninhados
 * com o contexto padrão.
 */
public class DefaultContextView {
    public DefaultContextView(Composite parent, IPartFactory factory) throws CoreException {
        // Criar um navegador de recurso
        ContainerContext viewContext1 = new ContainerContext();  
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
   
        // Criar uma visualização de propriedade
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}

Captura de Tela de DefaultContextView

Redirecionando Dependências de um Pai para um Filho

Esse exemplo demonstra como redirecionar uma interface de site do pai para um filho. Essa visualização de composto contém um navegador de recurso e uma visualização de propriedade. Ela redireciona sua rotina de tratamento de seleção para o navegador de recurso e ele redireciona suas barras de ação para a visualização de propriedades. O resultado é uma visualização que fornece uma seleção de recurso e contém a barra de ferramentas e o menu da visualização de propriedades, conforme mostrado a seguir.

public class RedirectContextView {
    /**
     * Construtor do componente. Não chamar diretamente.
     */
    public RedirectContextView(Composite parent, IPartFactory factory, ISelectionHandler selection, IActionBars actionBars) throws CoreException {
        // Criar um navegador de recurso. Redirecionar a seleção do navegador diretamente para nosso pai.
        ContainerContext viewContext1 = new ContainerContext()
            .addInstance(ISelectionHandler.class, selection);
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV,
                parent, viewContext1, null);
   
        // Criar visualização de propriedade. Permitir que a visualização de propriedade utilize nossas barras de ações diretamente.
        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 Tela de RedirectContextView

Fornecendo Dependências Diretamente

Este exemplo demonstra como fornecer a um filho uma de suas dependências diretamente. Neste exemplo, criamos uma visualização composta que contém uma visualização de problemas e uma visualização de propriedades. Fornecemos a visualização de problema com um ISelectionHandler para exibir o número de problemas selecionados na descrição do conteúdo. O resultado final é mostrado a seguir.

public class OverrideInstanceView {
   
    /**
     * Construtor do componente. Não chamar diretamente.
     */
    public OverrideInstanceView(Composite parent, IPartFactory factory, final INameable name) throws CoreException {
        ContainerContext viewContext1 = new ContainerContext();
       
        // Incluir um ISelectionHandler no contexto da visualização. Sempre que a visualização alterar sua seleção,
        // exibir o número de itens selecionados na descrição do conteúdo
        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)}));
                }
            }
        });

        // Criar uma visualização de problema
        ISite view1 = factory.createView(
                IPageLayout.ID_PROBLEM_VIEW, parent, viewContext1, null);
   
        // Criar uma visualização de propriedade
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());
    }
}



Captura de Tela de OverrideInstanceView