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  /**
26   * Copyright (c) Ontos AG (http://www.ontosearch.com).
27   * This class is part of JAPE Debugger component for
28   * GATE (Copyright (c) "The University of Sheffield" see http://gate.ac.uk/) <br>
29   * This class represents all processing and language resources
30   * being loaded in GATE as a tree.
31   * It uses <code>CreoleListenerImpl</code> class
32   * to dynamically change the tree after user
33   * has loaded/unloaded/renamed any resource in GATE.
34   * @author Andrey Shafirin, Oleg Mishchenko
35   */
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          //TODO: (by Andrey Shafirin) logical inaccuracy "CreoleListenerImpl.getInstance(this)" parameter ignored
86          // for already initialised CreoleListenerImpl
87          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 //            children = getChildren();
132         }
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 //                nodes.add(new PRTreeNode(it.next()));
180                 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 }