// Body-Mass-Index mit grafischer Anzeige des Wertes
//
// Copyleft: GNU-Public License Version 2 oder höher (http://www.gnu.org)
//
// Empfohlene Applet Grösse 200*360 (ist jedoch dynamisch (FlowLayout.LEFT))

import java.awt.*;
import java.applet.*;
import java.awt.event.*; // wieso wird dies nicht durch import java.awt.*; eingebunden?

public class bmi extends Applet implements ActionListener
{
 double bmi = 0;
 Label titel = new Label("Body-Mass-Index");
 Label gewicht_text = new Label("Körpergewicht in kg:");
 TextField gewicht = new TextField(5); // ? für was eine 5 wenn trotzdem eine längere eingabe möglich ist!!!
 Label groesse_text = new Label("Körpergrösse in cm:");
 TextField groesse = new TextField(5);
 Button berechnen = new Button("BMI berechnen");
 Label ausgabe_text = new Label("                                                  ");
 Label ausgabe_zahl = new Label("                                                  ");
 Canvas ausgabe_grafisch = new Canvas();
   
 public void init()
  {
   setBackground(Color.lightGray);
   //Panel panel = new Panel( set Layout( new GridLayout(8,1)) );
   setLayout( new FlowLayout(FlowLayout.LEFT) ); // anzahl zeilen und spalten in die dann die elemente eingefügt werden
   // schrift waehlen
   Font font_normal;
   font_normal = new Font ("Helvetica", Font.PLAIN, 12);
   setFont (font_normal);
   
   add(titel);
   add(gewicht_text);
   add(gewicht);
   add(groesse_text);
   add(groesse);
   //berechnen.setSize(200,50);
   berechnen.addActionListener(this);
   add(berechnen);
   add(ausgabe_text);
   add(ausgabe_zahl);
   ausgabe_grafisch = new Canvas();
   add(ausgabe_grafisch);
   //
   //ausgabe_grafisch.setSize(100,50);
   // titel grösser
   Font font_titel;
   font_titel = new Font ("Helvetica", Font.BOLD, 16);
   titel.setFont (font_titel);
  }
 
 public void actionPerformed(ActionEvent event) // wird beim drücken einer Schaltfläche ausgelöst
  {
   
   if (event.getSource() == berechnen)
    {
     try
      {
       double gewicht_zahl = Double.parseDouble(gewicht.getText());
       double groesse_zahl = Double.parseDouble(groesse.getText());
       bmi = gewicht_zahl/Math.pow((groesse_zahl/100),2);
       ausgabe_zahl.setText("BMI: "+bmi);
       
       // unter 18.5 Untergewicht
       // 18.5 bis 25 Normalgewicht
       // 25 bis 30 Übergwicht
       // über 30 starkes Übergewicht

       // da switch nicht mit double geht: fuck
       if(bmi<18.5)
        {
         ausgabe_text.setText("Untergewicht!");
        }
       else
        {
         if(bmi<=25)
          {
           ausgabe_text.setText("Normalgewicht");
          }
         else
          {
           if(bmi<=30)
            {
             ausgabe_text.setText("Übergewicht!");
            }
           else
            {
             ausgabe_text.setText("starkes Übergewicht!!!");
            }
          }
        }
      }
     catch (Exception e)
      {
       ausgabe_text.setText("Bitte korrekte Werte eingeben.");
       ausgabe_zahl.setText("");
      }
    }
        
   repaint(); // neuzeichnen
    
  } // Ende actionPerformed

 public void paint(Graphics g)
  {
   // Hole Canvasausmaße
   Dimension s = size();
   // Lösche Fenster und male Rahmen
   g.clearRect(0,0,s.width,s.height);
   // koordinatensystem verschieben (ausgabe ist letztes element)
   g.translate(titel.getX(),(ausgabe_zahl.getY()+ausgabe_zahl.getSize().height));
   // höhe ausgeben
   // unter 18.5 Untergewicht
   // 18.5 bis 25 Normalgewicht
   // 25 bis 30 Übergwicht
   // über 30 starkes Übergewicht
   int breite = s.width-titel.getX()*2;
   // balken der breite 30 also von 10 bis 40 bmi
   int p1 = (int) (breite/30.0*(18.5-10)+0.5);
   int p2 = (int) (breite/30.0*(25-10)+0.5);
   int p3 = (int) (breite/30.0*(30-10)+0.5);
   g.drawString("10", 0-5, 65);
   g.drawString("18.5", p1-5, 65);
   g.drawString("25", p2-5, 65);
   g.drawString("30", p3-5, 65);
   g.drawString("40", breite-10, 65);
   //setBackground(Color.white);
   g.setColor(Color.red);
   g.fillRect(0,10,p1,40);
   g.setColor(Color.green);
   g.fillRect(p1,10,(p2-p1),40);
   g.setColor(Color.red);
   g.fillRect(p2,10,(p3-p2),40);
   g.setColor(Color.red.darker());
   g.fillRect(p3,10,(breite-p3),40);
   g.setColor(Color.black);
   // zeiger nur zeichen falls innerhalb des bereichs
   if ((bmi>=10) && (bmi<=40))
    {
     int p_bmi = (int) (breite/30.0*(bmi-10)+0.5);
     int[][] koordinaten = {{p_bmi, (p_bmi-5), p_bmi+5},{10, 5, 5}};
     g.fillPolygon(koordinaten[0], koordinaten[1], koordinaten[0].length);
     g.drawLine(p_bmi,10,p_bmi,49);
    }
  }  // Ende paint
    
}