1 31 32 package org.antlr.works.find; 33 34 import org.antlr.works.ate.syntax.misc.ATEToken; 35 import org.antlr.works.components.grammar.CEditorGrammar; 36 import org.antlr.works.editor.EditorTab; 37 import org.antlr.works.syntax.element.ElementRule; 38 39 import javax.swing.*; 40 import javax.swing.tree.DefaultMutableTreeNode ; 41 import javax.swing.tree.DefaultTreeCellRenderer ; 42 import javax.swing.tree.DefaultTreeModel ; 43 import javax.swing.tree.TreePath ; 44 import java.awt.*; 45 import java.awt.event.MouseAdapter ; 46 import java.awt.event.MouseEvent ; 47 48 public class Usages extends EditorTab { 49 50 protected JPanel panel; 51 protected JScrollPane treeScrollPane; 52 protected JTree tree; 53 54 protected DefaultTreeModel model; 55 protected DefaultMutableTreeNode root; 56 protected DefaultMutableTreeNode node; 57 protected String lastRule; 58 59 protected CEditorGrammar editor; 60 protected ATEToken token; 61 62 public Usages(CEditorGrammar editor, ATEToken token) { 63 this.editor = editor; 64 this.token = token; 65 66 panel = new JPanel(new BorderLayout()); 67 68 tree = new JTree(); 69 tree.setRootVisible(false); 70 tree.setShowsRootHandles(true); 71 72 DefaultTreeCellRenderer treeRenderer = new DefaultTreeCellRenderer (); 73 treeRenderer.setClosedIcon(null); 74 treeRenderer.setLeafIcon(null); 75 treeRenderer.setOpenIcon(null); 76 77 tree.setCellRenderer(treeRenderer); 78 79 tree.addMouseListener(new MouseAdapter () { 80 public void mousePressed(MouseEvent e) { 81 int selRow = tree.getRowForLocation(e.getX(), e.getY()); 82 TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); 83 if(selRow != -1) { 84 if(e.getClickCount() == 1) { 85 } 86 else if(e.getClickCount() == 2) { 87 DefaultMutableTreeNode node = (DefaultMutableTreeNode )selPath.getLastPathComponent(); 88 if(node.getUserObject() instanceof UsageMatch) 89 selectMatch((UsageMatch)node.getUserObject()); 90 } 91 } 92 } 93 }); 94 95 treeScrollPane = new JScrollPane(tree); 96 treeScrollPane.setWheelScrollingEnabled(true); 97 98 panel.add(treeScrollPane, BorderLayout.CENTER); 99 100 root = new DefaultMutableTreeNode (); 101 model = new DefaultTreeModel (root); 102 lastRule = null; 103 104 tree.setModel(model); 105 } 106 107 public Container getContainer() { 108 return panel; 109 } 110 111 public void addMatch(ElementRule rule, ATEToken token) { 112 if(lastRule == null || !lastRule.equals(rule.name)) { 113 node = new DefaultMutableTreeNode (); 114 node.setUserObject(rule.name); 115 root.add(node); 116 117 lastRule = rule.name; 118 } 119 120 DefaultMutableTreeNode matchNode = new DefaultMutableTreeNode (); 121 matchNode.setUserObject(new UsageMatch(rule, token)); 122 node.add(matchNode); 123 124 model.reload(); 125 } 126 127 public void selectMatch(UsageMatch match) { 128 editor.selectTextRange(match.token.getStartIndex(), match.token.getEndIndex()); 129 } 130 131 public String getTabName() { 132 return "Usages of \""+token.getAttribute()+"\""; 133 } 134 135 public Component getTabComponent() { 136 return getContainer(); 137 } 138 139 public static class UsageMatch { 140 public ElementRule rule; 141 public ATEToken token; 142 public String contextualText; 143 144 public UsageMatch(ElementRule rule, ATEToken token) { 145 this.rule = rule; 146 this.token = token; 147 createContextString(); 148 } 149 150 public void createContextString() { 151 String text = token.getText(); 152 int s = token.getStartIndex(); 153 while(s > 0 && text.charAt(s) != '\n' && text.charAt(s) != '\r') { 154 s--; 155 } 156 157 int e = token.getEndIndex(); 158 while(s < text.length() && text.charAt(e) != '\n' && text.charAt(e) != '\r') { 159 e++; 160 } 161 contextualText = text.substring(s, e); 162 } 163 164 public String toString() { 165 return token.getAttribute()+" @ ("+token.startLineNumber +", "+(token.getStartIndex()-token.getStartLineIndex())+") "+contextualText+" "; 167 } 168 } 169 } 170 | Popular Tags |