import java.awt.*;
  import java.applet.Applet;

 
  /*------------------------------------------------------*/
  /*             SUMBEVARENDE AFRUNDING                   */
  /*                                                      */
  /*  Programmet demonstrerer addition med sumbevarende   */
  /*  afrunding. Man kan selv vælge antallet af decimaler */
  /*  hvormed de afrundede resultater trykkes. For hvert  */
  /*  nyt indtastet tal trykkes henholdsvis den afrundede */
  /*  værdi efter 5-reglen og den afrundede værdi efter   */
  /*  sumbevaringsreglen.                                 */
  /*                                                      */
  /*  H.B.Hansen, februar 1998, revideret juni 1999       */
  /*------------------------------------------------------*/
 
 
  public class Sumdemo extends Applet
  {
    Panel P1,P2,P3;           //Paneler til bl.a. indtastning af data
    Label promt,decimaler;    //Ledetekster
    TextField input,deci;     //Indtastningsfelter
    TextArea output;          //Resultatarray
    Button again;             //Ny beregning
    Button done;              //Slutknap
    int dec;                  //Antal decimaler
 
    StringBuffer table;       //Output af hele beregningen
 
    //Her skabes et beregningsobjekt.
    Sumbevar c = new Sumbevar();
 
    //  Denne procedure kaldes ved hver ny beregnings begyndelse.
    private void initialize()
    {
       table = new StringBuffer("Indtastet    5-regel  sumbevar\n");
       c.initialize();
    }
 
 
    /*---------------------------------------------------*/
    /*          KONVERTERING TIL TRYKFORMAT              */
    /*                                                   */
    /*  x konverteres til et trykbart format. Width er   */
    /*  antal anslag i trykkefeltet og dec er antal      */
    /*  decimaler. Cifrene i x anbringes højrestillet i  */
    /*  trykkefeltet med foranstillede mellemrum. Hvis   */
    /*  der er for mange cifre til at trykningen kan     */
    /*  gennemføres, bliver der trykt width stjerner.    */
    /*---------------------------------------------------*/
 
    private String toString(double x,int width,int dec)
    {
      int tipot = 1,i,size;
      String s1,s4;
      for (i = 1; i <= dec; i++) tipot *= 10;
      //s1 er et HELT tal som String
      s1 = Integer.toString((int)Math.floor(x*tipot + 0.5));
      s1.trim();
      if (dec 0)     //Der trykkes kun decimaltegn hvis dec 0
      {
        size = s1.length();
        String s2 = s1.substring(0,size-dec);       //s2 er heltalsdelen af s1
        String s3 = s1.substring(size-dec,size);    //og s3 er decimalerne
        s4 = s2.concat(new String(".").concat(s3)); //Punktummet proppes ind
      } else s4 = s1;
      size = s4.length();
      StringBuffer buf = new StringBuffer();  //Buffer til foranstillede mellemrum
      if (size <= width)   //Der skal være plads til hele tallet
      {
         for (i = 1; i <= width-size; i++) buf.append(" ");
         return new String(buf).concat(s4);
       }
       //Hvis der ikke er plads returneres lutter stjerner
       for (i = 1; i <= width; i++) buf.append("*");
       return new String(buf);
     }
 
 
     /*------------------------------------------------------*/
     /*                START PÅ EN TABELLINIE                */
     /*                                                      */
     /* Hjælpeprocedure til at indlede en outputlinie. Proce-*/
     /* duren returnerer en String bestående af parameteren  */
     /* efterfulgt af så mange punktummer, at længden bliver */
     /* ialt 10 tegn, efterfulgt af kolon.                   */
     /*------------------------------------------------------*/
 
     private String intro(String s)
     {
       int size = s.length();
       StringBuffer buf = new StringBuffer(s);
       for (int i = 10; i size; i--) buf.append('.');
       return new String(buf.append(':'));
     }
 
 
 
     /*--------------------------------------------------*/
     /*             SELVE BEREGNINGSALGORITMEN           */
     /*                                                  */
     /* Parameteren s er det sidste indtastede tal som en*/
     /* String. Der udføres summation efter 5-reglen og  */
     /* med sumbevarende afrunding. De afrundede størrel-*/
     /* ser appendes til den globale textbuffer table, og*/
     /* de beregnede summer konkateneres til table. Pro- */
     /* ceduren returnerer den nye tabel som en String.  */
     /*--------------------------------------------------*/
 
     public String makeOutput(String s)
     {
       c.makeSums(s,dec);
       table.append(intro(s) + toString(c.tastetTal(),dec+5,dec));
       table.append(toString(c.sumbevTal(),dec+8,dec) + '\n');
       //De endelige summer hæftes på
       return new String(table).concat(intro("Sum") +
         toString(c.femregelSum(),dec+5,dec) +
         toString(c.sumbevSum(),dec+8,dec) + '\n');
     }
 
 
    // Og her kommer så de almindelige stumper i et Javaprogram
 
     public void init()
     {
       setFont(new Font("Courier",Font.PLAIN,12));
       P1 = new Panel();
       P2 = new Panel();
       decimaler = new Label("Antal decimaler:");
       deci = new TextField(2);
       P1.setLayout(new FlowLayout(FlowLayout.LEFT,0,10));
       P1.setBackground(Color.gray);
       P1.add(decimaler);
       P1.add(deci);
       promt = new Label("Tast et tal:");
       input = new TextField(7);
       input.setEditable(false); //Jeg vil have decimalerne først
       P2.setLayout(new FlowLayout(FlowLayout.LEFT,0,10));
       P2.setBackground(Color.red);
       P2.add(promt);
       P2.add(input);
       output = new TextArea(40,20);
       output.setBackground(Color.green);
       P3 = new Panel();
       again = new Button("Ny beregning");
       done = new Button("Exit");
       P3.setLayout(new FlowLayout(FlowLayout.LEFT,0,10));
       P3.add(again);
       P3.add(done);
       setLayout(new BorderLayout());
       add("North",P1);
       add("West",P2);
       add("Center",output);
       add("South",P3);
       initialize();
     }
 
 
     public boolean action(Event e,Object o)
     {
        if (e.target == deci)
        {
           dec = Integer.parseInt((String)e.arg);
           deci.setEditable(false);  //Man må ikke ændre antal decimaler
           input.setEditable(true);  //Der åbnes for indtastning af tal
           return true;
        }
        if (e.target == input)
        {
           output.setText(makeOutput(input.getText()));
           input.setText("");
           return true;
        }
        if (e.target == again)
        {
           input.setEditable(false);
           deci.setEditable(true);
           deci.setText("");
           output.setText("");
           initialize();
           return true;
        }
        if (e.target == done)
        {
           input.setEditable(false);
           output.setText("Farvel og tak!");
           System.exit(0);
           return true;
        }
        return false;
     }
  }