1 package debugger.gui.resources;
2
3 import debugger.gui.GuiFactory;
4 import debugger.gui.actions.resources.LrResourceSelectedAction;
5 import debugger.resources.ResourcesFactory;
6 import debugger.resources.lr.CorpusModel;
7 import debugger.resources.lr.LRRoot;
8 import debugger.resources.lr.LrModel;
9 import debugger.resources.pr.PRRoot;
10 import debugger.resources.pr.PhaseModel;
11 import debugger.resources.pr.PrModel;
12 import debugger.resources.pr.RuleModel;
13 import gate.Gate;
14
15 import javax.swing.*;
16 import javax.swing.tree.DefaultMutableTreeNode;
17 import javax.swing.tree.TreeNode;
18 import javax.swing.tree.TreePath;
19 import java.awt.*;
20 import java.awt.event.MouseAdapter;
21 import java.awt.event.MouseEvent;
22 import java.util.*;
23 import java.util.List;
24
25
36
37 public class ResourceTree extends JComponent {
38 private JTree tree;
39
40 public ResourceTree() {
41 init();
42 initListeners();
43 }
44
45 public JTree getTree() {
46 return tree;
47 }
48
49 public void refresh() {
50 this.removeAll();
51 init();
52 initListeners();
53 this.revalidate();
54 }
55
56 public PRTreeNode getNode(RuleModel rm) {
57 DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
58 for (int i = 0; i < root.getChildCount(); i++) {
59 TreeNode tn = root.getChildAt(i);
60 if (tn instanceof PRTreeNode) {
61 return ((PRTreeNode) tn).getNode(rm);
62 }
63 }
64 return null;
65 }
66
67 private void init() {
68 DefaultMutableTreeNode root = new DefaultMutableTreeNode() {
69 {
70 children = new Vector();
71 add(new PRTreeNode(ResourcesFactory.getPrRoot()));
72 add(new LRTreeNode(ResourcesFactory.getLrRoot()));
73 }
74
75 public String toString() {
76 return "Resources";
77 }
78 };
79 tree = new JTree(root);
80 tree.setCellRenderer(new ResourceTreeCellRenderer());
81 tree.putClientProperty("JTree.lineStyle", "Angled");
82 ToolTipManager.sharedInstance().registerComponent(tree);
83 this.setLayout(new BorderLayout());
84 this.add(new JScrollPane(tree, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER);
85 Gate.addCreoleListener(CreoleListenerImpl.getInstance(this));
88 }
89
90 private void initListeners() {
91 tree.addMouseListener(new MouseAdapter() {
92 public void mousePressed(MouseEvent me) {
93 TreePath treePath = tree.getPathForLocation(me.getX(), me.getY());
94 Object lastPathComponent = null;
95 if (treePath != null) {
96 lastPathComponent = treePath.getLastPathComponent();
97 Rectangle cellRectangle = tree.getPathBounds(treePath);
98 Component cellComponent = tree.getCellRenderer().getTreeCellRendererComponent(tree, lastPathComponent, true, false, true, 0, true);
99 cellComponent.setBounds(cellRectangle);
100 Component clickedComponent = cellComponent.getComponentAt(me.getX() - cellRectangle.x + 5, me.getY() - cellRectangle.y);
101 if (lastPathComponent instanceof ResourceTree.PRTreeNode && clickedComponent instanceof JCheckBox) {
102 RuleModel ruleModel = (RuleModel) ((ResourceTree.PRTreeNode) lastPathComponent).getPRResource();
103 if (ruleModel.isStopOnMatch()) {
104 ruleModel.setStopOnMatch(false);
105 } else {
106 ruleModel.setStopOnMatch(true);
107 }
108 }
109 if (lastPathComponent instanceof LRTreeNode && ((LRTreeNode) lastPathComponent).getLRResource() instanceof LrModel) {
110 LrResourceSelectedAction.getInstance().actionPerformed((LrModel) ((LRTreeNode) lastPathComponent).getLRResource());
111 }
112 if (lastPathComponent instanceof PRTreeNode && ((PRTreeNode) lastPathComponent).getPRResource() instanceof RuleModel) {
113 ResourcesFactory.setCurrentRuleModel((RuleModel) ((PRTreeNode) lastPathComponent).getPRResource());
114 }
115 if (lastPathComponent instanceof PRTreeNode && ((PRTreeNode) lastPathComponent).getPRResource() instanceof PhaseModel) {
116 GuiFactory.getDebugPanel().getTraceHistoryPanel().setCurrentPhase((PhaseModel) ((PRTreeNode) lastPathComponent).getPRResource());
117 }
118 }
119 repaint();
120 }
121 });
122 }
123
124 public class PRTreeNode extends DefaultMutableTreeNode {
125 private Object prResource;
126
127 public PRTreeNode(Object prResource) {
128 this.prResource = prResource;
129 children = new Vector();
130 getChildren();
131 }
133
134 public Object getPRResource() {
135 return prResource;
136 }
137
138 public PRTreeNode getNode(RuleModel rm) {
139 if (prResource.equals(rm)) return this;
140 for (Iterator itr = children.iterator(); itr.hasNext();) {
141 PRTreeNode node = (PRTreeNode) itr.next();
142 PRTreeNode prtNode = node.getNode(rm);
143 if (null != prtNode) return prtNode;
144 }
145 return null;
146 }
147
148 public String toString() {
149 if (prResource instanceof PRRoot)
150 return "Processing Resources";
151
152 else if (prResource instanceof PrModel)
153 return ((PrModel) prResource).getName();
154
155 else if (prResource instanceof PhaseModel)
156 return ((PhaseModel) prResource).getName();
157
158 else if (prResource instanceof RuleModel)
159 return ((RuleModel) prResource).getName();
160
161 else
162 return "";
163 }
164
165 private Vector getChildren() {
166 if (prResource instanceof PRRoot) {
167 return new Vector(createNodesFromChildren(((PRRoot) prResource).getPRs()));
168 } else if (prResource instanceof PrModel) {
169 return new Vector(createNodesFromChildren(((PrModel) prResource).getPhases()));
170 } else if (prResource instanceof PhaseModel) {
171 return new Vector(createNodesFromChildren(((PhaseModel) prResource).getRules()));
172 } else
173 return new Vector();
174 }
175
176 private Collection createNodesFromChildren(Collection children) {
177 List nodes = new ArrayList();
178 for (Iterator it = children.iterator(); it.hasNext();) {
179 add(new PRTreeNode(it.next()));
181 }
182 return nodes;
183 }
184
185
186 }
187
188 class LRTreeNode extends DefaultMutableTreeNode {
189 private Object languageResource;
190
191 public LRTreeNode(Object languageResource) {
192 this.languageResource = languageResource;
193 children = getChildren();
194 }
195
196 public String toString() {
197 if (languageResource instanceof LRRoot)
198 return "Language Resources";
199 else if (languageResource instanceof CorpusModel)
200 return languageResource.toString();
201 else if (languageResource instanceof LrModel)
202 return languageResource.toString();
203 else
204 return "";
205 }
206
207 public Object getLRResource() {
208 return languageResource;
209 }
210
211 private Vector getChildren() {
212 if (languageResource instanceof LRRoot) {
213 Vector children = new Vector();
214 for (Iterator it = ((LRRoot) languageResource).getCorpora().iterator(); it.hasNext();) {
215 CorpusModel corpusModel = (CorpusModel) it.next();
216 children.add(new LRTreeNode(corpusModel));
217 }
218 return children;
219 } else if (languageResource instanceof CorpusModel) {
220 Vector children = new Vector();
221 for (Iterator it = ((CorpusModel) languageResource).getLrModels().iterator(); it.hasNext();) {
222 LrModel currentModel = (LrModel) it.next();
223 children.add(new LRTreeNode(currentModel));
224 }
225 return children;
226 } else {
227 return new Vector();
228 }
229 }
230 }
231
232 public ResourceTreeCellRenderer getResourceTreeCellRenderer() {
233 return (ResourceTreeCellRenderer) tree.getCellRenderer();
234 }
235 }