gov.redhawk.ide.codegen.ui.DefaultGeneratorPropertiesWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.ide.codegen.ui.DefaultGeneratorPropertiesWizardPage.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.ui;

import gov.redhawk.codegen.validation.OutputDirectoryValidator;
import gov.redhawk.ide.codegen.CodegenFactory;
import gov.redhawk.ide.codegen.CodegenPackage;
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.provider.CodegenItemProviderAdapterFactory;
import gov.redhawk.ide.codegen.ui.internal.CustomPropertyItemProvider;
import gov.redhawk.ide.codegen.ui.internal.PropertyDialog;
import gov.redhawk.ide.codegen.ui.internal.WaveDevItemProviderAdapterFactoryAdapter;
import gov.redhawk.ide.codegen.util.CodegenFileHelper;
import gov.redhawk.ui.util.EMFEmptyStringToNullUpdateValueStrategy;
import gov.redhawk.ui.util.SWTUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

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

import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.ValidationStatusProvider;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.notify.AdapterFactory;
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.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
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.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
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.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;

/**
 * The Class CodeGneratorWizardPage.
 * 
 * @since 2.1
 */
public class DefaultGeneratorPropertiesWizardPage extends WizardPage implements ICodegenWizardPage {

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

    private class AllRequiredPropertiesValidator extends ValidationStatusProvider {

        private final WritableValue status;
        private final IObservableList targets;
        private final IObservableList models;

        public AllRequiredPropertiesValidator() {
            this.status = new WritableValue();
            this.status.setValue(Status.OK_STATUS);
            this.targets = Observables.emptyObservableList();
            this.models = Observables.emptyObservableList();
            DefaultGeneratorPropertiesWizardPage.this.implSettings.eAdapters().add(new EContentAdapter() {
                /**
                 * {@inheritDoc}
                 */
                @Override
                public void notifyChanged(final Notification msg) {
                    super.notifyChanged(msg);
                    if (DefaultGeneratorPropertiesWizardPage.this.selectedTemplate == null) {
                        return;
                    }
                    final IPropertyDescriptor[] properties = DefaultGeneratorPropertiesWizardPage.this.selectedTemplate
                            .getPropertyDescriptors();
                    final ArrayList<IPropertyDescriptor> missing = new ArrayList<IPropertyDescriptor>();
                    for (final IPropertyDescriptor propDesc : properties) {
                        if (propDesc.isRequired()) {
                            boolean found = false;
                            final Iterator<Property> propIterator = DefaultGeneratorPropertiesWizardPage.this.implSettings
                                    .getProperties().iterator();
                            while (propIterator.hasNext()) {
                                if (propDesc.getKey().equals(propIterator.next().getId())) {
                                    found = true;
                                }
                            }
                            if (!found) {
                                missing.add(propDesc);
                            }
                        }
                    }
                    IStatus retVal = Status.OK_STATUS;
                    if (!missing.isEmpty()) {
                        final StringBuilder builder = new StringBuilder();
                        for (final IPropertyDescriptor propDesc : missing) {
                            builder.append(", " + propDesc.getKey());
                        }
                        retVal = new Status(IStatus.ERROR, RedhawkCodegenUiActivator.getPluginId(),
                                "Missing property" + builder.toString(), null);
                    }
                    final IStatus finalRetVal = retVal;
                    if (!status.isDisposed()) {
                        AllRequiredPropertiesValidator.this.status.getRealm().exec(new Runnable() {

                            @Override
                            public void run() {
                                if (status.isDisposed()) {
                                    return;
                                }
                                AllRequiredPropertiesValidator.this.status.setValue(finalRetVal);
                            }

                        });
                    }
                }
            });
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public IObservableList getModels() {
            return this.models;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public IObservableList getTargets() {
            return this.targets;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public IObservableValue getValidationStatus() {
            return this.status;
        }

    }

    private static final ImageDescriptor TITLE_IMAGE = null;

    private final EMFDataBindingContext context = new EMFDataBindingContext();

    private ImplementationSettings implSettings;

    private ICodeGeneratorDescriptor codegen = null;

    private ITemplateDesc selectedTemplate = null;

    private WizardPageSupport support;

    private TableViewer propertiesViewer;

    private ComposedAdapterFactory adapterFactory;

    private Text generatorLabel = null;

    private Text outputDirText = null;

    private ComboViewer templateViewer;

    private boolean configured;

    private boolean created;

    private boolean canFlip = false;

    private boolean canFinish = false;
    private SoftPkg softPkg;
    private String componentType;

    /**
     * The Constructor.
     */
    public DefaultGeneratorPropertiesWizardPage() {
        super("codeGeneratorPage", "Setup Code Generation", DefaultGeneratorPropertiesWizardPage.TITLE_IMAGE);
        setDescription("Set configuration values of this implementation's code generation properties.");
        setPageComplete(false);
    }

    /**
     * @since 7.0
     */
    @Override
    public void configure(final SoftPkg softPkg, final Implementation spd, final ICodeGeneratorDescriptor desc,
            final ImplementationSettings implSettings, final String componentType) {
        this.softPkg = softPkg;
        this.implSettings = implSettings;
        this.codegen = desc;
        this.componentType = componentType;
        if (desc != null) {
            final ITemplateDesc[] temps = RedhawkCodegenActivator.getCodeGeneratorTemplatesRegistry()
                    .findTemplatesByCodegen(desc.getId(), componentType);
            if (this.created) {
                this.templateViewer.setInput(temps);
            }

            final boolean selectDefault = (implSettings.getTemplate() == null)
                    || (implSettings.getTemplate().length() == 0);
            // Select the appropriate template
            for (final ITemplateDesc temp : temps) {
                if ((selectDefault && !temp.notDefaultableGenerator())
                        || temp.getId().equals(implSettings.getTemplate())) {
                    this.selectedTemplate = temp;
                    if (this.created) {
                        this.templateViewer.setSelection(new StructuredSelection(temp));
                        this.templateViewer.getCombo().setToolTipText(temp.getDescription());
                    }
                    break;
                }
            }
        } else {
            this.templateViewer.setInput(new ITemplateDesc[0]);
            this.selectedTemplate = null;
            this.templateViewer.getCombo().setToolTipText("");
        }

        if ((this.implSettings.getProperties().size() == 0) && (this.selectedTemplate != null)) {
            for (final IPropertyDescriptor prop : this.selectedTemplate.getPropertyDescriptors()) {
                if (prop.isRequired() && !prop.isDeprecated()) {
                    final Property p = CodegenFactory.eINSTANCE.createProperty();
                    p.setId(prop.getKey());
                    p.setValue(prop.getDefaultValue());
                    this.implSettings.getProperties().add(p);
                }
            }
        }

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

        if (this.created) {
            bind();
        }
        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) { // SUPPRESS CHECKSTYLE MethodLength
        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 != DefaultGeneratorPropertiesWizardPage.this.selectedTemplate) {
                        DefaultGeneratorPropertiesWizardPage.this.selectedTemplate = desc;

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

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

                        // Update the properties displayed
                        DefaultGeneratorPropertiesWizardPage.this.propertiesViewer
                                .setInput(desc.getPropertyDescriptors());
                    }

                    // Save the new template and update the tooltip
                    DefaultGeneratorPropertiesWizardPage.this.implSettings.setTemplate(desc.getId());
                    DefaultGeneratorPropertiesWizardPage.this.templateViewer.getCombo()
                            .setToolTipText(desc.getDescription());
                } else {
                    DefaultGeneratorPropertiesWizardPage.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));

        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());
        final Composite tableComp = new Composite(client, SWT.NULL);
        final GridLayout layout = SWTUtil.TABLE_ENTRY_LAYOUT_FACTORY.create();
        tableComp.setLayout(layout);
        tableComp.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(true, true).create());

        final Table table = new Table(tableComp, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
        table.setLayoutData(GridDataFactory.fillDefaults().span(1, 3).grab(true, true).create()); // SUPPRESS CHECKSTYLE
        // MagicNumber
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        final TableLayout tableLayout = new TableLayout();
        tableLayout.addColumnData(new ColumnWeightData(40, 100, true)); // SUPPRESS CHECKSTYLE MagicNumber
        tableLayout.addColumnData(new ColumnWeightData(60, 70, true)); // SUPPRESS CHECKSTYLE MagicNumber
        table.setLayout(tableLayout);

        final TableColumn idColumn = new TableColumn(table, SWT.NULL);
        idColumn.setText("Name");

        final TableColumn valueColumn = new TableColumn(table, SWT.NULL);
        valueColumn.setText("Value");

        this.propertiesViewer = new TableViewer(table);

        ColumnViewerToolTipSupport.enableFor(this.propertiesViewer);

        final TableViewerColumn idViewer = new TableViewerColumn(this.propertiesViewer, idColumn);
        idViewer.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(final Object element) {
                String text = "";
                if (element instanceof Property) {
                    if (((Property) element).getId().length() != 0) {
                        final ICodeGeneratorDescriptor generator = RedhawkCodegenActivator
                                .getCodeGeneratorsRegistry().findCodegen(
                                        DefaultGeneratorPropertiesWizardPage.this.implSettings.getGeneratorId());
                        final ITemplateDesc template = getTemplateDesc(generator);

                        for (final IPropertyDescriptor propDesc : template.getPropertyDescriptors()) {
                            if (propDesc.getKey().equals(((Property) element).getId())) {
                                text = propDesc.getName();
                                break;
                            }
                        }
                    }
                }
                return text;
            };

            @Override
            public String getToolTipText(final Object element) {
                String text = "No description available for this property";
                if (element instanceof Property) {
                    if (((Property) element).getId().length() != 0) {
                        final ICodeGeneratorDescriptor generator = RedhawkCodegenActivator
                                .getCodeGeneratorsRegistry().findCodegen(
                                        DefaultGeneratorPropertiesWizardPage.this.implSettings.getGeneratorId());
                        final ITemplateDesc template = getTemplateDesc(generator);

                        for (final IPropertyDescriptor propDesc : template.getPropertyDescriptors()) {
                            if (propDesc.getKey().equals(((Property) element).getId())) {
                                text = propDesc.getDescription();
                                break;
                            }
                        }
                    }
                }
                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 DefaultGeneratorPropertiesWizardPage.TOOLTIP_DELAY_MILLIS;
            }

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

        final TableViewerColumn valueViewer = new TableViewerColumn(this.propertiesViewer, valueColumn);
        valueViewer.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(final Object element) {
                String text = "";
                if (element instanceof Property) {
                    final Property prop = (Property) element;
                    if (prop.getId().length() != 0) {
                        final ICodeGeneratorDescriptor generator = RedhawkCodegenActivator
                                .getCodeGeneratorsRegistry().findCodegen(
                                        DefaultGeneratorPropertiesWizardPage.this.implSettings.getGeneratorId());
                        final ITemplateDesc template = getTemplateDesc(generator);

                        for (final IPropertyDescriptor propDesc : template.getPropertyDescriptors()) {
                            if (propDesc.getKey().equals(prop.getId())) {
                                text = propDesc.getDefaultValue();
                                for (final Property tempProp : DefaultGeneratorPropertiesWizardPage.this.implSettings
                                        .getProperties()) {
                                    if (tempProp.getId().equals(prop.getId())) {
                                        text = tempProp.getValue();
                                        break;
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
                return text;
            };
        });

        this.propertiesViewer.setContentProvider(new AdapterFactoryContentProvider(getAdapterFactory()));
        this.propertiesViewer.setComparator(createPropertiesViewerComparator());
        this.propertiesViewer.setFilters(createPropertiesViewerFilter());
        this.propertiesViewer.setColumnProperties(new String[] { CodegenPackage.Literals.PROPERTY__ID.getName(),
                CodegenPackage.Literals.PROPERTY__VALUE.getName() });

        final Button addButton = new Button(tableComp, SWT.PUSH);
        addButton.setText("Add...");
        addButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create());
        addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                handleAddProperty();
            }
        });
        final Button editButton = new Button(tableComp, SWT.PUSH);
        editButton.setText("Edit");
        editButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create());
        editButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                handleEditProperty();
            }
        });
        editButton.setEnabled(false);
        final Button removeButton = new Button(tableComp, SWT.PUSH);
        removeButton.setText("Remove");
        removeButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create());
        removeButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                handleRemoveProperty();
            }
        });
        removeButton.setEnabled(!this.propertiesViewer.getSelection().isEmpty());
        this.propertiesViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                removeButton.setEnabled(!event.getSelection().isEmpty());
                editButton.setEnabled(!event.getSelection().isEmpty());
            }
        });

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

        setControl(client);
        setPageComplete(false);
    }

    /**
     * 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
     */
    protected void createExtraArea(final Composite parent, final GridDataFactory labelFactory,
            final int numColumns) {
    }

    private void bind() {
        initFields();

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

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

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

        this.propertiesViewer.setInput(this.implSettings);
        this.context.addValidationStatusProvider(new AllRequiredPropertiesValidator());

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

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

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

    /**
     * Handle remove property.
     */
    protected void handleRemoveProperty() {
        this.implSettings.getProperties()
                .remove(((IStructuredSelection) this.propertiesViewer.getSelection()).getFirstElement());
    }

    /**
     * Handle edit property.
     */
    protected void handleEditProperty() {
        final Property oldValue = (Property) ((IStructuredSelection) this.propertiesViewer.getSelection())
                .getFirstElement();
        final Property propNewValue = EcoreUtil.copy(oldValue);
        final PropertyDialog dialog = new PropertyDialog(getShell(), "Edit Property", propNewValue,
                this.getTemplateDesc(this.codegen));
        if (dialog.open() == Window.OK) {
            EcoreUtil.replace(this.implSettings, CodegenPackage.Literals.IMPLEMENTATION_SETTINGS__PROPERTIES,
                    oldValue, dialog.getValue());
        }
    }

    /**
     * Handle add property.
     */
    protected void handleAddProperty() {
        final PropertyDialog dialog = new PropertyDialog(getShell(), "Add Property", null,
                this.getTemplateDesc(this.codegen));
        if (dialog.open() == Window.OK) {
            this.implSettings.getProperties().add(dialog.getValue());
        }
    }

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

    /**
     * Creates the properties viewer comparator.
     * 
     * @return the viewer comparator
     */
    private ViewerComparator createPropertiesViewerComparator() {
        return new ViewerComparator();
    }

    /**
     * Gets the adapter factory.
     * 
     * @return the adapter factory
     */
    private AdapterFactory getAdapterFactory() {
        if (this.adapterFactory == null) {
            this.adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);

            this.adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
            final WaveDevItemProviderAdapterFactoryAdapter adapter = new WaveDevItemProviderAdapterFactoryAdapter();
            adapter.setPropertyAdapter(new CustomPropertyItemProvider(adapter));
            this.adapterFactory.addAdapterFactory(adapter);
            this.adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
            this.adapterFactory.addAdapterFactory(new CodegenItemProviderAdapterFactory());
        }
        return this.adapterFactory;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void dispose() {
        if (this.support != null) {
            this.support.dispose();
        }
        if (this.adapterFactory != null) {
            this.adapterFactory.dispose();
        }
        if (this.context != null) {
            this.context.dispose();
        }
        super.dispose();
    }

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

    /**
     * Set the implSettings.
     * 
     * @param tempImpl
     * @since 3.0
     */

    public void setSettings(final ImplementationSettings tempImpl) {
        this.implSettings = tempImpl;
    }

    /**
     * @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 && 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 ITemplateDesc getTemplateDesc(final ICodeGeneratorDescriptor generator) {
        String templateId = this.implSettings.getTemplate();
        // If the templateId is null or old style, select the legacy code
        // generator template if the implementationSettings has existing props
        if (((templateId == null) || ("src/".equals(templateId)))
                && (this.implSettings.getProperties().size() > 0)) {
            templateId = this.implSettings.getGeneratorId();
        }
        ITemplateDesc template = null;
        ITemplateDesc genTemplate = null;
        final ITemplateDesc[] temps = RedhawkCodegenActivator.getCodeGeneratorTemplatesRegistry()
                .findTemplatesByCodegen(generator.getId());
        for (final ITemplateDesc temp : temps) {
            // Keep track of the default generator template
            if (temp.getId().equals(generator.getId())) {
                genTemplate = temp;
            }
            if (temp.getId().equals(templateId)) {
                template = temp;
                break;
            }
        }

        // If we didn't find the template for some reason, return the default
        // generator template
        return (template != null) ? template : genTemplate; // SUPPRESS CHECKSTYLE AvoidInline
    }

}