package de.elatexam.editor.components.panels; import java.awt.Dimension; import java.util.ArrayList; import java.util.List; import net.databinder.models.hib.CriteriaBuilder; import net.databinder.models.hib.HibernateObjectModel; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.ResourceModel; import org.hibernate.Criteria; import org.hibernate.criterion.Projections; import org.wicketstuff.googlecharts.AbstractChartData; import org.wicketstuff.googlecharts.Chart; import org.wicketstuff.googlecharts.ChartDataEncoding; import org.wicketstuff.googlecharts.ChartProvider; import org.wicketstuff.googlecharts.ChartType; import org.wicketstuff.googlecharts.IChartData; import org.wicketstuff.googlecharts.IChartProvider; import de.elatexam.editor.TaskEditorSession; import de.elatexam.editor.user.BasicUser; import de.elatexam.model.AddonSubTaskDef; import de.elatexam.model.ClozeSubTaskDef; import de.elatexam.model.ComplexTaskDef; import de.elatexam.model.MappingSubTaskDef; import de.elatexam.model.McSubTaskDef; import de.elatexam.model.PaintSubTaskDef; import de.elatexam.model.TextSubTaskDef; /** * @author sdienst */ public class StatisticPanel extends Panel { /** * @param id */ public StatisticPanel(final String id) { super(id); final List<Class> classes = new ArrayList<Class>(); classes.add(ComplexTaskDef.class); classes.add(McSubTaskDef.class); classes.add(ClozeSubTaskDef.class); classes.add(MappingSubTaskDef.class); classes.add(PaintSubTaskDef.class); classes.add(TextSubTaskDef.class); classes.add(AddonSubTaskDef.class); final ListView<Class> container = new AlternatingListView<Class>("globalstatslist", classes) { @Override protected void populateItem(final ListItem<Class> item) { // new model that queries the number of rows in a table final HibernateObjectModel<Integer> model = new HibernateObjectModel<Integer>(item.getModelObject(), new CriteriaBuilder() { public void build(final Criteria criteria) { // return "count(*)" criteria.setProjection(Projections.rowCount()); } }); item.add(new Label("statname", new ResourceModel(item.getModelObject().getSimpleName()))); item.add(new Label("statvalue", model)); } }; final ListView container2 = new AlternatingListView<Class>("privatestatslist", classes) { @Override protected void populateItem(final ListItem<Class> item) { item.add(new Label("statname", new ResourceModel(item.getModelObject().getSimpleName()))); item.add(new Label("statvalue", Integer.toString(count(item.getModelObject())))); } }; add(container); add(container2); add(new Chart("subtaskchart", createPiechart())); } /** * @return */ private IChartProvider createPiechart() { AbstractChartData data = new AbstractChartData() { @Override public double[][] getData() { return new double[][]{{count(McSubTaskDef.class), count(ClozeSubTaskDef.class), count(MappingSubTaskDef.class), count(TextSubTaskDef.class), count(PaintSubTaskDef.class), count(AddonSubTaskDef.class)}}; } }; data.setEncoding(ChartDataEncoding.EXTENDED); String[] labels=new String[]{"Multiple Choice", "Lückentext", "Zuordnung", "Freitext", "Zeichnen", "sonstiges"}; ChartProvider provider = new ChartProvider(new Dimension(400,200), ChartType.PIE , data); provider.setTitle("Eigene Aufgaben"); provider.setPieLabels(labels); return provider; } protected int count(final Class clazz) { final BasicUser user = TaskEditorSession.get().getUser(); if (clazz.isAssignableFrom(ComplexTaskDef.class)) { return user.getTaskdefs().size(); } else { return user.getSubtaskdefsOf(clazz).size(); } } }