package tmcm.xTuringMachine;
import java.awt.*;

class RuleTable extends Panel {

   Scrollbar scroll;
   RuleCanvas canvas;
   
   MachineData data;
   MachinePanel owner;
   
   RuleTable(MachinePanel owner) {
      setLayout(new BorderLayout());
      scroll = new Scrollbar(Scrollbar.VERTICAL);
      add("East",scroll);
      canvas = new RuleCanvas(this);
      add("Center",canvas);
      this.owner = owner;
   }
      
   void setMachineData(MachineData data) {
      this.data = data;
      int ct = (data == null)? 0 : data.getRuleCount();
      canvas.topRule = 0;
      if (data == null || canvas.visibleRules >= ct) {
          scroll.disable();
          scroll.setValues(0,1,0,1);
      }
      else {
          scroll.setValues(0,canvas.visibleRules,0,ct);
          scroll.enable();
      }
      canvas.selectedRule = -1;
      owner.deleteRuleButton.disable();
      canvas.repaint(2,canvas.lineHeight+4,canvas.width-4,canvas.height-canvas.lineHeight-6);       
   }
   
   void doDeleteRule() {
      if (canvas.selectedRule < 0 || data == null)
         return;
      Rule rule = data.getRule(canvas.selectedRule);
      data.deleteRule(rule.state,rule.symbol);
      if (rule.state == owner.ruleMaker.state && rule.symbol == owner.ruleMaker.symbol)
         owner.makeButton.setLabel("Make Rule");
      canvas.selectedRule = -1;
      canvas.resetScroll();
      owner.deleteRuleButton.disable();
      owner.dropFocus(MachinePanel.RULETABLEFOCUS);
   }
   
   void ruleAdded(int state, char symbol) {   
      int index = data.findRule(state,symbol);
      canvas.selectedRule = index;
      canvas.selectedColumn = 0;
      owner.deleteRuleButton.enable();
      canvas.resetScroll();
   }
   
   void ruleChanged(int state, char symbol) {
      int index = data.findRule(state,symbol);
      if (index == canvas.selectedRule)
         canvas.selectedRule = -1;  // this will force canvas.select to repaint
      canvas.select(index,0);
   }

   public boolean handleEvent(Event evt) {
      if (evt.id == Event.SCROLL_LINE_DOWN || evt.id == Event.SCROLL_LINE_UP || 
          evt.id == Event.SCROLL_PAGE_DOWN || evt.id == Event.SCROLL_PAGE_UP || 
          evt.id == Event.SCROLL_ABSOLUTE) {
         owner.dropFocus(MachinePanel.RULETABLEFOCUS);
         canvas.setStart();
         return true;
      }
      return super.handleEvent(evt);
   }
      

}


