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
27
28
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
53
54
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 }