KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > codehaus > groovy > antlr > LexerFrame


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 JavaDoc;
7
8 import javax.swing.*;
9 import javax.swing.border.Border JavaDoc;
10 import javax.swing.text.BadLocationException JavaDoc;
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 JavaDoc border1;
29     Border JavaDoc border2;
30
31     Class JavaDoc lexerClass;
32
33     public LexerFrame(Class JavaDoc lexerClass, Class JavaDoc 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 JavaDoc e){
53             e.printStackTrace();
54         }
55     }
56
57     Hashtable JavaDoc tokens = new Hashtable JavaDoc();
58
59     private void listTokens(Class JavaDoc tokenTypes) throws Exception JavaDoc{
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 JavaDoc 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 JavaDoc ex){
88                 ex.printStackTrace();
89             }
90         }
91     };
92
93     private void scanScript(File file) throws Exception JavaDoc{
94         scriptPane.read(new FileReader(file), null);
95
96         // create lexer
97
Constructor constructor = lexerClass.getConstructor(new Class JavaDoc[]{InputStream.class});
98         CharScanner lexer = (CharScanner) constructor.newInstance(new Object JavaDoc[]{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 JavaDoc) tokens.get(new Integer JavaDoc(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 JavaDoc ex1){
133         }
134         try{
135             tokenPane.setCaretPosition(tokenPane.getDocument().getLength()-1);
136         } catch(Exception JavaDoc ex){
137             tokenPane.setCaretPosition(0);
138         }
139         tokenPane.insertComponent(comp);
140     }
141
142     private void jbInit() throws Exception JavaDoc{
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 JavaDoc("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 JavaDoc[] args) throws Exception JavaDoc{
169         try{
170             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
171         } catch(Exception JavaDoc ignore){
172         }
173         new LexerFrame(GroovyLexer.class, GroovyTokenTypes.class).show();
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 }
Popular Tags