
package com.hls.Diagramm;

import java.applet.Applet;
import java.awt.*;
import java.text.*;
//import java.awt.image.ImageObserver;
//import java.io.PrintStream;
//import java.util.Vector;

public class Diagramm extends Applet
    implements Runnable
{
    Thread Thread;

    int Decimals=2;
    int ValuesNum;

    double valtab[];
    String SLabel[];
    String valstr[];

    Color SColor[];
    double MaxValue;
    int VBase;
    double VSingle;

    int XOrigin;
    int YOrigin;

    Image DB_Image;

    Color BackColor= Color.gray;
    Color TextColor= Color.black;
    
    int LRectHeight;
    Font f;
    FontMetrics fm;
    int TitleHeight;
    String Title;
    String body;
    String [] Input;

   static NumberFormat fmt;
   public static String DoubleRetStringPlus(double y,int w,int d) {
      int i=w-d-1;

      if(fmt==null) {
         fmt=NumberFormat.getInstance();
         fmt.setMinimumIntegerDigits(1);
      }
      fmt.setMaximumIntegerDigits(30);
      fmt.setMaximumFractionDigits(d);
      fmt.setMinimumFractionDigits(d);
      String s=fmt.format(y);
      return s;
   }

    String getParameter(String s, String s1) {
        s = getParameter(s);
        if(s == null) {
            return s1;
        }    
        return s;
    }
           
    String[] getParameterList(String s, char c) {
        String s1 = s;
        String as[] = null;
        if(s != null)
        {
            boolean flag = false;
            int i;
            int k;
            for(k = 0; (i = s1.indexOf(c)) >= 0; k++)
                s1 = s1.substring(i + 1);

            if(s1.length() > 0)
                k++;
            as = new String[k];
            s1 = s;
            for(int l = 0; l < as.length; l++) {
                int j = s1.indexOf(c);
                if(j < 0) {
                    as[l] = s1.substring(0, s1.length());
                    s1 = null;
                } else {
                    as[l] = s1.substring(0, j);
                    s1 = s1.substring(j + 1);
                }
            }

        }
        return as;
    }

    public int DefineArrays(int i) {
        valtab = new double[i];
        SColor = new Color[i];
        SLabel = new String[i];
        valstr = new String[i];
        int ind;       
        String s;
        
        MaxValue = 0;
        for(int j = 0; j < i; j++) {
            String as[] = getParameterList(Input[j], ',');
            SLabel[j] = as[0];
            valstr[j] = s = as[1];
            ind=s.indexOf(',');
            if(ind>=0) {
               s.replace(',','.'); 
            }    
            valtab[j] = Double.valueOf(s).doubleValue();
            SColor[j] = new Color(StrBaseRetInt(as[2].substring(1),16));
            if(valtab[j] > MaxValue) {
               MaxValue = valtab[j];
            }    
        }

        return i;
    }

    public int ParseGraphType(String s) {
        if(s.compareTo("vertikal") == 0)
            return 1;
        return s.compareTo("linie") != 0 ? 0 : 2;
    }

    public void PrepareGraph() {
        boolean flag = false;
        ValuesNum = DefineArrays(Input.length);
        f = new Font("Times", 1, 12);
        fm = getGraphics().getFontMetrics(f);
        int l = 1;
        int i1 = 0;
        for(int j1 = 0; j1 < ValuesNum; j1++) {
            if(i1 + fm.stringWidth(SLabel[j1]) + 21 >= getSize().width - 4) {
                i1 = 0;
                l++;
            }
            if(i1 == 0) {
                i1 = i1 + 11 + fm.stringWidth(SLabel[j1]);
            } else {
                i1 = i1 + 11 + fm.stringWidth(SLabel[j1]) + 10;
            }    
        }

        LRectHeight = l * fm.getHeight() + (l - 1) * 3 + 10;
        int j = fm.getHeight();
        VBase = (int)(getSize().width * 0.90) / ValuesNum;
        VSingle = (getSize().height - LRectHeight - TitleHeight - j - 2) / MaxValue;
    }

    public void GrFmDrawStringCenter(Graphics g, FontMetrics fm, String s, int x,int y) {
        int xlen=fm.stringWidth(s);
        g.drawString(s, x-xlen/2, y);
    }        
    
    public void PrepareLegend(Graphics g, int i, int j) {
        g.setColor(TextColor);
        int k = j + fm.getAscent();
        int l = k - fm.getHeight() / 2;
        int i1,j1;
        for(j1 = 0, i1=XOrigin; j1 <= ValuesNum - 1; j1++, i1+=VBase) {
            g.setColor(SColor[j1]);
            g.setColor(TextColor);
            GrFmDrawStringCenter(g,fm,SLabel[j1],i1+VBase/2,k);            
        }
    }

    public void GenerateGraph() {
        int i = 0;
        int j = -1;
        int k = -1;
        int w,h;
        Graphics g;

        DB_Image = createImage(getSize().width, getSize().height);
        g=DB_Image.getGraphics();
        w=getSize().width;
        h=getSize().height;
        
        g.setColor(BackColor);
        g.fillRect(0, 0, w, h);
        g.setColor(Color.black);
        g.drawRect(0,0,w-1,h-1);
        
        if(TitleHeight>0) {
            Font f2=new Font("Times", Font.BOLD +Font.ITALIC, 14);
            FontMetrics fm2 = g.getFontMetrics(f2);
            g.setFont(f2);
            g.setColor(TextColor);
            GrFmDrawStringCenter(g,fm2,Title,w/2, 17);
        }

        g.setFont(f);
        XOrigin = (getSize().width - VBase * ValuesNum) / 2 + 1;
        YOrigin = getSize().height - LRectHeight - 1;

        PrepareLegend(g, 0, getSize().height - LRectHeight);
        for(int l = 0; l < ValuesNum; l++) {
            g.setColor(SColor[l]);
            g.fill3DRect(XOrigin, YOrigin - (int)(VSingle * (float)valtab[l]), VBase - 1, (int)(VSingle * (float)valtab[l]), true);
            g.setColor(TextColor);
//            GrFmDrawStringCenter(g,fm,DoubleRetStringPlus(valtab[l],20,Decimals), XOrigin + VBase/2, YOrigin - (int)(VSingle * (float)valtab[l]) - 3);
            GrFmDrawStringCenter(g,fm,valstr[l], XOrigin + VBase/2, YOrigin - (int)(VSingle * (float)valtab[l]) - 3);
            XOrigin = XOrigin + VBase;
        } 
    }

    String DefaultBody="chat,310,#8080ff|email,470,#8080ff|mlist,520.1,#8080ff|usenet,570,#8080ff|www,520,#8080ff|wikiweb,1000,#000080";
    
    public int StrBaseRetInt(String s,int base) {
       int ret=0;
       try {
          ret=Integer.parseInt(s,base);
       } catch (Exception ex) {
        
       }
       return ret;
    }    
    
    
    public void init() {
        body = getParameter("Body",DefaultBody);
        Input= getParameterList(body, '|');

        String ai = getParameter("Hintergrund", "#cccccc");
        BackColor = new Color(StrBaseRetInt(ai.substring(1),16));
        
        ai = getParameter("Farbe", "#000000");
        TextColor =  new Color(StrBaseRetInt(ai.substring(1),16));

        Title = getParameter("Titel", "Diagramm");
        TitleHeight = 20;

        PrepareGraph();
        GenerateGraph();
    }
    
    int paint_count=0;

    public void paint(Graphics g) {        
        g.drawImage(DB_Image, 0, 0, this);
    }

    public void start() {
        Thread = new Thread(this);
        Thread.start();
    }

    public void stop() {
        Thread = null;
    }

    public void run() {
        Thread.currentThread();
    }

    public Diagramm() {

    }

}
