import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class Principal {
private static List<String> wordList;
private static Random randomGenerator;
private static String version = "15-05-2012";
private String word;
private JFrame frm;
private JButton btnOrigText;
private JLabel lblOriginalText;
private JButton btnStart;
private JButton btnNext;
private JFormattedTextField txtUser;
static {
randomGenerator = new Random();
wordList = new ArrayList<String>();
BufferedReader wlf;
try {
if (new File("WordList.txt").exists()) {
wlf = new BufferedReader(new FileReader("WordList.txt"));
} else {
InputStreamReader in = new InputStreamReader(PlayChar.class
.getResourceAsStream("WordList.txt"));
wlf = new BufferedReader(in);
}
String strLine;
while ((strLine = wlf.readLine()) != null) {
strLine = strLine.trim();
if (!strLine.startsWith("#") && strLine.length() > 0){
wordList.add(strLine);
}
}
wlf.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public Principal() {
frm = new JFrame("Word spelling");
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JLabel label = new JLabel("Write the spelled word: ");
c.insets = new Insets(30, 0, 0, 0); // padding
c.gridx = 0;
c.gridy = 1;
panel.add(label, c);
txtUser = new JFormattedTextField();
txtUser.setColumns(20);
txtUser.setEnabled(false);
c.gridx = 1;
c.gridy = 1;
panel.add(txtUser, c);
btnOrigText = new JButton();
btnOrigText.setText("Show original word");
btnOrigText.setMnemonic('h');
btnOrigText.setEnabled(false);
btnOrigText.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!lblOriginalText.isVisible()) {
lblOriginalText.setText(word);
lblOriginalText.setVisible(true);
btnOrigText.setText("Hide original word");
} else {
lblOriginalText.setText("");
lblOriginalText.setVisible(false);
btnOrigText.setText("Show original word");
}
txtUser.requestFocus();
lblOriginalText.repaint();
btnOrigText.repaint();
}
});
c.insets = new Insets(10, 0, 0, 0); // padding
c.gridx = 0;
c.gridy = 2;
panel.add(btnOrigText, c);
lblOriginalText = new JLabel(" ");
c.gridx = 1;
c.gridy = 2;
lblOriginalText.setVisible(false);
panel.add(lblOriginalText, c);
btnStart = new JButton();
btnStart.setText("Start");
btnStart.setMnemonic('r');
btnStart.registerKeyboardAction(btnStart.getActionForKeyStroke(
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, false)),
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false),
JComponent.WHEN_FOCUSED);
btnStart.registerKeyboardAction(btnStart.getActionForKeyStroke(
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true)),
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),
JComponent.WHEN_FOCUSED);
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
btnStart.setText("Repeat");
btnStart.setEnabled(false);
btnNext.setEnabled(false);
btnOrigText.setEnabled(true);
if (!txtUser.isEnabled()){
txtUser.setEnabled(true);
}
txtUser.requestFocus();
btnStart.repaint();
btnNext.repaint();
new Thread(new Runnable() {
public void run() {
playWord(false);
}
}).start();
}
});
c.anchor = GridBagConstraints.LAST_LINE_END;
c.gridx = 0;
c.gridy = 3;
c.insets = new Insets(40, 0, 0, 0); // padding
panel.add(btnStart, c);
btnNext = new JButton();
btnNext.setText("Next");
btnNext.setEnabled(false);
btnNext.setMnemonic('N');
btnNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
btnStart.setEnabled(false);
btnNext.setEnabled(false);
lblOriginalText.setText("");
lblOriginalText.setVisible(false);
btnOrigText.setText("Show original word");
txtUser.setText("");
txtUser.repaint();
txtUser.requestFocus();
btnStart.repaint();
btnNext.repaint();
lblOriginalText.repaint();
btnOrigText.repaint();
new Thread(new Runnable() {
public void run() {
playWord(true);
}
}).start();
}
});
c.anchor = GridBagConstraints.LAST_LINE_START;
c.gridx = 1;
c.gridy = 3;
c.insets = new Insets(40, 10, 0, 0); // padding
panel.add(btnNext, c);
frm.getContentPane().add(panel, BorderLayout.CENTER);
final JLabel about = new JLabel();
about.setText("About ");
// about.setHorizontalTextPosition(JLabel.RIGHT);
about.setHorizontalAlignment(JLabel.RIGHT);
about.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent arg0) {
JOptionPane
.showMessageDialog(about,
"Version "+version
+"\nLicensed under GPL, sounds under CC sampling.\n"+
"Any questions, visit \nhttp://engspell.sourceforge.net/",
"About", JOptionPane.PLAIN_MESSAGE);
}
});
frm.getContentPane().add(about, BorderLayout.NORTH);
frm.pack();
frm.setSize(500, 300);
frm.setLocation(100, 200);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
private void playWord(boolean newWord) {
PlayChar clipPlayer = null;
try {
if (newWord || word == null) {
int randomInt = randomGenerator.nextInt(100);
word = wordList.get(randomInt % wordList.size());
System.out.println("Word selected: " + word);
}
for (char c : word.toCharArray()) {
if (Character.isLetter(c) || Character.isDigit(c)) {
String filename = "";
if (Character.isLetter(c) ){
filename = "sounds/" + Character.toUpperCase(c)
+ ".wav";
} else {
filename = "sounds/" +c + ".wav";
}
InputStream inputStream = Principal.class.getClassLoader()
.getResourceAsStream(filename);
BufferedInputStream bis = new BufferedInputStream(
inputStream);
clipPlayer = new PlayChar(bis);
clipPlayer.play();
}
Thread.sleep(600);
}
btnStart.setEnabled(true);
btnNext.setEnabled(true);
btnStart.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
/* System.setOut(new PrintStream(new BufferedOutputStream(
new FileOutputStream("stdout.txt"))));
System.setErr(new PrintStream(new BufferedOutputStream(
new FileOutputStream("stderr.txt"))));
*/
new Principal();
} catch (Exception e) {
e.printStackTrace();
}
}
}