package org.movsim.viewer.ui.charts; ///** // * Copyright (C) 2010, 2011 by Arne Kesting, Martin Treiber, // * Ralph Germ, Martin Budden // * <movsim@akesting.de> // * ---------------------------------------------------------------------- // * // * This file is part of // * // * MovSim - the multi-model open-source vehicular-traffic simulator // * // * MovSim is free software: you can redistribute it and/or modify // * it under the terms of the GNU General Public License as published by // * the Free Software Foundation, either version 3 of the License, or // * (at your option) any later version. // * // * MovSim is distributed in the hope that it will be useful, // * but WITHOUT ANY WARRANTY; without even the implied warranty of // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * GNU General Public License for more details. // * // * You should have received a copy of the GNU General Public License // * along with MovSim. If not, see <http://www.gnu.org/licenses/> or // * <http://www.movsim.org>. // * // * ---------------------------------------------------------------------- // */ //package org.movsim.viewer.graphics.charts; // //import java.awt.BorderLayout; //import java.awt.Dimension; //import java.awt.event.ActionEvent; //import java.awt.event.ActionListener; //import java.awt.event.WindowAdapter; //import java.awt.event.WindowEvent; //import java.text.DecimalFormat; //import java.util.HashMap; //import java.util.List; //import java.util.Map; //import java.util.concurrent.ExecutorService; //import java.util.concurrent.Executors; // //import javax.swing.Box; //import javax.swing.BoxLayout; //import javax.swing.JCheckBox; //import javax.swing.JFrame; //import javax.swing.JLabel; //import javax.swing.JPanel; // //import org.jfree.chart.ChartFactory; //import org.jfree.chart.ChartPanel; //import org.jfree.chart.JFreeChart; //import org.jfree.chart.axis.NumberAxis; //import org.jfree.chart.axis.NumberTickUnit; //import org.jfree.chart.axis.TickUnitSource; //import org.jfree.chart.axis.TickUnits; //import org.jfree.chart.axis.ValueAxis; //import org.jfree.chart.plot.PlotOrientation; //import org.jfree.chart.plot.XYPlot; //import org.jfree.chart.renderer.xy.XYItemRenderer; //import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; //import org.jfree.chart.title.LegendTitle; //import org.jfree.data.xy.XYSeries; //import org.jfree.data.xy.XYSeriesCollection; //import org.jfree.ui.RectangleEdge; //import org.movsim.output.FloatingCars; //import org.movsim.simulator.Simulator; //import org.movsim.utilities.ObserverInTime; //import org.movsim.viewer.graphics.charts.model.FloatingCarDataPoint; //import org.movsim.viewer.util.SwingHelper; // ///** // * @author ralph // * // */ //public class FloatingCarsAccelerationView extends JFrame implements ActionListener, ObserverInTime, Runnable { // // private final FloatingCars floatingCars; // // private List<Integer> listOfFloatingCars; // // private Map<Integer, List<FloatingCarDataPoint>> floatingCarsDataPoints; // // private final ChartPanel chartPanel; // // private String titleChart; // // private String xAxis; // // private String yAxis; // // private List<Integer> floatingCarsList; // // private int numberOfFloatingCars; // // private XYSeries series[]; // // private XYPlot plot; // // private Boolean flagDp = false; // // private final JLabel[] lblTraveledDistance; // // private final Simulator simulator; // // private final DecimalFormat format; // // private final ExecutorService exec; // // private double time; // // /** // * @param floatingCarPanel // * @param simulator // */ // public FloatingCarsAccelerationView() { // this.simulator = Simulator.getInstance(); // this.setLayout(new BorderLayout()); // // addWindowListener(new WindowAdapter() { // @Override // public void windowClosing(WindowEvent evnt) { // // removeObserver(); // // cbMenu.setSelected(false); // evnt.getWindow().setVisible(false); // evnt.getWindow().dispose(); // } // }); // // floatingCars = simulator.getSimObservables().getFloatingCars(); // if (floatingCars == null) { // System.out.println("error, expected floating_cars xml configuration for use case here "); // TODO handle // } else { // floatingCars.registerObserver(this); // listOfFloatingCars = floatingCars.getFcdList(); // floatingCarsDataPoints = new HashMap<Integer, List<FloatingCarDataPoint>>(); // floatingCarsList = floatingCars.getFcdList(); // numberOfFloatingCars = floatingCarsList.size(); // series = new XYSeries[numberOfFloatingCars]; // for (int i = 0; i < numberOfFloatingCars; i++) { // series[i] = new XYSeries(String.valueOf(floatingCarsList.get(i) - 1)); // series[i].add(0, 0); // } // } // // setTitleChart("Floating Cars"); // setxAxis("x"); // TODO Label acc // setyAxis("Y"); // final JFreeChart chart = createChart(); // // chartPanel = new ChartPanel(chart, true, false, false, true, true); // // SwingHelper.setComponentSize(chartPanel, 200, 100); // // chartPanel.setMouseWheelEnabled(true); // // // chartPanel.setHorizontalAxisTrace(true); // // chartPanel.setVerticalAxisTrace(true); // // // Hide FC checkboxes // final JPanel checkBoxpanel = new JPanel(); // // lblTraveledDistance = new JLabel[numberOfFloatingCars]; // for (int i = 0; i < numberOfFloatingCars; i++) { // lblTraveledDistance[i] = new JLabel("0 m/\u00B2"); // SwingHelper.setComponentSize(lblTraveledDistance[i], 68, 22); // } // // checkBoxpanel.setLayout(new BoxLayout(checkBoxpanel, BoxLayout.PAGE_AXIS)); // // checkBoxpanel.add(Box.createRigidArea(new Dimension(10, 40))); // // for (int i = 0; i < numberOfFloatingCars; i++) { // final Integer fc = floatingCarsList.get(i); // final JCheckBox jcheckbox = new JCheckBox("Car " + String.valueOf(fc - 1)); // jcheckbox.setActionCommand(String.valueOf(fc)); // jcheckbox.addActionListener(this); // jcheckbox.setSelected(true); // // checkBoxpanel.add(jcheckbox); // checkBoxpanel.add(lblTraveledDistance[i]); // //// final Vehicle floatingCar = floatingCars.getVehicleContainers().get(0).getVehicles().get(fc); //// lblTraveledDistance[i].setText(String.valueOf(floatingCar.physicalQuantities().getAcc() + " m/s\u00B2 ")); //// checkBoxpanel.add(Box.createVerticalGlue()); //TODO // } // final JCheckBox rendererCheckBox = new JCheckBox("dp"); // rendererCheckBox.setActionCommand("dp"); // rendererCheckBox.addActionListener(this); // rendererCheckBox.setSelected(flagDp); // checkBoxpanel.add(rendererCheckBox); // // checkBoxpanel.add(Box.createRigidArea(new Dimension(10, 40))); // // add(checkBoxpanel, BorderLayout.EAST); // add(chartPanel, BorderLayout.CENTER); // // format = new DecimalFormat("#.##"); // // exec = Executors.newCachedThreadPool(); // // pack(); // setVisible(true); // } // // /* // * (non-Javadoc) // * // * @see org.movsim.utilities.ObserverInTime#notifyObserver(double) // */ // @Override // public void notifyObserver(final double time) { // this.time = time; // if (floatingCars != null) { // // // new Thread(new Runnable() { // // // // @Override // // public void run() { // // // TODO Auto-generated method stub // // pullFloatingCarsData(time); // // // // updateView(); // // } // // }).start(); // exec.execute(this); // // } // } // // private void updateView() { // for (int i = 0; i < numberOfFloatingCars; i++) { // addDataToSerieAndNextToChart(series[i], floatingCarsList.get(i), i); // // } // // System.out.println("updateview() Thread: " + Thread.currentThread().getName()); // // this.repaint(); // } // // private void addDataToSerieAndNextToChart(XYSeries se, int fc, int i) { // final List<FloatingCarDataPoint> accData = floatingCarsDataPoints.get(fc); // // final double yAx = accData.get(accData.size() - 1).getAcc(); // gets the last added. concurrency problem! // final double time = accData.get(accData.size() - 1).getTime(); // se.add(time, yAx); // lblTraveledDistance[i].setText(String.valueOf(format.format(yAx) + " m/s\u00B2 ")); // } // // private XYSeriesCollection createDataSerie() { // final XYSeriesCollection dataSet = new XYSeriesCollection(); // for (final XYSeries se : series) { // dataSet.addSeries(se); // } // return dataSet; // } // // private JFreeChart createChart() { // final JFreeChart chart = ChartFactory.createXYLineChart(null, xAxis, yAxis, createDataSerie(), // PlotOrientation.VERTICAL, true, false, false); // chart.setBackgroundPaint(getBackground()); // plot = (XYPlot) chart.getPlot(); // // final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); // rangeAxis.setStandardTickUnits(createAccelerationTickUnits()); // // final NumberAxis domainAxis = (NumberAxis) plot.getDomainAxis(); // domainAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); // // final double duration = simulator.getSimInput().getSimulationInput().getMaxSimTime(); // final ValueAxis vDomainAxis = plot.getDomainAxis(); // domainAxis.setRange(0, duration); // // // plot.setBackgroundPaint(Color.WHITE); // // // XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) // // plot.getRenderer(); // // renderer.setShapesVisible(true); // // renderer.setShapesFilled(true); // // // smooth chart // // chart.getXYPlot().setRenderer(new XYSplineRenderer()); // // final LegendTitle legend = chart.getLegend(); // legend.setPosition(RectangleEdge.RIGHT); // return chart; // // } // // private void pullFloatingCarsData(double time) { // for (final int fc : listOfFloatingCars) { //// final Vehicle floatingCar = floatingCars.getVehicleContainers().get(0).getVehicles().get(fc); //// final List<FloatingCarDataPoint> data = floatingCarsDataPoints.get(fc); //// if (data == null) { //// final ArrayList<FloatingCarDataPoint> list = new ArrayList<FloatingCarDataPoint>(); //// list.add(new FloatingCarDataPoint(time, floatingCar.physicalQuantities().getPosition(), floatingCar //// .physicalQuantities().getSpeed() * 3.6, floatingCar.physicalQuantities().getAcc())); //// floatingCarsDataPoints.put(fc, list); //// } else { //// floatingCarsDataPoints.get(fc).add( //// new FloatingCarDataPoint(time, floatingCar.physicalQuantities().getPosition(), floatingCar //// .physicalQuantities().getSpeed() * 3.6, floatingCar.physicalQuantities().getAcc())); //// } // TODO // // } // System.out.println("pulldate Thread :" + Thread.currentThread().getName()); // } // // public String getTitleChart() { // return titleChart; // } // // public void setTitleChart(String titleChart) { // this.titleChart = titleChart; // } // // public String getxAxis() { // return xAxis; // } // // public void setxAxis(String xAxis) { // this.xAxis = xAxis; // } // // public String getyAxis() { // return yAxis; // } // // public void setyAxis(String yAxis) { // this.yAxis = yAxis; // } // // /* // * (non-Javadoc) // * // * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) // */ // @Override // public void actionPerformed(ActionEvent e) { // // final XYItemRenderer renderer = plot.getRenderer(); // for (int i = 0; i < numberOfFloatingCars; i++) { // if (e.getActionCommand().equals(String.valueOf(floatingCarsList.get(i)))) { // if (i >= 0) { // final boolean flag = renderer.getItemVisible(i, 0); // renderer.setSeriesVisible(i, new Boolean(!flag)); // } // } // } // if (e.getActionCommand().equals("dp")) { // flagDp = !flagDp; // final XYLineAndShapeRenderer rendererLS = (XYLineAndShapeRenderer) plot.getRenderer(); // rendererLS.setShapesVisible(flagDp); // rendererLS.setShapesFilled(flagDp); // } // // } // // public static TickUnitSource createAccelerationTickUnits() { // // final TickUnits units = new TickUnits(); // final DecimalFormat df0 = new DecimalFormat("0.0"); // final DecimalFormat df1 = new DecimalFormat("0.0"); // final DecimalFormat df2 = new DecimalFormat("0.0"); // final DecimalFormat df3 = new DecimalFormat("0.0"); // final DecimalFormat df4 = new DecimalFormat("0.0"); // final DecimalFormat df5 = new DecimalFormat("0.0"); // final DecimalFormat df6 = new DecimalFormat("0.0"); // final DecimalFormat df7 = new DecimalFormat("0.0"); // final DecimalFormat df8 = new DecimalFormat("0.0"); // final DecimalFormat df9 = new DecimalFormat("0.0"); // final DecimalFormat df10 = new DecimalFormat("0.0"); // // // we can add the units in any order, the MyTickUnits collection will // // sort them... // units.add(new NumberTickUnit(0.0000001, df1, 2)); // units.add(new NumberTickUnit(0.000001, df2, 2)); // units.add(new NumberTickUnit(0.00001, df3, 2)); // units.add(new NumberTickUnit(0.0001, df4, 2)); // units.add(new NumberTickUnit(0.001, df5, 2)); // units.add(new NumberTickUnit(0.01, df6, 2)); // units.add(new NumberTickUnit(0.1, df7, 2)); // units.add(new NumberTickUnit(1, df8, 2)); // units.add(new NumberTickUnit(10, df8, 2)); // units.add(new NumberTickUnit(100, df8, 2)); // units.add(new NumberTickUnit(1000, df8, 2)); // units.add(new NumberTickUnit(10000, df8, 2)); // units.add(new NumberTickUnit(100000, df8, 2)); // units.add(new NumberTickUnit(1000000, df9, 2)); // units.add(new NumberTickUnit(10000000, df9, 2)); // units.add(new NumberTickUnit(100000000, df9, 2)); // units.add(new NumberTickUnit(1000000000, df10, 2)); // units.add(new NumberTickUnit(10000000000.0, df10, 2)); // units.add(new NumberTickUnit(100000000000.0, df10, 2)); // // units.add(new NumberTickUnit(0.00000025, df0, 5)); // units.add(new NumberTickUnit(0.0000025, df1, 5)); // units.add(new NumberTickUnit(0.000025, df2, 5)); // units.add(new NumberTickUnit(0.00025, df3, 5)); // units.add(new NumberTickUnit(0.0025, df4, 5)); // units.add(new NumberTickUnit(0.025, df5, 5)); // units.add(new NumberTickUnit(0.25, df6, 5)); // units.add(new NumberTickUnit(2.5, df7, 5)); // units.add(new NumberTickUnit(25, df8, 5)); // units.add(new NumberTickUnit(250, df8, 5)); // units.add(new NumberTickUnit(2500, df8, 5)); // units.add(new NumberTickUnit(25000, df8, 5)); // units.add(new NumberTickUnit(250000, df8, 5)); // units.add(new NumberTickUnit(2500000, df9, 5)); // units.add(new NumberTickUnit(25000000, df9, 5)); // units.add(new NumberTickUnit(250000000, df9, 5)); // units.add(new NumberTickUnit(2500000000.0, df10, 5)); // units.add(new NumberTickUnit(25000000000.0, df10, 5)); // units.add(new NumberTickUnit(250000000000.0, df10, 5)); // // units.add(new NumberTickUnit(0.0000005, df1, 5)); // units.add(new NumberTickUnit(0.000005, df2, 5)); // units.add(new NumberTickUnit(0.00005, df3, 5)); // units.add(new NumberTickUnit(0.0005, df4, 5)); // units.add(new NumberTickUnit(0.005, df5, 5)); // units.add(new NumberTickUnit(0.05, df6, 5)); // units.add(new NumberTickUnit(0.5, df7, 5)); // units.add(new NumberTickUnit(5L, df8, 5)); // units.add(new NumberTickUnit(50L, df8, 5)); // units.add(new NumberTickUnit(500L, df8, 5)); // units.add(new NumberTickUnit(5000L, df8, 5)); // units.add(new NumberTickUnit(50000L, df8, 5)); // units.add(new NumberTickUnit(500000L, df8, 5)); // units.add(new NumberTickUnit(5000000L, df9, 5)); // units.add(new NumberTickUnit(50000000L, df9, 5)); // units.add(new NumberTickUnit(500000000L, df9, 5)); // units.add(new NumberTickUnit(5000000000L, df10, 5)); // units.add(new NumberTickUnit(50000000000L, df10, 5)); // units.add(new NumberTickUnit(500000000000L, df10, 5)); // // return units; // // } // // /* // * (non-Javadoc) // * // * @see java.lang.Runnable#run() // */ // @Override // public void run() { // pullFloatingCarsData(time); // updateView(); // } //}