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