gov.redhawk.datalist.ui.views.OptionsComposite.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.datalist.ui.views.OptionsComposite.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.datalist.ui.views;

import gov.redhawk.datalist.ui.DataCollectionSettings;
import gov.redhawk.datalist.ui.DataListPlugin;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import org.eclipse.core.databinding.AggregateValidationStatus;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.core.databinding.observable.value.ComputedValue;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.Label;
import org.eclipse.swt.widgets.Text;

/**
 * @since 2.0
 */
public abstract class OptionsComposite {

    private final DataCollectionSettings settings = new DataCollectionSettings();

    private static class State {
        private boolean isRunning = false;
        private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

        public void setRunning(boolean isRunning) {
            boolean oldValue = this.isRunning;
            this.isRunning = isRunning;
            pcs.firePropertyChange("running", oldValue, isRunning);
        }

        public boolean isRunning() {
            return isRunning;
        }

        public void addPropertyChangeListener(PropertyChangeListener listener) {
            pcs.addPropertyChangeListener(listener);
        }

        public void removePropertyChangeListener(PropertyChangeListener listener) {
            pcs.removePropertyChangeListener(listener);
        }
    }

    private State state = new State();

    private DataBindingContext ctx = new DataBindingContext();

    private Text samplesTxt;

    private Button button;

    private ImageRegistry resources = new ImageRegistry();
    //   
    public static final String REAL = "Real", IMAGINARY = "Imaginary", COMPLEX = "Complex";

    public static enum CaptureMethod {
        NUMBER("Number of Samples"), INDEFINITELY("Indefinitely"), CLOCK_TIME("Clock Time"), SAMPLE_TIME(
                "Sample Time");

        /** the description of the enum, outputted by toString() */
        private String description; // DO NOT SET to null!

        CaptureMethod(String description) {
            this.description = description;
        }

        @Override
        public String toString() {
            return description;
        }
    }

    public OptionsComposite(Composite main) {
        resources.put("icons/start.gif", DataListPlugin
                .imageDescriptorFromPlugin(DataListPlugin.PLUGIN_ID, "icons/start.gif").createImage(true));
        resources.put("icons/stop.gif", DataListPlugin
                .imageDescriptorFromPlugin(DataListPlugin.PLUGIN_ID, "icons/stop.gif").createImage(true));
        main.addDisposeListener(new DisposeListener() {

            @Override
            public void widgetDisposed(DisposeEvent e) {
                resources.dispose();
                ctx.dispose();
            }
        });
        createControl(main);
    }

    public void createControl(Composite main) {
        final Composite parent = new Composite(main, SWT.None);
        parent.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).create());

        final ComboViewer captureCombo = new ComboViewer(parent, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
        captureCombo.setContentProvider(new ArrayContentProvider());
        captureCombo.setLabelProvider(new LabelProvider());
        captureCombo.setInput(new Object[] { CaptureMethod.NUMBER, CaptureMethod.INDEFINITELY });
        ctx.bindValue(ViewerProperties.singleSelection().observe(captureCombo),
                BeanProperties.value("processType").observe(settings));

        samplesTxt = new Text(parent, SWT.BORDER);
        samplesTxt.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        ctx.bindValue(WidgetProperties.enabled().observe(samplesTxt),
                BeanProperties.value("processType").observe(settings),
                new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER),
                new UpdateValueStrategy().setConverter(new Converter(CaptureMethod.class, Boolean.class) {

                    @Override
                    public Object convert(Object fromObject) {
                        if (fromObject == CaptureMethod.INDEFINITELY) {
                            return false;
                        }
                        return true;
                    }
                }));
        Binding binding = ctx.bindValue(WidgetProperties.text(SWT.Modify).observe(samplesTxt),
                BeanProperties.value("samples").observe(settings),
                new UpdateValueStrategy().setBeforeSetValidator(new IValidator() {

                    @Override
                    public IStatus validate(Object obj) {
                        Double value = (Double) obj;
                        if (Double.valueOf(value) <= 0) {
                            return ValidationStatus.error(settings.getProcessType() + " must be greater than 0.");
                        }

                        if (value > Integer.MAX_VALUE) {
                            return ValidationStatus.error(settings.getProcessType()
                                    + " must be less than or equal to " + Integer.MAX_VALUE + ".");
                        }

                        if ((value - value.intValue()) > 0) {
                            return ValidationStatus
                                    .error(settings.getProcessType() + " must be a positive integer.");
                        }

                        if (value > 1000000) {
                            return ValidationStatus.warning("For this sample size, you may run out of heap space.");
                        }
                        return ValidationStatus.ok();
                    }

                }), null);
        ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT);

        final IObservableValue running = BeanProperties.value("running").observe(state);
        final IObservableValue pType = BeanProperties.value("processType").observe(settings);
        ComputedValue enabledSamples = new ComputedValue(Boolean.class) {

            @Override
            protected Object calculate() {
                return !(Boolean) running.getValue() && pType.getValue() != CaptureMethod.INDEFINITELY;
            }
        };

        ctx.bindValue(WidgetProperties.enabled().observe(samplesTxt), enabledSamples,
                new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), null);

        final Label unitsLabel = new Label(parent, SWT.None);
        unitsLabel.setText("");
        GridData unitsLayout = new GridData();
        unitsLayout.widthHint = 20;
        unitsLabel.setLayoutData(unitsLayout);

        settings.addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if ("processType".equals(evt.getPropertyName())) {
                    CaptureMethod method = (CaptureMethod) evt.getNewValue();
                    if (method == CaptureMethod.INDEFINITELY) {
                        settings.setSamples(1);
                        unitsLabel.setText("");
                    } else {
                        if (method == CaptureMethod.CLOCK_TIME || method == CaptureMethod.SAMPLE_TIME) {
                            unitsLabel.setText("(s)");
                        } else {
                            unitsLabel.setText("");
                        }
                        settings.setSamples(1024);
                    }
                }
            }
        });

        Label label = new Label(parent, SWT.None);
        label.setText("Number of Dimensions:");

        Combo columnsCombo = new Combo(parent, SWT.BORDER | SWT.SINGLE | SWT.DROP_DOWN);
        columnsCombo.setText(REAL);
        columnsCombo.add(REAL, 0);
        columnsCombo.add(COMPLEX, 1);
        columnsCombo.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        ctx.bindValue(WidgetProperties.enabled().observe(columnsCombo),
                BeanProperties.value("running").observe(state),
                new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER),
                new UpdateValueStrategy().setConverter(new Converter(Boolean.class, Boolean.class) {

                    @Override
                    public Boolean convert(Object fromObject) {
                        return !((Boolean) fromObject);
                    }
                }));
        binding = ctx.bindValue(WidgetProperties.selection().observe(columnsCombo),
                BeanProperties.value("dimensions").observe(settings),
                new UpdateValueStrategy().setAfterGetValidator(new IValidator() {

                    @Override
                    public IStatus validate(Object value) {
                        if (REAL.equalsIgnoreCase((String) value)) {
                            return ValidationStatus.ok();
                        } else if (COMPLEX.equalsIgnoreCase((String) value)) {
                            return ValidationStatus.ok();
                        } else {
                            try {
                                Integer intValue = Integer.valueOf((String) value);
                                if (intValue > 0) {
                                    return ValidationStatus.ok();
                                }
                            } catch (NumberFormatException e) {
                                // PASS
                            }
                        }
                        return ValidationStatus
                                .error("Please enter a positive integer or choose one of the options below.");
                    }

                }).setConverter(new Converter(String.class, Integer.class) {

                    @Override
                    public Object convert(Object fromObject) {
                        if (REAL.equalsIgnoreCase((String) fromObject)) {
                            return 1;
                        } else if (COMPLEX.equalsIgnoreCase((String) fromObject)) {
                            return 2;
                        } else {
                            return Integer.valueOf((String) fromObject);
                        }
                    }

                }), null);
        ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT);

        button = new Button(parent, SWT.None);
        button.setLayoutData(GridDataFactory.fillDefaults().create());
        button.setImage(resources.get("icons/start.gif"));
        button.setToolTipText("Start Acquire");
        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                if (state.isRunning) {
                    stopAcquire();
                } else {
                    startAcquire();
                }
            }
        });
        ctx.bindValue(WidgetProperties.enabled().observe(button),
                new AggregateValidationStatus(ctx, AggregateValidationStatus.MAX_SEVERITY),
                new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER),
                new UpdateValueStrategy().setConverter(new Converter(IStatus.class, Boolean.class) {

                    @Override
                    public Object convert(Object fromObject) {
                        return ((IStatus) fromObject).getSeverity() != IStatus.ERROR;
                    }
                }));
    }

    public abstract void startAcquire();

    public abstract void stopAcquire();

    public static void showDecoration(ControlDecoration dec, String errorText) {
        dec.setDescriptionText(errorText);
        dec.show();
    }

    public void buttonsEnable(boolean running) {
        state.setRunning(running);
        if (running) {
            button.setImage(resources.get("icons/stop.gif"));
            button.setToolTipText("Stop Acquire");
        } else {
            button.setImage(resources.get("icons/start.gif"));
            button.setToolTipText("Start Acquire");
        }
    }

    public boolean isIndefinite() {
        return settings.getProcessType() == CaptureMethod.INDEFINITELY;
    }

    public DataCollectionSettings getSettings() {
        return settings;
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        if (this.samplesTxt != null && !this.samplesTxt.isDisposed()) {
            this.samplesTxt.setFocus();
        }
    }

}