package lsystem;

import java.awt.*;
/**
 * Lindenmayer-System <br>
 * Belegarbeit AlgoDat WS99/SS2000, Aufgabe 8
 * <p>
 * Zeichenflaeche.
 *
 * @author Christian Semrau<br>
 * Christian.Semrau@student.uni-magdeburg.de<br>
 */
public class LSystemCanvas extends Canvas {
	Image img, oldImg;
	float perc;
	boolean justInfo;
/**
 * Konstruktor, setzt <code>img</code> auf <code>null</code>.
 */
public LSystemCanvas() {
	super();
	oldImg = img = null; perc = 0;
	justInfo = false;
}
/**
 * Stellt das Bild oder die Prozentanzeige dar.
 * @param g Graphics
 */
public void paint(Graphics g) {
	if (img==null){
		// wir sind in einer Berechnung
		if (oldImg!=null && !justInfo)
			// wir muessen die Flaeche komplett neuzeichnen
			g.drawImage(oldImg,0,0,this);
		paintString(g);
	}else{
		// ein Bild steht zur Darstellung bereit
		g.drawImage(img,0,0,this);
	}
	justInfo = false;
}
/**
 * Zeichnet den "Geduld"-Block.
 * @param g java.awt.Graphics
 */
private void paintString(Graphics g) {
	String calcString = "Geduld! Kann sich nur um Stunden handeln ...";
	if (perc!=0) calcString += " ("+Utils.fdouble(perc,4,1)+"%)";
	int w = getSize().width;
	int h = getSize().height;
	FontMetrics fm = g.getFontMetrics();
	int strLen = fm.stringWidth(calcString);
	int x = (w - strLen)/2;
	int y = h/2;

	g.setColor(Color.white);
	g.fillRect(x-10, y-fm.getHeight()-5, strLen+20, fm.getHeight()+20);
	g.setColor(Color.red);
	g.drawString(calcString, x, y);
//	g.setColor(Color.black);
}
/**
 * Setzt das neue Bild und sichert das vorige.
 * @param img java.awt.Image
 */
public void setImage(Image img) {
	if (img==null){
		// Bild entfernen = neue Berechnung beginnen
		if (this.img!=null)
			// bereits vorhandenes Bild retten
			oldImg = this.img;
		this.img = null;
		perc = 0;
		paint(getGraphics());
	}else{
		// neues Bild ist fertig
		this.img = img;
		paint(getGraphics());
	}
}
/**
 * Legt ein Bild an, das angezeigt wird, bevor das erste Bild fertig ist.
 * Kann nicht im Konstruktor aufgerufen werden, weil da die Groesse noch nicht
 * bekannt ist.
 */
public void setStartImage(String calcString, String calcString2) {
	// Groesse der Zeichenflaeche
	int width = getSize().width;
	int height = getSize().height;
	if (width<=0 || height<=0) return;
	
	// Offscreen-Image anlegen
	Image img = createImage(width, height);
	Graphics g = img.getGraphics();

	// Weiss fuellen und schwarze Randlinie zeichnen
	g.setColor(Color.white);
	g.fillRect(0, 0, width-1, height-1);
	g.setColor(Color.black);
	g.drawRect(0, 0, width-1, height-1);
	g.setColor(Color.black);

	FontMetrics fm; int x,y;

	g.setColor(Color.black);
	fm = g.getFontMetrics();
	x = (width - fm.stringWidth(calcString))/2;
	y = 10+fm.getHeight();
	g.drawString(calcString, x, y);
	g.setColor(Color.black);

	g.setColor(Color.black);
	fm = g.getFontMetrics();
	x = (width - fm.stringWidth(calcString2))/2;
	y = 10+2*fm.getHeight();
	g.drawString(calcString2, x, y);
	g.setColor(Color.black);

	setImage(img);
}
/**
 * Diese ueberlagerte Methode verhindert, dass die Zeichenflaeche beim
 * Neuzeichnen unnoetig geloescht (mit der Hintergrundfarbe gefuellt) wird.
 */
public void update(Graphics g){
	paint(g);
}
}