Java tutorial
/******************************************************************************* * 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; } }