View Javadoc

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   * @author tonyj
38   * @version $Id: CollectionTable.java,v 1.9 2007/06/02 00:05:51 tonyj Exp $
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        // Add some smart renderers
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          // Look for collections in the event which contain objects of this class
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 }