gov.redhawk.ui.port.nxmplot.FftNumAvgControls.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.ui.port.nxmplot.FftNumAvgControls.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.ui.port.nxmplot;

import gov.redhawk.sca.util.PropertyChangeSupport;
import gov.redhawk.ui.port.nxmblocks.FftNxmBlock;
import gov.redhawk.ui.port.nxmplot.preferences.FftPreferences;

import java.beans.PropertyChangeListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.Text;

/**
 * @since 4.4
 */
public class FftNumAvgControls extends Composite {

    private static final Integer DEFAULT_FFT_NUM_AVE = 1;

    private IPropertyChangeListener fftSettingsListener = new IPropertyChangeListener() {

        @Override
        public void propertyChange(final PropertyChangeEvent evt) {
            if (isDisposed()) {
                return;
            }
            if (FftPreferences.NUM_AVERAGES.isEvent(evt)) {

                getDisplay().asyncExec(new Runnable() {

                    @Override
                    public void run() {
                        int numAvg = (Integer) evt.getNewValue();
                        if (avgSlider != null && avgText != null) {
                            if (numAvg < avgSlider.getMinimum()) {
                                numAvg = avgSlider.getMinimum();
                            } else if (numAvg > avgSlider.getMaximum()) {
                                numAvg = avgSlider.getMaximum();
                            }
                            state.setNumAvg(numAvg);
                        }
                    }

                });
            }
        }

    };

    private PropertyChangeListener propListener = new PropertyChangeListener() {

        @Override
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            if (isDisposed()) {
                return;
            }
            if (PlotPageBook2.PROP_SOURCES.equals(evt.getPropertyName())) {
                if (evt.getNewValue() instanceof PlotSource) {
                    for (INxmBlock b : pageBook.getBlockChain((PlotSource) evt.getNewValue())) {
                        if (b instanceof FftNxmBlock) {
                            ((FftNxmBlock) b).getPreferences().addPropertyChangeListener(fftSettingsListener);
                        }
                    }
                }
            }
        }
    };

    private class State {
        private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
        private int numAvg;

        @SuppressWarnings("unused")
        public int getNumAvg() {
            return numAvg;
        }

        public void setNumAvg(int numAvg) {
            numAvg = Math.min(avgSlider.getMaximum(), numAvg);
            numAvg = Math.max(avgSlider.getMinimum(), numAvg);
            int oldAvg = this.numAvg;
            this.numAvg = numAvg;
            if (oldAvg != this.numAvg) {
                pcs.firePropertyChange("numAvg", oldAvg, this.numAvg);
                for (FftNxmBlock b : getFftBlocks()) {
                    b.setNumAverages(this.numAvg);
                }
            }
        }

        @SuppressWarnings("unused")
        public void addPropertyChangeListener(PropertyChangeListener listener) {
            pcs.addPropertyChangeListener(listener);
        }

        @SuppressWarnings("unused")
        public void removePropertyChangeListener(PropertyChangeListener listener) {
            pcs.removePropertyChangeListener(listener);
        }

    }

    private State state = new State();

    private Scale avgSlider;
    private Text avgText;
    private final NumberFormat numberFormatter;
    private final PlotPageBook2 pageBook;
    private DataBindingContext context = new DataBindingContext();

    public FftNumAvgControls(PlotPageBook2 pageBook, Composite parent) {
        super(parent, SWT.None);
        this.pageBook = pageBook;
        this.pageBook.addPropertyChangeListener(propListener);
        numberFormatter = new DecimalFormat("##0");
        numberFormatter.setParseIntegerOnly(true);
        createPartControls(this);
        for (PlotSource source : pageBook.getSources()) {
            for (INxmBlock b : pageBook.getBlockChain(source)) {
                if (b instanceof FftNxmBlock) {
                    ((FftNxmBlock) b).getPreferences().addPropertyChangeListener(fftSettingsListener);
                }
            }
        }
        state.setNumAvg(getCurrentFftAvg());
    }

    @Override
    public void dispose() {
        super.dispose();
        pageBook.removePropertyChangeListener(propListener);
        for (FftNxmBlock b : getFftBlocks()) {
            b.getPreferences().removePropertyChangeListener(fftSettingsListener);
        }
    }

    private void createPartControls(Composite parent) {
        parent.setLayout(new GridLayout(1, false));

        Label avgLabel = new Label(parent, SWT.CENTER);
        avgLabel.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        FontData[] fD = avgLabel.getFont().getFontData();
        fD[0].setStyle(SWT.BOLD);
        fD[0].setHeight(8);
        avgLabel.setFont(new Font(avgLabel.getDisplay(), fD[0]));
        avgLabel.setText("Avg");

        this.avgText = new Text(parent, SWT.BORDER);
        fD = avgText.getFont().getFontData();
        fD[0].setHeight(8);
        avgText.setFont(new Font(avgText.getDisplay(), fD[0]));
        GC gc = null;
        try {
            gc = new GC(avgText);
            Point minSize = gc.stringExtent("XXX");
            this.avgText.setLayoutData(
                    GridDataFactory.fillDefaults().grab(true, false).hint(minSize.x, SWT.DEFAULT).create());
        } finally {
            if (gc != null) {
                gc.dispose();
            }
        }
        this.avgText.setTextLimit(3);
        context.bindValue(
                WidgetProperties.text(new int[] { SWT.Modify, SWT.FocusOut }).observeDelayed(500, avgText),
                BeanProperties.value("numAvg").observe(state));

        this.avgSlider = new Scale(parent, SWT.VERTICAL);
        this.avgSlider.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
        this.avgSlider.setToolTipText("FFT Averaging");
        this.avgSlider.setMinimum(1);
        this.avgSlider.setMaximum(100);
        context.bindValue(WidgetProperties.selection().observeDelayed(100, avgSlider),
                BeanProperties.value("numAvg").observe(state));

    }

    private int getCurrentFftAvg() {
        for (FftNxmBlock block : getFftBlocks()) {
            return block.getSettings().getNumAverages();
        }
        return FftNumAvgControls.DEFAULT_FFT_NUM_AVE;
    }

    private List<FftNxmBlock> getFftBlocks() {
        List<FftNxmBlock> retVal = new ArrayList<FftNxmBlock>();
        for (PlotSource source : pageBook.getSources()) {
            for (INxmBlock block : pageBook.getBlockChain(source)) {
                if (block instanceof FftNxmBlock) {
                    retVal.add((FftNxmBlock) block);
                }
            }
        }
        return retVal;
    }

}