package ckelling.baukasten;

import java.awt.*;
import java.util.Vector;


// Versionsgeschichte
// 0.2.0, 28.11.96
// 0.2.1, 05.08.97

/**
 *	SystemMessage.java
 *
 *	Ein Fenster mit variablem Text und
 *	einem "Fuellstandsanzeiger"
 *
 *	@author		Carsten Kelling
 *	@version	0.2.1, 05.08.97
 */
public class SystemMessage extends Frame
{
    public final static int	WAITLENGTH	= 90;
    public final static String WAITCHAR	= "|";

	private String waitbarText;
	private String wbt[];
	private double factor;

	private int	startTime;
	private Vector stats;

	private Rechner	parent;

    public SystemMessage(String messageText, int maxInc, Rechner parent)
    {
        super("Bitte beachten");

        this.parent = parent;

        factor = (double) WAITLENGTH / (double) maxInc;
        // 90 Zeichen '|' passen in das TextField waitbar.
        // Das Programm, welches die Systemmeldung ausgibt, gibt ueber
        // maxInc die Summe der i in seinen Aufrufen an inc(int i) an
        // (nach dem letzten inc() ist das Warten vorbei und die SystemMessage
        // sollte zerstoert werden).
        // factor bestimmt, wieviele '|' bei inc(int i) ausgegeben werden muessen.

        wbt = new String[maxInc + 1];
        wbt[0] = "";
        for (int i = 1; i <= maxInc; i++)
        {
        	String str = new String("");
			for (int j = 1; j <= (int) (factor * i); j++)
				str = str + WAITCHAR;
			wbt[i] = str;
		}

		startTime = (int) System.currentTimeMillis();
		stats = new Vector(50, 10);

        //{{INIT_CONTROLS
		setLayout(null);
		addNotify();
		resize(insets().left + insets().right + 325,insets().top + insets().bottom + 232);
		setBackground(new Color(12632256));
		message = new java.awt.TextArea(7,33);
		message.setEditable(false);
		message.reshape(insets().left + 24,insets().top + 36,280,117);
		message.setFont(new Font("Helvetica", Font.BOLD, 12));
		add(message);
		waitbar = new java.awt.TextField(33);
		waitbar.setEditable(false);
		waitbar.reshape(insets().left + 24,insets().top + 168,280,20);
		waitbar.setFont(new Font("Dialog", Font.BOLD, 10));
		add(waitbar);
		setTitle("Laden der Klassen");
		setResizable(false);
		//}}

        message.setText(messageText);

		Dimension d = parent.getScreenSize();
        move( (d.width - bounds().width)/2, (d.height - bounds().height)/2);
        show();

        waitbarText = "";

        //{{INIT_MENUS
		//}}
    }

    public synchronized void show() {
    	//move(180, 170);
    	//move(5, 5);
    	super.show();
    	toFront();
    }

    public boolean handleEvent(Event event)
    {
    	if (event.id == Event.WINDOW_DESTROY) {
    	    return true;
    	}
    	return super.handleEvent(event);
    }

	public void inc(int inc)
	{
		stats.addElement(new Point((int) System.currentTimeMillis() - startTime, inc));
		startTime = (int) System.currentTimeMillis();

		waitbarText = waitbarText + wbt[inc];
    	waitbar.setText(waitbarText);
	}

	/**
	 * Abkürzung für inc(5)
	 */
	public void inc()
	{
		inc(5);
	}
	
	public void timerWokeUp(String title)
	{
		inc(1);
	}


	public void dispose()
	{
		dispose(false);
	}

	public void dispose(boolean showStatistics)
	{
		if (showStatistics)
		{
			System.out.println();
			System.out.println("Statistik einer SystemMessage");
			System.out.println("=============================\n");
			System.out.println("Aufrufe von inc(): " + stats.size());

			int totalTime = 0;
			int totalChars = 0;
			Point p;
			for (int i = 0; i < stats.size(); i++)
			{
				p = (Point) stats.elementAt(i);
				totalTime += p.x;
				totalChars += p.y;
			}
			System.out.println("Summe der Parameter von inc(): " + totalChars);
			System.out.println("Lebenszeit: " + totalTime + " ms\n");

			System.out.println("Aufruf Nr., IST-Parameter, SOLL-Parameter");
			System.out.println("-----------------------------------------");
			double shouldBe;
			for (int i = 0; i < stats.size(); i++)
			{
				p = (Point) stats.elementAt(i);
				if (p.x == 0)
					p.x = 1;
				shouldBe = (WAITLENGTH * p.x) / totalTime;
				System.out.println(i + ", " + p.y + ", " + ((int) shouldBe));
			}
			System.out.println();
		}

	 	super.dispose();
	}


    //{{DECLARE_MENUS
	//}}

    //{{DECLARE_CONTROLS
	java.awt.TextArea message;
	java.awt.TextField waitbar;
	//}}
}


