Eclipse JFace's Wizards - PullRequest
       17

Eclipse JFace's Wizards

13 голосов
/ 05 июня 2009

Мне нужен мастер, содержание второй страницы которого зависит от выбора первой страницы. Первая страница запрашивает у пользователя «вид» фильтра, который он хочет создать, а вторая просит пользователя создать один экземпляр фильтра выбранного «вида».

Содержимое страниц мастера JFace (метод createControl (...)) создается при открытии мастера, а не при отображении заданной страницы (это позволяет JFace узнать размер мастера, я полагаю ??).

Из-за этого мне нужно создать содержимое второй страницы ДО того, как откроется мастер, НО я не могу, так как содержимое второй страницы зависит от выбора первой страницы.

На данный момент более чистое решение, которое я нашел, состоит в создании всех (секунд) страниц до открытия мастера (с их содержимым) и переопределении метода getNextPage () в реализации первой страницы.

Основным недостатком этого решения является то, что оно может быть дорогостоящим, если имеется много вторых страниц для создания.

Что вы думаете об этом решении? Как вы управляете страницами вашего мастера? Есть ли какое-то более чистое решение, которое я пропустил?

Ответы [ 4 ]

9 голосов
/ 05 июня 2009

Подход правильный, если у вас есть несколько других страниц, которые

  • полностью отличается друг от друга
  • зависит от предыдущих выборов, сделанных на предыдущей странице

Затем вы можете динамически добавить следующую страницу (также как , описанное здесь )

Но если у вас есть только следующая страница с динамическим контентом, вы сможете создать этот контент методом 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();
}

Как показано в статье об угле затмения Создание мастеров JFace :

Мы можем изменить порядок страниц мастера, переписав метод getNextPage любой страницы мастера. Прежде чем покинуть страницу, мы сохраняем в модели значения, выбранные пользователем. В нашем примере, в зависимости от выбора поездки, пользователь затем увидит страницу с рейсами или страницу для путешествий на машине.

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

Мы определяем метод для этой инициализации для PlanePage, onEnterPage(), и мы вызываем этот метод при переходе к PlanePage, то есть в методе getNextPage() для первой страницы .

5 голосов
/ 05 июня 2009

Если вы хотите запустить новый мастер на основе вашего выбора на первой странице, вы можете использовать базовый класс JFace org.eclipse.jface.wizard.WizardSelectionPage .

В приведенном ниже примере показан список доступных мастеров, определенных точкой расширения. При нажатии Далее выбранный мастер запускается.

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

}

Соответствующий класс мастера выглядит так:

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

}
}
1 голос
/ 26 декабря 2016

Другой альтернативой является @Override setVisible . В это время вы можете обновить значения страниц или добавить дополнительные виджеты.

0 голосов
/ 10 мая 2013

У меня другое решение.

Если страница зависит от результата страницы 1, создайте переменную и передайте ее на первую страницу, когда на этой странице мастера есть опция от пользователя, тогда последним, перед закрытием страницы, является установка переменной на требуемое значение.

Затем передайте эту переменную мастеру, затем передайте ее на следующую страницу мастера. Затем сделайте простое утверждение if и вы получите оба варианта.

Помните, что в большинстве кодов есть только небольшая разница в пользовательских настройках, поэтому не забывайте, что вам не придется дублировать ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...