gov.redhawk.ide.codegen.jet.java.ui.JavaJetGeneratorPropertiesWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.ide.codegen.jet.java.ui.JavaJetGeneratorPropertiesWizardPage.java

Source

/*******************************************************************************
 * This file is protected by Copyright. 
 * Please refer to the COPYRIGHT file distributed with this source distribution.
 *
 * This file is part of REDHAWK IDE.
 *
 * 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 gov.redhawk.ide.codegen.jet.java.ui;

import gov.redhawk.codegen.validation.OutputDirectoryValidator;
import gov.redhawk.ide.codegen.CodegenFactory;
import gov.redhawk.ide.codegen.CodegenPackage;
import gov.redhawk.ide.codegen.CodegenUtil;
import gov.redhawk.ide.codegen.ICodeGeneratorDescriptor;
import gov.redhawk.ide.codegen.IPropertyDescriptor;
import gov.redhawk.ide.codegen.ITemplateDesc;
import gov.redhawk.ide.codegen.ImplementationSettings;
import gov.redhawk.ide.codegen.Property;
import gov.redhawk.ide.codegen.RedhawkCodegenActivator;
import gov.redhawk.ide.codegen.jet.java.JavaGeneratorProperties;
import gov.redhawk.ide.codegen.jet.java.JavaPackageNameValidator;
import gov.redhawk.ide.codegen.ui.ICodegenWizardPage;
import gov.redhawk.ide.codegen.ui.RedhawkCodegenUiActivator;
import gov.redhawk.ide.codegen.util.CodegenFileHelper;
import gov.redhawk.ide.spd.ui.wizard.ScaImplementationWizard2;
import gov.redhawk.ui.util.EMFEmptyStringToNullUpdateValueStrategy;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import mil.jpeojtrs.sca.spd.Implementation;
import mil.jpeojtrs.sca.spd.SoftPkg;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.core.databinding.observable.set.ISetChangeListener;
import org.eclipse.core.databinding.observable.set.SetChangeEvent;
import org.eclipse.core.databinding.observable.set.WritableSet;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.databinding.wizard.WizardPageSupport;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;

/**
 * The Class JavaJetGeneratorPropertiesWizardPage.
 * 
 * @since 2.0
 */
public class JavaJetGeneratorPropertiesWizardPage extends WizardPage implements ICodegenWizardPage {

    private static final int TOOLTIP_DELAY_MILLIS = 300;
    private static final int TOOLTIP_DISPLAY_TIME_MILLIS = 5000;

    private static final ImageDescriptor TITLE_IMAGE = null;

    private ImplementationSettings implSettings;

    private final EMFDataBindingContext context = new EMFDataBindingContext();

    private SoftPkg softPkg = null;

    private ICodeGeneratorDescriptor codegen = null;

    private WizardPageSupport support;

    private Text generatorLabel = null;

    private Text outputDirText = null;

    private Text packageNameText = null;

    private ComboViewer templateViewer;

    private HashMap<ImplementationSettings, WritableSet> setMap;

    private CheckboxTableViewer propertiesViewer;

    private boolean created;

    private boolean configured;

    private boolean canFlip = false;

    private boolean canFinish = false;

    private final ArrayList<Binding> bindings;

    private Property packageName = null;

    private ITemplateDesc selectedTemplate = null;

    private Binding propBinding;
    private String componentType;
    private Implementation impl;
    // TODO: Marry up with the selectedTemplate
    private String currentTemplate;

    private EContentAdapter templateListener = new EContentAdapter() {
        /**
         * {@inheritDoc}
         */
        @Override
        public void notifyChanged(final Notification msg) {
            super.notifyChanged(msg);
            switch (msg.getFeatureID(ImplementationSettings.class)) {
            case CodegenPackage.IMPLEMENTATION_SETTINGS__TEMPLATE:
                if (msg.getNotifier() instanceof ImplementationSettings) {
                    ImplementationSettings newSettings = (ImplementationSettings) msg.getNotifier();

                    // If our current template is null and the template coming in is not then we just need to add pages.
                    if (JavaJetGeneratorPropertiesWizardPage.this.currentTemplate == null) {
                        if (newSettings.getTemplate() != null) {
                            JavaJetGeneratorPropertiesWizardPage.this.currentTemplate = newSettings.getTemplate();
                            addCustomPages();
                        }
                    } else {
                        // If our current template is not null and the template coming in is null then we need to remove.
                        if (newSettings.getTemplate() == null) {
                            removeCustomPages();
                            JavaJetGeneratorPropertiesWizardPage.this.currentTemplate = null;
                        } else if (!JavaJetGeneratorPropertiesWizardPage.this.currentTemplate
                                .equals(newSettings.getTemplate())) {
                            // If our current template is not null and the template coming in is not null and they are not the same we need to remove and replace.
                            removeCustomPages();
                            JavaJetGeneratorPropertiesWizardPage.this.currentTemplate = newSettings.getTemplate();
                            addCustomPages();
                        }
                    }
                }
                break;
            }
        }
    };

    /**
     * The Constructor.
     * 
     * @param desc the Code Generator descriptor for default implSettings
     * @param implSettings the ImplementationSettings to store the values in
     */
    public JavaJetGeneratorPropertiesWizardPage() {
        super("codeGeneratorPage", "Setup Code Generation", JavaJetGeneratorPropertiesWizardPage.TITLE_IMAGE);
        setDescription("Set configuration values of this implementation's code generation properties.");
        setPageComplete(false);
        this.bindings = new ArrayList<Binding>();
    }

    /**
     * @since 8.1
     */
    @Override
    public void configure(final SoftPkg softPkg, final Implementation impl, final ICodeGeneratorDescriptor desc,
            final ImplementationSettings implSettings, final String componentType) {
        this.softPkg = softPkg;
        this.impl = impl;
        this.implSettings = implSettings;
        this.codegen = desc;
        this.componentType = componentType;
        final boolean selectDefault = (implSettings.getTemplate() == null)
                || (implSettings.getTemplate().length() == 0);
        boolean clearProps = false;

        Assert.isNotNull(desc);
        Assert.isNotNull(this.softPkg);

        final ITemplateDesc[] temps = RedhawkCodegenActivator.getCodeGeneratorTemplatesRegistry()
                .findTemplatesByCodegen(desc.getId(), componentType);
        Assert.isTrue(temps.length > 0);
        if (this.created) {
            this.templateViewer.setInput(temps);
        }

        // Select the appropriate template
        for (final ITemplateDesc temp : temps) {
            if ((selectDefault && !temp.notDefaultableGenerator())
                    || temp.getId().equals(implSettings.getTemplate())) {
                clearProps = ((this.selectedTemplate == null)
                        || !temp.getId().equals(this.selectedTemplate.getId()));
                this.selectedTemplate = temp;

                break;
            }
        }

        // If we haven't selected a defaultable template, pick the first one
        if ((this.selectedTemplate == null)) {
            this.selectedTemplate = temps[0];
        }

        if (this.created) {
            this.templateViewer.setSelection(new StructuredSelection(this.selectedTemplate));
            this.templateViewer.getCombo().setToolTipText(this.selectedTemplate.getDescription());
        }

        final EList<Property> properties = implSettings.getProperties();
        if (clearProps || properties.size() == 0) {
            this.packageName = null;

            // Make a list of the property id's for this template
            final List<String> propList = new ArrayList<String>();
            if (this.selectedTemplate != null) {
                for (final IPropertyDescriptor value : this.selectedTemplate.getPropertyDescriptors()) {
                    propList.add(value.getKey());
                }
            }

            // If we need to clear old properties, check to see if properties 
            // have already been set for the template, only remove the ones that
            // aren't valid anymore (aka. for a different generator)
            if (clearProps) {
                final List<Property> delProps = new ArrayList<Property>();
                for (final Property prop : properties) {
                    // Remove the invalid property from the settings
                    if (!propList.contains(prop.getId())) {
                        delProps.add(prop);
                        // Remove the valid property from the ones to add
                    } else {
                        if (CodegenUtil.JAVA_PACKAGE.equals(prop.getId())) {
                            prop.setValue(JavaGeneratorProperties.getPackage(softPkg, impl, implSettings));
                            this.packageName = prop;
                        }
                        propList.remove(prop.getId());
                    }
                }
                properties.removeAll(delProps);
            }

            // Check the template for properties to populate
            if (this.selectedTemplate != null) {
                for (final IPropertyDescriptor value : this.selectedTemplate.getPropertyDescriptors()) {
                    // Don't override a valid property
                    if (propList.contains(value.getKey()) && !value.isDeprecated()) {
                        final Property p = CodegenFactory.eINSTANCE.createProperty();
                        p.setId(value.getKey());
                        if (JavaGeneratorProperties.PROP_PACKAGE.equals(p.getId())) {
                            p.setValue(JavaGeneratorProperties.getPackage(softPkg, impl, implSettings));
                            this.packageName = p;
                        } else {
                            p.setValue(value.getDefaultValue());
                        }
                        properties.add(p);
                    }
                }
            }
        }

        if (!this.context.getBindings().isEmpty()) {
            this.context.dispose();
        }

        if (this.created) {
            bind();
        }

        if (!this.implSettings.eAdapters().contains(templateListener)) {
            this.implSettings.eAdapters().add(templateListener);
        }

        this.configured = true;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setVisible(final boolean visible) {
        super.setVisible(visible);
        if (visible) {
            setPageComplete(true);
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void createControl(final Composite parent) {
        final Composite client = new Composite(parent, SWT.NULL);
        client.setLayout(new GridLayout(2, false));

        Label label;

        final GridDataFactory labelFactory = GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.FILL);

        label = new Label(client, SWT.NULL);
        label.setText("Generator:");
        label.setLayoutData(labelFactory.create());
        this.generatorLabel = new Text(client, SWT.READ_ONLY | SWT.SINGLE | SWT.BORDER);
        this.generatorLabel.setEnabled(false);
        this.generatorLabel.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        label = new Label(client, SWT.NULL);
        label.setText("Template:");
        this.templateViewer = new ComboViewer(client, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY | SWT.DROP_DOWN);
        this.templateViewer.getControl()
                .setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
        this.templateViewer.setContentProvider(new ArrayContentProvider());
        this.templateViewer.setLabelProvider(new LabelProvider() {
            /**
             * {@inheritDoc}
             */
            @Override
            public String getText(final Object element) {
                if (element instanceof ITemplateDesc) {
                    return ((ITemplateDesc) element).getName();
                }
                return super.getText(element);
            }
        });
        this.templateViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                final ITemplateDesc desc = (ITemplateDesc) ((IStructuredSelection) event.getSelection())
                        .getFirstElement();
                if (desc != null) {
                    if (desc != JavaJetGeneratorPropertiesWizardPage.this.selectedTemplate) {
                        JavaJetGeneratorPropertiesWizardPage.this.selectedTemplate = desc;

                        // Remove the old templates properties
                        final EList<Property> properties = JavaJetGeneratorPropertiesWizardPage.this.implSettings
                                .getProperties();
                        if (properties.size() != 0) {
                            properties.clear();
                        }

                        JavaJetGeneratorPropertiesWizardPage.this.packageName = null;

                        final List<IPropertyDescriptor> propList = new ArrayList<IPropertyDescriptor>();

                        // Add the new templates properties
                        for (final IPropertyDescriptor value : desc.getPropertyDescriptors()) {
                            final Property p = CodegenFactory.eINSTANCE.createProperty();
                            if (!value.isDeprecated()) {
                                p.setId(value.getKey());
                                p.setValue(value.getDefaultValue());
                                properties.add(p);

                                if (!JavaGeneratorProperties.PROP_PACKAGE.equals(value.getKey())) {
                                    propList.add(value);
                                } else {
                                    p.setValue(JavaGeneratorProperties.getPackage(
                                            JavaJetGeneratorPropertiesWizardPage.this.softPkg,
                                            JavaJetGeneratorPropertiesWizardPage.this.impl,
                                            JavaJetGeneratorPropertiesWizardPage.this.implSettings));
                                    JavaJetGeneratorPropertiesWizardPage.this.packageName = p;
                                }
                            }
                        }

                        // Update the properties displayed
                        JavaJetGeneratorPropertiesWizardPage.this.propertiesViewer.setInput(propList);

                        // Unbind the old properties and bind the new ones
                        if (JavaJetGeneratorPropertiesWizardPage.this.propBinding != null) {
                            JavaJetGeneratorPropertiesWizardPage.this.bindings
                                    .remove(JavaJetGeneratorPropertiesWizardPage.this.propBinding);
                        }
                        JavaJetGeneratorPropertiesWizardPage.this.propBinding = createPropertyBinding();
                        JavaJetGeneratorPropertiesWizardPage.this.bindings
                                .add(JavaJetGeneratorPropertiesWizardPage.this.propBinding);
                    }

                    // Save the new template and update the tooltip
                    JavaJetGeneratorPropertiesWizardPage.this.implSettings.setTemplate(desc.getId());
                    JavaJetGeneratorPropertiesWizardPage.this.templateViewer.getCombo()
                            .setToolTipText(desc.getDescription());
                } else {
                    JavaJetGeneratorPropertiesWizardPage.this.implSettings.setTemplate(null);
                }
            }
        });

        label = new Label(client, SWT.NULL);
        label.setText("Output Directory:");
        this.outputDirText = new Text(client, SWT.BORDER);
        this.outputDirText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));

        label = new Label(client, SWT.NULL);
        label.setText("Package:");
        label.setLayoutData(labelFactory.create());
        this.packageNameText = new Text(client, SWT.SINGLE | SWT.BORDER);
        this.packageNameText.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        createExtraArea(client, labelFactory, ((GridLayout) client.getLayout()).numColumns);

        label = new Label(client, SWT.NULL);
        label.setText("Properties:");
        label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.TOP).create());

        this.propertiesViewer = new CheckboxTableViewer(new Table(client, SWT.CHECK | SWT.READ_ONLY | SWT.BORDER));
        ColumnViewerToolTipSupport.enableFor(this.propertiesViewer);
        this.propertiesViewer.setContentProvider(new ArrayContentProvider());

        final CellLabelProvider labelProvider = new CellLabelProvider() {

            public String getText(final Object element) {
                String text = "";
                if (element instanceof IPropertyDescriptor) {
                    if (((IPropertyDescriptor) element).getName().length() != 0) {
                        text = ((IPropertyDescriptor) element).getName();
                    } else {
                        text = ((IPropertyDescriptor) element).getKey();
                    }
                }
                return text;
            }

            @Override
            public String getToolTipText(final Object element) {
                String text = "No description available for this property";
                if (element instanceof IPropertyDescriptor) {
                    final String desc = ((IPropertyDescriptor) element).getDescription();
                    if (desc != null && desc.length() != 0) {
                        text = desc;
                    }
                }
                return text;
            }

            @Override
            public Point getToolTipShift(final Object object) {
                return new Point(5, 5); // SUPPRESS CHECKSTYLE MagicNumber
            }

            @Override
            public int getToolTipDisplayDelayTime(final Object object) {
                return JavaJetGeneratorPropertiesWizardPage.TOOLTIP_DELAY_MILLIS;
            }

            @Override
            public int getToolTipTimeDisplayed(final Object object) {
                return JavaJetGeneratorPropertiesWizardPage.TOOLTIP_DISPLAY_TIME_MILLIS;
            }

            @Override
            public void update(final ViewerCell cell) {
                cell.setText(getText(cell.getElement()));
            }
        };

        this.propertiesViewer.setLabelProvider(labelProvider);
        this.propertiesViewer.setFilters(createPropertiesViewerFilter());
        this.propertiesViewer.getControl()
                .setLayoutData(GridDataFactory.fillDefaults().span(1, 2).grab(false, true).create());

        if (this.configured) {
            bind();
        }
        this.created = true;

        setControl(client);
    }

    /**
     * Creates the properties viewer filter.
     * 
     * @return the viewer filter[]
     */
    private ViewerFilter[] createPropertiesViewerFilter() {
        final ViewerFilter[] filters = new ViewerFilter[1];
        filters[0] = new ViewerFilter() {

            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (element instanceof IPropertyDescriptor) {
                    return !((IPropertyDescriptor) element).isDeprecated();
                }
                return true;
            }

        };
        return filters;
    }

    /**
     * This method is used to add extra Generator Settings information for
     * subclasses.
     * 
     * @param parent the parent composite
     * @param labelFactory the GridDataFactory for creating labels
     * @param numColumns the number of columns for the current layout
     * @since 2.1
     */
    protected void createExtraArea(final Composite parent, final GridDataFactory labelFactory,
            final int numColumns) {
    }

    private void bind() {
        for (final Binding b : this.bindings) {
            this.context.removeBinding(b);
        }

        this.support = WizardPageSupport.create(this, this.context);

        initFields();

        this.bindings.add(this.context.bindValue(ViewersObservables.observeSingleSelection(this.templateViewer),
                EMFObservables.observeValue(this.implSettings,
                        CodegenPackage.Literals.IMPLEMENTATION_SETTINGS__TEMPLATE),
                createTemplateTargetToModel(), createTemplateModelToTarget()));

        this.bindings.add(this.context.bindValue(SWTObservables.observeText(this.outputDirText, SWT.Modify),
                EMFObservables.observeValue(this.implSettings,
                        CodegenPackage.Literals.IMPLEMENTATION_SETTINGS__OUTPUT_DIR),
                new UpdateValueStrategy().setAfterConvertValidator(new OutputDirectoryValidator(this.softPkg)),
                null));

        this.bindings.add(this.context.bindValue(SWTObservables.observeText(this.packageNameText, SWT.Modify),
                EMFObservables.observeValue(JavaJetGeneratorPropertiesWizardPage.this.packageName,
                        CodegenPackage.Literals.PROPERTY__VALUE),
                new UpdateValueStrategy().setAfterConvertValidator(new JavaPackageNameValidator()), null));

        if ((this.implSettings.getOutputDir() == null) || "".equals(this.implSettings.getOutputDir().trim())) {
            setDefaults();
        } else {
            selectInitialTemplate(false);
        }

        final List<IPropertyDescriptor> propList = new ArrayList<IPropertyDescriptor>();
        for (final IPropertyDescriptor prop : this.selectedTemplate.getPropertyDescriptors()) {
            if (!"java_package".equals(prop.getKey())) {
                propList.add(prop);
            }
        }

        this.propertiesViewer.setInput(propList);
        this.propBinding = createPropertyBinding();
        this.bindings.add(this.propBinding);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void dispose() {

        removeCustomPages();

        if (this.implSettings != null && this.implSettings.eAdapters().contains(templateListener)) {
            this.implSettings.eAdapters().remove(templateListener);
        }

        if (this.support != null) {
            this.support.dispose();
        }
        if (this.context != null) {
            this.context.dispose();
        }
        super.dispose();
    }

    /**
     * Gets the implSettings.
     * 
     * @return the implSettings
     */
    @Override
    public ImplementationSettings getSettings() {
        return this.implSettings;
    }

    /**
     * @since 2.1
     */
    protected EMFDataBindingContext getContext() {
        return this.context;
    }

    /**
     * @since 2.1
     */
    protected ICodeGeneratorDescriptor getCodegen() {
        return this.codegen;
    }

    /**
     * @since 2.1
     */
    protected WizardPageSupport getSupport() {
        return this.support;
    }

    /**
     * @since 2.1
     */
    protected Text getOutputDirText() {
        return this.outputDirText;
    }

    private void initFields() {
        this.generatorLabel.setText(this.codegen.getName());
        final ITemplateDesc[] temps = RedhawkCodegenActivator.getCodeGeneratorTemplatesRegistry()
                .findTemplatesByCodegen(this.codegen.getId(), this.componentType);
        this.templateViewer.setInput(temps);
        if (this.packageName != null) {
            this.packageNameText.setText(this.packageName.getValue());
        }
    }

    private void selectInitialTemplate(final boolean setDefault) {
        final ITemplateDesc[] temps = RedhawkCodegenActivator.getCodeGeneratorTemplatesRegistry()
                .findTemplatesByCodegen(this.codegen.getId(), this.componentType);
        final ITemplateDesc[] input = temps;
        String templateId = this.implSettings.getTemplate();
        // Use this to select the legacy code generator template
        if (setDefault && "src/".equals(templateId) && (this.implSettings.getProperties().size() > 0)) {
            templateId = this.implSettings.getGeneratorId();
        }
        if (templateId != null) {
            for (final ITemplateDesc temp : input) {
                if (temp.getId().equals(templateId)) {
                    this.implSettings.setTemplate(templateId);
                    this.templateViewer.setSelection(new StructuredSelection(temp));
                    this.templateViewer.getCombo().setToolTipText(temp.getDescription());
                    break;
                }
            }
        } else {
            for (final ITemplateDesc temp : input) {
                if (!temp.notDefaultableGenerator()) {
                    this.implSettings.setTemplate(temp.getId());
                    this.templateViewer.setSelection(new StructuredSelection(temp));
                    this.templateViewer.getCombo().setToolTipText(temp.getDescription());
                    break;
                }
            }
        }
    }

    private void setDefaults() {
        if (this.codegen != null) {
            if (this.generatorLabel != null) {
                this.generatorLabel.setText(this.codegen.getName());
            }
            if (this.templateViewer != null) {
                this.selectInitialTemplate(true);
            }
            this.setPageComplete(!this.selectedTemplate.hasSettings());

            this.implSettings.setOutputDir(CodegenFileHelper.createDefaultOutputDir(this.softPkg, this.codegen));
            if (this.outputDirText != null) {
                this.outputDirText.setText(this.implSettings.getOutputDir());
            }
            this.implSettings.setGeneratorId(this.codegen.getId());
            if (this.packageNameText != null) {
                if ("".equals(this.packageName.getValue())) {
                    this.packageName.setValue(
                            JavaGeneratorProperties.getPackage(this.softPkg, this.impl, this.implSettings));
                    this.packageNameText.setText(this.packageName.getValue());
                }
            }
        } else {
            if (this.generatorLabel != null) {
                this.generatorLabel.setText("");
            }
            if (this.templateViewer != null) {
                this.templateViewer.setInput(Collections.EMPTY_LIST);
                this.templateViewer.setSelection(new StructuredSelection());
                this.selectedTemplate = null;
            }

            if (this.outputDirText != null) {
                this.outputDirText.setText("");
            }
            this.implSettings.setGeneratorId(null);
            if (this.packageNameText != null) {
                this.packageNameText.setText("");
            }
        }
    }

    /**
     * Creates the property binding.
     * 
     * @since 8.0
     */
    protected Binding createPropertyBinding() {
        if (this.setMap == null) {
            this.setMap = new HashMap<ImplementationSettings, WritableSet>();
        }

        final WritableSet mySet = new WritableSet();
        for (final IPropertyDescriptor prop : this.selectedTemplate.getPropertyDescriptors()) {
            // Initialize to the default value of the property
            boolean val = "TRUE".equalsIgnoreCase(prop.getDefaultValue());

            // Check the ImplementationSettings for the current value of the property
            for (final Property settingsProp : this.implSettings.getProperties()) {
                if (settingsProp.getId().equals(prop.getKey())) {
                    val = "TRUE".equalsIgnoreCase(settingsProp.getValue());
                    break;
                }
            }
            if (val) {
                mySet.add(prop);
            }
        }
        mySet.addSetChangeListener(new ISetChangeListener() {
            @Override
            public void handleSetChange(final SetChangeEvent event) {
                final EList<Property> properties = JavaJetGeneratorPropertiesWizardPage.this.implSettings
                        .getProperties();
                for (final Object obj : event.diff.getRemovals()) {
                    final IPropertyDescriptor cp = (IPropertyDescriptor) obj;
                    for (final Property p : properties) {
                        if (p.getId().equals(cp.getKey())) {
                            p.setValue("FALSE");
                            break;
                        }
                    }
                }
                for (final Object obj : event.diff.getAdditions()) {
                    final IPropertyDescriptor cp = (IPropertyDescriptor) obj;
                    for (final Property p : properties) {
                        if (p.getId().equals(cp.getKey())) {
                            p.setValue("TRUE");
                            break;
                        }
                    }
                }
            }

        });

        this.setMap.put(this.implSettings, mySet);

        return this.context.bindSet(
                ViewersObservables.observeCheckedElements(this.propertiesViewer, IPropertyDescriptor.class),
                this.setMap.get(this.implSettings), null, null);
    }

    /**
     * @return
     */
    private UpdateValueStrategy createTemplateModelToTarget() {
        final EMFUpdateValueStrategy strategy = new EMFUpdateValueStrategy();
        strategy.setConverter(new Converter(String.class, ITemplateDesc.class) {

            @Override
            public Object convert(final Object fromObject) {
                if (fromObject == null) {
                    return null;
                }
                final String templateId = fromObject.toString();
                final ITemplateDesc template = RedhawkCodegenActivator.getCodeGeneratorTemplatesRegistry()
                        .findTemplate(templateId);
                return template;
            }

        });
        return strategy;
    }

    /**
     * @return
     */
    private UpdateValueStrategy createTemplateTargetToModel() {
        final EMFEmptyStringToNullUpdateValueStrategy strategy = new EMFEmptyStringToNullUpdateValueStrategy();
        strategy.setConverter(new Converter(ITemplateDesc.class, String.class) {

            @Override
            public Object convert(final Object fromObject) {
                if (fromObject == null) {
                    return null;
                }
                final ITemplateDesc desc = (ITemplateDesc) fromObject;
                return desc.getId();
            }

        });
        return strategy;
    }

    @Override
    public boolean canFlipToNextPage() {
        return this.canFlip && this.isPageComplete() && notLastPage();
    }

    /**
     * Checks to see if this Wizard page is the last one in the wizard pages list.
     * @return True if this page is not the last page
     */
    private boolean notLastPage() {
        IWizardPage[] pages = getWizard().getPages();
        return pages[pages.length - 1] != this;
    }

    /**
     * @since 3.0
     */
    @Override
    public boolean canFinish() {
        return this.canFinish;
    }

    /**
     * @since 3.0
     */
    @Override
    public void setCanFlipToNextPage(final boolean canFlip) {
        this.canFlip = canFlip;
    }

    /**
     * @since 3.0
     */
    @Override
    public void setCanFinish(final boolean canFinish) {
        this.canFinish = canFinish;
    }

    private void addCustomPages() {
        if (this.getWizard() instanceof ScaImplementationWizard2) {
            ICodegenWizardPage[] codeGenTemplatePages = RedhawkCodegenUiActivator
                    .getCodeGeneratorsTemplateRegistry().findPageByGeneratorId(this.currentTemplate);
            ((ScaImplementationWizard2) this.getWizard()).addTemplatePages(this, codeGenTemplatePages);
        }
        // Otherwise assume the Wizard is taking care of this itself.
    }

    private void removeCustomPages() {
        if (this.currentTemplate == null || "".equals(this.currentTemplate)) {
            return;
        }

        ICodegenWizardPage[] codeGenTemplatePages = RedhawkCodegenUiActivator.getCodeGeneratorsTemplateRegistry()
                .findPageByGeneratorId(this.currentTemplate);
        ((ScaImplementationWizard2) this.getWizard()).removeTemplatePages(this, codeGenTemplatePages);

    }
}