package G4ip;
import pizza.util.Hashtable;
import java.awt.*;
import G4ip.Form.*;
/** A label with a surrounding box.
*/
class MyLabel extends Label {
public MyLabel() { super(); }
public MyLabel(String s) { super(s); }
public void paint(Graphics g) {
Dimension d = this.size();
g.setColor(Color.gray);
g.drawRect(0,0,d.width-1,d.height-1);
}
}
/** Draws a frame on the screen containing a proof.
*/
public class ProofDisplay extends Frame {
Button ok;
Hashtable<int,Sequent> proof; // contains the indexed sequents
/** The proof is represented in the hashtable.
* @param proof is a hashtable; the structure of the proof (or tree)
* is mapped onto a sequence of integers; each integer is a key for
* a sequent stored in the hashtable.
*/
public ProofDisplay(Hashtable<int,Sequent> iproof) {
super("Proof");
ok = new Button("Close");
proof = iproof;
setLayout(new BorderLayout());
// SOUTH
Panel p = new Panel();
p.add(ok);
add("South",p);
//CENTER
Panel display = new Panel();
printproof(display,1);
add("Center", display);
pack();
show();
}
/** Recovers the structure of the proofs from the hashtable representation.
*/
public void printproof(Panel p,int index) {
MyLabel l = new MyLabel(proof.get(index).toString());
l.setAlignment(MyLabel.CENTER);
p.setLayout(new BorderLayout());
p.add("South",l);
// axiom (do nothing)
if ((proof.get(2*index) == null) && (proof.get(2*index+1) == null)) {
return;
}
// rule with a single premise
if ((proof.get(2*index) != null) && (proof.get(2*index+1) == null)) {
Panel np = new Panel();
printproof(np,2*index);
p.add("Center",np);
return;
}
// rule with two premises
if ((proof.get(2*index) != null) && (proof.get(2*index+1) != null)) {
Panel np1 = new Panel();
Panel np2 = new Panel();
printproof(np1,2*index);
printproof(np2,2*index+1);
p.add("West",np1);
p.add("East",np2);
return;
}
}
/** If either the "Close" or the "Window-destroy" button
* is pressed, then close the window.
*/
public boolean handleEvent(Event e) {
if (e.id == Event.ACTION_EVENT && e.target == ok) {
this.finalize();
return true;
}
if (e.id == Event.WINDOW_DESTROY) {
this.finalize();
return true;
}
return false;
}
/** Closes the window.
*/
public void finalize()
{ this.dispose(); }
}