Instanciando Partes

Toda a interação com uma parte ocorre por meio de um ISite. Do ponto de vista de alguém que cria uma parte, o ISite é a parte. Um ISite pode ser criado a partir de um IPartFactory ou pela instanciação direta da classe Site.

Para destruir uma parte, descarte o controle de seu ISite.

Instanciando Partes com o IPartFactory

Normalmente, visualizações e editores são criados utilizando um IPartFactory e o IPartFactory pode criar apenas partes registradas com o ponto de extensão das visualizações ou editores. . Partes criadas pelo IPartFactory dependem de um IWorkbenchPage e não podem viver mais do que o IWorkbenchPage. O IPartFactory cria partes por ID e a classe de implementação da parte não precisa ser API. Um IPartFactory pode ser obtido do IWorkbenchPage. Partes também podem obter um IPartFactory em seu construtor para criar filhos aninhados.

Este exemplo demonstra como criar uma visualização utilizando IPartFactory.

/**
 * Utilizado para criar instâncias de editores e visualizações.
 *
 * @since 3.1
 */
public interface IPartFactory {
    /**
     * Cria uma instância de uma visualização. Retorna um <code>ISite</code> para a visualização recém-criada.
     * Quando o responsável pela chamada conclui a parte, ele deve descartar o controle principal da parte. Isso pode ser
     * realizado chamando <code>ISite.getControl().dispose()</code> ou descartando o
     * composto pai.
     *
     * O ID do @param viewID da visualização, conforme registrado no ponto de extensão org.eclipse.ui.views
     * Composto pai do @param parentComposite para a visualização. Se a visualização for criada com êxito, ela
     *        criará exatamente um novo controle de filho nesse composto.
     * Contexto local do @param context da visualização. Esse objeto pode substituir qualquer uma ou todas as dependências da visualização.
     *        Se a visualização possuir uma dependência que não esteja localizada no contexto local, uma implementação padrão será
     *        fornecida pelo ponto de extensão org.eclipse.core.component.types.
     * O estado do @param savedState salvo anteriormente da parte ou nulo se nenhum
     * @return um ISite para a visualização recém-criada
     * @throws CoreException se não puder criar a parte
     */
    public ISite createView(String viewId, Composite parentComposite, IContainerContext context, IMemento savedState) throws CoreException;
   
    /**
     * Cria uma instância de um editor. Retorna um <code>ISite</code> para o editor recém-criado.
     * Quando o responsável pela chamada conclui a parte, ele deve descartar o controle principal da parte. Isso pode ser
     * realizado chamando <code>ISite.getControl().dispose()</code> ou descartando o
     * composto pai.
     *
     * O ID do @param editorID do editor, conforme registrado no ponto de extensão org.eclipse.ui.editors
     * o composto pai @param parentComposite para o editor. Se o editor for criado com êxito,
     *        ele criará exatamente um novo controle de filho nesse composto.
     * Contexto local @param context para o editor. Esse objeto pode substituir qualquer uma ou todas as dependências da parte.
     *        Se a parte possuir uma dependência que não esteja localizada no contexto local, uma implementação padrão será
     *        fornecida pelo ponto de extensão org.eclipse.core.component.types.
     * @param input IEditorInput para esse editor
     * estado @param savedState salvo anteriormente para a parte ou nulo se nenhum
     * @return um ISite para o editor recém-criado
     * @throws CoreException se não puder criar a parte
     */
    public ISite createEditor(String editorId, Composite parentComposite, IContainerContext context, IEditorInput input, IMemento savedState) throws CoreException;
}


A seguir encontra-se um exemplo de uma ação que cria uma visualização utilizando IPartFactory

/**
 * Demonstrar como abrir uma visualização por seu ID a partir de um IWorkbenchPage.
 */
public class CreateViewByIdAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        IWorkbenchPage page = window.getActivePage();
       
        if (page == null) {
           
// ...código de manipulação de erro sem interesse removido...
            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 manipulação de erro sem interesse removido...
        }
       
        // Abrir o 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 (vazios) removidos...
}

Instanciando Partes com a Classe Site

Nem todas as partes são visualizações ou editores. Os clientes também podem utilizar a API da parte para criar seus próprios componentes reutilizáveis. Essas partes não são registradas nos pontos de extensão da visualização ou do editor, mas podem utilizar a maior parte da API disponível para visualizações e editores. Embora não exista nada que impeça clientes de inventar sua própria API para componentes reutilizáveis, o uso do padrão de parte permite que seus componentes sejam incorporados dentro de qualquer coisa que suporte incorporação de visualizações ou de editores.

Partes criadas utilizando a classe Site possuem as seguintes propriedades: O construtor do Site deve receber a classe de implementação da parte e o pacote configurável do plug-in associado. O pacote configurável do plug-in determina onde mensagens de erro de log serão registradas e onde a parte deve procurar ao pesquisar por recursos em seu próprio plug-in.

O seguinte exemplo demonstra como utilizar a classe Site para instanciar uma parte diretamente. Neste exemplo, instanciamos a parte NameTestView em um diálogo. Embora NameTestView seja chamada de uma visualização e possa utilizar a API de visualização, ela não precisa realmente ser registrada no ponto de extensão org.eclipse.ui.views a não ser que o workbench deva realmente utilizá-la como uma visualização.


/**
 * Demonstrar como abrir uma parte de maneira programática utilizando a classe Site.
 */
public class ProgrammaticViewCreationExampleAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        // Criar um 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 {
            // Instanciar a parte NameTestView (esta linha é o ponto total do exemplo)
            // Ela demonstra como a classe Site pode ser utilizada, em vez de chamar o construtor do NameTestView.
            Site testPart = new Site(tempShell, new ContainerContext(),
                    thisPlugin,
                    NameTestView.class);           
           
        } catch (CoreException e) {
            // ...código de manipulação de erro sem interesse removido...
        }
       
        // Abrir um 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 (vazios) removidos...
}