1 | /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
---|
2 | * JFlex 1.4.3 *
|
---|
3 | * Copyright (C) 1998-2009 Gerwin Klein <[email protected]> *
|
---|
4 | * All rights reserved. *
|
---|
5 | * *
|
---|
6 | * This program is free software; you can redistribute it and/or modify *
|
---|
7 | * it under the terms of the GNU General Public License. See the file *
|
---|
8 | * COPYRIGHT for more information. *
|
---|
9 | * *
|
---|
10 | * This program is distributed in the hope that it will be useful, *
|
---|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
---|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
---|
13 | * GNU General Public License for more details. *
|
---|
14 | * *
|
---|
15 | * You should have received a copy of the GNU General Public License along *
|
---|
16 | * with this program; if not, write to the Free Software Foundation, Inc., *
|
---|
17 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
|
---|
18 | * *
|
---|
19 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
---|
20 |
|
---|
21 | package JFlex.gui;
|
---|
22 |
|
---|
23 | import JFlex.Main;
|
---|
24 | import JFlex.Out;
|
---|
25 |
|
---|
26 | import java.io.File;
|
---|
27 | import java.awt.*;
|
---|
28 | import java.awt.event.*;
|
---|
29 |
|
---|
30 | /**
|
---|
31 | * JFlex main application frame (GUI mode only)
|
---|
32 | *
|
---|
33 | * @author Gerwin Klein
|
---|
34 | * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
|
---|
35 | */
|
---|
36 | final public class MainFrame extends Frame implements Handles {
|
---|
37 |
|
---|
38 | private volatile boolean choosing;
|
---|
39 |
|
---|
40 | private String fileName = "";
|
---|
41 | private String dirName = "";
|
---|
42 |
|
---|
43 | private Button quit;
|
---|
44 | private Button options;
|
---|
45 | private Button generate;
|
---|
46 | private Button stop;
|
---|
47 | private Button specChoose;
|
---|
48 | private Button dirChoose;
|
---|
49 |
|
---|
50 | private TextField spec;
|
---|
51 | private TextField dir;
|
---|
52 |
|
---|
53 | private TextArea messages;
|
---|
54 |
|
---|
55 | private GeneratorThread thread;
|
---|
56 |
|
---|
57 | private OptionsDialog dialog;
|
---|
58 |
|
---|
59 |
|
---|
60 | public MainFrame() {
|
---|
61 | super("JFlex "+Main.version);
|
---|
62 | buildContent();
|
---|
63 |
|
---|
64 | addWindowListener( new WindowAdapter() {
|
---|
65 | public void windowClosing(WindowEvent e) {
|
---|
66 | quit();
|
---|
67 | }
|
---|
68 | });
|
---|
69 |
|
---|
70 | pack();
|
---|
71 | show();
|
---|
72 | }
|
---|
73 |
|
---|
74 |
|
---|
75 | private void buildContent() {
|
---|
76 | setBackground(SystemColor.control);
|
---|
77 |
|
---|
78 | generate = new Button("Generate");
|
---|
79 | quit = new Button("Quit");
|
---|
80 | options = new Button("Options");
|
---|
81 | stop = new Button("Stop");
|
---|
82 | dirChoose = new Button("Browse");
|
---|
83 | dir = new TextField(10);
|
---|
84 | specChoose = new Button("Browse");
|
---|
85 | spec = new TextField(10);
|
---|
86 | messages = new TextArea(10,80);
|
---|
87 |
|
---|
88 | messages.setEditable(false);
|
---|
89 | Font font = messages.getFont();
|
---|
90 | if (font != null)
|
---|
91 | messages.setFont(new Font("Monospaced", font.getStyle(), font.getSize()));
|
---|
92 | else
|
---|
93 | messages.setFont(new Font("Monospaced", Font.PLAIN, 12));
|
---|
94 |
|
---|
95 | Out.setGUIMode(messages);
|
---|
96 |
|
---|
97 | generate.addActionListener( new ActionListener() {
|
---|
98 | public void actionPerformed(ActionEvent e) {
|
---|
99 | generate();
|
---|
100 | }
|
---|
101 | } );
|
---|
102 |
|
---|
103 | options.addActionListener( new ActionListener() {
|
---|
104 | public void actionPerformed(ActionEvent e) {
|
---|
105 | showOptions();
|
---|
106 | }
|
---|
107 | } );
|
---|
108 |
|
---|
109 | quit.addActionListener( new ActionListener() {
|
---|
110 | public void actionPerformed(ActionEvent e) {
|
---|
111 | quit();
|
---|
112 | }
|
---|
113 | } );
|
---|
114 |
|
---|
115 | stop.addActionListener( new ActionListener() {
|
---|
116 | public void actionPerformed(ActionEvent e) {
|
---|
117 | stop();
|
---|
118 | }
|
---|
119 | } );
|
---|
120 |
|
---|
121 | specChoose.addActionListener( new ActionListener() {
|
---|
122 | public void actionPerformed(ActionEvent e) {
|
---|
123 | specChoose();
|
---|
124 | }
|
---|
125 | } );
|
---|
126 |
|
---|
127 | dirChoose.addActionListener( new ActionListener() {
|
---|
128 | public void actionPerformed(ActionEvent e) {
|
---|
129 | dirChoose();
|
---|
130 | }
|
---|
131 | } );
|
---|
132 |
|
---|
133 | spec.addActionListener( new ActionListener() {
|
---|
134 | public void actionPerformed(ActionEvent e) {
|
---|
135 | fileName = spec.getText();
|
---|
136 | generate();
|
---|
137 | }
|
---|
138 | } );
|
---|
139 |
|
---|
140 | spec.addTextListener( new TextListener() {
|
---|
141 | public void textValueChanged(TextEvent e) {
|
---|
142 | fileName = spec.getText();
|
---|
143 | }
|
---|
144 | } );
|
---|
145 |
|
---|
146 | dir.addActionListener( new ActionListener() {
|
---|
147 | public void actionPerformed(ActionEvent e) {
|
---|
148 | dirName = dir.getText();
|
---|
149 | generate();
|
---|
150 | }
|
---|
151 | } );
|
---|
152 |
|
---|
153 | dir.addTextListener( new TextListener() {
|
---|
154 | public void textValueChanged(TextEvent e) {
|
---|
155 | dirName = dir.getText();
|
---|
156 | }
|
---|
157 | } );
|
---|
158 |
|
---|
159 | GridPanel north = new GridPanel(5,4,10,10);
|
---|
160 | north.setInsets( new Insets(10,5,5,10) );
|
---|
161 |
|
---|
162 | north.add( 4,0, quit);
|
---|
163 | north.add( 4,1, generate);
|
---|
164 | north.add( 4,2, options);
|
---|
165 | north.add( 4,3, stop);
|
---|
166 |
|
---|
167 | north.add( 0,0, BOTTOM, new Label("Lexical specification:"));
|
---|
168 | north.add( 0,1, 2,1, spec);
|
---|
169 | north.add( 2,1, specChoose);
|
---|
170 |
|
---|
171 | north.add( 0,2, BOTTOM, new Label("Output directory:"));
|
---|
172 | north.add( 0,3, 2,1, dir);
|
---|
173 | north.add( 2,3, dirChoose);
|
---|
174 |
|
---|
175 | Panel center = new Panel(new BorderLayout());
|
---|
176 | center.add("North", new Label("Messages:"));
|
---|
177 | center.add("Center", messages);
|
---|
178 |
|
---|
179 | add("North", north);
|
---|
180 | add("Center", center);
|
---|
181 |
|
---|
182 | setEnabledAll(false);
|
---|
183 | }
|
---|
184 |
|
---|
185 | protected void showOptions() {
|
---|
186 | if (dialog == null) {
|
---|
187 | dialog = new OptionsDialog(this);
|
---|
188 | }
|
---|
189 | dialog.show();
|
---|
190 | }
|
---|
191 |
|
---|
192 |
|
---|
193 | public Dimension getPreferredSize() {
|
---|
194 | Dimension d = super.getPreferredSize();
|
---|
195 | d.width = messages.getPreferredSize().width;
|
---|
196 | return d;
|
---|
197 | }
|
---|
198 |
|
---|
199 | private void setEnabledAll(boolean generating) {
|
---|
200 | stop.setEnabled( generating );
|
---|
201 | quit.setEnabled( !generating );
|
---|
202 | generate.setEnabled( !generating );
|
---|
203 | dirChoose.setEnabled( !generating );
|
---|
204 | dir.setEnabled( !generating );
|
---|
205 | specChoose.setEnabled( !generating );
|
---|
206 | spec.setEnabled( !generating );
|
---|
207 | }
|
---|
208 |
|
---|
209 | private void generate() {
|
---|
210 | // workaround for a weird AWT bug
|
---|
211 | if (choosing) return;
|
---|
212 |
|
---|
213 | setEnabledAll(true);
|
---|
214 |
|
---|
215 | thread = new GeneratorThread(this, fileName, dirName);
|
---|
216 | thread.start();
|
---|
217 | }
|
---|
218 |
|
---|
219 | public void generationFinished(boolean success) {
|
---|
220 | setEnabledAll(false);
|
---|
221 |
|
---|
222 | if (success)
|
---|
223 | messages.append(Out.NL+"Generation finished successfully."+Out.NL);
|
---|
224 | else
|
---|
225 | messages.append(Out.NL+"Generation aborted."+Out.NL);
|
---|
226 | }
|
---|
227 |
|
---|
228 | private void stop() {
|
---|
229 | if (thread != null) {
|
---|
230 | /* stop ok here despite deprecation (?)
|
---|
231 | I don't know any good way to abort generation without changing the
|
---|
232 | generator code */
|
---|
233 | thread.stop();
|
---|
234 | thread = null;
|
---|
235 | }
|
---|
236 | generationFinished(false);
|
---|
237 | }
|
---|
238 |
|
---|
239 | private void quit() {
|
---|
240 | setVisible(false);
|
---|
241 | System.exit(0);
|
---|
242 | }
|
---|
243 |
|
---|
244 | private void dirChoose() {
|
---|
245 | choosing = true;
|
---|
246 |
|
---|
247 | FileDialog d = new FileDialog(this, "Choose directory", FileDialog.LOAD);
|
---|
248 |
|
---|
249 | d.show();
|
---|
250 |
|
---|
251 | if (d.getDirectory() != null) {
|
---|
252 | dir.setText( (new File(d.getDirectory())).getAbsolutePath() );
|
---|
253 | }
|
---|
254 |
|
---|
255 | choosing = false;
|
---|
256 | }
|
---|
257 |
|
---|
258 | private void specChoose() {
|
---|
259 | choosing = true;
|
---|
260 |
|
---|
261 | FileDialog d = new FileDialog(this, "Choose file", FileDialog.LOAD);
|
---|
262 |
|
---|
263 | d.setFile("*.flex");
|
---|
264 | d.show();
|
---|
265 |
|
---|
266 | if (d.getFile() != null) {
|
---|
267 | fileName = d.getDirectory()+d.getFile();
|
---|
268 | dir.setText(d.getDirectory());
|
---|
269 | spec.setText(fileName);
|
---|
270 | }
|
---|
271 |
|
---|
272 | choosing = false;
|
---|
273 | }
|
---|
274 |
|
---|
275 | }
|
---|