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";
|
}
|
}
|