1 package org.lcsim.plugin.browser;
2
3 import hep.physics.vec.Hep3Vector;
4 import java.awt.BorderLayout;
5 import java.awt.CardLayout;
6 import java.awt.Component;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9 import java.lang.reflect.Array;
10 import java.util.Collection;
11 import java.util.HashMap;
12 import java.util.List;
13 import java.util.Map;
14 import javax.swing.JButton;
15 import javax.swing.JPanel;
16 import javax.swing.JScrollPane;
17 import javax.swing.JTable;
18 import javax.swing.JTextArea;
19 import javax.swing.SwingConstants;
20 import javax.swing.table.DefaultTableCellRenderer;
21 import javax.swing.table.DefaultTableModel;
22 import javax.swing.table.TableModel;
23 import org.freehep.application.Application;
24 import org.freehep.application.studio.Studio;
25 import org.freehep.swing.table.TableColumnPacker;
26 import org.freehep.util.ScientificFormat;
27 import org.lcsim.event.EventHeader;
28 import org.lcsim.event.EventHeader.LCMetaData;
29 import org.lcsim.plugin.browser.sort.DefaultSortableTableModel;
30 import org.lcsim.plugin.browser.sort.SortableTableModel;
31 import org.lcsim.plugin.browser.sort.TableSorter;
32 import org.openide.util.Lookup.Result;
33 import org.openide.util.Lookup.Template;
34
35
36
37
38
39
40 class CollectionTable extends JPanel implements ActionListener
41 {
42 private static final String noCollection = "No Collection";
43 private static final TableModel emptyTable = new DefaultSortableTableModel(new DefaultTableModel());
44 private JTextArea m_tableLabel = new JTextArea(noCollection);
45 private JTable m_table = new JTable();
46 private JButton errorButton = new JButton("An error occured, click for details...");
47 private CardLayout cardLayout = new CardLayout();
48 private JPanel panel = new JPanel(cardLayout);
49 private EventHeader m_lce;
50 private Studio m_app;
51 private Throwable error;
52 private Map<TableModel,SortableTableModel> sortedModels = new HashMap<TableModel,SortableTableModel>();
53 private TableColumnPacker tableColumnPacker = new TableColumnPacker();
54
55 CollectionTable(Studio app)
56 {
57 super(new BorderLayout());
58 m_table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
59 m_app = app;
60 m_tableLabel.setEditable(false);
61 add(m_tableLabel,BorderLayout.NORTH);
62 panel.add(new JScrollPane(m_table),"first");
63 panel.add(errorButton,"second");
64 add(panel,BorderLayout.CENTER);
65
66 errorButton.addActionListener(this);
67
68
69
70 m_table.setDefaultRenderer(Double.class,new ScientificRenderer());
71 m_table.setDefaultRenderer(Float.class,new ScientificRenderer());
72 m_table.setDefaultRenderer(new double[0].getClass(),new ArrayRenderer());
73 m_table.setDefaultRenderer(new float[0].getClass(),new ArrayRenderer());
74 m_table.setDefaultRenderer(new int[0].getClass(),new ArrayRenderer());
75 m_table.setDefaultRenderer(new short[0].getClass(),new ArrayRenderer());
76 m_table.setDefaultRenderer(new String[0].getClass(),new ArrayRenderer());
77 m_table.setDefaultRenderer(Hep3Vector.class,new VectorRenderer());
78 m_table.setDefaultRenderer(Object.class, new LCObjectRenderer());
79
80 new TableSorter(m_table);
81 }
82 void setEvent(EventHeader event)
83 {
84 m_lce = event;
85 m_table.setModel(emptyTable);
86 m_tableLabel.setText(noCollection) ;
87 }
88 void setCollection(Object collection)
89 {
90 if (collection instanceof Throwable)
91 {
92 m_table.setModel(emptyTable);
93 error = (Throwable) collection;
94 cardLayout.last(panel);
95 }
96 else if (collection != null && collection instanceof List && m_lce != null)
97 {
98 List coll = (List) collection;
99 LCMetaData meta = m_lce.getMetaData(coll);
100 Class type = meta.getType();
101 int flag = meta.getFlags();
102
103 StringBuffer tableText = new StringBuffer();
104 tableText.append("Collection: ").append(meta.getName());
105 tableText.append(" size:").append(coll.size());
106 tableText.append(" flags:").append(Integer.toHexString(flag));
107
108 for (Map.Entry<String,int[]> entry : meta.getIntegerParameters().entrySet())
109 {
110 tableText.append( "\n ").append(entry.getKey()).append(":\t");
111 for(int v : entry.getValue())
112 {
113 tableText.append(v);
114 tableText.append(", ");
115 }
116 if (entry.getValue().length > 0) tableText.setLength(tableText.length()-2);
117 }
118 for (Map.Entry<String,float[]> entry : meta.getFloatParameters().entrySet())
119 {
120 tableText.append( "\n ").append(entry.getKey()).append(":\t");
121 for(float v : entry.getValue())
122 {
123 tableText.append(v);
124 tableText.append(", ");
125 }
126 if (entry.getValue().length > 0) tableText.setLength(tableText.length()-2);
127 }
128 for (Map.Entry<String,String[]> entry : meta.getStringParameters().entrySet())
129 {
130 tableText.append( "\n ").append(entry.getKey()).append(":\t");
131 for(String v : entry.getValue())
132 {
133 tableText.append(v);
134 tableText.append(", ");
135 }
136 if (entry.getValue().length > 0) tableText.setLength(tableText.length()-2);
137 }
138 m_tableLabel.setText(tableText.toString()) ;
139
140 try
141 {
142 Template template = new Template(EventBrowserTableModel.class);
143 Result result = m_app.getLookup().lookup(template);
144 Collection<EventBrowserTableModel> models = (Collection<EventBrowserTableModel>) result.allInstances();
145
146 boolean ok = false;
147 for (EventBrowserTableModel model : models)
148 {
149 if (model.canDisplay(type))
150 {
151 model.setData(meta,coll);
152 SortableTableModel sortedModel = sortedModels.get(model);
153 if (sortedModel == null)
154 {
155 sortedModel = new DefaultSortableTableModel(model);
156 sortedModels.put(model,sortedModel);
157 }
158 m_table.setModel(sortedModel);
159 tableColumnPacker.packColumns(m_table);
160 ok = true;
161 break;
162 }
163 }
164 if (!ok)
165 {
166 m_table.setModel(emptyTable);
167
168 }
169 cardLayout.first(panel);
170 }
171 catch (Exception x)
172 {
173 error = x;
174 cardLayout.last(panel);
175 }
176 }
177 else
178 {
179 m_table.setModel(emptyTable);
180 m_tableLabel.setText(noCollection) ;
181 cardLayout.first(panel);
182 }
183 }
184
185 public void actionPerformed(ActionEvent actionEvent)
186 {
187 Application.error(this,"Error displaying collection", error);
188 }
189 private static class ScientificRenderer extends DefaultTableCellRenderer
190 {
191 private ScientificFormat format = new ScientificFormat();
192 ScientificRenderer()
193 {
194 setHorizontalAlignment(SwingConstants.RIGHT);
195 }
196
197 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
198 {
199 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
200 if (value instanceof Number) setText(format.format(((Number) value).doubleValue()));
201 return this;
202 }
203 }
204 private static class ArrayRenderer extends DefaultTableCellRenderer
205 {
206 private ScientificFormat format = new ScientificFormat();
207 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
208 {
209 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
210 if (value != null && value.getClass().isArray())
211 {
212 StringBuffer buffer = new StringBuffer("[");
213 int ll = Array.getLength(value);
214 for (int i=0; i<10;)
215 {
216 if (i >= ll) break;
217 Object o = Array.get(value,i);
218 if (o instanceof Double || o instanceof Float) buffer.append(format.format(((Number) o).doubleValue()));
219 else buffer.append(o);
220 if (++i >= ll) break;
221 buffer.append(',');
222 }
223 if (ll > 10) buffer.append("...");
224 buffer.append(']');
225 setText(buffer.toString());
226 }
227 return this;
228 }
229 }
230 private static class VectorRenderer extends DefaultTableCellRenderer
231 {
232 private ScientificFormat format = new ScientificFormat();
233 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
234 {
235 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
236 if (value instanceof Hep3Vector)
237 {
238 Hep3Vector vector = (Hep3Vector) value;
239 StringBuffer buffer = new StringBuffer("[");
240 buffer.append(format.format(vector.x()));
241 buffer.append(',');
242 buffer.append(format.format(vector.y()));
243 buffer.append(',');
244 buffer.append(format.format(vector.z()));
245 buffer.append(']');
246 setText(buffer.toString());
247 }
248 return this;
249 }
250 }
251 private class LCObjectRenderer extends DefaultTableCellRenderer
252 {
253 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
254 {
255 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
256 if (value instanceof String) return this;
257
258
259 List<List<Object>> collections = m_lce.get(Object.class);
260 for (List<Object> collection : collections)
261 {
262 int index = collection.indexOf(value);
263 if (index >= 0)
264 {
265 setText(m_lce.getMetaData(collection).getName()+"["+index+"]");
266 return this;
267 }
268 }
269 return this;
270 }
271 }
272 }