View Javadoc

1   package org.lcsim.plugin.browser;
2   
3   import java.awt.BorderLayout;
4   import java.awt.CardLayout;
5   import java.awt.Dimension;
6   import java.awt.Font;
7   import java.util.ArrayList;
8   import java.util.Collections;
9   import org.freehep.util.commanddispatcher.CommandProcessor;
10  
11  import javax.swing.event.ListSelectionEvent;
12  import javax.swing.event.ListSelectionListener;
13  import javax.swing.event.TreeSelectionEvent;
14  import javax.swing.event.TreeSelectionListener;
15  import javax.swing.tree.DefaultMutableTreeNode;
16  import javax.swing.tree.DefaultTreeModel;
17  import javax.swing.tree.TreeModel;
18  import javax.swing.tree.TreePath;
19  import java.util.List;
20  import javax.swing.JLabel;
21  import javax.swing.JPanel;
22  import javax.swing.JScrollPane;
23  import javax.swing.JSplitPane;
24  import javax.swing.JTree;
25  import javax.swing.event.TreeExpansionEvent;
26  import javax.swing.event.TreeWillExpandListener;
27  import javax.swing.tree.ExpandVetoException;
28  import org.freehep.application.studio.Studio;
29  import org.freehep.record.loop.LoopEvent;
30  import org.freehep.record.loop.LoopListener;
31  import org.freehep.record.loop.RecordLoop;
32  import org.freehep.record.source.RecordSource;
33  import org.freehep.util.FreeHEPLookup;
34  import org.lcsim.event.EventHeader;
35  import org.lcsim.event.MCParticle;
36  
37  
38  
39  /**
40   * A browser for viewing LCIO events in org.lcsim
41   * @author tonyj
42   * @author gaede
43   */
44  public class LCSimEventBrowser extends JPanel implements LoopListener, TreeSelectionListener, ListSelectionListener, TreeWillExpandListener
45  {
46     private static final String noEvent = "No Event";
47     private static final TreeModel m_empty = new DefaultTreeModel(new DefaultMutableTreeNode(noEvent));
48     private JLabel m_label = new JLabel(noEvent);
49     private JTree m_tree = new JTree(m_empty);
50     
51     private EventHeaderPanel m_headerPanel = new EventHeaderPanel();
52     private LCSimEventTree m_eventTree = new LCSimEventTree();
53     private CollectionTable m_table;
54     private CardLayout m_cardLayout = new CardLayout();
55     private JPanel m_switchPanel = new JPanel(m_cardLayout);
56     private RecordLoop m_loop;
57     private EventHeader m_lce;
58     private String m_selectedNode;
59     private Commands m_commands = new Commands();
60     private Studio app;
61     
62     public static void registerTableModels(FreeHEPLookup lookup)
63     {
64        lookup.add(new CalorimeterHitTableModel());
65        lookup.add(new SimCalorimeterHitTableModel());
66        lookup.add(new ClusterTableModel());
67        lookup.add(new MCParticleTableModel());
68        lookup.add(new SimTrackerHitTableModel());
69        lookup.add(new RawCalorimeterHitTableModel());
70        lookup.add(new RawTrackerHitTableModel());
71        lookup.add(new TPCHitTableModel());
72        lookup.add(new TrackerHitTableModel());
73        lookup.add(new LCRelationTableModel());
74        lookup.add(new TrackTableModel());
75        lookup.add(new ReconstructedParticleTableModel());
76        lookup.add(new LCGenericObjectTableModel());
77        lookup.add(new Hep3VectorTableModel());
78        lookup.add(new TrackerPulseTableModel());
79        lookup.add(new TrackerDataTableModel());
80        lookup.add(new VertexTableModel());
81        lookup.add(new FloatVecTableModel());
82        lookup.add(new IntVecTableModel());
83        lookup.add(new StringVecTableModel());
84     }
85     
86     public LCSimEventBrowser(Studio app, RecordLoop loop)
87     {
88        super(new BorderLayout());
89        this.app = app;
90        m_tree.addTreeSelectionListener(this);
91        m_tree.addTreeWillExpandListener(this);
92        m_tree.setMinimumSize(new Dimension(100,100));
93        
94        m_table = new CollectionTable(app);
95        m_switchPanel.add(m_table,"Collection");
96        m_switchPanel.add(m_headerPanel,"Event");
97        m_switchPanel.add(m_eventTree,"Tree");      
98        JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,new JScrollPane(m_tree),m_switchPanel);
99        add(pane,BorderLayout.CENTER);
100       add(m_label,BorderLayout.NORTH);
101       m_loop = loop;
102       
103       Font oldFont = m_table.getFont() ;
104       Font newFont = new Font( "Monospaced", oldFont.getStyle() , oldFont.getSize() ) ;
105       m_table.setFont( newFont ) ;
106    }
107    
108    public void addNotify()
109    {
110       RecordSource source = m_loop.getRecordSource();
111       setSource(source);
112       m_loop.addLoopListener(this);
113       super.addNotify();
114    }
115    public void removeNotify()
116    {
117       super.removeNotify();
118       m_loop.removeLoopListener(this);
119    }
120    public CommandProcessor getCommands()
121    {
122       return m_commands;
123    }
124    private void setSource(RecordSource source)
125    {
126       try
127       {
128          setEvent(source.getCurrentRecord());
129       }
130       catch (Throwable t)
131       {
132          setEvent(t);
133       }
134    }
135    private void setEvent(Object event)
136    {
137       if (event == null)
138       {
139          m_tree.setModel(m_empty);
140          m_label.setText(noEvent);
141          m_headerPanel.setData(null);
142          m_eventTree.setEvent(null);
143          m_table.setEvent(null);
144          m_lce = null;
145       }
146       else if (event instanceof EventHeader)
147       {
148          m_lce = (EventHeader) event;
149          m_table.setEvent(m_lce);
150          DefaultMutableTreeNode root = new DefaultMutableTreeNode("Event");
151          List<String> collections = new ArrayList<String>(m_lce.keys());
152          Collections.sort(collections);
153          int selectedRow = -1;
154          int i = 0;
155          for (String name : collections)
156          {
157             if (name.equals(m_selectedNode)) selectedRow = i;
158             root.add(new DefaultMutableTreeNode(name));
159             i++;
160          }
161          if (m_lce.hasCollection(MCParticle.class, EventHeader.MC_PARTICLES))
162          {
163             if ("MCParticleTree".equals(m_selectedNode)) selectedRow = i;
164             root.add(new DefaultMutableTreeNode("MCParticleTree"));
165          }
166          
167          m_tree.setModel(new DefaultTreeModel(root));
168          m_label.setText("Run:"+m_lce.getRunNumber()+"  Event: "+m_lce.getEventNumber());
169          
170          m_eventTree.setEvent(m_lce);
171          
172          // Try to find selected node
173          if (selectedRow >= 0) m_tree.setSelectionRow(selectedRow+1);
174          else m_tree.setSelectionRow(0);
175          m_tree.expandRow(0); // Make sure root is expanded
176       }
177       else
178       {
179          m_lce = null;
180          m_tree.setModel(m_empty);
181          m_label.setText(event.toString());
182          m_eventTree.setEvent(null);
183       }
184       m_commands.setChanged();
185    }
186 
187    public void process(LoopEvent event) {
188     switch (event.getEventType()) {
189       case SUSPEND:
190       case RESET:
191         RecordLoop loop = event.getSource();
192         setSource(loop.getRecordSource());
193       default:
194     }
195    }
196    
197    public void valueChanged(TreeSelectionEvent e)
198    {
199       try
200       {
201          TreePath path = m_tree.getSelectionPath();
202          if (path != null && m_lce != null)
203          {
204             m_selectedNode = path.getLastPathComponent().toString();
205             if (m_selectedNode.equals("Event"))
206             {
207                m_headerPanel.setData(m_lce);
208                m_cardLayout.show(m_switchPanel,"Event");
209             }
210             else if (m_selectedNode.equals("MCParticleTree"))
211             {
212                m_cardLayout.show(m_switchPanel,"Tree");               
213             }
214             else
215             {
216                List coll = m_lce.get(Object.class,m_selectedNode);
217                m_table.setCollection(coll);
218                m_cardLayout.show(m_switchPanel,"Collection");
219             }
220          }
221          else
222          {
223             m_table.setCollection(null);
224          }
225       }
226       catch (Exception x)
227       {
228          m_table.setCollection(x);
229       }
230       m_commands.setChanged();
231    }
232    
233    public void valueChanged(ListSelectionEvent e)
234    {
235       m_commands.setChanged();
236    }
237 
238    public void treeWillCollapse(TreeExpansionEvent treeExpansionEvent) throws ExpandVetoException
239    {
240       // Don't allow the root node to be collapsed
241       if (treeExpansionEvent.getPath().getPathCount()==1) throw new ExpandVetoException(treeExpansionEvent);
242    }
243 
244    public void treeWillExpand(TreeExpansionEvent treeExpansionEvent) throws ExpandVetoException
245    {
246    }
247    
248    private class Commands extends CommandProcessor
249    {
250       //      public void onPrintPreview()
251       //      {
252       //         Studio app = getApplication();
253       //         TableModel model = table.getModel();
254       //         Font headerFont = new Font("Serif", Font.BOLD, 12);
255       //         Font cellFont = new Font("SansSerif", Font.PLAIN, 10);
256       //         PrinterJob pj = PrinterJob.getPrinterJob();
257       //         PageFormat pf = pj.defaultPage();
258       //         pj.cancel();
259       //         // FIXME: the frc and pf should depend on the current default printer
260       //         FontRenderContext frc = ((Graphics2D) app.getGraphics()).getFontRenderContext();
261       //         TablePrinter printer = new TablePrinter(model,"Table Test", pf, headerFont, cellFont,  frc);
262       //         PrintPreview pp = app.createPrintPreview();
263       //         pp.setPageable(printer);
264       //         JDialog dlg = pp.createDialog(app,"Print Preview...");
265       //         app.showDialog(dlg,"tableTestPrintPreview");
266       //      }
267 //      public void enableCopy(CommandState state)
268 //      {
269 //         state.setEnabled(m_table.getSelectionModel().getLeadSelectionIndex() >= 0);
270 //      }
271 //      public void onCopy()
272 //      {
273 //         StringBuffer buf = new StringBuffer();
274 //         for (int col=0; col<m_table.getColumnCount();)
275 //         {
276 //            buf.append(m_table.getColumnName(col));
277 //            if (++col == m_table.getColumnCount()) break;
278 //            buf.append('\t');
279 //         }
280 //         buf.append('\n');
281 //         
282 //         int[] rows = m_table.getSelectedRows();
283 //         for (int r=0; r<rows.length; r++)
284 //         {
285 //            int row = rows[r];
286 //            for (int col=0; col<m_table.getColumnCount();)
287 //            {
288 //               buf.append(m_table.getValueAt(row,col));
289 //               if (++col == m_table.getColumnCount()) break;
290 //               buf.append('\t');
291 //            }
292 //            buf.append('\n');
293 //         }
294 //         Clipboard cb = getToolkit().getSystemClipboard();
295 //         StringSelection sel = new StringSelection(buf.toString());
296 //         cb.setContents(sel,sel);
297 //      }
298    }
299 }