package G4ip;
import java.applet.*;
import java.awt.*;
import G4ip.Sequent.*;
import G4ip.Prover.*;
import G4ip.Parser.*;
/** The applet for the prover.
* @author Christian Urban
*/
public class ProverApplet extends Applet {
Prover prover;
Parser parser;
Button start;
Button clear;
Button next;
Button stop;
TextField lhs_text; // place for the program formulae
TextField rhs_text; // place for the goal formula
/** A field for various messages (e.g. error messages).
*/
public Label messages; // to be verbose
public void init() {
setLayout(new BorderLayout());
// NORTH
Panel textfields = new Panel();
add("North", textfields);
// the parameters LHS_size and RHS_size are given in the html-file
int LHS_size = Integer.parseInt(this.getParameter("LHS_size"));
int RHS_size = Integer.parseInt(this.getParameter("RHS_size"));
lhs_text = new TextField(LHS_size); // program textfield
rhs_text = new TextField(RHS_size); // goal textfield
Label separation = new Label("=>"); // for separation
if (LHS_size > 0) { // if someone prefears only single side sequents
textfields.add(lhs_text); }
textfields.add(separation);
textfields.add(rhs_text);
// CENTER
Panel buttonfield = new Panel();
add("Center", buttonfield);
start = new Button("Start");
clear = new Button("Clear");
next = new Button("Next");
stop = new Button("Stop");
switch_into_input_mode(); // start in input mode
buttonfield.add(start);
buttonfield.add(clear);
buttonfield.add(next);
buttonfield.add(stop);
// SOUTH
messages = new Label(""); // for any kind of message
messages.setAlignment(Label.CENTER);
add("South",messages);
}
/** When start is pressed;
* start and clear button are disabled;
* next and stop button are enabled.
*/
public void switch_into_prove_mode() {
start.disable(); next.enable();
clear.disable(); stop.enable();
repaint();
}
/** When start is pressed
* and (hopefully) when prover finishes.
*/
public void switch_into_input_mode() {
start.enable(); next.disable();
clear.enable(); stop.disable();
repaint();
}
/** Initiates the parse and prove process.
*/
void initiate_proving() {
Sequent sequ;
messages.setText("");
messages.repaint();
repaint();
Parser rhs_parser = new Parser(rhs_text.getText());
Parser lhs_parser = new Parser(lhs_text.getText());
try { // try to parse the input
sequ = new Sequent(lhs_parser.parseFormulae(),
rhs_parser.parseFormula());
}
catch (Exception exc) { // there was a parser exception
messages.setText(exc.getMessage());
messages.repaint();
repaint();
return; // in case there was an exception
} // don't run the following code
System.out.println(sequ.G.internalString());
switch_into_prove_mode();
prover = new Prover(sequ,this);
prover.start();
}
/** Forces the prover to dispose all open frames.
*/
public void destroy() {
if (prover != null && prover.isAlive()) {
prover.stop();
prover.finalize();
}
}
/** The actions for the buttons:
* this bit of code would be different in Java 1.1
*/
public boolean action(Event e, Object arg) {
// clear button has been pressed
if (e.target == clear) {
messages.setText("");
lhs_text.setText("");
rhs_text.setText("");
messages.repaint();
repaint();
}
// start button has been pressed
if (e.target == start) {
initiate_proving();
return true;
}
// stop button has been pressed
if (e.target == stop) {
switch_into_input_mode();
if (prover != null && prover.isAlive()) { prover.stop(); }
return true;
}
// next button has been pressed
if (e.target == next) {
if (prover != null && prover.isAlive()) { prover.resume();}
return true;
}
return false;
}
}