package timeflow.views; import timeflow.app.ui.HtmlDisplay; import timeflow.data.analysis.*; import timeflow.data.db.*; import timeflow.data.time.*; import timeflow.format.field.FieldFormatCatalog; import timeflow.model.*; import java.awt.*; import java.util.Date; import javax.swing.*; public class SummaryView extends AbstractView { private JEditorPane analysisDisplay; private FieldAnalysis[] fieldAnalyzers=new FieldAnalysis[] { new MissingValueAnalysis(), new RangeDateAnalysis(), new RangeNumberAnalysis(), new FrequencyAnalysis() }; private int numItems; private int numFiltered; private Interval range; private JComponent controls; public SummaryView(TFModel model) { super(model); analysisDisplay=HtmlDisplay.create(); JScrollPane scrollPane = new JScrollPane(analysisDisplay); setLayout(new GridLayout(1,1)); add(scrollPane); controls=new HtmlControls("This report gives a
statistical breakdown
"+ "of your data.

Reading the summary often helps
you find "+ "data errors."); } @Override public JComponent _getControls() { return controls; } void makeHtml() { Display d=getModel().getDisplay(); ActDB db=getModel().getDB(); ActList acts=getModel().getActs(); StringBuffer page=new StringBuffer(); page.append("

"); if (getModel().getDB()==null) { page.append("

No data loaded.

"); } else { page.append("


File: "+getModel().getDbFile()+"
"); page.append("Source: "+getModel().getDB().getSource()+"

"); page.append("Description: "+getModel().getDB().getDescription()+"

"); page.append("

"); page.append(""); page.append(""); page.append(""); page.append("
"); page.append("Data
"); page.append("
"); append(page, "Total events", ""+numItems); if (numItems>0) { append(page, "Total selected", ""+numFiltered); if (numFiltered>0) { append(page, "Earliest", new Date(range.start).toString()); append(page, "Latest", new Date(range.end).toString()); } } page.append("
"); page.append("Fields
"); page.append("
"); for (Field f: getModel().getDB().getFields()) { append(page, f.getName(),FieldFormatCatalog.humanName(f.getType())+fieldLabel(f)); } page.append("
"); if (numFiltered>0) { page.append("

Statistics (for "+acts.size()+" items)

"); for (Field field: db.getFields()) { page.append("

"+field.getName()+"

"); page.append(""); } } } page.append("
"); analysisDisplay.setText(page.toString()); analysisDisplay.setCaretPosition(0); } static void append(StringBuffer page, String label, String value) { page.append(""+label+"    "); page.append(value); page.append("
"); } @Override protected void onscreen(boolean majorChange) { _note(null); } protected void _note(TFEvent e) { recalculate(); makeHtml(); repaint(); } String fieldLabel(Field f) { StringBuffer b=new StringBuffer(""); ActDB db=getModel().getDB(); for (String v: VirtualField.list()) { if (db.getField(v)!=null && db.getField(v).getName().equals(f.getName())) b.append(" (Shown in visualization as "+VirtualField.humanName(v)+")"); } b.append(""); return b.toString(); } void recalculate() { ActList acts=getModel().getActs(); if (acts==null) { numItems=0; return; } numFiltered=acts.size(); numItems=getModel().getDB().size(); range=DBUtils.range(acts, VirtualField.START); } @Override public String getName() { return "Summary"; } }