001package com.ganteater.ae.desktop.view;
002
003import java.awt.BorderLayout;
004import java.util.Properties;
005
006import org.jfree.chart.ChartFactory;
007import org.jfree.chart.ChartPanel;
008import org.jfree.chart.JFreeChart;
009import org.jfree.chart.axis.NumberAxis;
010import org.jfree.chart.labels.ItemLabelAnchor;
011import org.jfree.chart.labels.ItemLabelPosition;
012import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
013import org.jfree.chart.plot.CategoryPlot;
014import org.jfree.chart.plot.PlotOrientation;
015import org.jfree.chart.renderer.category.CategoryItemRenderer;
016import org.jfree.data.category.DefaultCategoryDataset;
017import org.jfree.ui.TextAnchor;
018
019import com.ganteater.ae.AEManager;
020import com.ganteater.ae.processor.annotation.CommandDescription;
021
022@CommandDescription("`BarChart` View Type example:\r\n"
023                + "```xml\r\n"
024                + "<View name=\"barView\" reuse=\"true\" type=\"BarChart\" title=\"Bar Chart\" xAxisLabel=\"x\" yAxisLabel=\"y\" /> \r\n"
025                + "     <Rnd name=\"value\" symbols=\"3\" type=\"number\" /> \r\n"
026                + "     <Out view=\"barView\" row=\"1\" column=\"$var{column}\" level=\"debug\">$var{value}</Out> \r\n"
027                + "     <Rnd name=\"value\" symbols=\"3\" type=\"number\" /> \r\n"
028                + "     <Out view=\"barView\" row=\"2\" column=\"$var{column}\" level=\"debug\">$var{value}</Out> \r\n"
029                + "</Loop> \r\n"
030                + "```")
031public class BarChart extends View {
032        private static final long serialVersionUID = 1L;
033
034        private DefaultCategoryDataset dataset;
035        private JFreeChart chart = null;
036
037        public void init(Properties params, AEManager manager) {
038                super.init(params, manager);
039
040                String title = params.getProperty("title");
041                String xAxisLabel = params.getProperty("xAxisLabel");
042                String yAxisLabel = params.getProperty("yAxisLabel");
043
044                dataset = new DefaultCategoryDataset();
045                chart = ChartFactory.createBarChart(title, xAxisLabel, yAxisLabel, dataset, PlotOrientation.VERTICAL, true,
046                                true, true);
047
048                CategoryPlot plot = chart.getCategoryPlot();
049                plot.setDomainGridlinesVisible(true);
050
051                CategoryItemRenderer renderer = ((CategoryPlot) chart.getPlot()).getRenderer();
052                renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
053                renderer.setBaseItemLabelsVisible(true);
054                ItemLabelPosition position = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.TOP_CENTER);
055                renderer.setBasePositiveItemLabelPosition(position);
056
057                final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
058                rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
059
060                ChartPanel comp = new ChartPanel(chart);
061                add(comp, BorderLayout.CENTER);
062        }
063
064        @Override
065        public void out(Object data, Properties properties) {
066                if (data instanceof String) {
067                        double value = Double.parseDouble((String) data);
068                        Comparable<?> row = properties.getProperty("row");
069                        Comparable<?> column = properties.getProperty("column");
070
071                        CategoryPlot plot = chart.getCategoryPlot();
072                        final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
073                        if (value != Math.ceil(value) && rangeAxis.getStandardTickUnits() == NumberAxis.createIntegerTickUnits()) {
074                                rangeAxis.setStandardTickUnits(NumberAxis.createStandardTickUnits());
075                        }
076
077                        dataset.addValue((int) value, row, column);
078                }
079        }
080}