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 <br> statistical breakdown<br> "+
"of your data. <p> Reading the summary often helps<br> 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("<blockquote>");
if (getModel().getDB()==null)
{
page.append("<h1><font color=#003399>No data loaded.</font></h1>");
}
else
{
page.append("<BR><BR><BR>File: "+getModel().getDbFile()+"<br>");
page.append("Source: "+getModel().getDB().getSource()+"<br><br>");
page.append("Description: "+getModel().getDB().getDescription()+"<br><br>");
page.append("<br><br>");
page.append("<table border=0>");
page.append("<tr><td valign=top align=left width=100><b>");
page.append("<font size=+1>Data</font><br>");
page.append("</td><td align=top>");
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("<br></td></tr>");
page.append("<tr><td valign=top align=left width=100><b>");
page.append("<font size=+1>Fields</font><br>");
page.append("</td><td align=top>");
for (Field f: getModel().getDB().getFields())
{
append(page, f.getName(),FieldFormatCatalog.humanName(f.getType())+fieldLabel(f));
}
page.append("<br></td></tr>");
page.append("</table>");
if (numFiltered>0)
{
page.append("<h1>Statistics (for "+acts.size()+" items)</h1>");
for (Field field: db.getFields())
{
page.append("<h2>"+field.getName()+"</h2>");
page.append("<ul>");
for (int i=0; i<fieldAnalyzers.length; i++)
{
FieldAnalysis fa=fieldAnalyzers[i];
if (fa.canHandleType(field.getType()))
{
page.append("<li>");
page.append("<b><font color=#808080>"+fa.getName()+"</font></b><br>");
fa.perform(acts, field);
String[] s=fa.getResultDescription();
for (int j=0; j<s.length; j++)
{
page.append(s[j]);
page.append("<br>");
}
page.append("</li>");
}
}
page.append("</ul>");
}
}
}
page.append("</blockquote>");
analysisDisplay.setText(page.toString());
analysisDisplay.setCaretPosition(0);
}
static void append(StringBuffer page, String label, String value)
{
page.append("<b><font color=#808080>"+label+"</font></b> ");
page.append(value);
page.append("<br>");
}
@Override
protected void onscreen(boolean majorChange)
{
_note(null);
}
protected void _note(TFEvent e) {
recalculate();
makeHtml();
repaint();
}
String fieldLabel(Field f)
{
StringBuffer b=new StringBuffer("<b>");
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("</b>");
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";
}
}