gov.redhawk.datareader.ui.controlPanels.DataReaderComposite.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.datareader.ui.controlPanels.DataReaderComposite.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.datareader.ui.controlPanels;

import gov.redhawk.datareader.ui.DataReaderActivator;
import gov.redhawk.ide.debug.LocalScaComponent;
import gov.redhawk.model.sca.ScaComponent;
import gov.redhawk.model.sca.ScaSimpleProperty;
import gov.redhawk.model.sca.commands.ScaModelCommand;
import gov.redhawk.sca.observables.SCAObservables;

import java.io.File;

import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;

import CF.ResourcePackage.StartError;
import CF.ResourcePackage.StopError;

/**
 *
 */
public class DataReaderComposite extends Composite {

    private ScaComponent input;
    private Text sampleRateText;
    private Text streamIdText;
    private EMFDataBindingContext context;
    private Text frontEndRfText;
    private Text inputFileText;
    private Button inputFileButton;
    private Text speedFactorText;
    private Button playButton;
    private Text yDeltaText;
    private Text subsizeText;
    private Combo complexCombo;
    private Combo loopCombo;
    private Button stopButton;
    private FileDialog inputFileDialog;
    private Button pauseButton;

    public DataReaderComposite(Composite parent, int style) {
        super(parent, style);
        createPropertyComposite(this);
    }

    @Override
    public void dispose() {
        super.dispose();
        context.dispose();
    }

    private void createPropertyComposite(Composite parent) {
        Composite propertyComposite = new Composite(parent, SWT.BORDER);
        parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).margins(25, 25).create());
        createControls(propertyComposite);
    }

    private void createControls(final Composite parent) {
        parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).margins(10, 10).create());
        Composite textInput = new Composite(parent, SWT.None);

        Composite comboInput = new Composite(parent, SWT.None);

        GridData buttonGridData = new GridData();
        buttonGridData.horizontalAlignment = GridData.CENTER;
        Composite buttonInput = new Composite(parent, SWT.None);
        buttonInput.setLayoutData(buttonGridData);

        createText(textInput);
        createCombos(comboInput);
        createButtons(buttonInput);
    }

    public void createText(final Composite parent) {
        parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(6).margins(0, 0).create());

        GridData textGridData = new GridData();
        textGridData.horizontalAlignment = GridData.FILL;
        textGridData.horizontalSpan = 2;
        textGridData.widthHint = 200;

        Label label = new Label(parent, SWT.None);
        label.setText("Sample Rate (Hz):");
        sampleRateText = new Text(parent, SWT.BORDER);
        sampleRateText.setLayoutData(textGridData);
        ControlDecoration sampleRateDecoration = createControlDecoration(sampleRateText, label);
        validate(sampleRateText, sampleRateDecoration);

        label = new Label(parent, SWT.None);
        label.setText("Stream ID:");
        streamIdText = new Text(parent, SWT.BORDER);
        streamIdText.setLayoutData(textGridData);

        label = new Label(parent, SWT.None);
        label.setText("Frontend RF (Hz):");
        frontEndRfText = new Text(parent, SWT.BORDER);
        frontEndRfText.setLayoutData(textGridData);
        ControlDecoration frontEndRfDecoration = createControlDecoration(frontEndRfText, label);
        validate(frontEndRfText, frontEndRfDecoration);

        label = new Label(parent, SWT.None);
        label.setText("Speed Factor:");
        speedFactorText = new Text(parent, SWT.BORDER);
        speedFactorText.setLayoutData(textGridData);
        ControlDecoration speedFactorDecoration = createControlDecoration(speedFactorText, label);
        validate(speedFactorText, speedFactorDecoration);

        label = new Label(parent, SWT.None);
        label.setText("Y Delta:");
        yDeltaText = new Text(parent, SWT.BORDER);
        yDeltaText.setLayoutData(textGridData);
        ControlDecoration yDeltaDecoration = createControlDecoration(yDeltaText, label);
        validate(yDeltaText, yDeltaDecoration);

        label = new Label(parent, SWT.None);
        label.setText("Subsize:");
        subsizeText = new Text(parent, SWT.BORDER);
        subsizeText.setLayoutData(textGridData);
        ControlDecoration subsizeDecoration = createControlDecoration(subsizeText, label);
        validate(subsizeText, subsizeDecoration);

        label = new Label(parent, SWT.None);
        label.setText("Input File:");
        inputFileText = new Text(parent, SWT.BORDER);
        inputFileText.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).span(4, 1).create());
        inputFileButton = new Button(parent, SWT.PUSH);
        inputFileButton.setText("Browse");
        inputFileButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                Shell shell = parent.getShell();

                if (input instanceof LocalScaComponent) {
                    openLocalInputDialog(shell);
                }
                //TODO
                //else this is a Domain/Remote component
                //openScaInputDialog
            }

            private void openLocalInputDialog(Shell shell) {
                inputFileDialog = new FileDialog(shell, SWT.NULL);
                inputFileDialog.setText("Select Input File");
                String path = inputFileDialog.open();
                if (path != null) {
                    File file = new File(path);
                    if (file.isFile()) {
                        displayFiles(new String[] { file.toString() });
                    } else {
                        displayFiles(file.list());
                    }
                }
            }
        });
    }

    public void createCombos(Composite parent) {
        parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).margins(0, 0).spacing(64, 10).create());

        GridData comboGridData = new GridData();
        comboGridData.widthHint = 100;

        Label label = new Label(parent, SWT.None);
        label.setText("Complex");
        complexCombo = new Combo(parent, SWT.READ_ONLY);
        complexCombo.add("true");
        complexCombo.add("false");
        complexCombo.setToolTipText(
                "Flag to indicate data is complex.  If true, data values assumed to be alternating real and complex float values.");
        complexCombo.setLayoutData(comboGridData);

        label = new Label(parent, SWT.None);
        label.setText("Loop");
        loopCombo = new Combo(parent, SWT.READ_ONLY);
        loopCombo.add("true");
        loopCombo.add("false");
        //      loopCombo.setEnabled(false);
        loopCombo.setToolTipText("Do we continue to replay and loop over the input file when we are done or not");
        loopCombo.setLayoutData(comboGridData);
    }

    public void createButtons(Composite parent) {
        parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).margins(0, 0).create());

        GridData buttonGridData = new GridData();
        buttonGridData.horizontalSpan = 1;
        buttonGridData.horizontalAlignment = GridData.CENTER;
        buttonGridData.widthHint = 150;

        playButton = new Button(parent, SWT.PUSH);
        playButton.setText("Play");
        playButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                ScaModelCommand.execute(input, new ScaModelCommand() {
                    @Override
                    public void execute() {
                        ((ScaSimpleProperty) input.getProperty("Play")).setValue(true);
                    }
                });
                Job job = new Job("Start...") {
                    @Override
                    protected IStatus run(IProgressMonitor monitor) {
                        try {
                            input.start();
                        } catch (StartError e) {
                            return new Status(Status.ERROR, DataReaderActivator.PLUGIN_ID,
                                    "Failed to start data reader.", e);
                        }
                        return Status.OK_STATUS;
                    }
                };
                job.schedule();
            }
        });
        playButton.setLayoutData(buttonGridData);

        pauseButton = new Button(parent, SWT.PUSH);
        pauseButton.setText("Pause");
        pauseButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                ScaModelCommand.execute(input, new ScaModelCommand() {
                    @Override
                    public void execute() {
                        ((ScaSimpleProperty) input.getProperty("Play")).setValue(false);
                    }
                });
            }
        });
        pauseButton.setLayoutData(buttonGridData);

        stopButton = new Button(parent, SWT.PUSH);
        stopButton.setText("Stop");
        stopButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                ScaModelCommand.execute(input, new ScaModelCommand() {
                    @Override
                    public void execute() {
                        ((ScaSimpleProperty) input.getProperty("Play")).setValue(false);
                    }
                });
                Job job = new Job("Stop...") {
                    @Override
                    protected IStatus run(IProgressMonitor monitor) {
                        try {
                            input.stop();
                        } catch (StopError e) {
                            return new Status(Status.ERROR, DataReaderActivator.PLUGIN_ID,
                                    "Failed to stop data reader.", e);
                        }
                        return Status.OK_STATUS;
                    }
                };
                job.schedule();
            }
        });
        stopButton.setLayoutData(buttonGridData);
    }

    public void setInput(ScaComponent input) {
        this.input = input;
        if (context != null) {
            context.dispose();
            context = null;
        }
        if (input == null) {
            return;
        }
        context = new EMFDataBindingContext();

        setTextBindings(input, "SampleRate", sampleRateText);
        setTextBindings(input, "StreamID", streamIdText);
        setTextBindings(input, "FrontendRF", frontEndRfText);
        setTextBindings(input, "InputFile", inputFileText);
        setTextBindings(input, "SpeedFactor", speedFactorText);
        setTextBindings(input, "ydelta", yDeltaText);
        setTextBindings(input, "subsize", subsizeText);

        setComboBindings(input, "complex", complexCombo);
        setComboBindings(input, "Loop", loopCombo);
    }

    public void setTextBindings(ScaComponent input, String id, Widget value) {
        IObservableValue scaProperty = SCAObservables.observeSimpleProperty(input, id);
        IObservableValue cPanelProperty = WidgetProperties.text(SWT.Modify).observeDelayed(500, value);
        context.bindValue(cPanelProperty, scaProperty);
    }

    public void setComboBindings(ScaComponent input, String id, Widget value) {
        IObservableValue scaProperty = SCAObservables.observeSimpleProperty(input, id);
        IObservableValue cPanelProperty = WidgetProperties.selection().observeDelayed(500, value);
        context.bindValue(cPanelProperty, scaProperty);
    }

    public void displayFiles(String[] files) {
        for (int i = 0; files != null && i < files.length; i++) {
            inputFileText.setText(files[i]);
        }
    }

    private ControlDecoration createControlDecoration(Control control, Label label) {
        ControlDecoration controlDecoration = new ControlDecoration(control, SWT.LEFT | SWT.TOP);
        controlDecoration.setDescriptionText(label.getText() + " Not a valid entry.  Data must be numeric.");
        FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault()
                .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR);
        controlDecoration.setImage(fieldDecoration.getImage());
        return controlDecoration;
    }

    private void validate(final Text text, final ControlDecoration decoration) {
        text.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent event) {
                String textInput = text.getText();
                try {
                    Double.parseDouble(textInput);
                    decoration.hide();
                } catch (NumberFormatException ex) {
                    decoration.show();
                }
            }
        });
    }
}