source: other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/MainFrame.java@ 25584

Last change on this file since 25584 was 25584, checked in by davidb, 12 years ago

Initial cut an a text edit area for GLI that supports color syntax highlighting

File size: 7.3 KB
Line 
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
21package JFlex.gui;
22
23import JFlex.Main;
24import JFlex.Out;
25
26import java.io.File;
27import java.awt.*;
28import 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 */
36final 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}
Note: See TracBrowser for help on using the repository browser.