Prover/ProofDisplay.pizza
changeset 96 907b1fff5637
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Prover/ProofDisplay.pizza	Thu Mar 15 10:07:28 2012 +0000
@@ -0,0 +1,106 @@
+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();  }
+  
+}
+
+