Debianization.
[anag] / AnagGUI.java
1 /* -*-java-*-
2 *
3 * $Id: AnagGUI.java,v 1.6 2003/11/29 23:38:37 mdw Exp $
4 *
5 * Front-end GUI
6 *
7 * (c) 2001 Mark Wooding
8 */
9
10 /*----- Licensing notice --------------------------------------------------*
11 *
12 * This file is part of Anag: a simple wordgame helper.
13 *
14 * Anag is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * Anag is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with Anag; if not, write to the Free Software Foundation,
26 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 */
28
29 /*----- Revision history --------------------------------------------------*
30 *
31 * $Log: AnagGUI.java,v $
32 * Revision 1.6 2003/11/29 23:38:37 mdw
33 * Debianization.
34 *
35 * Revision 1.5 2002/08/11 12:58:09 mdw
36 * Added support for regular expression matching, if supported by the C
37 * library.
38 *
39 * Revision 1.4 2001/02/19 19:19:11 mdw
40 * Add `help' button. Lowercase input to the command.
41 *
42 * Revision 1.3 2001/02/16 21:46:10 mdw
43 * Use a BufferedReader, not a LineNumberReader.
44 *
45 * Revision 1.2 2001/02/07 09:10:04 mdw
46 * Add a settings panel (currently only allows the wordlist to be
47 * changed). Move the buttons down the right-hand side of the list. Add a
48 * `Run' button which passes arguments through directly.
49 *
50 * Revision 1.1 2001/02/04 19:53:07 mdw
51 * Simple GUI front-end in Java.
52 *
53 */
54
55 /*----- Imports -----------------------------------------------------------*/
56
57 import java.lang.*;
58 import java.util.*;
59 import java.io.*;
60 import java.awt.*;
61 import java.applet.*;
62 import java.awt.event.*;
63
64 /*----- Main code ---------------------------------------------------------*/
65
66 class Whinge extends Frame {
67 public Whinge(String gripe) {
68 super("Error from AnagGUI");
69 setLayout(new GridBagLayout());
70 GridBagConstraints g = new GridBagConstraints();
71
72 addWindowListener(new WindowAdapter() {
73 public void windowClosing(WindowEvent e) { dispose(); }
74 });
75
76 g.gridx = g.gridy = GridBagConstraints.RELATIVE;
77 g.gridwidth = GridBagConstraints.REMAINDER; g.gridheight = 1;
78 g.weightx = g.weighty = 1;
79 g.insets = new Insets(24, 24, 24, 24);
80 add(new Label(gripe), g);
81
82 Button b = new Button("Bummer");
83 b.addActionListener(new ActionListener() {
84 public void actionPerformed(ActionEvent e) { dispose(); }
85 });
86 g.weighty = 0;
87 g.insets.top = 0; g.insets.bottom = 24;
88 add(b, g);
89 pack();
90 show();
91 }
92 };
93
94 class AnagPanel extends Panel {
95 TextField word;
96 java.awt.List list;
97 String file;
98 Settings sb;
99
100 class Settings extends Frame {
101 TextField name;
102
103 public Settings() {
104 super("AnagGUI settings");
105 Button b;
106 GridBagConstraints g = new GridBagConstraints();
107 this.setLayout(new GridBagLayout());
108 this.addWindowListener(new WindowAdapter() {
109 public void windowClosing(WindowEvent e) { dispose(); sb = null; }
110 });
111 g.gridx = g.gridy = GridBagConstraints.RELATIVE;
112 g.gridheight = 1;
113 g.weighty = 0;
114 g.fill = GridBagConstraints.NONE;
115 g.gridwidth = 1; g.weightx = 0;
116 g.insets = new Insets(8, 8, 8, 8);
117 this.add(new Label("Word list"), g);
118 g.fill = GridBagConstraints.HORIZONTAL;
119 g.gridwidth = GridBagConstraints.REMAINDER; g.weightx = 1;
120 g.insets.left = 0;
121 name = new TextField(20);
122 name.setText(file);
123 this.add(name, g);
124 g.insets.left = 8; g.insets.top = 0; g.gridwidth = 1;
125 g.weightx = 0; this.add(new Panel(), g);
126 g.weightx = 1; this.add(new Panel(), g);
127 g.weightx = 0;
128 g.insets.left = 0;
129 b = new Button("Cancel");
130 b.addActionListener(new ActionListener() {
131 public void actionPerformed(ActionEvent e) { dispose(); sb = null; }
132 });
133 this.add(b, g);
134 b = new Button("OK");
135 b.addActionListener(new ActionListener() {
136 public void actionPerformed(ActionEvent e) {
137 file = name.getText(); dispose(); sb = null;
138 }
139 });
140 this.add(b, g);
141 this.pack();
142 this.show();
143 }
144 };
145
146 void splat(String gripe) { new Whinge(gripe); }
147 void settings() { if (sb != null) sb.toFront(); else sb = new Settings(); }
148
149 void listen(Process p) throws IOException {
150 BufferedReader fout =
151 new BufferedReader(new InputStreamReader(p.getInputStream()));
152 BufferedReader ferr =
153 new BufferedReader(new InputStreamReader(p.getErrorStream()));
154
155 String l;
156 Vector v = new Vector();
157 while ((l = fout.readLine()) != null)
158 v.addElement(l);
159 StringBuffer d = new StringBuffer();
160 while ((l = ferr.readLine()) != null)
161 d.append(l).append("\n");
162 l = d.toString();
163 if (l.length() > 0)
164 splat(l);
165 else {
166 list.removeAll();
167 int i;
168 String[] vv = new String[v.size()];
169 v.copyInto(vv);
170 for (i = 0; i < vv.length; i++)
171 list.add(vv[i]);
172 }
173 }
174
175 void run() {
176 try {
177 StringBuffer b = new StringBuffer();
178 b.append("anag -file ")
179 .append(file)
180 .append(" ")
181 .append(word.getText());
182 Process p = Runtime.getRuntime().exec(b.toString());
183 listen(p);
184 } catch (IOException e) {
185 splat(e.toString());
186 }
187 }
188
189 void help() {
190 try {
191 Process p = Runtime.getRuntime().exec("anag --help");
192 listen(p);
193 } catch (IOException e) {
194 splat(e.toString());
195 }
196 }
197
198 void getlist(String tag) {
199 try {
200 Vector v = new Vector();
201 String[] vv;
202 v.addElement("anag");
203 v.addElement("-file");
204 v.addElement(file);
205 v.addElement(tag);
206 v.addElement(word.getText().toLowerCase());
207 vv = new String[v.size()];
208 v.copyInto(vv);
209 Process p = Runtime.getRuntime().exec(vv);
210 listen(p);
211 } catch (IOException e) {
212 splat(e.toString());
213 }
214 }
215
216 public AnagPanel() {
217 super();
218 setLayout(new GridBagLayout());
219 GridBagConstraints g = new GridBagConstraints();
220 Button b;
221
222 file = System.getProperty("anag.dictionary", "/usr/dict/words");
223 sb = null;
224
225 g.gridx = g.gridy = GridBagConstraints.RELATIVE;
226 g.gridwidth = GridBagConstraints.REMAINDER; g.gridheight = 1;
227 g.weightx = 1; g.weighty = 0;
228
229 word = new TextField(20);
230 g.fill = GridBagConstraints.HORIZONTAL;
231 g.insets = new Insets(8, 8, 8, 8);
232 add(word, g);
233
234 list = new java.awt.List(20);
235 g.fill = GridBagConstraints.BOTH;
236 g.insets.top = 0;
237 g.gridwidth = 1; g.gridheight = GridBagConstraints.REMAINDER;
238 g.weightx = g.weighty = 1;
239 add(list, g);
240
241 g.fill = GridBagConstraints.BOTH;
242 g.weightx = 0; g.weighty = 1;
243 g.insets.left = 0;
244 g.gridheight = 1; g.gridwidth = GridBagConstraints.REMAINDER;
245 add(new Panel(), g);
246
247 g.fill = GridBagConstraints.HORIZONTAL;
248 g.weighty = 0;
249
250 b = new Button("Anagram");
251 b.addActionListener(new ActionListener() {
252 public void actionPerformed(ActionEvent e) { getlist("-anagram"); }
253 });
254 add(b, g);
255
256 b = new Button("Subgram");
257 b.addActionListener(new ActionListener() {
258 public void actionPerformed(ActionEvent e) { getlist("-subgram"); }
259 });
260 add(b, g);
261
262 b = new Button("Wildcard");
263 b.addActionListener(new ActionListener() {
264 public void actionPerformed(ActionEvent e) { getlist("-wildcard"); }
265 });
266 add(b, g);
267
268 b = new Button("Regular expression");
269 b.addActionListener(new ActionListener() {
270 public void actionPerformed(ActionEvent e) { getlist("-regexp"); }
271 });
272 add(b, g);
273
274 b = new Button("Perl regexp");
275 b.addActionListener(new ActionListener() {
276 public void actionPerformed(ActionEvent e) { getlist("-pcre"); }
277 });
278 add(b, g);
279
280 b = new Button("Monoalphabetic");
281 b.addActionListener(new ActionListener() {
282 public void actionPerformed(ActionEvent e) { getlist("-mono"); }
283 });
284 add(b, g);
285
286 b = new Button("Trackword");
287 b.addActionListener(new ActionListener() {
288 public void actionPerformed(ActionEvent e) { getlist("-trackword"); }
289 });
290 add(b, g);
291
292 b = new Button("Run");
293 b.addActionListener(new ActionListener() {
294 public void actionPerformed(ActionEvent e) { run(); }
295 });
296 add(b, g);
297
298 b = new Button("Help!");
299 b.addActionListener(new ActionListener() {
300 public void actionPerformed(ActionEvent e) { help(); }
301 });
302 add(b, g);
303
304 b = new Button("Settings...");
305 b.addActionListener(new ActionListener() {
306 public void actionPerformed(ActionEvent e) { settings(); }
307 });
308 add(b, g);
309 }
310 };
311
312 /*----- Program or applet -------------------------------------------------*/
313
314 public class AnagGUI extends Applet {
315 public static void main(String[] argv) {
316 Frame f = new Frame("Anagram solver");
317 f.addWindowListener(new WindowAdapter() {
318 public void windowClosing(WindowEvent e) { System.exit(0); }
319 });
320 AnagPanel p = new AnagPanel();
321 f.add(p);
322 f.pack();
323 f.show();
324 }
325 public AnagGUI() { super(); setLayout(new BorderLayout()); }
326 public void init() { /*add(new AnagPanel());*/ main(null); }
327 public void destroy() { /*removeAll();*/ }
328 };
329
330 /*----- That's all, folks -------------------------------------------------*/