| .. | .. | 
|---|
| 13 | 13 |   | 
|---|
| 14 | 14 |  import javax.swing.*; | 
|---|
| 15 | 15 |   | 
|---|
 | 16 | +public class SummaryView extends AbstractView  | 
|---|
 | 17 | +{  | 
|---|
| 16 | 18 |   | 
|---|
| 17 |  | -public class SummaryView extends AbstractView {  | 
|---|
| 18 |  | -	  | 
|---|
| 19 |  | -	private JEditorPane analysisDisplay;  | 
|---|
| 20 |  | -	private FieldAnalysis[] fieldAnalyzers=new FieldAnalysis[]  | 
|---|
| 21 |  | -    {  | 
|---|
| 22 |  | -			new MissingValueAnalysis(), new RangeDateAnalysis(),   | 
|---|
| 23 |  | -			new RangeNumberAnalysis(), new FrequencyAnalysis()  | 
|---|
| 24 |  | -    };  | 
|---|
| 25 |  | -	private int numItems;  | 
|---|
| 26 |  | -	private int numFiltered;  | 
|---|
| 27 |  | -	private Interval range;  | 
|---|
| 28 |  | -	private JComponent controls;  | 
|---|
| 29 |  | -	  | 
|---|
| 30 |  | -	public SummaryView(TFModel model)  | 
|---|
| 31 |  | -	{  | 
|---|
| 32 |  | -		super(model);  | 
|---|
| 33 |  | -		analysisDisplay=HtmlDisplay.create();  | 
|---|
| 34 |  | -		JScrollPane scrollPane = new JScrollPane(analysisDisplay);  | 
|---|
| 35 |  | -		setLayout(new GridLayout(1,1));  | 
|---|
| 36 |  | -		add(scrollPane);  | 
|---|
| 37 |  | -		  | 
|---|
| 38 |  | -		controls=new HtmlControls("This report gives a <br> statistical breakdown<br> "+  | 
|---|
| 39 |  | -				"of your data. <p> Reading the summary often helps<br> you find "+  | 
|---|
| 40 |  | -				"data errors.");  | 
|---|
| 41 |  | -	}  | 
|---|
| 42 |  | -	  | 
|---|
| 43 |  | -	@Override  | 
|---|
| 44 |  | -	public JComponent _getControls()  | 
|---|
| 45 |  | -	{  | 
|---|
| 46 |  | -		return controls;  | 
|---|
| 47 |  | -	}  | 
|---|
| 48 |  | -	  | 
|---|
| 49 |  | -	void makeHtml()  | 
|---|
| 50 |  | -	{  | 
|---|
| 51 |  | -		Display d=getModel().getDisplay();  | 
|---|
| 52 |  | -		ActDB db=getModel().getDB();  | 
|---|
| 53 |  | -		ActList acts=getModel().getActs();  | 
|---|
| 54 |  | -		StringBuffer page=new StringBuffer();  | 
|---|
| 55 |  | -		page.append("<blockquote>");  | 
|---|
| 56 |  | -		if (getModel().getDB()==null)  | 
|---|
| 57 |  | -		{  | 
|---|
| 58 |  | -			page.append("<h1><font color=#003399>No data loaded.</font></h1>");  | 
|---|
| 59 |  | -		}  | 
|---|
| 60 |  | -		else  | 
|---|
| 61 |  | -		{  | 
|---|
| 62 |  | -			page.append("<BR><BR><BR>File: "+getModel().getDbFile()+"<br>");  | 
|---|
| 63 |  | -			page.append("Source: "+getModel().getDB().getSource()+"<br><br>");  | 
|---|
| 64 |  | -			page.append("Description: "+getModel().getDB().getDescription()+"<br><br>");  | 
|---|
| 65 |  | -			page.append("<br><br>");  | 
|---|
| 66 |  | -			page.append("<table border=0>");  | 
|---|
| 67 |  | -			  | 
|---|
| 68 |  | -			  | 
|---|
| 69 |  | -			page.append("<tr><td valign=top align=left width=100><b>");  | 
|---|
| 70 |  | -			page.append("<font size=+1>Data</font><br>");  | 
|---|
| 71 |  | -			  | 
|---|
| 72 |  | -			page.append("</td><td align=top>");  | 
|---|
| 73 |  | -			append(page, "Total events", ""+numItems);  | 
|---|
| 74 |  | -			  | 
|---|
| 75 |  | -			if (numItems>0)  | 
|---|
| 76 |  | -			{  | 
|---|
| 77 |  | -				append(page, "Total selected", ""+numFiltered);  | 
|---|
| 78 |  | -				if (numFiltered>0)  | 
|---|
| 79 |  | -				{  | 
|---|
| 80 |  | -					append(page, "Earliest",  new Date(range.start).toString());  | 
|---|
| 81 |  | -					append(page, "Latest",  new Date(range.end).toString());  | 
|---|
| 82 |  | -				}  | 
|---|
| 83 |  | -			}  | 
|---|
| 84 |  | -			page.append("<br></td></tr>");  | 
|---|
| 85 |  | -			  | 
|---|
| 86 |  | -			page.append("<tr><td valign=top align=left width=100><b>");  | 
|---|
| 87 |  | -			page.append("<font size=+1>Fields</font><br>");  | 
|---|
| 88 |  | -			  | 
|---|
| 89 |  | -			page.append("</td><td align=top>");  | 
|---|
| 90 |  | -			for (Field f: getModel().getDB().getFields())  | 
|---|
| 91 |  | -			{  | 
|---|
| 92 |  | -					append(page, f.getName(),FieldFormatCatalog.humanName(f.getType())+fieldLabel(f));  | 
|---|
| 93 |  | -			}  | 
|---|
| 94 |  | -			page.append("<br></td></tr>");  | 
|---|
| 95 |  | -			  | 
|---|
| 96 |  | -				  | 
|---|
| 97 |  | -			page.append("</table>");  | 
|---|
 | 19 | +        private JEditorPane analysisDisplay;  | 
|---|
 | 20 | +        private FieldAnalysis[] fieldAnalyzers = new FieldAnalysis[]  | 
|---|
 | 21 | +        {  | 
|---|
 | 22 | +                new MissingValueAnalysis(), new RangeDateAnalysis(),  | 
|---|
 | 23 | +                new RangeNumberAnalysis(), new FrequencyAnalysis()  | 
|---|
 | 24 | +        };  | 
|---|
 | 25 | +        private int numItems;  | 
|---|
 | 26 | +        private int numFiltered;  | 
|---|
 | 27 | +        private Interval range;  | 
|---|
 | 28 | +        private JComponent controls;  | 
|---|
| 98 | 29 |   | 
|---|
| 99 |  | -			if (numFiltered>0)  | 
|---|
| 100 |  | -			{  | 
|---|
| 101 |  | -				page.append("<h1>Statistics (for "+acts.size()+" items)</h1>");  | 
|---|
| 102 |  | -				for (Field field: db.getFields())  | 
|---|
| 103 |  | -				{  | 
|---|
| 104 |  | -					page.append("<h2>"+field.getName()+"</h2>");  | 
|---|
| 105 |  | -					page.append("<ul>");  | 
|---|
| 106 |  | -					for (int i=0; i<fieldAnalyzers.length; i++)  | 
|---|
| 107 |  | -					{  | 
|---|
| 108 |  | -						FieldAnalysis fa=fieldAnalyzers[i];  | 
|---|
| 109 |  | -						if (fa.canHandleType(field.getType()))  | 
|---|
| 110 |  | -						{  | 
|---|
| 111 |  | -							page.append("<li>");  | 
|---|
| 112 |  | -							page.append("<b><font color=#808080>"+fa.getName()+"</font></b><br>");  | 
|---|
| 113 |  | -							fa.perform(acts, field);  | 
|---|
| 114 |  | -							String[] s=fa.getResultDescription();  | 
|---|
| 115 |  | -							for (int j=0; j<s.length; j++)  | 
|---|
| 116 |  | -							{  | 
|---|
| 117 |  | -								page.append(s[j]);  | 
|---|
| 118 |  | -								page.append("<br>");  | 
|---|
| 119 |  | -							}  | 
|---|
| 120 |  | -							page.append("</li>");  | 
|---|
| 121 |  | -						}  | 
|---|
| 122 |  | -					}  | 
|---|
| 123 |  | -					page.append("</ul>");  | 
|---|
| 124 |  | -				}  | 
|---|
| 125 |  | -			}  | 
|---|
| 126 |  | -		}  | 
|---|
| 127 |  | -		page.append("</blockquote>");  | 
|---|
| 128 |  | -		analysisDisplay.setText(page.toString());  | 
|---|
| 129 |  | -		analysisDisplay.setCaretPosition(0);  | 
|---|
| 130 |  | -	}  | 
|---|
| 131 |  | -	  | 
|---|
| 132 |  | -	static void append(StringBuffer page, String label, String value)  | 
|---|
| 133 |  | -	{  | 
|---|
| 134 |  | -		page.append("<b><font color=#808080>"+label+"</font></b>    ");  | 
|---|
| 135 |  | -		page.append(value);  | 
|---|
| 136 |  | -		page.append("<br>");  | 
|---|
| 137 |  | -	}  | 
|---|
| 138 |  | -	  | 
|---|
| 139 |  | -	@Override  | 
|---|
| 140 |  | -	protected void onscreen(boolean majorChange)  | 
|---|
| 141 |  | -	{  | 
|---|
| 142 |  | -		_note(null);  | 
|---|
| 143 |  | -	}  | 
|---|
 | 30 | +        public SummaryView(TFModel model)  | 
|---|
 | 31 | +        {  | 
|---|
 | 32 | +                super(model);  | 
|---|
 | 33 | +                analysisDisplay = HtmlDisplay.create();  | 
|---|
 | 34 | +                JScrollPane scrollPane = new JScrollPane(analysisDisplay);  | 
|---|
 | 35 | +                setLayout(new GridLayout(1, 1));  | 
|---|
 | 36 | +                add(scrollPane);  | 
|---|
| 144 | 37 |   | 
|---|
| 145 |  | -	protected void _note(TFEvent e) {  | 
|---|
| 146 |  | -		recalculate();  | 
|---|
| 147 |  | -		makeHtml();  | 
|---|
| 148 |  | -		repaint();  | 
|---|
| 149 |  | -	}  | 
|---|
| 150 |  | -	  | 
|---|
| 151 |  | -	String fieldLabel(Field f)  | 
|---|
| 152 |  | -	{  | 
|---|
| 153 |  | -		StringBuffer b=new StringBuffer("<b>");  | 
|---|
| 154 |  | -		ActDB db=getModel().getDB();  | 
|---|
| 155 |  | -		for (String v: VirtualField.list())  | 
|---|
| 156 |  | -		{  | 
|---|
| 157 |  | -			if (db.getField(v)!=null && db.getField(v).getName().equals(f.getName()))  | 
|---|
| 158 |  | -				b.append(" (Shown in visualization as "+VirtualField.humanName(v)+")");  | 
|---|
| 159 |  | -		}  | 
|---|
| 160 |  | -		b.append("</b>");  | 
|---|
| 161 |  | -		return b.toString();  | 
|---|
| 162 |  | -	}  | 
|---|
| 163 |  | -	  | 
|---|
| 164 |  | -	void recalculate()  | 
|---|
| 165 |  | -	{  | 
|---|
| 166 |  | -		ActList acts=getModel().getActs();  | 
|---|
| 167 |  | -		if (acts==null)  | 
|---|
| 168 |  | -		{  | 
|---|
| 169 |  | -			numItems=0;  | 
|---|
| 170 |  | -			return;  | 
|---|
| 171 |  | -		}  | 
|---|
| 172 |  | -		numFiltered=acts.size();  | 
|---|
| 173 |  | -		numItems=getModel().getDB().size();  | 
|---|
| 174 |  | -		range=DBUtils.range(acts, VirtualField.START);  | 
|---|
| 175 |  | -	}  | 
|---|
 | 38 | +                controls = new HtmlControls("This report gives a <br> statistical breakdown<br> "  | 
|---|
 | 39 | +                        + "of your data. <p> Reading the summary often helps<br> you find "  | 
|---|
 | 40 | +                        + "data errors.");  | 
|---|
 | 41 | +        }  | 
|---|
| 176 | 42 |   | 
|---|
| 177 |  | -	@Override  | 
|---|
| 178 |  | -	public String getName() {  | 
|---|
| 179 |  | -		return "Summary";  | 
|---|
| 180 |  | -	}  | 
|---|
 | 43 | +        @Override  | 
|---|
 | 44 | +        public JComponent _getControls()  | 
|---|
 | 45 | +        {  | 
|---|
 | 46 | +                return controls;  | 
|---|
 | 47 | +        }  | 
|---|
 | 48 | +  | 
|---|
 | 49 | +        void makeHtml()  | 
|---|
 | 50 | +        {  | 
|---|
 | 51 | +                Display d = getModel().getDisplay();  | 
|---|
 | 52 | +                ActDB db = getModel().getDB();  | 
|---|
 | 53 | +                ActList acts = getModel().getActs();  | 
|---|
 | 54 | +                StringBuffer page = new StringBuffer();  | 
|---|
 | 55 | +                page.append("<blockquote>");  | 
|---|
 | 56 | +                if (getModel().getDB() == null)  | 
|---|
 | 57 | +                {  | 
|---|
 | 58 | +                        page.append("<h1><font color=#003399>No data loaded.</font></h1>");  | 
|---|
 | 59 | +                } else  | 
|---|
 | 60 | +                {  | 
|---|
 | 61 | +                        page.append("<BR><BR><BR>File: " + getModel().getDbFile() + "<br>");  | 
|---|
 | 62 | +                        page.append("Source: " + getModel().getDB().getSource() + "<br><br>");  | 
|---|
 | 63 | +                        page.append("Description: " + getModel().getDB().getDescription() + "<br><br>");  | 
|---|
 | 64 | +                        page.append("<br><br>");  | 
|---|
 | 65 | +                        page.append("<table border=0>");  | 
|---|
 | 66 | +  | 
|---|
 | 67 | +  | 
|---|
 | 68 | +                        page.append("<tr><td valign=top align=left width=100><b>");  | 
|---|
 | 69 | +                        page.append("<font size=+1>Data</font><br>");  | 
|---|
 | 70 | +  | 
|---|
 | 71 | +                        page.append("</td><td align=top>");  | 
|---|
 | 72 | +                        append(page, "Total events", "" + numItems);  | 
|---|
 | 73 | +  | 
|---|
 | 74 | +                        if (numItems > 0)  | 
|---|
 | 75 | +                        {  | 
|---|
 | 76 | +                                append(page, "Total selected", "" + numFiltered);  | 
|---|
 | 77 | +                                if (numFiltered > 0)  | 
|---|
 | 78 | +                                {  | 
|---|
 | 79 | +                                        append(page, "Earliest", new Date(range.start).toString());  | 
|---|
 | 80 | +                                        append(page, "Latest", new Date(range.end).toString());  | 
|---|
 | 81 | +                                }  | 
|---|
 | 82 | +                        }  | 
|---|
 | 83 | +                        page.append("<br></td></tr>");  | 
|---|
 | 84 | +  | 
|---|
 | 85 | +                        page.append("<tr><td valign=top align=left width=100><b>");  | 
|---|
 | 86 | +                        page.append("<font size=+1>Fields</font><br>");  | 
|---|
 | 87 | +  | 
|---|
 | 88 | +                        page.append("</td><td align=top>");  | 
|---|
 | 89 | +                        for (Field f : getModel().getDB().getFields())  | 
|---|
 | 90 | +                        {  | 
|---|
 | 91 | +                                append(page, f.getName(), FieldFormatCatalog.humanName(f.getType()) + fieldLabel(f));  | 
|---|
 | 92 | +                        }  | 
|---|
 | 93 | +                        page.append("<br></td></tr>");  | 
|---|
 | 94 | +  | 
|---|
 | 95 | +  | 
|---|
 | 96 | +                        page.append("</table>");  | 
|---|
 | 97 | +  | 
|---|
 | 98 | +                        if (numFiltered > 0)  | 
|---|
 | 99 | +                        {  | 
|---|
 | 100 | +                                page.append("<h1>Statistics (for " + acts.size() + " items)</h1>");  | 
|---|
 | 101 | +                                for (Field field : db.getFields())  | 
|---|
 | 102 | +                                {  | 
|---|
 | 103 | +                                        page.append("<h2>" + field.getName() + "</h2>");  | 
|---|
 | 104 | +                                        page.append("<ul>");  | 
|---|
 | 105 | +                                        for (int i = 0; i < fieldAnalyzers.length; i++)  | 
|---|
 | 106 | +                                        {  | 
|---|
 | 107 | +                                                FieldAnalysis fa = fieldAnalyzers[i];  | 
|---|
 | 108 | +                                                if (fa.canHandleType(field.getType()))  | 
|---|
 | 109 | +                                                {  | 
|---|
 | 110 | +                                                        page.append("<li>");  | 
|---|
 | 111 | +                                                        page.append("<b><font color=#808080>" + fa.getName() + "</font></b><br>");  | 
|---|
 | 112 | +                                                        fa.perform(acts, field);  | 
|---|
 | 113 | +                                                        String[] s = fa.getResultDescription();  | 
|---|
 | 114 | +                                                        for (int j = 0; j < s.length; j++)  | 
|---|
 | 115 | +                                                        {  | 
|---|
 | 116 | +                                                                page.append(s[j]);  | 
|---|
 | 117 | +                                                                page.append("<br>");  | 
|---|
 | 118 | +                                                        }  | 
|---|
 | 119 | +                                                        page.append("</li>");  | 
|---|
 | 120 | +                                                }  | 
|---|
 | 121 | +                                        }  | 
|---|
 | 122 | +                                        page.append("</ul>");  | 
|---|
 | 123 | +                                }  | 
|---|
 | 124 | +                        }  | 
|---|
 | 125 | +                }  | 
|---|
 | 126 | +                page.append("</blockquote>");  | 
|---|
 | 127 | +                analysisDisplay.setText(page.toString());  | 
|---|
 | 128 | +                analysisDisplay.setCaretPosition(0);  | 
|---|
 | 129 | +        }  | 
|---|
 | 130 | +  | 
|---|
 | 131 | +        static void append(StringBuffer page, String label, String value)  | 
|---|
 | 132 | +        {  | 
|---|
 | 133 | +                page.append("<b><font color=#808080>" + label + "</font></b>    ");  | 
|---|
 | 134 | +                page.append(value);  | 
|---|
 | 135 | +                page.append("<br>");  | 
|---|
 | 136 | +        }  | 
|---|
 | 137 | +  | 
|---|
 | 138 | +        @Override  | 
|---|
 | 139 | +        protected void onscreen(boolean majorChange)  | 
|---|
 | 140 | +        {  | 
|---|
 | 141 | +                _note(null);  | 
|---|
 | 142 | +        }  | 
|---|
 | 143 | +  | 
|---|
 | 144 | +        protected void _note(TFEvent e)  | 
|---|
 | 145 | +        {  | 
|---|
 | 146 | +                recalculate();  | 
|---|
 | 147 | +                makeHtml();  | 
|---|
 | 148 | +                repaint();  | 
|---|
 | 149 | +        }  | 
|---|
 | 150 | +  | 
|---|
 | 151 | +        String fieldLabel(Field f)  | 
|---|
 | 152 | +        {  | 
|---|
 | 153 | +                StringBuffer b = new StringBuffer("<b>");  | 
|---|
 | 154 | +                ActDB db = getModel().getDB();  | 
|---|
 | 155 | +                for (String v : VirtualField.list())  | 
|---|
 | 156 | +                {  | 
|---|
 | 157 | +                        if (db.getField(v) != null && db.getField(v).getName().equals(f.getName()))  | 
|---|
 | 158 | +                        {  | 
|---|
 | 159 | +                                b.append(" (Shown in visualization as " + VirtualField.humanName(v) + ")");  | 
|---|
 | 160 | +                        }  | 
|---|
 | 161 | +                }  | 
|---|
 | 162 | +                b.append("</b>");  | 
|---|
 | 163 | +                return b.toString();  | 
|---|
 | 164 | +        }  | 
|---|
 | 165 | +  | 
|---|
 | 166 | +        void recalculate()  | 
|---|
 | 167 | +        {  | 
|---|
 | 168 | +                ActList acts = getModel().getActs();  | 
|---|
 | 169 | +                if (acts == null)  | 
|---|
 | 170 | +                {  | 
|---|
 | 171 | +                        numItems = 0;  | 
|---|
 | 172 | +                        return;  | 
|---|
 | 173 | +                }  | 
|---|
 | 174 | +                numFiltered = acts.size();  | 
|---|
 | 175 | +                numItems = getModel().getDB().size();  | 
|---|
 | 176 | +                range = DBUtils.range(acts, VirtualField.START);  | 
|---|
 | 177 | +        }  | 
|---|
 | 178 | +  | 
|---|
 | 179 | +        @Override  | 
|---|
 | 180 | +        public String getName()  | 
|---|
 | 181 | +        {  | 
|---|
 | 182 | +                return "Summary";  | 
|---|
 | 183 | +        }  | 
|---|
| 181 | 184 |  } | 
|---|