Assistentes do Eclipse JFace
Pergunta
Eu preciso de um assistente que segundo o conteúdo da página depende da escolha da primeira página. A primeira página pede ao usuário o "tipo" de filtro, ele quer criar ea segunda pede ao usuário para criar uma instância de filtro do selecionado "tipo".
JFace de assistentes páginas conteúdos (CreateControl (...) método) são criados quando o assistente é aberto e não quando uma determinada página é exibida (isto permite que JFace saber o tamanho assistente Acho ??).
Devido a isso, eu tenho que criar minha segunda conteúdo da página antes de o assistente é aberto mas não posso desde o conteúdo da segunda página depende da primeira seleção página.
Por agora, a solução mais limpa eu encontrei consiste na criação de todas (segundos) páginas antes de o assistente é aberto (com o seu conteúdo) e substituir o método getNextPage () na implementação da primeira página.
A principal desvantagem dessa solução é que ele pode ser ser caro quando existem muitas segundas páginas para criar.
O que você acha sobre essa solução? Como você gerenciar as páginas do seu assistente? Existe alguma solução mais limpa que eu perdi?
Solução
A abordagem é certa, se você várias outras páginas que são
- um completamente diferente com outro
- depende das escolhas anteriores feitas em uma página anterior
Depois, você pode adicionar a próxima página dinamicamente ( também como descrito aqui )
Mas se você tem apenas uma página seguinte com um conteúdo dinâmico, você deve ser capaz de criar esse conteúdo no método onEnterPage()
public void createControl(Composite parent)
{
//
// create the composite to hold the widgets
//
this.composite = new Composite(parent, SWT.NONE);
//
// create the desired layout for this wizard page
//
GridLayout layout = new GridLayout();
layout.numColumns = 4;
this.composite.setLayout(layout);
// set the composite as the control for this page
setControl(this.composite);
}
void onEnterPage()
{
final MacroModel model = ((MacroWizard) getWizard()).model;
String selectedKey = model.selectedKey;
String[] attrs = (String[]) model.macroMap.get(selectedKey);
for (int i = 0; i < attrs.length; i++)
{
String attr = attrs[i];
Label label = new Label(this.composite, SWT.NONE);
label.setText(attr + ":");
new Text(this.composite, SWT.NONE);
}
pack();
}
Como mostrado no artigo canto eclipse Criando JFace assistentes :
Nós podemos mudar a ordem das páginas do assistente, substituindo o método getNextPage de qualquer page.Before assistente sair da página, poupamos no modelo os valores escolhidos pelo usuário. No nosso exemplo, dependendo da escolha do curso o usuário próximo verão a página com vôos ou a página para viajar de carro.
public IWizardPage getNextPage(){
saveDataToModel();
if (planeButton.getSelection()) {
PlanePage page = ((HolidayWizard)getWizard()).planePage;
page.onEnterPage();
return page;
}
// Returns the next page depending on the selected button
if (carButton.getSelection()) {
return ((HolidayWizard)getWizard()).carPage;
}
return null;
}
definir um método para fazer isso de inicialização para o PlanePage
, onEnterPage()
e invocamos este método quando se deslocam para o PlanePage
, que está no método getNextPage()
para a primeira página .
Outras dicas
Se você deseja iniciar um novo assistente com base na sua seleção na primeira página, você pode usar a classe base JFace org.eclipse .jface.wizard.WizardSelectionPage .
O exemplo a seguir mostra uma lista de assistentes disponíveis definidas por um ponto de extensão. Quando você pressiona Próximo , o assistente selecionado é iniciado.
public class ModelSetupWizardSelectionPage extends WizardSelectionPage {
private ComboViewer providerViewer;
private IConfigurationElement selectedProvider;
public ModelSetupWizardSelectionPage(String pageName) {
super(pageName);
}
private class WizardNode implements IWizardNode {
private IWizard wizard = null;
private IConfigurationElement configurationElement;
public WizardNode(IConfigurationElement c) {
this.configurationElement = c;
}
@Override
public void dispose() {
}
@Override
public Point getExtent() {
return new Point(-1, -1);
}
@Override
public IWizard getWizard() {
if (wizard == null) {
try {
wizard = (IWizard) configurationElement
.createExecutableExtension("wizardClass");
} catch (CoreException e) {
}
}
return wizard;
}
@Override
public boolean isContentCreated() {
// TODO Auto-generated method stub
return wizard != null;
}
}
@Override
public void createControl(Composite parent) {
setTitle("Select model provider");
Composite main = new Composite(parent, SWT.NONE);
GridLayout gd = new GridLayout(2, false);
main.setLayout(gd);
new Label(main, SWT.NONE).setText("Model provider");
Combo providerList = new Combo(main, SWT.NONE);
providerViewer = new ComboViewer(providerList);
providerViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof IConfigurationElement) {
IConfigurationElement c = (IConfigurationElement) element;
String result = c.getAttribute("name");
if (result == null || result.length() == 0) {
result = c.getAttribute("class");
}
return result;
}
return super.getText(element);
}
});
providerViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (!selection.isEmpty()
&& selection instanceof IStructuredSelection) {
Object o = ((IStructuredSelection) selection)
.getFirstElement();
if (o instanceof IConfigurationElement) {
selectedProvider = (IConfigurationElement) o;
setMessage(selectedProvider.getAttribute("description"));
setSelectedNode(new WizardNode(selectedProvider));
}
}
}
});
providerViewer.setContentProvider(new ArrayContentProvider());
List<IConfigurationElement> providers = new ArrayList<IConfigurationElement>();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = registry
.getExtensionPoint(<your extension point namespace>,<extension point name>);
if (extensionPoint != null) {
IExtension extensions[] = extensionPoint.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement configurationElements[] = extension
.getConfigurationElements();
for (IConfigurationElement c : configurationElements) {
providers.add(c);
}
}
}
providerViewer.setInput(providers);
setControl(main);
}
Os correspondentes aparência de classe assistente como este:
public class ModelSetupWizard extends Wizard {
private ModelSetupWizardSelectionPage wizardSelectionPage;
public ModelSetupWizard() {
setForcePreviousAndNextButtons(true);
}
@Override
public boolean performFinish() {
// Do what you have to do to finish the wizard
return true;
}
@Override
public void addPages() {
wizardSelectionPage = new ModelSetupWizardSelectionPage("Select a wizard");
addPage(wizardSelectionPage);
}
}
Outra alternativa é @Override setVisible . Você pode atualizar valores de página ou adicionar widgets adicionais nesse momento.
Eu tenho uma solução diferente.
Se a página depende do resultado da página 1, criar uma variável e passá-lo para a primeira página, quando essa página do assistente tem a opção do usuário, então a última coisa antes que a página é fechada é definir a variável para o valor necessário.
Em seguida, passe esta variável para assistente, em seguida, passá-lo para a próxima página do assistente. Em seguida, fazer uma simples declaração se e de que maneira você tem as duas opções em conjunto.
Lembre-se que na maioria código existe apenas uma pequena diferença nas opções de usuário, então não se esqueça de se atolar em duplicar o seu código.