package jadex.application.space.envsupport.evaluation;
import jadex.application.runtime.IApplication;
import jadex.commons.ResourceInfo;
import jadex.commons.ThreadSuspendable;
import jadex.commons.service.SServiceProvider;
import jadex.commons.service.library.ILibraryService;
import java.awt.Image;
import javax.imageio.ImageIO;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.statistics.SimpleHistogramBin;
import org.jfree.data.statistics.SimpleHistogramDataset;
/**
* Create a category chart consumer, x must be a comparable and y must be double value.
*/
public class HistogramDataConsumer extends AbstractChartDataConsumer
{
//-------- constructors --------
/**
* Create a new chart consumer.
*/
public HistogramDataConsumer()
{
}
//-------- methods --------
/**
* Create a chart with the underlying dataset.
* @return The chart.
*/
protected JFreeChart createChart()
{
String title = (String)getProperty("title");
String labelx = (String)getProperty("labelx");
String labely = (String)getProperty("labely");
boolean legend = getProperty("legend")==null? true: ((Boolean)getProperty("legend")).booleanValue();
boolean tooltips = getProperty("tooltips")==null? true: ((Boolean)getProperty("tooltips")).booleanValue();
boolean urls = getProperty("urls")==null? false: ((Boolean)getProperty("urls")).booleanValue();
boolean autorepaint = getProperty("autorepaint")==null? false: ((Boolean)getProperty("autorepaint")).booleanValue();
String seriesname = (String)getProperty("seriesname");
SimpleHistogramDataset dataset = new SimpleHistogramDataset(seriesname);
Number low = (Number)getProperty("lowvalue");
Number high = (Number)getProperty("highvalue");
Number bincnt = (Number)getProperty("bincount");
if(low!=null && high!=null)
{
int cnt = bincnt!=null? bincnt.intValue(): 1;
double lv = low.doubleValue();
double hv = high.doubleValue();
double bsize = (hv-lv)/cnt;
for(int i=0; i<cnt; i++)
{
// System.out.println("lower: "+lv+(i*bsize)+", upper: "+lv+((i+1)*bsize));
dataset.addBin(new SimpleHistogramBin(lv+(i*bsize), lv+((i+1)*bsize), true, false));
}
}
else
{
for(int i=0; ; i++)
{
Number lb;
if(i==0 && getPropertyNames().contains("lowbin"))
lb = (Number)getProperty("lowbin");
else
lb = (Number)getProperty("lowbin_"+i);
Number hb;
if(i==0 && getPropertyNames().contains("highbin"))
hb = (Number)getProperty("highbin");
else
hb = (Number)getProperty("highhbin_"+i);
if(lb!=null && hb!=null)
{
// todo: what about the borders?!
dataset.addBin(new SimpleHistogramBin(lb.doubleValue(), hb.doubleValue(), true, false));
}
else
{
break;
}
}
}
if(dataset.getItemCount(0)==0)
throw new RuntimeException("No bins defined.");
JFreeChart chart = ChartFactory.createHistogram(title, labelx, labely, dataset, PlotOrientation.VERTICAL, legend, tooltips, urls);
chart.setNotify(autorepaint);
// chart.setBackgroundPaint(new Color(100,100,100,100));
// chart.getPlot().setBackgroundAlpha(0.5f);
String bgimagefn = (String)getProperty("bgimage");
if(bgimagefn!=null)
{
try
{
IApplication app = getSpace().getContext();
// todo: hack remove ThreadSuspendable
ClassLoader cl = ((ILibraryService)SServiceProvider.getService(
app.getServiceProvider(), ILibraryService.class).get(new ThreadSuspendable())).getClassLoader();
ResourceInfo rinfo = getResourceInfo(bgimagefn, app.getApplicationType().getAllImports(), cl);
Image image = ImageIO.read(rinfo.getInputStream());
rinfo.getInputStream().close();
chart.getPlot().setBackgroundImage(image);
}
catch(Exception e)
{
System.out.println("Background image not found: "+bgimagefn);
}
}
// ChartPanel panel = new ChartPanel(chart);
// panel.setFillZoomRectangle(true);
// JFrame f = new JFrame();
// JPanel content = new JPanel(new BorderLayout());
// content.add(panel, BorderLayout.CENTER);
// f.setContentPane(panel);
// f.pack();
// f.setVisible(true);
return chart;
}
/**
* Add a value to a specific series of the chart.
* @param seriesname The series name.
* @param valx The x value.
* @param valy The y value.
* @param data The data table.
* @param row The current data row.
*/
protected void addValue(Comparable seriesname, Object valx, Object valy, DataTable data, Object[] row)
{
double val = ((Number)valy).doubleValue();
Number low = (Number)getProperty("lowvalue");
Number high = (Number)getProperty("highvalue");
if(val>=low.doubleValue() && val<=high.doubleValue())
{
SimpleHistogramDataset dataset = (SimpleHistogramDataset)((XYPlot)getChart().getPlot()).getDataset();
dataset.addObservation(val);
}
// else
// {
// // print out of range warning?
// }
}
}