com.ecfeed.ui.dialogs.GeneratorSetupDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.ecfeed.ui.dialogs.GeneratorSetupDialog.java

Source

/*******************************************************************************
 *
 * Copyright (c) 2016 ecFeed AS.                                                
 * All rights reserved. This program and the accompanying materials              
 * are 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 
 *  
 *******************************************************************************/

package com.ecfeed.ui.dialogs;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeNodeContentProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
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.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;

import com.ecfeed.core.adapter.EImplementationStatus;
import com.ecfeed.core.adapter.IImplementationStatusResolver;
import com.ecfeed.core.generators.DoubleParameter;
import com.ecfeed.core.generators.GeneratorFactory;
import com.ecfeed.core.generators.IntegerParameter;
import com.ecfeed.core.generators.NWiseGenerator;
import com.ecfeed.core.generators.api.GeneratorException;
import com.ecfeed.core.generators.api.IGenerator;
import com.ecfeed.core.generators.api.IGeneratorParameter;
import com.ecfeed.core.generators.api.IGeneratorParameter.TYPE;
import com.ecfeed.core.model.AbstractNode;
import com.ecfeed.core.model.ChoiceNode;
import com.ecfeed.core.model.ChoicesParentNode;
import com.ecfeed.core.model.Constraint;
import com.ecfeed.core.model.ConstraintNode;
import com.ecfeed.core.model.MethodNode;
import com.ecfeed.core.model.MethodParameterNode;
import com.ecfeed.core.model.ModelHelper;
import com.ecfeed.core.serialization.export.ExportTemplateFactory;
import com.ecfeed.core.serialization.export.IExportTemplate;
import com.ecfeed.core.utils.JavaTypeHelper;
import com.ecfeed.core.utils.StringHolder;
import com.ecfeed.ui.common.ApplyValueMode;
import com.ecfeed.ui.common.CommonConstants;
import com.ecfeed.ui.common.EclipseImplementationStatusResolver;
import com.ecfeed.ui.common.Messages;
import com.ecfeed.ui.common.NodeNameColumnLabelProvider;
import com.ecfeed.ui.common.TreeCheckStateListener;
import com.ecfeed.ui.common.utils.IFileInfoProvider;
import com.ecfeed.ui.dialogs.TestCasesExportDialog.FileCompositeVisibility;
import com.ecfeed.ui.dialogs.basic.DialogObjectToolkit;
import com.ecfeed.ui.editor.IValueApplier;

public abstract class GeneratorSetupDialog extends TitleAreaDialog {
    private Combo fTestSuiteCombo;
    private Combo fGeneratorCombo;
    private Button fOkButton;
    private MethodNode fMethod;
    private String fTestSuiteName;
    private CheckboxTreeViewer fParametersViewer;
    private CheckboxTreeViewer fConstraintsViewer;
    private List<List<ChoiceNode>> fAlgorithmInput;
    private Collection<Constraint> fConstraints;
    private IGenerator<ChoiceNode> fSelectedGenerator;
    private Map<String, Object> fParameters;
    private Composite fParametersComposite;
    private Composite fMainContainer;
    private GeneratorFactory<ChoiceNode> fGeneratorFactory;
    private boolean fGenerateExecutableContent;
    private IImplementationStatusResolver fStatusResolver;
    private IFileInfoProvider fFileInfoProvider;
    private Combo fExportFormatCombo;
    private Text fTargetFileText;
    private int fContent;
    private String fTargetFile;
    private ExportTemplateFactory fExportTemplateFactory;
    private IExportTemplate fExportTemplate;
    DialogObjectToolkit.FileSelectionComposite fExportFileSelectionComposite;

    public final static int CONSTRAINTS_COMPOSITE = 1;
    public final static int CHOICES_COMPOSITE = 1 << 1;
    public final static int TEST_SUITE_NAME_COMPOSITE = 1 << 2;
    public final static int GENERATOR_SELECTION_COMPOSITE = 1 << 3;
    public final static int TEST_CASES_EXPORT_COMPOSITE = 1 << 4;

    public GeneratorSetupDialog(Shell parentShell, MethodNode method, boolean generateExecutables,
            IFileInfoProvider fileInfoProvider, ExportTemplateFactory exportTemplateFactory, String targetFile) {

        super(parentShell);
        setHelpAvailable(false);
        setShellStyle(SWT.BORDER | SWT.RESIZE | SWT.TITLE | SWT.APPLICATION_MODAL);

        fMethod = method;
        fGeneratorFactory = new GeneratorFactory<ChoiceNode>();
        fGenerateExecutableContent = generateExecutables;

        fStatusResolver = new EclipseImplementationStatusResolver(fileInfoProvider);
        fFileInfoProvider = fileInfoProvider;

        fTargetFile = null;

        fExportTemplateFactory = exportTemplateFactory;

        if (fExportTemplateFactory != null) {
            fExportTemplate = exportTemplateFactory.createDefaultTemplate();
        }

        fTargetFile = targetFile;
    }

    protected abstract String getDialogTitle();

    protected abstract int getContent();

    public List<List<ChoiceNode>> getAlgorithmInput() {
        return fAlgorithmInput;
    }

    public Collection<Constraint> getConstraints() {
        return fConstraints;
    }

    public String getTestSuiteName() {
        return fTestSuiteName;
    }

    public IGenerator<ChoiceNode> getSelectedGenerator() {
        return fSelectedGenerator;
    }

    public Map<String, Object> getGeneratorParameters() {
        return fParameters;
    }

    public String getExportTemplate() {
        return fExportTemplate.getTemplateText();
    }

    @Override
    public Point getInitialSize() {
        return new Point(600, 800);
    }

    @Override
    public void okPressed() {
        if (fTargetFileText != null) {
            fTargetFile = fTargetFileText.getText();

            if (!TestCasesExportDialog.canOverwriteFile(fTargetFile)) {
                return;
            }

        } else {
            fTargetFile = null;
        }

        saveAlgorithmInput();
        saveConstraints();
        super.okPressed();
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        fOkButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        if (fGenerateExecutableContent) {
            for (MethodParameterNode parameter : fMethod.getMethodParameters()) {
                EImplementationStatus parameterStatus = fStatusResolver.getImplementationStatus(parameter);
                if ((parameter.getChoices().isEmpty()
                        && (parameter.isExpected() == false || JavaTypeHelper.isUserType(parameter.getType())))
                        || parameterStatus == EImplementationStatus.NOT_IMPLEMENTED) {
                    setOkButtonStatus(false);
                    break;
                }
            }
        } else {
            for (MethodParameterNode parameter : fMethod.getMethodParameters()) {
                if (parameter.getChoicesWithCopies().isEmpty()
                        && (parameter.isExpected() == false || JavaTypeHelper.isUserType(parameter.getType()))) {
                    setOkButtonStatus(false);
                    break;
                }
            }
        }

        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);

        updateOkButtonAndErrorMsg();
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        setTitle(getDialogTitle());
        setMessage(getDialogMessage());
        Composite area = (Composite) super.createDialogArea(parent);
        fMainContainer = new Composite(area, SWT.NONE);
        fMainContainer.setLayout(new GridLayout(1, false));
        fMainContainer.setLayoutData(new GridData(GridData.FILL_BOTH));

        createContent();
        return area;
    }

    private void createContent() {
        fContent = getContent();

        if (isContentFlagOn(CONSTRAINTS_COMPOSITE)) {
            createConstraintsComposite(fMainContainer);
        }
        if (isContentFlagOn(CHOICES_COMPOSITE)) {
            createChoicesComposite(fMainContainer);
        }
        if (isContentFlagOn(TEST_SUITE_NAME_COMPOSITE)) {
            createTestSuiteComposite(fMainContainer);
        }
        if (isContentFlagOn(GENERATOR_SELECTION_COMPOSITE)) {
            createGeneratorSelectionComposite(fMainContainer);
        }
        if (isContentFlagOn(TEST_CASES_EXPORT_COMPOSITE)) {
            createTestCasesExportComposite(fMainContainer);
        }
    }

    protected String getDialogMessage() {
        final String DIALOG_GENERATE_TEST_SUITE_MESSAGE = "Configure test data generation.";
        return DIALOG_GENERATE_TEST_SUITE_MESSAGE;
    }

    private boolean isContentFlagOn(int flag) {

        if ((fContent & flag) > 0) {
            return true;
        }
        return false;
    }

    private void createConstraintsComposite(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        Label selectConstraintsLabel = new Label(composite, SWT.NONE);
        selectConstraintsLabel.setText(Messages.DIALOG_GENERATE_TEST_SUITES_SELECT_CONSTRAINTS_LABEL);

        createConstraintsViewer(composite);

        createConstraintsButtons(composite);
    }

    private void createConstraintsViewer(Composite parent) {
        Tree tree = new Tree(parent, SWT.CHECK | SWT.BORDER);
        tree.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));
        fConstraintsViewer = new CheckboxTreeViewer(tree);
        fConstraintsViewer.setContentProvider(new ConstraintsViewerContentProvider());
        fConstraintsViewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof String) {
                    return (String) element;
                }
                if (element instanceof Constraint) {
                    return ((Constraint) element).toString();
                }
                return null;
            }
        });
        fConstraintsViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        fConstraintsViewer.setInput(fMethod);
        fConstraintsViewer.addCheckStateListener(new TreeCheckStateListener(fConstraintsViewer));
        fConstraintsViewer.expandAll();
        for (String constraint : fMethod.getConstraintsNames()) {
            fConstraintsViewer.setSubtreeChecked(constraint, true);
        }
        fConstraintsViewer.collapseAll();
    }

    private void createConstraintsButtons(Composite parent) {
        Composite buttonsComposite = new Composite(parent, SWT.NONE);
        buttonsComposite.setLayout(new FillLayout(SWT.HORIZONTAL));
        Button checkAllButton = new Button(buttonsComposite, SWT.NONE);
        checkAllButton.setText("Check all");
        checkAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                for (String name : fMethod.getConstraintsNames()) {
                    fConstraintsViewer.setSubtreeChecked(name, true);
                }
            }
        });

        Button uncheckAllButton = new Button(buttonsComposite, SWT.NONE);
        uncheckAllButton.setText("Uncheck all");
        uncheckAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                for (String name : fMethod.getConstraintsNames()) {
                    fConstraintsViewer.setSubtreeChecked(name, false);
                }
            }
        });
    }

    private void createChoicesComposite(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        Label selectChoicesLabel = new Label(composite, SWT.WRAP);
        selectChoicesLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
        selectChoicesLabel.setText(Messages.DIALOG_GENERATE_TEST_SUITES_SELECT_CHOICES_LABEL);

        createChoicesViewer(composite);
    }

    private void createChoicesViewer(Composite parent) {
        final Tree tree = new Tree(parent, SWT.CHECK | SWT.BORDER);
        tree.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));
        fParametersViewer = new CheckboxTreeViewer(tree);
        fParametersViewer.setContentProvider(new ParametersContentProvider());
        fParametersViewer.setLabelProvider(new NodeNameColumnLabelProvider());
        fParametersViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        fParametersViewer.setInput(fMethod);
        fParametersViewer.addCheckStateListener(new ChoiceTreeCheckStateListener(fParametersViewer));
        for (MethodParameterNode parameter : fMethod.getMethodParameters()) {
            fParametersViewer.expandAll();
            fParametersViewer.setSubtreeChecked(parameter, true);
            fParametersViewer.collapseAll();
        }
    }

    private void createTestSuiteComposite(Composite container) {
        Composite composite = new Composite(container, SWT.NONE);
        composite.setLayout(new GridLayout(2, false));
        composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        Label testSuiteLabel = new Label(composite, SWT.NONE);
        testSuiteLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        testSuiteLabel.setText("Test suite");

        ComboViewer testSuiteViewer = new ComboViewer(composite, SWT.NONE);
        fTestSuiteCombo = testSuiteViewer.getCombo();
        fTestSuiteCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        fTestSuiteCombo.setItems(fMethod.getTestSuites().toArray(new String[] {}));
        fTestSuiteCombo.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                updateOkButtonAndErrorMsg();
            }
        });
        fTestSuiteCombo.setText(CommonConstants.DEFAULT_NEW_TEST_SUITE_NAME);
    }

    private void updateOkButtonAndErrorMsg() {
        StringHolder message = new StringHolder();

        if (validateDialogFields(message)) {
            setOkButtonStatus(true);
            setErrorMessage(null);
            return;
        }
        setOkButtonStatus(false);
        setErrorMessage(message.get());
    }

    private boolean validateDialogFields(StringHolder message) {
        if (!validateTestSuiteName(message)) {
            return false;
        }
        if (!validateMethodParameters(fGenerateExecutableContent, message)) {
            return false;
        }
        if (!validateTargetFileText(message)) {
            return false;
        }
        return true;
    }

    private boolean validateTestSuiteName(StringHolder message) {
        boolean testSuiteValid = true;

        if (fTestSuiteCombo != null && fTestSuiteCombo.isDisposed() == false) {
            testSuiteValid = ModelHelper.isValidTestCaseName(fTestSuiteCombo.getText());
            if (testSuiteValid) {
                fTestSuiteName = fTestSuiteCombo.getText();
            }
        }

        if (!testSuiteValid) {
            final String MSG_TEST_SUITE_NAME_INVALID = "Test suite name is invalid.";
            message.set(MSG_TEST_SUITE_NAME_INVALID);
            return false;
        }
        return true;
    }

    private boolean validateMethodParameters(boolean onlyExecutable, StringHolder message) {

        for (MethodParameterNode parameter : fMethod.getMethodParameters()) {
            if (!validateOneParameter(parameter, onlyExecutable, message)) {
                return false;
            }
        }

        return true;
    }

    private boolean validateOneParameter(MethodParameterNode parameter, boolean onlyExecutable,
            StringHolder message) {

        if (parameter.isExpected()) {
            if (!validateExpectedParameter(parameter, message)) {
                return false;
            }
            return true;
        }

        return validateChoices(parameter, onlyExecutable, message);
    }

    private boolean validateExpectedParameter(MethodParameterNode parameter, StringHolder message) {
        if (!fParametersViewer.getChecked(parameter)) {
            final String MSG_EXPECTED_SHOULD_BE_CHECKED = "Expected parameter: %s should be checked.";
            message.set(String.format(MSG_EXPECTED_SHOULD_BE_CHECKED, parameter.getName()));
            return false;
        }
        return true;
    }

    private boolean validateChoices(MethodParameterNode parameter, boolean onlyExecutable, StringHolder message) {
        boolean checkedChoiceFound = false;
        boolean choiceFound = false;

        for (ChoiceNode choice : parameter.getLeafChoicesWithCopies()) {
            choiceFound = true;
            checkedChoiceFound |= fParametersViewer.getChecked(choice);

            if (!validateChoiceImplementationStatus(choice, onlyExecutable, message)) {
                return false;
            }
        }

        if (!choiceFound) {
            final String MSG_NO_CHOICES = "There are no choices for parameter: %s.";
            message.set(String.format(MSG_NO_CHOICES, parameter.getName()));
            return false;
        }

        if (!checkedChoiceFound) {
            final String MSG_AT_LEAST_ONE_CHOICE = "At least one choice for parameter: %s must be checked.";
            message.set(String.format(MSG_AT_LEAST_ONE_CHOICE, parameter.getName()));
            return false;
        }

        return true;
    }

    private boolean validateChoiceImplementationStatus(ChoiceNode choice, boolean onlyExecutable,
            StringHolder message) {
        if (!onlyExecutable) {
            return true;
        }
        if (!fFileInfoProvider.isProjectAvailable()) {
            return true;
        }
        EImplementationStatus status = fStatusResolver.getImplementationStatus(choice);
        if (status == EImplementationStatus.IMPLEMENTED) {
            return true;
        }

        final String MSG_NOT_IMPLEMENTED = "Choice: %s must be implemented.";
        message.set(String.format(MSG_NOT_IMPLEMENTED, choice.getName()));
        return false;
    }

    private boolean validateTargetFileText(StringHolder message) {
        if (!isContentFlagOn(TEST_CASES_EXPORT_COMPOSITE)) {
            return true;
        }
        if (fTargetFileText == null || fTargetFileText.getText().isEmpty()) {
            final String MSG_FILE_EMPTY = "Field: Export target file is empty.";
            message.set(MSG_FILE_EMPTY);
            return false;
        }
        return true;
    }

    private void setOkButtonStatus(boolean enabled) {
        if (fOkButton != null && !fOkButton.isDisposed()) {
            fOkButton.setEnabled(enabled);
        }
    }

    private void createGeneratorSelectionComposite(Composite container) {
        Composite generatorComposite = new Composite(container, SWT.NONE);
        generatorComposite.setLayout(new GridLayout(2, false));
        generatorComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        Label generatorLabel = new Label(generatorComposite, SWT.NONE);
        generatorLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        generatorLabel.setText("Generator");

        createGeneratorViewer(generatorComposite);
    }

    private void createTestCasesExportComposite(Composite parentComposite) {

        DialogObjectToolkit.createRowComposite(parentComposite);
        Composite advancedButtonComposite = DialogObjectToolkit.createRowComposite(parentComposite);

        DialogObjectToolkit.createGridButton(advancedButtonComposite, "Advanced...",
                new ExportDefinitionSelectionAdapter());

        createExportTemplateCombo(parentComposite);
        createFileSelectionComposite(parentComposite);
    }

    private void createExportTemplateCombo(Composite composite) {
        final String DEFINE_TEMPLATE = "Template: ";
        DialogObjectToolkit.createLabel(composite, DEFINE_TEMPLATE);

        fExportFormatCombo = DialogObjectToolkit.createReadOnlyGridCombo(composite,
                new ExportFormatComboValueApplier(), ApplyValueMode.ON_SELECTION_ONLY);

        String[] exportFormats = ExportTemplateFactory.getAvailableExportFormats();
        fExportFormatCombo.setItems(exportFormats);

        String format = fExportTemplate.getTemplateFormat();
        fExportFormatCombo.setText(format);
    }

    private void createFileSelectionComposite(Composite parentComposite) {
        final String TARGET_FILE = "Export target file";

        fExportFileSelectionComposite = DialogObjectToolkit.createFileSelectionComposite(parentComposite,
                TARGET_FILE, getExportFileExtensions(), new ExportFileModifyListener());

        fTargetFileText = fExportFileSelectionComposite.getTextField();

        if (fTargetFile != null) {
            fTargetFileText.setText(fTargetFile);
        }
    }

    public String getTargetFile() {
        return fTargetFile;
    }

    private void createGeneratorViewer(final Composite parent) {
        final GeneratorFactory<ChoiceNode> generatorFactory = new GeneratorFactory<>();
        ComboViewer generatorViewer = new ComboViewer(parent, SWT.READ_ONLY);
        fGeneratorCombo = generatorViewer.getCombo();
        fGeneratorCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        fGeneratorCombo.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                try {
                    fSelectedGenerator = generatorFactory.getGenerator(fGeneratorCombo.getText());
                    correctionForMethodWithOneParam(fGeneratorCombo.getText());

                    createParametersComposite(parent, fSelectedGenerator.parameters());
                    fMainContainer.layout();
                } catch (GeneratorException exception) {
                    exception.printStackTrace();
                    fGeneratorCombo.setText("");
                }
            }
        });
        if (fGeneratorFactory.availableGenerators().size() > 0) {
            String[] availableGenerators = generatorFactory.availableGenerators().toArray(new String[] {});
            for (String generator : availableGenerators) {
                fGeneratorCombo.add(generator);
            }
            fGeneratorCombo.select(0);
            setOkButtonStatus(true);
        }
    }

    private void correctionForMethodWithOneParam(String generatorName) throws GeneratorException {
        if (fMethod.getParameters().size() != 1) {
            return;
        }
        if (!generatorName.equals(GeneratorFactory.GEN_TYPE_N_WISE)) {
            return;
        }

        for (IGeneratorParameter parameter : fSelectedGenerator.parameters()) {
            String parameterName = parameter.getName();
            if (parameterName.equals(NWiseGenerator.N_PARAMETER_NAME)) {
                IntegerParameter intParameter = (IntegerParameter) parameter;
                intParameter.setDefaultValue(1);
                break;
            }
        }
    }

    private void createParametersComposite(Composite parent, List<IGeneratorParameter> parameters) {
        fParameters = new HashMap<String, Object>();
        if (fParametersComposite != null && !fParametersComposite.isDisposed()) {
            fParametersComposite.dispose();
        }
        fParametersComposite = new Composite(parent, SWT.NONE);
        fParametersComposite.setLayout(new GridLayout(2, false));
        fParametersComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
        for (IGeneratorParameter parameter : parameters) {
            createParameterEdit(fParametersComposite, parameter);
        }
        parent.layout();
    }

    private void createParameterEdit(Composite parent, IGeneratorParameter definition) {
        fParameters.put(definition.getName(), definition.defaultValue());
        if (definition.getType() == TYPE.BOOLEAN) {
            createBooleanParameterEdit(parent, definition);
        } else {
            new Label(parent, SWT.LEFT).setText(definition.getName());
            if (definition.allowedValues() != null) {
                createComboParameterEdit(parent, definition);
            } else {
                switch (definition.getType()) {
                case INTEGER:
                    createIntegerParameterEdit(parent, (IntegerParameter) definition);
                    break;
                case DOUBLE:
                    createDoubleParameterEdit(parent, (DoubleParameter) definition);
                    break;
                case STRING:
                    createStringParameterEdit(parent, definition);
                    break;
                default:
                    break;
                }
            }
        }
    }

    private void createBooleanParameterEdit(Composite parent, final IGeneratorParameter definition) {
        final Button checkButton = new Button(parent, SWT.CHECK);
        checkButton.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
        checkButton.setText(definition.getName());
        checkButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                fParameters.put(definition.getName(), checkButton.getSelection());
            }
        });
        checkButton.pack();
    }

    private void createComboParameterEdit(Composite parent, final IGeneratorParameter definition) {
        final Combo combo = new Combo(parent, SWT.CENTER | SWT.READ_ONLY);
        ModifyListener listener = new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                switch (definition.getType()) {
                case INTEGER:
                    fParameters.put(definition.getName(), Integer.parseInt(combo.getText()));
                    break;
                case DOUBLE:
                    fParameters.put(definition.getName(), Double.parseDouble(combo.getText()));
                    break;
                case STRING:
                    fParameters.put(definition.getName(), combo.getText());
                    break;
                default:
                    break;
                }
            }
        };
        combo.setItems(allowedValuesItems(definition));
        combo.setText(definition.defaultValue().toString());
        combo.addModifyListener(listener);
    }

    private String[] allowedValuesItems(IGeneratorParameter definition) {
        List<String> values = new ArrayList<String>();
        for (Object value : definition.allowedValues()) {
            values.add(value.toString());
        }
        return values.toArray(new String[] {});
    }

    private void createIntegerParameterEdit(Composite parent, final IntegerParameter definition) {
        final Spinner spinner = new Spinner(parent, SWT.BORDER | SWT.RIGHT);
        spinner.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                fParameters.put(definition.getName(), spinner.getSelection());
            }
        });
        spinner.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        spinner.setValues((int) definition.defaultValue(), definition.getMin(), definition.getMax(), 0, 1, 1);
    }

    private void createDoubleParameterEdit(Composite parent, final DoubleParameter definition) {
        final Spinner spinner = new Spinner(parent, SWT.BORDER);
        final int FLOAT_DECIMAL_PLACES = 3;
        spinner.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                int selection = spinner.getSelection();
                int digits = spinner.getDigits();
                fParameters.put(definition.getName(), selection / (Math.pow(10, digits)));
            }
        });
        spinner.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        int factor = (int) Math.pow(10, FLOAT_DECIMAL_PLACES);
        int defaultValue = (int) Math.round((double) definition.defaultValue() * factor);
        int minValue = (int) Math.round(definition.getMin() * factor);
        int maxValue = (int) Math.round(definition.getMax());
        spinner.setValues(defaultValue, minValue, maxValue, FLOAT_DECIMAL_PLACES, 1, 100);
    }

    private void createStringParameterEdit(Composite parent, final IGeneratorParameter definition) {
        final Text text = new Text(parent, SWT.NONE);
        text.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                fParameters.put(definition.getName(), text.getText());
            }
        });
        text.setText((String) definition.defaultValue());
    }

    private void saveConstraints() {
        Object[] checkedObjects = fConstraintsViewer.getCheckedElements();
        List<Constraint> constraints = new ArrayList<Constraint>();
        for (Object obj : checkedObjects) {
            if (obj instanceof Constraint) {
                constraints.add((Constraint) obj);
            }
        }

        fConstraints = constraints;
    }

    private void saveAlgorithmInput() {
        List<MethodParameterNode> parameters = fMethod.getMethodParameters();
        fAlgorithmInput = new ArrayList<List<ChoiceNode>>();
        for (int i = 0; i < parameters.size(); i++) {
            List<ChoiceNode> choices = new ArrayList<ChoiceNode>();
            if (parameters.get(i).isExpected()) {
                choices.add(expectedValueChoice(parameters.get(i)));
            } else {
                for (ChoiceNode choice : parameters.get(i).getLeafChoicesWithCopies()) {
                    if (fParametersViewer.getChecked(choice)) {
                        choices.add(choice);
                    }
                }
            }
            fAlgorithmInput.add(choices);
        }
    }

    private ChoiceNode expectedValueChoice(MethodParameterNode c) {
        ChoiceNode p = new ChoiceNode("", c.getDefaultValue());
        p.setParent(c);
        return p;
    }

    public String[] getExportFileExtensions() {

        String fileExtension = fExportTemplate.getFileExtension();
        String[] extensionsFilter = { "*." + fileExtension, "*.*" };

        return extensionsFilter;
    }

    private class ChoiceTreeCheckStateListener extends TreeCheckStateListener {

        public ChoiceTreeCheckStateListener(CheckboxTreeViewer treeViewer) {
            super(treeViewer);
        }

        @Override
        public void checkStateChanged(CheckStateChangedEvent event) {
            super.checkStateChanged(event);
            if (event.getElement() instanceof MethodParameterNode
                    && ((MethodParameterNode) event.getElement()).isExpected()) {
                fParametersViewer.setChecked(event.getElement(), true);
            } else {
                updateOkButtonAndErrorMsg();
            }
        }
    }

    private class ParametersContentProvider extends TreeNodeContentProvider implements ITreeContentProvider {
        @Override
        public Object[] getElements(Object input) {
            if (input instanceof MethodNode) {
                return ((MethodNode) input).getParameters().toArray();
            }
            return null;
        }

        @Override
        public Object[] getChildren(Object element) {
            List<Object> noChildren = new ArrayList<Object>();

            if (isExpectedMethodParameter(element)) {
                return noChildren.toArray();
            }
            if (element instanceof ChoicesParentNode) {
                return getChoices(element).toArray();
            }
            return noChildren.toArray();
        }

        private boolean isExpectedMethodParameter(Object element) {
            if (!(element instanceof MethodParameterNode)) {
                return false;
            }
            if (!((MethodParameterNode) element).isExpected()) {
                return false;
            }
            return true;
        }

        private List<Object> getChoices(Object element) {
            List<Object> children = new ArrayList<Object>();
            ChoicesParentNode parent = (ChoicesParentNode) element;

            if (fGenerateExecutableContent) {
                addImplementedChoices(parent, children);
                return children;
            }

            children.addAll(parent.getChoicesWithCopies());
            return children;
        }

        private void addImplementedChoices(ChoicesParentNode parent, List<Object> children) {
            for (ChoiceNode child : parent.getChoicesWithCopies()) {
                if (fStatusResolver.getImplementationStatus(child) != EImplementationStatus.NOT_IMPLEMENTED) {
                    children.add(child);
                }
            }
        }

        @Override
        public Object getParent(Object element) {
            if (element instanceof AbstractNode) {
                return ((AbstractNode) element).getParent();
            }
            return null;
        }

        @Override
        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }
    }

    private class ConstraintsViewerContentProvider extends TreeNodeContentProvider implements ITreeContentProvider {
        private final Object[] EMPTY_ARRAY = new Object[] {};

        @Override
        public Object[] getElements(Object input) {
            if (input instanceof MethodNode) {
                return fMethod.getConstraintsNames().toArray();
            }
            return EMPTY_ARRAY;
        }

        @Override
        public Object[] getChildren(Object element) {
            if (element instanceof String) {
                Object[] result = fMethod.getConstraints((String) element).toArray();
                return result;
            }
            return EMPTY_ARRAY;
        }

        @Override
        public Object getParent(Object element) {
            if (element instanceof ConstraintNode) {
                return ((ConstraintNode) element).getName();
            }
            return null;
        }

        @Override
        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }
    }

    private class ExportDefinitionSelectionAdapter extends SelectionAdapter {
        @Override
        public void widgetSelected(SelectionEvent e) {

            TestCasesExportDialog dialog = new TestCasesExportDialog(FileCompositeVisibility.NOT_VISIBLE,
                    fExportTemplateFactory, fExportTemplate, fTargetFile, fMethod.getParametersCount(), null);

            if (dialog.open() != IDialogConstants.OK_ID) {
                return;
            }

            fExportTemplate = dialog.getExportTemplate();
            fExportFormatCombo.setText(fExportTemplate.getTemplateFormat());
        }
    }

    class ExportFileModifyListener implements ModifyListener {
        @Override
        public void modifyText(ModifyEvent e) {
            updateOkButtonAndErrorMsg();
        }
    }

    private class ExportFormatComboValueApplier implements IValueApplier {

        @Override
        public void applyValue() {

            String exportFormat = fExportFormatCombo.getText();
            fExportTemplate = fExportTemplateFactory.createTemplate(exportFormat);

            fExportFileSelectionComposite.setFileExtensionsFilter(getExportFileExtensions());
        }

    }

}