É possível incluir um assistente na opção de menu Arquivo->Novo no workbench usando o ponto de extensão org.eclipse.ui.newWizards. O exemplo de ferramenta leiame utiliza essa definição de ponto de extensão para incluir o assistente de Arquivo Leiame:
<extension
point = "org.eclipse.ui.newWizards">
<category
id = "org.eclipse.ui.examples.readmetool.new"
name="Exemplo de Assistentes de Criação">
</category>
<wizard
id = "org.eclipse.ui.examples.readmetool.wizards.new.file"
name = "Arquivo Leiame"
class="org.eclipse.ui.examples.readmetool.ReadmeCreationWizard"
category="org.eclipse.ui.examples.readmetool.new"
icon="icons/basic/obj16/newreadme_wiz.gif">
<description>Um exemplo de um assistente que cria amostras do arquivo Leiame
</description>
<selection class="org.eclipse.core.resources.IResource"/>
</wizard>
</extension>
Category descreve onde o assistente será agrupado quando diálogo de seleção do assistente for usado para procurar e lançar um assistente. A categoria nome ("Exemplo de Assistentes de Criação") define a etiqueta que é utilizada no assistente. O próprio assistente é atribuído à categoria. Seu nome, ícone e descrição mostram-se todos no diálogo de seleção de assistente mostrado abaixo.
Tudo isso aparece com base na marcação no arquivo plugin.xml. Nenhum destes códigos de plug-in é executado até que o usuário escolha o botão Avançar. Quando isso acontecer, o workbench criará a instância de classe do assistente especificado na marcação e lhe transmitirá uma seleção esperada classe.
A classe identificada nesta extensão (ReadmeCreationWizard) deve implementar a interface INewWizard. A maioria dos assistentes fazem isso estendendo a plataforma classe do Assistente apesar disso ser um mecanismo de implementação e não ser exigido pelo ponto de extensão.
O assistente não faz muito, mas cria as páginas em seu interior. Vamos ver primeiramente a implementação da página e em seguida voltar ao assistente.
O workbench fornece classes de página de assistente básico que é compatível com o tipo de processamento executado para cada ponto de extensão de assistente. É possível usar essas páginas ou estendê-las para incluir processamento adicional.
O objetivo do ReadmeCreationWizard é criar um novo arquivo, incluir o conteúdo necessário no arquivo e como uma opção, abrir um editor no arquivo. Nossa página precisa definir os controles que permitem ao usuário especificar o conteúdo que vai no arquivo e se deveria ser lançado um editor.
Criamos a página de assistente, CreateReadmePage1, estendendo WizardNewFileCreationPage. Os controles de uma página de assistente são definidos de forma similar à definição dos controles de uma exibição ou de um editor. A página implementa um método createControl, criando os SWT widgets necessários como filho da Composite fornecida. Uma vez que a super classe já inclui widgets compatíveis com o processamento de novos arquivos, precisamos somente estender o método createControl na nossa página do assistente para incluir as caixas de entrada adicionais que controlam a geração de seções e a abertura do editor.
public void createControl(Composite parent) {
// contêiner de padrão herdado e widgets de especificação do nome
super.createControl(parent);
Composite composite = (Composite)getControl();
...
// grupo de geração de seção de amostra
Group group = new Group(composite,SWT.NONE);
group.setLayout(new GridLayout());
group.setText("Geração automática de amostra de seção");
group.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL |
GridData.HORIZONTAL_ALIGN_FILL));
...
// amostra de caixas de entrada de geração de seção
sectionCheckbox = new Button(group,SWT.CHECK);
sectionCheckbox.setText("Geração de amostras de títulos de seção");
sectionCheckbox.setSelection(true);
sectionCheckbox.addListener(SWT.Selection,this);
subsectionCheckbox = new Button(group,SWT.CHECK);
subsectionCheckbox.setText("Geração de amostras de títulos de seções filhas");
subsectionCheckbox.setSelection(true);
subsectionCheckbox.addListener(SWT.Selection,this);
...
// abrir arquivo de edição da caixa de entrada
openFileCheckbox = new Button(composite,SWT.CHECK);
openFileCheckbox.setText("Abrir arquivos para edição ao concluir");
openFileCheckbox.setSelection(true);
...
}
Você estará apto a seguir esse código se conhecer os conceitos no Kit de Ferramentas Padrão de Widgets.
Os padrões básicos para implementar uma página incluem:
Adicionar atendentes a todos os controles que afetem o comportamento dinâmico da página. Por exemplo, se selecionar um item em uma lista ou marcar uma caixa afetar o estado de outros controles da página, inclua um atendente para poder alterar o estado da página.
Ocupe os controles com dados com base na seleção que existia quando o assistente foi lançado. Alguns dados podem depender dos valores em outros controles. Alguns controles podem utilizar definições de diálogo para inicializar seus valores.
Utilize setPageComplete(true) quando o usuário fornecer informações suficientes para sair da página (e vá para a próxima página ou finalize o assistente.)
A classe ReadmeCreationPage herda grande parte deste comportamento do WizardNewFileCreationPage. Procure a implementação dessas classes para obter mais informações.
Agora que entendemos o que a página faz, voltemos ao assistente.
O assistente é responsável por criar as páginas e fornecer a lógica "concluir".
Os padrões básicos para implementar um assistente incluem:
Implementar o método init para configurar variáveis locais de informações de contexto como o workbench e a seleção atual.
public void init(IWorkbench workbench,IStructuredSelection selection) {
this.workbench = workbench;
this.selection = selection;
setWindowTitle("Novo Arquivo Leiame");
setDefaultPageImageDescriptor(ReadmeImages.README_WIZARD_BANNER);
}
Implemente addPages criando ocorrências das páginas.
public void addPages() {
mainPage = new ReadmeCreationPage(workbench, selection);
addPage(mainPage);
}
Implemente performFinish para concluir a tarefa.
Os assistentes de páginas múltiplas normalmente tratam a lógica de conclusão no próprio assistente, uma vez que cada página irá contribuir com informações que determinam como a tarefa é implementada. Os assistentes de página única podem implementar a lógica no assistente ou pedir que a página conclua o trabalho. A abordagem assumida depende muito de onde seu estado importante é mantido. No caso do assistente leiame, solicitaremos nossa página para tratar o processamento da finalização.
public boolean performFinish() {
return mainPage.finish();
}
O assistente concluído aparece dessa forma: