mbtarranger.widgets.streaminspector.StreamInspector.java Source code

Java tutorial

Introduction

Here is the source code for mbtarranger.widgets.streaminspector.StreamInspector.java

Source

/*******************************************************************************
 * Copyright (c) 2015 ETAS GmbH.
 * 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
 *
 * Contributors:
 * Dennis Eder (ETAS GmbH) - initial API and implementation and/or initial documentation
 *******************************************************************************/
package mbtarranger.widgets.streaminspector;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JTextField;

import mbtarranger.widgets.custombutton.CustomButton;
import mbtarranger.widgets.customslider.CustomSlider;
import mbtarranger.widgets.streaminspector.InteractionModel.Bin;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseWheelListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormAttachment;

public class StreamInspector extends Composite implements PropertyChangeListener {
    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

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

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

    @Override
    public void propertyChange(PropertyChangeEvent event) {
        propertyChangeSupport.firePropertyChange(event);
    }

    private DataBindingContext m_bindingContext;
    protected InteractionModel interactionModel = new InteractionModel();
    private JTextField textField;
    private Text text_AltsPerBin;
    private Canvas canvas_plot1;

    private CustomSlider slider_translateX;
    private CustomSlider slider_translateY;

    public StreamInspector(Composite parent, int style) {
        super(parent, style);
        parent.setLayout(new swing2swt.layout.BorderLayout(0, 0));

        Composite composite_1 = new Composite(parent, SWT.NONE);
        composite_1.setLayoutData(swing2swt.layout.BorderLayout.CENTER);
        composite_1.setLayout(new swing2swt.layout.BorderLayout(0, 0));

        Composite composite_2 = new Composite(composite_1, SWT.NONE);
        composite_2.setLayoutData(swing2swt.layout.BorderLayout.SOUTH);
        composite_2.setLayout(new FormLayout());

        Button btnAltsPerBinMinus = new Button(composite_2, SWT.NONE);
        FormData fd_btnAltsPerBinMinus = new FormData();
        fd_btnAltsPerBinMinus.top = new FormAttachment(0, 3);
        fd_btnAltsPerBinMinus.left = new FormAttachment(0, 3);
        btnAltsPerBinMinus.setLayoutData(fd_btnAltsPerBinMinus);
        btnAltsPerBinMinus.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                interactionModel.setNumAltsPerBin(interactionModel.getNumAltsPerBin() - 1);
                canvas_plot1.redraw();
            }
        });
        btnAltsPerBinMinus.setText("-");
        text_AltsPerBin = new Text(composite_2, SWT.BORDER);
        text_AltsPerBin.setEditable(false);
        FormData fd_text_AltsPerBin = new FormData();
        fd_text_AltsPerBin.left = new FormAttachment(btnAltsPerBinMinus);
        fd_text_AltsPerBin.top = new FormAttachment(0, 3);
        text_AltsPerBin.setLayoutData(fd_text_AltsPerBin);
        Button btnAltsPerBinPlus = new Button(composite_2, SWT.NONE);
        FormData fd_btnAltsPerBinPlus = new FormData();
        fd_btnAltsPerBinPlus.left = new FormAttachment(text_AltsPerBin);
        fd_btnAltsPerBinPlus.top = new FormAttachment(0, 3);
        btnAltsPerBinPlus.setLayoutData(fd_btnAltsPerBinPlus);
        btnAltsPerBinPlus.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                interactionModel.setNumAltsPerBin(interactionModel.getNumAltsPerBin() + 1);
                canvas_plot1.redraw();
            }
        });
        btnAltsPerBinPlus.setText("+");

        Composite composite2_2 = new Composite(composite_2, SWT.NONE);
        composite2_2.setLayout(new FormLayout());
        FormData fd_composite2_2 = new FormData();
        fd_composite2_2.right = new FormAttachment(100, -3);
        fd_composite2_2.left = new FormAttachment(btnAltsPerBinPlus);
        composite2_2.setLayoutData(fd_composite2_2);

        Button btnAltsZoomIn = new Button(composite2_2, SWT.NONE);
        FormData fd_btnAltsZoomIn = new FormData();
        fd_btnAltsZoomIn.right = new FormAttachment(100, -3);
        fd_btnAltsZoomIn.top = new FormAttachment(0);

        btnAltsZoomIn.setLayoutData(fd_btnAltsZoomIn);
        btnAltsZoomIn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                interactionModel.setScale_x(interactionModel.getScale_x() * 1.1f);
                canvas_plot1.redraw();
            }
        });
        btnAltsZoomIn.setText("+");
        Button btnAltsZoomOut = new Button(composite2_2, SWT.NONE);
        FormData fd_btnAltsZoomOut = new FormData();
        fd_btnAltsZoomOut.right = new FormAttachment(btnAltsZoomIn);
        fd_btnAltsZoomOut.top = new FormAttachment(0);
        btnAltsZoomOut.setLayoutData(fd_btnAltsZoomOut);
        btnAltsZoomOut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                interactionModel.setScale_x(interactionModel.getScale_x() * 0.9f);
                canvas_plot1.redraw();
            }
        });
        btnAltsZoomOut.setText("-");

        slider_translateX = new CustomSlider(composite2_2, SWT.NONE, false);
        FormData fd_slider_translateX = new FormData();
        fd_slider_translateX.left = new FormAttachment(0, 3);
        fd_slider_translateX.right = new FormAttachment(btnAltsZoomOut);
        slider_translateX.setLayoutData(fd_slider_translateX);
        slider_translateX.setMaximum(1);
        slider_translateX.setSelection(1);

        Composite composite_3 = new Composite(composite_1, SWT.NONE);
        composite_3.setLayoutData(swing2swt.layout.BorderLayout.EAST);
        composite_3.setLayout(new FormLayout());
        Button btnVarntsZoomIn = new Button(composite_3, SWT.NONE);
        FormData fd_btnVarntsZoomIn = new FormData();
        fd_btnVarntsZoomIn.top = new FormAttachment(0, 3);
        fd_btnVarntsZoomIn.left = new FormAttachment(0, 3);
        btnVarntsZoomIn.setLayoutData(fd_btnVarntsZoomIn);
        btnVarntsZoomIn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                interactionModel.setScale_y(interactionModel.getScale_y() * 1.1f);
                canvas_plot1.redraw();
            }
        });
        btnVarntsZoomIn.setText("+");

        Button btnVarntsZoomOut = new Button(composite_3, SWT.NONE);
        FormData fd_btnVarntsZoomOut = new FormData();
        fd_btnVarntsZoomOut.top = new FormAttachment(btnVarntsZoomIn);
        fd_btnVarntsZoomOut.left = new FormAttachment(0, 3);
        btnVarntsZoomOut.setLayoutData(fd_btnVarntsZoomOut);
        btnVarntsZoomOut.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                interactionModel.setScale_y(interactionModel.getScale_y() * 0.9f);
                canvas_plot1.redraw();
            }
        });
        btnVarntsZoomOut.setText("-");
        slider_translateY = new CustomSlider(composite_3, SWT.NONE, true);
        FormData fd_slider_translateY = new FormData();
        fd_slider_translateY.bottom = new FormAttachment(100, -3);
        fd_slider_translateY.top = new FormAttachment(btnVarntsZoomOut);
        fd_slider_translateY.left = new FormAttachment(0, 3);
        slider_translateY.setLayoutData(fd_slider_translateY);
        slider_translateY.setMaximum(1);
        slider_translateY.setSelection(1);

        Composite composite_4 = new Composite(composite_1, SWT.NONE);
        composite_4.setLayoutData(swing2swt.layout.BorderLayout.NORTH);
        RowLayout rl_composite = new RowLayout(SWT.HORIZONTAL);
        rl_composite.wrap = false;
        rl_composite.fill = true;
        composite_4.setLayout(rl_composite);

        canvas_plot1 = new Canvas(composite_1, SWT.NONE);
        canvas_plot1.setLayoutData(swing2swt.layout.BorderLayout.CENTER);
        m_bindingContext = initDataBindings();
        canvas_plot1.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                Canvas canvas = (Canvas) e.widget;
                int pixelsPerBin_x = 80;
                int minX = 1;
                int minY = 1;
                int maxX = canvas.getSize().x - minX;
                int maxY = canvas.getSize().y - minY;
                int numBins = maxX / pixelsPerBin_x;
                int yScale = 10;
                org.eclipse.swt.graphics.Transform transform = new org.eclipse.swt.graphics.Transform(e.display);
                e.gc.getTransform(transform);
                transform.translate(0, (float) maxY);
                transform.translate(-interactionModel.getTranslate_x(), interactionModel.getTranslate_y());
                transform.scale(interactionModel.getScale_x(), interactionModel.getScale_y());
                transform.scale(1.0f, -1.0f);

                //e.gc.setAdvanced(true);
                e.gc.setTransform(transform);
                e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_DARK_GRAY));
                e.gc.setLineWidth(2);
                e.gc.drawLine(minX, minY, maxX, minY);
                e.gc.drawLine(minX, minY, minX, maxY);
                e.gc.drawLine(minX, maxY, maxX, maxY);

                e.gc.drawLine(maxX, minY, maxX, maxY);

                e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_GRAY));
                e.gc.setLineWidth(1);
                int xAxis_y = (int) Math.max(0.2 * maxY, 10.0);
                int binLeftmost_x = (int) Math.max(0.2 * maxX, 10.0);
                int binRightmost_x = (int) (maxX - binLeftmost_x);
                e.gc.drawLine(binLeftmost_x, xAxis_y, binRightmost_x, xAxis_y);
                e.gc.drawLine(binLeftmost_x, xAxis_y, binLeftmost_x, maxY);
                e.gc.drawLine(binRightmost_x, xAxis_y, binRightmost_x, maxY);
                // grid
                for (int i = 0; i < 20; i++) {
                    int x1 = binLeftmost_x;
                    int x2 = binRightmost_x;
                    int y1 = xAxis_y + (i * yScale);
                    int y2 = y1;
                    e.gc.drawLine(x1, y1, x2, y2);
                }

                // data
                ArrayList<Integer> dummyAlternatives = generateDummyDatastream1();

                int numAltsPerBin = interactionModel.getNumAltsPerBin();
                //int numBins = 8;

                List<Bin> quantized = quantize(dummyAlternatives, numAltsPerBin);
                e.gc.setLineWidth(1);
                float w = ((float) (binRightmost_x - binLeftmost_x) / (float) quantized.size());
                for (int i = 0; i < quantized.size(); i++) {
                    Bin bin = quantized.get(i);
                    int varsMax = bin.alternatives.get(0);
                    int varsMin = bin.alternatives.get(0);
                    for (Integer varsNum : bin.alternatives) {
                        if (varsNum > varsMax)
                            varsMax = varsNum;
                        if (varsNum < varsMin)
                            varsMin = varsNum;
                    }
                    int x1 = binLeftmost_x + Math.round(w * i);

                    int y1 = (int) (xAxis_y + ((varsMin - 0.5) * yScale));
                    int h = (int) (((varsMax - varsMin + 1) * yScale));
                    //e.gc.drawLine(x1, y1, x2, y2);
                    if (i == interactionModel.getSelection()) {
                        e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLUE));
                        e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_BLUE));
                    } else {
                        e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_GRAY));
                        e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_GRAY));
                    }
                    e.gc.fillRectangle(x1, y1, (int) Math.floor(w), h);
                }

            }
        });

        /*
         * at end of construction, register redraw for all property change
         * events from interactionmodel:
         */
        interactionModel.addPropertyChangeListener(evt -> canvas_plot1.redraw());
    }

    protected List<InteractionModel.Bin> quantize(List<Integer> alternatives, int altsPerBin) {
        ArrayList<InteractionModel.Bin> res = new ArrayList<InteractionModel.Bin>();
        int binsIdx = 0;
        int altCount = 0;
        for (Integer alternative : alternatives) {
            altCount++;
            binsIdx = altCount / altsPerBin;
            if (res.size() < binsIdx + 1)
                res.add(new InteractionModel.Bin());
            res.get(res.size() - 1).alternatives.add(alternative);
        }
        return res;
    }

    protected CustomSlider getSlider_translateX() {
        return slider_translateX;
    }

    private static ArrayList<Integer> generateDummyDatastream1() {
        ArrayList<Integer> dummyAlternatives = new ArrayList<>();
        dummyAlternatives.add(1);
        dummyAlternatives.add(1);
        dummyAlternatives.add(4);
        dummyAlternatives.add(5);
        dummyAlternatives.add(5);
        dummyAlternatives.add(3);
        dummyAlternatives.add(1);
        dummyAlternatives.add(2);
        dummyAlternatives.add(7);
        dummyAlternatives.add(7);
        dummyAlternatives.add(8);
        dummyAlternatives.add(4);
        dummyAlternatives.add(2);
        dummyAlternatives.add(3);
        dummyAlternatives.add(4);
        dummyAlternatives.add(1);
        dummyAlternatives.add(2);
        dummyAlternatives.add(7);
        dummyAlternatives.add(4);
        dummyAlternatives.add(5);
        dummyAlternatives.add(5);
        dummyAlternatives.add(1);
        dummyAlternatives.add(2);
        dummyAlternatives.add(7);
        dummyAlternatives.add(5);
        dummyAlternatives.add(2);
        dummyAlternatives.add(5);
        dummyAlternatives.add(2);
        dummyAlternatives.add(3);
        dummyAlternatives.add(4);
        dummyAlternatives.add(5);
        dummyAlternatives.add(1);
        dummyAlternatives.add(2);
        dummyAlternatives.add(7);
        dummyAlternatives.add(3);
        dummyAlternatives.add(4);
        dummyAlternatives.add(5);
        dummyAlternatives.add(5);
        dummyAlternatives.add(3);
        return dummyAlternatives;
    }

    protected DataBindingContext initDataBindings() {
        DataBindingContext bindingContext = new DataBindingContext();
        //
        IObservableValue slider_translateXSelectionObserveValue = BeansObservables.observeValue(slider_translateX,
                "selection");
        IObservableValue interactionModelTranslate_xObserveValue = BeansObservables.observeValue(interactionModel,
                "translate_x");
        bindingContext.bindValue(slider_translateXSelectionObserveValue, interactionModelTranslate_xObserveValue,
                null, null);
        //
        IObservableValue slider_translateYSelectionObserveValue = BeansObservables.observeValue(slider_translateY,
                "selection");
        IObservableValue interactionModelTranslate_yObserveValue = BeansObservables.observeValue(interactionModel,
                "translate_y");
        bindingContext.bindValue(slider_translateYSelectionObserveValue, interactionModelTranslate_yObserveValue,
                null, null);
        //
        IObservableValue slider_translateXMaximumObserveValue = BeansObservables.observeValue(slider_translateX,
                "maximum");
        IObservableValue interactionModelTranslate_xMaxObserveValue = BeansObservables
                .observeValue(interactionModel, "translate_xMax");
        bindingContext.bindValue(slider_translateXMaximumObserveValue, interactionModelTranslate_xMaxObserveValue,
                null, null);
        //
        IObservableValue canvas_plot1ObserveSizeObserveWidget = SWTObservables.observeSize(canvas_plot1);
        IObservableValue interactionModelPlotSizeObserveValue = BeansObservables.observeValue(interactionModel,
                "plotSize");
        bindingContext.bindValue(canvas_plot1ObserveSizeObserveWidget, interactionModelPlotSizeObserveValue, null,
                null);
        //
        IObservableValue slider_translateYMaximumObserveValue = BeansObservables.observeValue(slider_translateY,
                "maximum");
        IObservableValue interactionModelTranslate_yMaxObserveValue = BeansObservables
                .observeValue(interactionModel, "translate_yMax");
        bindingContext.bindValue(slider_translateYMaximumObserveValue, interactionModelTranslate_yMaxObserveValue,
                null, null);
        //
        IObservableValue text_AltsPerBinObserveTextObserveWidget = SWTObservables.observeText(text_AltsPerBin,
                SWT.Modify);
        IObservableValue interactionModelNumAltsPerBinObserveValue = BeansObservables.observeValue(interactionModel,
                "numAltsPerBin");
        bindingContext.bindValue(text_AltsPerBinObserveTextObserveWidget, interactionModelNumAltsPerBinObserveValue,
                null, null);
        //
        return bindingContext;
    }
}