gov.redhawk.ide.codegen.frontend.ui.wizard.FrontEndTunerOptionsWizardPage.java Source code

Java tutorial

Introduction

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

import gov.redhawk.eclipsecorba.idl.Definition;
import gov.redhawk.eclipsecorba.idl.IdlInterfaceDcl;
import gov.redhawk.eclipsecorba.library.IdlLibrary;
import gov.redhawk.eclipsecorba.library.RepositoryModule;
import gov.redhawk.ide.codegen.ICodeGeneratorDescriptor;
import gov.redhawk.ide.codegen.ImplementationSettings;
import gov.redhawk.ide.codegen.frontend.FeiDevice;
import gov.redhawk.ide.codegen.frontend.FrontendPackage;
import gov.redhawk.ide.codegen.frontend.ui.FrontEndDeviceWizardPlugin;
import gov.redhawk.ide.codegen.frontend.ui.FrontEndProjectValidator;
import gov.redhawk.ide.codegen.ui.ICodegenWizardPage;
import gov.redhawk.ide.dcd.ui.wizard.ScaDeviceProjectPropertiesWizardPage;
import gov.redhawk.ui.RedhawkUiActivator;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

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

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.IConverter;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.GC;
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.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.ui.statushandlers.StatusManager;

public class FrontEndTunerOptionsWizardPage extends WizardPage implements ICodegenWizardPage {

    private ImplementationSettings implSettings;
    private FeiDevice feiDevice;
    private Composite client;
    private DataBindingContext ctx;
    private Definition[] propertyTypes;
    private Composite parent;
    private FrontEndProjectValidator validator;
    private IBaseLabelProvider definitionComboViewerLabelProvider = new LabelProvider() {
        @Override
        public String getText(final Object element) {
            final Definition def = (Definition) element;
            return def.getName();
        }
    };

    public FrontEndTunerOptionsWizardPage(FeiDevice feiDevice) {
        super("");
        this.feiDevice = feiDevice;
        populatePropertyTypes();

        // Initialize the model object
        if (propertyTypes != null && propertyTypes.length > 0) {
            this.feiDevice.setDigitalInputTypeForTx(propertyTypes[0]);
            this.feiDevice.setDigitalInputType(propertyTypes[0]);
            this.feiDevice.setDigitalOutputType(propertyTypes[0]);
        }
    }

    @Override
    public void createControl(Composite parent) {
        this.setTitle("FrontEnd Interface Tuner Options");
        this.setDescription("Select the input and output types for this FrontEnd Interfaces Tuner Device");
        this.parent = parent;
        client = new Composite(parent, SWT.NULL);
        ctx = new DataBindingContext();

        createUIElements(client);

        this.setControl(client);

        IWizardPage[] wizPages = this.getWizard().getPages();
        ScaDeviceProjectPropertiesWizardPage propWizPage = null;

        for (IWizardPage wizPage : wizPages) {
            if (wizPage instanceof ScaDeviceProjectPropertiesWizardPage) {
                propWizPage = (ScaDeviceProjectPropertiesWizardPage) wizPage;
                break;
            }
        }

        // This must come after the creation of the page support since creation of page support updates the 
        // error message.  The WizardPageSupport doesn't update the error message because no UI elements have changed
        // so this is a bit of a hack.
        if (propWizPage != null) {
            this.validator = new FrontEndProjectValidator(propWizPage.getProjectSettings(), this);
            ctx.addValidationStatusProvider(validator);
            IObservableValue validationStatus = validator.getValidationStatus();
            validationStatus.addChangeListener(new IChangeListener() {

                @Override
                public void handleChange(ChangeEvent event) {
                    if (validator != null) {
                        updateErrorMessage();
                    }
                }
            });

            updateErrorMessage();
        }

        if (this.propertyTypes == null || this.propertyTypes.length == 0) {
            this.validator.setCustomValidationStatus(new Status(Status.ERROR, FrontEndDeviceWizardPlugin.PLUGIN_ID,
                    "Failed to Load IDL Library.", null));
        }
    }

    protected void updateErrorMessage() {
        IStatus status = (IStatus) this.validator.getValidationStatus().getValue();
        if (status.isOK()) {
            this.setErrorMessage(null);
        } else {
            this.setErrorMessage(status.getMessage());
        }
    }

    private void populatePropertyTypes() {
        final IdlLibrary idlLibrary = RedhawkUiActivator.getDefault().getIdlLibraryService().getLibrary();
        RepositoryModule bulkioIdl;
        List<Definition> bulkioTypes = new ArrayList<Definition>();

        IStatus loadStatus = idlLibrary.getLoadStatus();

        if (loadStatus == null || loadStatus.getSeverity() == IStatus.ERROR) {
            try {
                new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, true,
                        new IRunnableWithProgress() {

                            @Override
                            public void run(IProgressMonitor monitor)
                                    throws InvocationTargetException, InterruptedException {
                                try {
                                    idlLibrary.load(monitor);
                                } catch (CoreException e) {
                                    throw new InvocationTargetException(e);
                                }

                            }
                        });
            } catch (InterruptedException e) {
                // PASS
            } catch (InvocationTargetException e) {
                StatusManager.getManager().handle(new Status(Status.ERROR, FrontEndDeviceWizardPlugin.PLUGIN_ID,
                        "Failed to Load IDL Library.", e), StatusManager.SHOW | StatusManager.LOG);
            }
        }

        // Grab array of available BULKIO types
        for (Definition def : idlLibrary.getDefinitions()) {
            if ("BULKIO".equals(def.getName())) {
                bulkioIdl = (RepositoryModule) def;

                // We don't want these to show up in any combos
                List<String> removedTypes = new ArrayList<String>();
                removedTypes.add("IDL:BULKIO/ProvidesPortStatisticsProvider:1.0");
                removedTypes.add("IDL:BULKIO/UsesPortStatisticsProvider:1.0");
                removedTypes.add("IDL:BULKIO/dataFile:1.0");
                removedTypes.add("IDL:BULKIO/updateSRI:1.0");
                removedTypes.add("IDL:BULKIO/dataXML:1.0");

                for (Definition bulkioDef : bulkioIdl.getDefinitions()) {
                    if (bulkioDef instanceof IdlInterfaceDcl) {
                        if (removedTypes.contains(bulkioDef.getRepId())) {
                            continue;
                        }
                        bulkioTypes.add(bulkioDef);
                    }
                }
            }
        }
        Collections.sort(bulkioTypes, new Comparator<Definition>() {

            @Override
            public int compare(Definition o1, Definition o2) {
                return o1.getName().compareToIgnoreCase(o2.getName());
            }

        });
        propertyTypes = bulkioTypes.toArray(new Definition[0]);
    }

    private void createUIElements(Composite client) {
        client.setLayout(new GridLayout(1, false));

        if (!feiDevice.isTxTuner()) {
            createReceiverGroup(client);
        } else if (!feiDevice.isRxTuner()) {
            createTransmitterGroup(client);
        } else {
            createReceiverGroup(client);
            createTransmitterGroup(client);
        }
    }

    // Create Receiver Group and all sub-methods
    private void createReceiverGroup(Composite client) {
        Group receiverGroup = new Group(client, SWT.SHADOW_ETCHED_IN);
        receiverGroup.setText("Receiver Properties");
        receiverGroup.setLayout(new GridLayout(2, false));
        receiverGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        createInputControl(receiverGroup);
        createOutputControl(receiverGroup);
    }

    private void createInputControl(Group parent) {
        Composite inputContainer = new Composite(parent, SWT.None);
        inputContainer.setLayout(new GridLayout(1, false));
        inputContainer.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());

        GridData layoutData = GridDataFactory.fillDefaults().grab(true, false).indent(30, 0)
                .align(SWT.LEFT, SWT.CENTER).create();

        Button analogInputButton = new Button(inputContainer, SWT.RADIO);
        analogInputButton.setText("Analog Input (default)");
        analogInputButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 2, 1));
        createAnalogIn(inputContainer).setLayoutData(layoutData);
        UpdateValueStrategy uvs = booleanConverter();
        ctx.bindValue(WidgetProperties.selection().observe(analogInputButton),
                EMFObservables.observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_INPUT),
                uvs, uvs);

        Button digitalInputButton = new Button(inputContainer, SWT.RADIO);
        digitalInputButton.setText("Digital Input");
        digitalInputButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 2, 1));
        createDigitalIn(inputContainer).setLayoutData(layoutData);
        ctx.bindValue(WidgetProperties.selection().observe(digitalInputButton), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_INPUT));

        digitalInputButton.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                feiDevice.setHasDigitalOutput(true);
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }
        });
    }

    private Composite createAnalogIn(Composite parent) {
        Composite analogIn = new Composite(parent, SWT.SHADOW_NONE);
        analogIn.setLayout(new GridLayout(2, false));

        Label numAnalogLabel = new Label(analogIn, SWT.None);
        numAnalogLabel.setText("Number of Analog input ports: ");

        Spinner numAnalogSpinner = new Spinner(analogIn, SWT.BORDER);
        numAnalogSpinner.setMinimum(1);
        GC gc = new GC(numAnalogSpinner);
        try {
            Point size = gc.textExtent("XXX");
            numAnalogSpinner.setLayoutData(GridDataFactory.fillDefaults().hint(size.x, SWT.DEFAULT).create());
        } finally {
            gc.dispose();
        }
        UpdateValueStrategy uvs = booleanConverter();
        ctx.bindValue(WidgetProperties.selection().observe(numAnalogSpinner), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__NUMBER_OF_ANALOG_INPUTS));
        ctx.bindValue(WidgetProperties.enabled().observe(numAnalogSpinner),
                EMFObservables.observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_INPUT),
                uvs, uvs);
        return analogIn;
    }

    private Composite createDigitalIn(Composite parent) {
        Composite digitalIn = new Composite(parent, SWT.SHADOW_NONE);
        digitalIn.setLayout(new GridLayout(2, false));

        Label digitalInputTypeLabel = new Label(digitalIn, SWT.None);
        digitalInputTypeLabel.setText("Digital Input Type: ");

        ComboViewer digitalInputCombo = new ComboViewer(digitalIn, SWT.READ_ONLY);
        digitalInputCombo.setContentProvider(new ArrayContentProvider());
        digitalInputCombo.setLabelProvider(definitionComboViewerLabelProvider);
        digitalInputCombo.setInput(propertyTypes);
        ctx.bindValue(ViewersObservables.observeSingleSelection(digitalInputCombo), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__DIGITAL_INPUT_TYPE));

        ctx.bindValue(WidgetProperties.enabled().observe(digitalInputCombo.getCombo()), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_INPUT));
        return digitalIn;
    }

    private void createOutputControl(Group parent) {
        Composite outputContainer = new Composite(parent, SWT.None);
        outputContainer.setLayout(new GridLayout(1, false));
        outputContainer.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());

        Button analogOutputButton = new Button(outputContainer, SWT.RADIO);
        analogOutputButton.setText("Analog Output");
        analogOutputButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 2, 1));
        UpdateValueStrategy uvs = booleanConverter();
        ctx.bindValue(WidgetProperties.enabled().observe(analogOutputButton),
                EMFObservables.observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_INPUT),
                uvs, uvs);
        ctx.bindValue(WidgetProperties.selection().observe(analogOutputButton), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_OUTPUT), uvs, uvs);

        Button digitalOutputButton = new Button(outputContainer, SWT.RADIO);
        digitalOutputButton.setText("Digital Output (default)");
        digitalOutputButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 2, 1));
        createDigitalOut(outputContainer);
        ctx.bindValue(WidgetProperties.selection().observe(digitalOutputButton), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_OUTPUT));
    }

    private Composite createDigitalOut(Composite parent) {
        Composite digitalOut = new Composite(parent, SWT.SHADOW_NONE);
        digitalOut.setLayout(new GridLayout(2, false));
        digitalOut.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).indent(30, 0)
                .align(SWT.CENTER, SWT.CENTER).create());

        Label digitalOutputTypeLabel = new Label(digitalOut, SWT.None);
        digitalOutputTypeLabel.setText("Digital Output Type: ");

        ComboViewer digitalOutputCombo = new ComboViewer(digitalOut, SWT.READ_ONLY);
        digitalOutputCombo.setContentProvider(new ArrayContentProvider());
        digitalOutputCombo.setLabelProvider(definitionComboViewerLabelProvider);
        digitalOutputCombo.setInput(propertyTypes);
        ctx.bindValue(ViewersObservables.observeSingleSelection(digitalOutputCombo), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__DIGITAL_OUTPUT_TYPE));
        ctx.bindValue(WidgetProperties.enabled().observe(digitalOutputCombo.getCombo()), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_OUTPUT));

        Button multiOutCheck = new Button(digitalOut, SWT.CHECK);
        multiOutCheck.setText("Multi-out");
        ctx.bindValue(WidgetProperties.selection().observe(multiOutCheck),
                EMFObservables.observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__MULTI_OUT));
        ctx.bindValue(WidgetProperties.enabled().observe(multiOutCheck), EMFObservables.observeValue(this.feiDevice,
                FrontendPackage.Literals.FEI_DEVICE__HAS_DIGITAL_OUTPUT));
        return digitalOut;
    } //End Receiver Group

    //Create Transmitter Group and all sub-methods
    private void createTransmitterGroup(Composite client) {
        Group transmitterGroup = new Group(client, SWT.SHADOW_ETCHED_IN);
        transmitterGroup.setText("Transmitter Properties");
        transmitterGroup.setLayout(new GridLayout(4, false));
        transmitterGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        Label numDigitalInLabel = new Label(transmitterGroup, SWT.None);
        numDigitalInLabel.setText("Number of Digital input ports: ");

        Spinner numDigitalSpinner = new Spinner(transmitterGroup, SWT.BORDER);
        GC gc = new GC(numDigitalSpinner);
        try {
            Point size = gc.textExtent("XXX");
            numDigitalSpinner.setLayoutData(GridDataFactory.fillDefaults().hint(size.x, SWT.DEFAULT).create());
        } finally {
            gc.dispose();
        }
        numDigitalSpinner.setMinimum(1);
        ctx.bindValue(WidgetProperties.selection().observe(numDigitalSpinner), EMFObservables.observeValue(
                this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__NUMBER_OF_DIGITAL_INPUTS_FOR_TX));

        Label digitalInputTypeLabel = new Label(transmitterGroup, SWT.None);
        digitalInputTypeLabel.setText("Digital Input Type: ");
        digitalInputTypeLabel
                .setLayoutData(GridDataFactory.fillDefaults().indent(50, 0).align(SWT.CENTER, SWT.CENTER).create());

        ComboViewer digitalInputCombo = new ComboViewer(transmitterGroup, SWT.READ_ONLY);
        digitalInputCombo.setContentProvider(new ArrayContentProvider());
        digitalInputCombo.setLabelProvider(definitionComboViewerLabelProvider);
        digitalInputCombo.setInput(propertyTypes);

        ctx.bindValue(ViewersObservables.observeSingleSelection(digitalInputCombo), EMFObservables
                .observeValue(this.feiDevice, FrontendPackage.Literals.FEI_DEVICE__DIGITAL_INPUT_TYPE_FOR_TX));
    } //End Transmitter Group

    private UpdateValueStrategy booleanConverter() {
        UpdateValueStrategy converter = new UpdateValueStrategy();
        converter.setConverter(new IConverter() {

            @Override
            public Object getToType() {
                return Boolean.class;
            }

            @Override
            public Object getFromType() {
                return Boolean.class;
            }

            @Override
            public Object convert(Object fromObject) {
                return !((Boolean) fromObject).booleanValue();
            }
        });
        return converter;
    }

    @Override
    public void configure(SoftPkg softpkg, Implementation impl, ICodeGeneratorDescriptor desc,
            ImplementationSettings implSettings, String componentType) {
        this.implSettings = implSettings;
    }

    @Override
    public ImplementationSettings getSettings() {
        return this.implSettings;
    }

    @Override
    public boolean canFinish() {
        return this.isPageComplete();
    }

    @Override
    public boolean isPageComplete() {
        // Page is complete as long as the validator is okay.
        if (this.validator == null) {
            return true;
        } else if (((IStatus) this.validator.getValidationStatus().getValue()).isOK()) {
            return super.isPageComplete();
        } else {
            return false;
        }
    }

    @Override
    public void setCanFlipToNextPage(boolean canFlip) {
        // TODO Auto-generated method stub
    }

    @Override
    public void setCanFinish(boolean canFinish) {
        // TODO Auto-generated method stub
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (visible) {
            client.dispose();
            createControl(parent);
            parent.layout(true, true);
        }
    }

}