package org.lucci.madhoc.simulation.monitor;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Vector;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.lucci.madhoc.gui.MonitorView;
import org.lucci.madhoc.simulation.Monitor;
import org.lucci.madhoc.simulation.measure.DistributionSensor;
import org.lucci.madhoc.simulation.measure.MeasureHistory;
import org.lucci.madhoc.simulation.measure.Sensor;
import org.lucci.madhoc.simulation.projection.Projection;
import org.lucci.math.StatisticalCounter;
import org.lucci.up.SwingPlotter;
import org.lucci.up.data.Figure;
import org.lucci.up.data.FigureFactory;
import org.lucci.up.data.rendering.point.HistogramPointRenderer;
public class DistributionMeasure2DGraphicalView extends MonitorView
{
private List<DistributionPlotter> plotters = new Vector<DistributionPlotter>();
private JList measureList = new JList();
private ListSelectionListener listSelectionListener = new ListSelectionHandler();
public void setMonitor(Monitor application)
{
plotters.add(new DistributionPlotter());
plotters.add(new DistributionPlotter());
super.setMonitor(application);
setLayout(new GridLayout(1, 3));
for (SwingPlotter plotter : plotters)
{
add(plotter);
}
harvestMeasures();
add(createConfPanel());
}
private JPanel createConfPanel()
{
JPanel panel = new JPanel(new GridLayout(1, 1));
{
measureList.setListData(new Vector<Sensor>(harvestMeasures()));
measureList.setCellRenderer(new ListRenderer());
measureList.setBorder(new TitledBorder("Measures"));
measureList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
panel.add(measureList);
measureList.addListSelectionListener(listSelectionListener);
}
return panel;
}
private List<Sensor> harvestMeasures()
{
List<Sensor> sensors = new Vector<Sensor>();
for (Monitor monitor : getMonitor().getNetwork().getMonitorMap().values())
{
List<DistributionSensor> appMeasures = new Vector<DistributionSensor>(monitor.findDistributionMeasures());
Collections.sort(appMeasures, new Comparator()
{
public int compare(Object arg0, Object arg1)
{
Sensor s0 = (Sensor) arg0;
Sensor s1 = (Sensor) arg1;
return s0.getName().compareTo(s1.getName());
}
});
sensors.addAll(appMeasures);
}
return sensors;
}
public String getName()
{
return "distribution plotter";
}
public void updateViewContent()
{
for (DistributionPlotter plotter : plotters)
{
if (plotter.getSensor() != null)
{
MeasureHistory measureHistory = getProjectionComponent().getProjection().getMeasureHistoryMap().get(plotter.getSensor());
StatisticalCounter lastValue = (StatisticalCounter) measureHistory.getLastValue();
Figure fig = FigureFactory.createFigure(lastValue.getRelativeMap());
HistogramPointRenderer renderer = new HistogramPointRenderer();
renderer.setFillColor(plotter.getSensor().getMonitor().getColor());
fig.addRenderer(renderer);
plotter.getGraphics2DPlotter().setFigure(fig);
plotter.getGraphics2DPlotter().getSpace().getLegend().setText(plotter.getSensor().getName());
plotter.getGraphics2DPlotter().getSpace().getYDimension().getLegend().setText(plotter.getSensor().getTargetSetName() + " ratio");
plotter.repaint(0);
}
}
}
public class ListSelectionHandler implements ListSelectionListener
{
public void valueChanged(ListSelectionEvent event)
{
if (!event.getValueIsAdjusting())
{
DistributionSensor sensor = (DistributionSensor) measureList.getSelectedValue();
if (sensor != null)
{
plotters.get(0).setSensor(sensor);
updateViewContent();
Collections.swap(plotters, 0, 1);
}
}
}
}
public class ListRenderer extends DefaultListCellRenderer
{
public Component getListCellRendererComponent(JList arg0, Object arg1, int arg2, boolean arg3, boolean arg4)
{
super.getListCellRendererComponent(arg0, arg1, arg2, arg3, arg4);
Sensor sensor = (Sensor) arg1;
setBackground(sensor.getMonitor().getColor());
setText(" " + sensor.getName() + " ");
return this;
}
}
public void configure() throws Throwable
{
}
}