package tc.catseye.whothm;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.concurrent.SynchronousQueue;
import javax.swing.*;
public class ContentPane extends JPanel {
private BitMap bitmap;
private JMenuBar menuBar;
private Canvas canvas;
private JLabel statusBar;
private JTextArea progBox;
public ContentPane() {
super(new BorderLayout());
bitmap = new BitMap();
// Construct stuff in inner -> outer order
canvas = new Canvas(bitmap);
canvas.setBackground(Color.yellow);
canvas.setMinimumSize(new Dimension(100, 50));
JScrollPane canvasScrollPane = new JScrollPane(canvas);
progBox = new JTextArea();
progBox.setText(
"r := (0, 0, 1, 2);\n" +
"s := (0, 0, 1, 2);\n" +
"XOR := TF/FT;\n\n" +
"begin\n" +
"r.x += r.w;\n" +
"r.x += -1;\n" +
"r.w += 1;\n" +
"r.h += 1;\n" +
"draw r, XOR;\n" +
"s.x += s.w;\n" +
"s.x += -1;\n" +
"s.w += 1;\n" +
"s.h += 2;\n" +
"draw s, XOR;\n" +
"end"
);
progBox.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent event) {
}
public void keyPressed(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.VK_PAGE_UP) {
bitmap.alterPixelSize(-1);
canvas.resize();
event.consume();
} else if (event.getKeyCode() == KeyEvent.VK_PAGE_DOWN) {
bitmap.alterPixelSize(+1);
canvas.resize();
event.consume();
}
}
public void keyReleased(KeyEvent event) { }
});
JScrollPane progScrollPane = new JScrollPane(progBox);
JButton buttonRun = new JButton("Run");
buttonRun.setMnemonic(KeyEvent.VK_R);
buttonRun.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String program = progBox.getText();
statusBar.setText("Parsing...");
canvas.repaint();
Parser p = new Parser(program);
try {
Machine m = p.parse();
statusBar.setText("Drawing...");
canvas.repaint();
bitmap.clear();
m.run(bitmap);
statusBar.setText("Ready.");
progBox.grabFocus();
} catch (ParseException pe) {
System.out.println("Parse exception!");
pe.printStackTrace();
statusBar.setText(pe.asString());
}
canvas.repaint();
}
});
buttonRun.setToolTipText("Run the program entered above " +
"and display the drawing on the canvas " +
"to the right.");
JPanel progPanel = new JPanel(new BorderLayout());
progPanel.setMinimumSize(new Dimension(100, 50));
progPanel.add(progScrollPane, BorderLayout.CENTER);
progPanel.add(buttonRun, BorderLayout.PAGE_END);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
progPanel, canvasScrollPane);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(150);
statusBar = new JLabel("Ready.");
this.setPreferredSize(new Dimension(640, 400));
this.add(splitPane, BorderLayout.CENTER);
this.add(statusBar, BorderLayout.PAGE_END);
this.setOpaque(true);
canvas.resize();
}
}