2009-06-05 12 views
13

Necesito un asistente cuyo contenido de la segunda página depende de la selección de la primera página. La primera página le pregunta al usuario el "tipo" de filtro que quiere crear y la segunda le pide al usuario que cree una instancia de filtro del "tipo" seleccionado.Asistentes de Eclipse JFace

Los contenidos de las páginas de asistentes de JFace (método createControl (...)) se crean cuando el asistente está abierto y no cuando se muestra una página determinada (¿esto permite que JFace conozca el tamaño del asistente?).

Debido a esto, tengo que crear el contenido de mi segunda página ANTES de que se abra el asistente, PERO no puedo, ya que el contenido de la segunda página depende de la selección de la primera página.

Por ahora la solución limpiadora que encontré consiste en crear todas las páginas (segundos) antes de que el asistente esté abierto (con su contenido) y anular el método getNextPage() en la implementación de la primera página.

El principal inconveniente de esa solución es que puede ser costoso cuando hay muchas páginas secundarias para crear.

¿Qué opinas de esa solución? ¿Cómo manejas las páginas de tu asistente? ¿Hay alguna solución más limpia que me perdí?

Respuesta

9

El enfoque es correcto si usted es varias otras páginas que son

  • uno completamente diferente con otro
  • depende de las decisiones anteriores realizadas en una página anterior

A continuación, puede add the next page dynamically (también como described here)

Pero si solo tiene una página siguiente con contenido dinámico, debe ser un ble para crear ese contenido en el onEnterPage() method

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 se muestra en la esquina artículo Eclipse Creating JFace Wizards:

podemos cambiar el orden de las páginas del asistente al sobrescribir el método getNextPage de cualquier asistente page.Before dejando el página, guardamos en el modelo los valores elegidos por el usuario. En nuestro ejemplo, dependiendo de la elección del viaje, el usuario verá luego la página con los vuelos o la página para viajar en automóvil.

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; 
} 

Nos definimos un método para hacer esto de inicialización para el PlanePage, onEnterPage() y se invoca este método cuando se mueve a la PlanePage, es decir en el método getNextPage() para la primera página.

+0

Este es un patrón muy agradable, gracias por la gran respuesta! – rooftop

5

Si desea iniciar un nuevo asistente según su selección en la primera página, puede utilizar la clase base JFace org.eclipse.jface.wizard.WizardSelectionPage.

El siguiente ejemplo muestra una lista de asistentes disponibles definidos por un punto de extensión. Al presionar Siguiente, se inicia el asistente seleccionado.

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); 

} 

La clase asistente correspondiente se parece a esto:

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); 

} 
} 
+0

He reformateado un poco tu código, si no te gusta, retrocede. – MByD

0

tengo una solución diferente.

Si la página depende del resultado de la página 1, cree una variable y páselo a la primera página, cuando esa página del asistente tenga la opción del usuario, lo último antes de cerrar la página es establecer la variable al valor requerido.

Luego pase esta variable al asistente, luego páselo a la siguiente página del asistente. Luego haga una declaración simple de if y de esa manera obtenga ambas opciones juntas.

Recuerde que en la mayoría de los códigos solo hay una pequeña diferencia en las opciones de usuario, así que recuerde no atascarse en la duplicación de su código.

1

Otra alternativa es @Override setVisible. Puede actualizar los valores de la página o agregar widgets adicionales en ese momento.

Cuestiones relacionadas