View Javadoc

1   package org.codehaus.groovy.antlr;
2   import java.awt.*;
3   import java.awt.event.*;
4   import java.io.*;
5   import java.lang.reflect.*;
6   import java.util.Hashtable;
7   
8   import javax.swing.*;
9   import javax.swing.border.Border;
10  import javax.swing.text.BadLocationException;
11  import org.codehaus.groovy.antlr.parser.*;
12  
13  import antlr.*;
14  
15  /***
16   * @author Santhosh Kumar T
17   * @version 1.0
18   */
19  
20  public class LexerFrame extends JFrame implements ActionListener{
21      JSplitPane jSplitPane1 = new JSplitPane();
22      JScrollPane jScrollPane1 = new JScrollPane();
23      JScrollPane jScrollPane2 = new JScrollPane();
24      JTextPane tokenPane = new HScrollableTextPane();
25      JButton jbutton = new JButton("open");
26      JPanel mainPanel = new JPanel(new BorderLayout());
27      JTextArea scriptPane = new JTextArea();
28      Border border1;
29      Border border2;
30  
31      Class lexerClass;
32  
33      public LexerFrame(Class lexerClass, Class tokenTypesClass){
34          super("Token Steam Viewer");
35          this.lexerClass = lexerClass;
36          try{
37              jbInit();
38              setSize(500, 500);
39              listTokens(tokenTypesClass);
40  
41              final JPopupMenu popup = new JPopupMenu();
42              popup.add(loadFileAction);
43  
44              jbutton.setSize(30,30);
45              jbutton.addMouseListener(new MouseAdapter(){
46                  public void mouseReleased(MouseEvent e) {
47                      //if(e.isPopupTrigger())
48                          popup.show(scriptPane, e.getX(), e.getY());
49                  }
50              });
51              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
52          } catch(Exception e){
53              e.printStackTrace();
54          }
55      }
56  
57      Hashtable tokens = new Hashtable();
58  
59      private void listTokens(Class tokenTypes) throws Exception{
60          Field field[] = tokenTypes.getDeclaredFields();
61          for(int i = 0; i<field.length; i++)
62              tokens.put(field[i].get(null), field[i].getName());
63      }
64  
65      public void actionPerformed(ActionEvent ae){
66          Token token = (Token) ((JComponent) ae.getSource()).getClientProperty("token");
67          if(token.getType()==Token.EOF_TYPE){
68              scriptPane.select(0, 0);
69              return;
70          }
71          try{
72              int start = scriptPane.getLineStartOffset(token.getLine()-1)+token.getColumn()-1;
73              scriptPane.select(start, start+token.getText().length());
74              scriptPane.requestFocus();
75          } catch(BadLocationException ex){
76          }
77      }
78  
79      private Action loadFileAction = new AbstractAction("Open File..."){
80          public void actionPerformed(ActionEvent ae){
81              JFileChooser jfc = new JFileChooser();
82              int response = jfc.showOpenDialog(LexerFrame.this);
83              if(response!=JFileChooser.APPROVE_OPTION)
84                  return;
85              try{
86                  scanScript(jfc.getSelectedFile());
87              } catch(Exception ex){
88                  ex.printStackTrace();
89              }
90          }
91      };
92  
93      private void scanScript(File file) throws Exception{
94          scriptPane.read(new FileReader(file), null);
95  
96          // create lexer
97          Constructor constructor = lexerClass.getConstructor(new Class[]{InputStream.class});
98          CharScanner lexer = (CharScanner) constructor.newInstance(new Object[]{new FileInputStream(file)});
99  
100         tokenPane.setEditable(true);
101         tokenPane.setText("");
102 
103         int line = 1;
104         ButtonGroup bg = new ButtonGroup();
105         Token token = null;
106 
107         while(true){
108             token = lexer.nextToken();
109             JToggleButton tokenButton = new JToggleButton((String) tokens.get(new Integer(token.getType())));
110             bg.add(tokenButton);
111             tokenButton.addActionListener(this);
112             tokenButton.setToolTipText(token.getText());
113             tokenButton.putClientProperty("token", token);
114             tokenButton.setMargin(new Insets(0, 1, 0, 1));
115             tokenButton.setFocusPainted(false);
116             if(token.getLine()>line){
117                 tokenPane.getDocument().insertString(tokenPane.getDocument().getLength(), "\n", null);
118                 line = token.getLine();
119             }
120             insertComponent(tokenButton);
121             if(token.getType()==Token.EOF_TYPE)
122                 break;
123         }
124 
125         tokenPane.setEditable(false);
126         tokenPane.setCaretPosition(0);
127     }
128 
129     private void insertComponent(JComponent comp){
130         try{
131             tokenPane.getDocument().insertString(tokenPane.getDocument().getLength(), " ", null);
132         } catch(BadLocationException ex1){
133         }
134         try{
135             tokenPane.setCaretPosition(tokenPane.getDocument().getLength()-1);
136         } catch(Exception ex){
137             tokenPane.setCaretPosition(0);
138         }
139         tokenPane.insertComponent(comp);
140     }
141 
142     private void jbInit() throws Exception{
143         border1 = BorderFactory.createEmptyBorder();
144         border2 = BorderFactory.createEmptyBorder();
145         jSplitPane1.setOrientation(JSplitPane.VERTICAL_SPLIT);
146         tokenPane.setEditable(false);
147         tokenPane.setText("");
148         scriptPane.setFont(new java.awt.Font("DialogInput", 0, 12));
149         scriptPane.setEditable(false);
150         scriptPane.setMargin(new Insets(5, 5, 5, 5));
151         scriptPane.setText("");
152         jScrollPane1.setBorder(border1);
153         jScrollPane2.setBorder(border1);
154         jSplitPane1.setMinimumSize(new Dimension(800,600));
155         mainPanel.add(jSplitPane1, BorderLayout.CENTER);
156         mainPanel.add(jbutton,BorderLayout.NORTH);
157         this.getContentPane().add(mainPanel);
158         jSplitPane1.add(jScrollPane1, JSplitPane.LEFT);
159         jScrollPane1.getViewport().add(tokenPane, null);
160         jSplitPane1.add(jScrollPane2, JSplitPane.RIGHT);
161         jScrollPane2.getViewport().add(scriptPane, null);
162 
163         jScrollPane1.setColumnHeaderView(new JLabel(" Token Stream:"));
164         jScrollPane2.setColumnHeaderView(new JLabel(" Input Script:"));
165         jSplitPane1.setResizeWeight(0.5);
166     }
167 
168     public static void main(String[] args) throws Exception{
169         try{
170             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
171         } catch(Exception ignore){
172         }
173         new LexerFrame(GroovyLexer.class, GroovyTokenTypes.class).setVisible(true);
174     }
175 }
176 
177 
178 class HScrollableTextPane extends JTextPane{
179     public boolean getScrollableTracksViewportWidth(){
180         return(getSize().width<getParent().getSize().width);
181     }
182 
183     public void setSize(Dimension d){
184         if(d.width<getParent().getSize().width){
185             d.width = getParent().getSize().width;
186         }
187         super.setSize(d);
188     }
189 }