View Javadoc

1   package org.lcsim.plugin;
2   
3   import java.awt.BorderLayout;
4   import java.util.ArrayList;
5   import java.util.List;
6   import javax.swing.tree.TreePath;
7   import javax.swing.JPanel;
8   import javax.swing.JScrollPane;
9   import org.freehep.application.studio.Studio;
10  import org.freehep.record.loop.LoopEvent;
11  import org.freehep.record.loop.LoopListener;
12  import org.freehep.record.loop.RecordLoop;
13  import org.freehep.swing.treetable.AbstractTreeTableModel;
14  import org.freehep.swing.treetable.JTreeTable;
15  import org.freehep.swing.treetable.TreeTableModel;
16  import org.lcsim.util.Driver;
17  import org.lcsim.util.DriverAdapter;
18  import org.openide.util.Lookup.Result;
19  import org.openide.util.Lookup.Template;
20  import org.openide.util.LookupEvent;
21  import org.openide.util.LookupListener;
22  
23  
24  
25  /**
26   * A browser for viewing driver statistics
27   * @author tonyj
28   * @author gaede
29   */
30  public class LCSimDriverTree extends JPanel implements LoopListener, LookupListener
31  {
32     private Studio app;
33     private RecordLoop loop;
34     private Result result;
35     private List<Driver> drivers = new ArrayList<Driver>();
36     private DriverTreeModel model;
37     
38     public LCSimDriverTree(Studio app, RecordLoop loop)
39     {
40        super(new BorderLayout());
41        this.app = app;
42        this.loop = loop;
43        JTreeTable table = new JTreeTable();
44        model = new DriverTreeModel(drivers);
45        table.setModel(model);
46        add(new JScrollPane(table),BorderLayout.CENTER);
47     }
48     public void addNotify()
49     {
50        loop.addLoopListener(this);
51        
52        // Listen for record sources
53        // TODO: We use a "wild-card" template to work around a bug in Lookup.
54        //Lookup.Template template = new Lookup.Template(SequentialRecord.class);
55        Template template = new Template();
56        result = app.getLookup().lookup(template);
57        drivers.clear();
58        resultChanged(null);
59        result.addLookupListener(this);
60        
61        super.addNotify();
62     }
63     public void removeNotify()
64     {
65        super.removeNotify();
66        loop.removeLoopListener(this);
67        result.removeLookupListener(this);
68     }
69  
70     public void process(LoopEvent event) {}
71     
72     public class DriverTreeModel extends AbstractTreeTableModel
73     {
74        private String[] columns = { "Driver", "Events", "Time", "% of parent" };
75        DriverTreeModel(List<Driver> drivers)
76        {
77           super(drivers);
78        }
79  
80        public Class getColumnClass(int i)
81        {
82           return i == 0 ? TreeTableModel.class : Number.class;
83        }
84  
85        public int getColumnCount()
86        {
87           return columns.length;
88        }
89  
90        public String getColumnName(int i)
91        {
92           return columns[i];
93        }
94  
95        public Object getChild(Object parent, int index)
96        {
97           if (parent instanceof List)
98           {
99              return ((List) parent).get(index);
100          }
101          else 
102          {
103             return ((Driver) parent).drivers().get(index);
104          }
105       }
106 
107       public int getChildCount(Object parent)
108       {
109          if (parent instanceof List)
110          {
111             return ((List) parent).size();
112          }
113          else 
114          {
115             return ((Driver) parent).drivers().size();
116          }
117       }
118 
119       public Object getValueAt(Object object, int i)
120       {
121 
122          if (i == 0)
123          {
124             if (object instanceof Driver) return ((Driver) object).getName();
125             else return object.toString();
126          }
127          else return "list";
128 
129       }
130 
131       protected void fireTreeStructureChanged(Object source, TreePath path, int[] childIndices, Object[] children)
132       {
133          super.fireTreeStructureChanged(source, path, childIndices, children);
134       }
135 
136       protected void fireTreeNodesRemoved(Object source, TreePath path, int[] childIndices, Object[] children)
137       {
138          super.fireTreeNodesRemoved(source, path, childIndices, children);
139       }
140 
141       protected void fireTreeNodesInserted(Object source, TreePath path, int[] childIndices, Object[] children)
142       {
143          super.fireTreeNodesInserted(source, path, childIndices, children);
144       }
145 
146       protected void fireTreeNodesChanged(Object source, TreePath path, int[] childIndices, Object[] children)
147       {
148          super.fireTreeNodesChanged(source, path, childIndices, children);
149       }
150     
151    }
152    public void resultChanged(LookupEvent lookupEvent)
153    {
154       for (Object item : result.allInstances())
155       {
156          if (item instanceof DriverAdapter)
157          {
158             Driver driver = ((DriverAdapter) item).getDriver();
159             if (!drivers.contains(driver))
160             {
161                int i[] = { drivers.size() };
162                drivers.add(driver);
163                model.fireTreeNodesInserted(this,new TreePath(drivers),i,null);
164                
165             }
166          }
167       }
168    }
169 }