/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.windup.ui.internal.launch;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.jboss.tools.windup.core.services.WindupOptionsService;
import org.jboss.tools.windup.model.domain.ModelService;
import org.jboss.tools.windup.ui.internal.Messages;
import org.jboss.tools.windup.ui.internal.launch.OptionUiFacades.OptionUiFacade;
import org.jboss.tools.windup.windup.ConfigurationElement;
import org.jboss.windup.bootstrap.help.OptionDescription;
public class OptionsDialog extends Dialog {
private ModelService modelService;
private WindupOptionsService optionsService;
private Label optionLabel;
private Combo optionCombo;
private Composite stackComposite;
private OptionsWidgetManager widgetManager;
private OptionUiFacade selectedOption;
private ConfigurationElement configuration;
public OptionsDialog(Shell shell, ModelService modelService,
WindupOptionsService optionsService, ConfigurationElement configuration) {
super(shell);
this.modelService = modelService;
this.optionsService = optionsService;
this.configuration = configuration;
}
private void loadHelp(Composite parent) {
optionsService.loadOptions(() -> {
this.widgetManager = new OptionsWidgetManager(modelService.getOptionFacadeManager(),
parent, configuration, () -> {
updateButtons();
});
for (String option : widgetManager.getOptions()) {
optionCombo.add(option);
}
});
}
@Override
protected Control createDialogArea(Composite parent) {
Composite comp = (Composite) super.createDialogArea(parent);
((GridLayout) comp.getLayout()).numColumns = 1;
Composite container = new Composite(comp, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(2).applyTo(container);
GridDataFactory.fillDefaults().grab(true, false).hint(400, SWT.DEFAULT).applyTo(container);
optionLabel = new Label(container, SWT.NONE);
optionLabel.setText(Messages.OPTION+":");
optionLabel.setFont(comp.getFont());
GridDataFactory.fillDefaults().hint(50, SWT.DEFAULT).align(SWT.RIGHT, SWT.CENTER).applyTo(optionLabel);
optionCombo = new Combo(container, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
GridDataFactory.fillDefaults().grab(true, false).applyTo(optionCombo);
optionCombo.setFont(comp.getFont());
stackComposite = new Composite(comp, SWT.NONE);
stackComposite.setLayout(new StackLayout());
GridDataFactory.fillDefaults().grab(true, true).hint(400, /*25*/100).applyTo(stackComposite);
loadHelp(stackComposite);
optionCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String selection = widgetManager.getOptions().get(optionCombo.getSelectionIndex());
OptionUiFacade selectedOption = widgetManager.getOptionUiFacade(selection);
selectedOption.setFocus();
Control top = selectedOption.getControl();
OptionsDialog.this.selectedOption = selectedOption;
((StackLayout)stackComposite.getLayout()).topControl = top;
stackComposite.layout(true, true);
updateButtons();
}
});
return comp;
}
@Override
protected void buttonPressed(int buttonId) {
if (buttonId != IDialogConstants.OK_ID) {
this.selectedOption = null;
}
super.buttonPressed(buttonId);
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(Messages.windupOption);
}
protected void updateButtons() {
boolean enabled = this.selectedOption != null ? this.selectedOption.isValid() : false;
getButton(IDialogConstants.OK_ID).setEnabled(enabled);
}
public OptionDescription getSelectedOption() {
return this.selectedOption.getOptionDescription();
}
public String getSelectedOptionValue() {
return this.selectedOption.getValue();
}
@Override
public void create() {
super.create();
updateButtons();
}
}