package info.opencards.ui.ltmstats; import info.opencards.Utils; import info.opencards.core.CardFile; import info.opencards.core.Item; import info.opencards.learnstrats.ltm.LTMItem; 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.TickUnits; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.labels.StandardCategoryToolTipGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.StackedBarRenderer; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.ui.GradientPaintTransformType; import org.jfree.ui.StandardGradientPaintTransformer; import javax.swing.*; import java.awt.*; import java.util.*; import java.util.List; /** * A panel which shows the current ltm-learning state of a collection of flash-card files. * * @author Holger Brandl */ class LTMStateGraphPanel extends JPanel { private final DefaultCategoryDataset dataset; private final ValueAxis valueAxis; private static final int NUM_HIST_BINS = 9; private Collection<CardFile> currentFiles; private final String learnedPerfectly; private final String learnedNotYet; private final String learnedNaJa; public LTMStateGraphPanel() { setLayout(new BorderLayout()); // setup the stacked bar chart dataset = new DefaultCategoryDataset(); final JFreeChart chart = ChartFactory.createStackedBarChart( null, // chart title Utils.getRB().getString("CardTableModel.stats.learnsuccess"), // domain axis label // "# cards", // range axis label null, // range axis label dataset, // data PlotOrientation.VERTICAL, // the plot orientation false, // legend true, // tooltips false // urls ); StackedBarRenderer renderer = new StackedBarRenderer(); renderer.setGradientPaintTransformer(new StandardGradientPaintTransformer(GradientPaintTransformType.HORIZONTAL)); renderer.setItemMargin(0.0); Paint bluePaint = new GradientPaint(0.0f, 0.0f, new Color(0x22, 0x22, 0xFF), 0.0f, 0.0f, new Color(0x88, 0x88, 0xFF)); renderer.setSeriesPaint(0, bluePaint); renderer.setSeriesToolTipGenerator(0, new StandardCategoryToolTipGenerator()); // Paint p2 = new GradientPaint(0.0f, 0.0f, new Color(0xFF, 0x22, 0x22), 0.0f, 0.0f, new Color(0xFF, 0x88, 0x88)); // renderer.setSeriesPaint(1, p2); // renderer.setSeriesToolTipGenerator(1, new StandardCategoryToolTipGenerator()); // // Paint p3 = new GradientPaint(0.0f, 0.0f, new Color(0x22, 0xFF, 0x22), 0.0f, 0.0f, new Color(0x88, 0xFF, 0x88)); // renderer.setSeriesPaint(2, p3); // renderer.setSeriesToolTipGenerator(2, new StandardCategoryToolTipGenerator()); CategoryPlot plot = (CategoryPlot) chart.getPlot(); plot.setRenderer(renderer); valueAxis = plot.getRangeAxis(); TickUnits units = (TickUnits) NumberAxis.createIntegerTickUnits(); valueAxis.setStandardTickUnits(units); ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPopupMenu(null); chartPanel.setDomainZoomable(false); chartPanel.setRangeZoomable(false); add(chartPanel, BorderLayout.CENTER); rebuildPanel(new HashSet<CardFile>()); learnedPerfectly = Utils.getRB().getString("CardTableModel.stats.perfect"); learnedNotYet = Utils.getRB().getString("CardTableModel.stats.notatall"); learnedNaJa = Utils.getRB().getString("CardTableModel.stats.well"); } void rebuildPanel(Collection<CardFile> currentFiles) { if (currentFiles != null) this.currentFiles = currentFiles; dataset.clear(); if (this.currentFiles == null) return; set2NumRepHist(this.currentFiles); // set2EDistribution(currentFiles); } private boolean set2NumRepHist(Collection<CardFile> currentFiles) { List<Integer> numReps = new ArrayList<Integer>(); for (CardFile currentFile : currentFiles) { for (Item item : currentFile.getFlashCards().getLTMItems()) { numReps.add(((LTMItem) item).getNumRepetition()); } } if (numReps.isEmpty()) return true; // compute the histgram int[] eHist = new int[NUM_HIST_BINS]; for (Integer numRep : numReps) { eHist[numRep >= NUM_HIST_BINS - 1 ? NUM_HIST_BINS - 1 : numRep]++; } List<Integer> eBinSize = new ArrayList<Integer>(); String emptyString = ""; for (int i = 0; i < eHist.length; i += 1) { String columnTitle; if (i == eHist.length - 1) columnTitle = learnedPerfectly; else if (i == 0) columnTitle = learnedNotYet; else if (i == 4) columnTitle = learnedNaJa; else { emptyString += " "; columnTitle = emptyString; } dataset.addValue((double) eHist[i], "", columnTitle); eBinSize.add(eHist[i]); // dataset.addValue((double) eHist[i] + eHist[i+1], "Learned", columnTitle); // eBinSize.add(eHist[i] + eHist[i+1]); } valueAxis.setLowerBound(0); valueAxis.setUpperBound(1.1 * Collections.max(eBinSize)); valueAxis.setAutoRange(false); return false; } public void selectionChanged(List<CardFile> selectedFiles) { rebuildPanel(selectedFiles); } }