gov.redhawk.ui.port.nxmblocks.PlotNxmBlockControls.java Source code

Java tutorial

Introduction

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

import gov.redhawk.sca.util.ArrayUtil;
import gov.redhawk.ui.port.nxmplot.preferences.PlotPreferences;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.conversion.StringToNumberConverter;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

/**
 * Adjust/override INxmBlock settings to plot user entry dialog.
 * @NonNullByDefault
 * @noreference This class is provisional/beta and is subject to API changes
 * @since 4.4
 */
public class PlotNxmBlockControls {

    private static final String VALUE_USE_DEFAULT = "default";
    private static final Object[] FRAME_SIZE_COMBO_VALUES = new Object[] { VALUE_USE_DEFAULT, 512, 1024, 2048, 4096,
            8192 };

    private static final String FRAME_SIZE_FIELD_NAME = "Frame Size";

    private final PlotNxmBlockSettings settings;
    private final DataBindingContext dataBindingCtx;

    // widgets
    private ComboViewer frameSizeField;
    private Text linePlotConsumeLengthField;

    public PlotNxmBlockControls(PlotNxmBlockSettings settings, DataBindingContext dataBindingCtx) {
        this.settings = settings;
        this.dataBindingCtx = dataBindingCtx;
    }

    public void createControls(final Composite container) {
        container.setLayout(new GridLayout(2, false));
        Label label;

        // === frame size ===
        label = new Label(container, SWT.NONE);
        label.setText(FRAME_SIZE_FIELD_NAME + ":");
        this.frameSizeField = new ComboViewer(container, SWT.BORDER); // writable
        this.frameSizeField.getCombo().setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        this.frameSizeField.getCombo().setToolTipText(
                "Custom frame size to override value in StreamSRI. Default uses value from StreamSRI.");
        this.frameSizeField.setContentProvider(ArrayContentProvider.getInstance()); // ArrayContentProvider does not store any state, therefore can re-use instances
        this.frameSizeField.setLabelProvider(new LabelProvider());
        Object[] inputValues = ArrayUtil.copyAndPrependIfNotNull(this.settings.getFrameSize(),
                FRAME_SIZE_COMBO_VALUES);
        this.frameSizeField.setInput(inputValues);
        this.frameSizeField.setSelection(new StructuredSelection(inputValues[0])); // select first value (which is current value or default)
        this.frameSizeField
                .addSelectionChangedListener(new SelectAllTextComboTextListener(this.frameSizeField.getCombo()));

        // === line plot frame thinning ===
        label = new Label(container, SWT.NONE);
        label.setText("&Line Plot Frame Thinning:");
        this.linePlotConsumeLengthField = new Text(container, SWT.BORDER);
        this.linePlotConsumeLengthField.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
        this.linePlotConsumeLengthField.setToolTipText("Thin line plot by displaying 1 out of every n frames. "
                + "Use -1 for no thinning. Leave blank to use default of "
                + PlotPreferences.LINE_PLOT_CONSUMELENGTH.getDefaultValue() + ".");

        initDataBindings();
    }

    private void initDataBindings() {
        IObservableValue frameSizeWidgetValue = WidgetProperties.selection()
                .observe(this.frameSizeField.getCombo());
        IObservableValue frameSizeModelValue = PojoProperties.value(PlotNxmBlockSettings.PROP_FRAME_SIZE)
                .observe(this.settings);
        UpdateValueStrategy frameSizeTargetToModel = new UpdateValueStrategy();
        frameSizeTargetToModel
                .setAfterGetValidator(new StringToIntegerValidator(FRAME_SIZE_FIELD_NAME, VALUE_USE_DEFAULT));
        frameSizeTargetToModel.setConverter(
                new ObjectToNullConverter(StringToNumberConverter.toInteger(false), true, true, VALUE_USE_DEFAULT));
        frameSizeTargetToModel.setAfterConvertValidator(
                new NumberRangeValidator<Integer>(FRAME_SIZE_FIELD_NAME, Integer.class, 2));
        UpdateValueStrategy frameSizeModelToTarget = new UpdateValueStrategy();
        frameSizeModelToTarget.setConverter(new ObjectToNullConverter()); // converts null to null, otherwise uses toString()
        Binding bindingValue = dataBindingCtx.bindValue(frameSizeWidgetValue, frameSizeModelValue,
                frameSizeTargetToModel, frameSizeModelToTarget);
        ControlDecorationSupport.create(bindingValue, SWT.TOP | SWT.LEFT);

        bindingValue = dataBindingCtx.bindValue(
                WidgetProperties.text(SWT.Modify).observe(linePlotConsumeLengthField),
                PojoProperties.value("linePlotConsumeLength").observe(this.settings));
        ControlDecorationSupport.create(bindingValue, SWT.TOP | SWT.LEFT);
    }
}