/**  file: Comune: parte per mie finestre e bottoni ecc.. */

import java.awt.*;

/** ================
      Mia Finestra
    ================ */
class myFrame extends Frame {

  public myFrame (String s) { super(s); }

  public boolean handleEvent (Event evt) {
    if (evt.id == Event.WINDOW_DESTROY) {
      dispose();
      return true;
    }
    return super.handleEvent(evt);
  }
} //myFrame

/** ===============
      Mio Bottone
    =============== */
class myButton extends Button {
  protected String OpS;  // operazione da fare (aggiungere in stringa)
  protected char   FunC; // tipo: funzione "f" o valutazione "v"
  
  public myButton () {
    this ("?", "?", 'f');
  }
  public myButton (String Nome, String Oper, char fv) {
    super (Nome);
    OpS=Oper;
    FunC=fv;
    Color Col;
    if (fv == 'f') {
      if (Nome.length() > 1)
        Col = (Color.white).darker(); 
      else
        try {
          Integer NN = new Integer(Nome);
          Col = Color.green;
        } catch (Exception e)
            { if ((Oper.compareTo("+") == 0) ||
                  (Oper.compareTo("-") == 0) ||
                  (Oper.compareTo("*") == 0) ||
                  (Oper.compareTo("/") == 0))
                Col = (Color.green).darker();
              else
                if ((Oper.compareTo("(") == 0) ||
                    (Oper.compareTo(")") == 0) ||
                    (Oper.compareTo(".") == 0) ||
                    (Oper.compareTo(" ") == 0))
                  Col = Color.lightGray; 
                else
                  Col = (Color.magenta).brighter(); 
            }
    }
    else
      Col = Color.white;          
    setBackground (Col);
    setForeground (Color.black);
    setFont (new Font("Helvetica", Font.BOLD, 20));
  }

  public void DefBottone (String Nome, String Oper, char fv) {
    super.setLabel (Nome);
    OpS=Oper;
    FunC=fv;
  }
  
  public String toString() {
    return super.toString()+"[myop:"+OpS+" myf:"+FunC+"]";
  }
  
  public String Oper ()    { return OpS;        }
  public char   TipoFun () { return FunC;       }
  public String Nome ()    { return getLabel(); }
} //myButton

/** ==================
      Segnala Errore
    ================== */
class myErrDialog extends Dialog {  //Non usato

  public myErrDialog (Frame Genitore, String Mess) {
    super (Genitore, "!!! ERRORE !!!", true);   // NB: e' modale!
    add (new Label(Mess));
    add (new Button ("OK"));
 }

  public boolean handleEvent (Event evt) {
    if ((evt.id == Event.WINDOW_DESTROY) ||
        (evt.target instanceof myButton)) {
          dispose();
          return true;
    }
    return super.handleEvent(evt);
  }
} //myErrDialog

/** ==========================
      Mio Display per Albero
    ========================== */
class myDispPerAlbero extends Canvas {
  protected VisitorDisegnaAlbero DisVis = null; //Visitor per DISEGNARE l'albero
  protected Exp                  MyExp;
  protected TextArea             MsgOut;
  protected boolean              PrimaVolta;
  protected Image                MiaImage;
  protected Graphics             MioGraph;
    
  public myDispPerAlbero (Exp Espress, TextArea AreaMsg) {
    super();
    PrimaVolta=true;
    MyExp = Espress;
    MsgOut= AreaMsg;
  }
   
  public void paint (Graphics g) {
    super.paint (g);
    if (PrimaVolta) {
      MiaImage=createImage (600,400);  // creo immagine "fuori schermo"
      MioGraph=MiaImage.getGraphics();
      DisVis = new VisitorDisegnaAlbero (MioGraph, 30,20, MsgOut);
      try {
        MyExp.accept (DisVis);         // ACCETTA I VISITOR
      } catch (Exception e)
          { MsgOut.appendText ("!!! ERRORE !!!   "+ e +"\n"); }
      PrimaVolta=false;
    }
    // in ogni caso, stampa immagine su oggetto "g"!
    g.drawImage (MiaImage, 0,0, this);
  }

  public int RendiMaxX() { if (DisVis != null) return DisVis.RendiMaxX();
                                          else return 400;
                         }
  public int RendiMaxY() { if (DisVis != null) return DisVis.RendiMaxY();
                                          else return 300;
                         }
}
//*FINE FILE*