/*
 *  Fraktal.java
 *  Copyright (C) 2002  Frank Buß (fb@frank-buss.de)
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You can get the GNU General Public License at
 *  http://www.gnu.org/licenses/gpl.html
 */

import java.awt.*;
import java.applet.*;

public class Fraktal extends Applet
{
	private Choice formulaChoice;
	private TextField upperLimitTextField;
	private TextField moduloTextField;
	private Checkbox clippingCheckbox;
	private Choice drawingModeChoice;
	private TextField intensityTextField;
	private Checkbox normalizeCheckbox;
	private TextField upTextField;
	private TextField downTextField;
	private TextField leftTextField;
	private TextField rightTextField;
	private Button drawButton;
	private FraktalCanvas fraktalCanvas;
	
	private static String formulas[] = { "Primzahlen", "Fibonacci", "Zufall", "Summe der Quadrate"};
	public final static int FORMULA_PRIME = 0;
	public final static int FORMULA_FIBONACCI = 1;
	public final static int FORMULA_RANDOM = 2;
	public final static int FORMULA_SUM = 3;
	
	private static String drawingModes[] = { "rgb", "rbg", "brg", "grb", "bgr", "gbr" };
	public final static int DRAWING_MODE_RGB = 0;
	public final static int DRAWING_MODE_RBG = 1;
	public final static int DRAWING_MODE_BRG = 2;
	public final static int DRAWING_MODE_GRB = 3;
	public final static int DRAWING_MODE_BGR = 4;
	public final static int DRAWING_MODE_GBR = 5;
	
	/**
	 * GUI aufbauen.
	 */
	public void init()
	{
		setLayout(new BorderLayout());
		setBackground(Color.white);

		Panel inputContainer = new Panel();
		inputContainer.setLayout(new BorderLayout());
		Panel input = new Panel();
		input.setLayout(new GridLayout(0, 1));
		
		formulaChoice = new Choice();
		for (int i = 0; i < formulas.length; i++) formulaChoice.addItem(formulas[i]);
		input.add(new Label("Formel:"));
		input.add(formulaChoice);
		
		input.add(new Label("Obere Grenze:"));
		upperLimitTextField = new TextField("1000000", 20);
		input.add(upperLimitTextField);
		
		input.add(new Label("Modulo-Wert:"));
		moduloTextField = new TextField("11", 20);
		input.add(moduloTextField);

		input.add(new Label("rauf-Modulo-Rest:"));
		upTextField = new TextField("1", 20);
		input.add(upTextField);

		input.add(new Label("runter-Modulo-Rest:"));
		downTextField = new TextField("2", 20);
		input.add(downTextField);

		input.add(new Label("links-Modulo-Rest:"));
		leftTextField = new TextField("3", 20);
		input.add(leftTextField);

		input.add(new Label("rechts-Modulo-Rest:"));
		rightTextField = new TextField("4", 20);
		input.add(rightTextField);

		clippingCheckbox = new Checkbox("Koordinaten begrenzen");
		input.add(clippingCheckbox);

		drawingModeChoice = new Choice();
		for (int i = 0; i < drawingModes.length; i++) drawingModeChoice.addItem(drawingModes[i]);
		input.add(new Label("Darstellung:"));
		input.add(drawingModeChoice);

		input.add(new Label("Helligkeitsmultiplikator:"));
		intensityTextField = new TextField("1", 20);
		input.add(intensityTextField);

		normalizeCheckbox = new Checkbox("Farbwerte normieren", true);
		input.add(normalizeCheckbox);
		
		drawButton = new Button("Zeichnen");
		input.add(drawButton);
		
		inputContainer.add(BorderLayout.NORTH, input);
		add(BorderLayout.EAST, inputContainer);

		fraktalCanvas = new FraktalCanvas(this);
		add(BorderLayout.CENTER, fraktalCanvas);
		
		Label title = new Label("Fraktalzeichenprogramm, Copyright 2002 by Frank Buß", Label.CENTER);
		title.setFont(new Font("SansSerif", Font.PLAIN, 20));
		add(BorderLayout.NORTH, title);
		
		// initiales Bild anzeigen
		fraktalCanvas.calculatePic();
		fraktalCanvas.repaint();
	}
        
        /**
         * Fraktal neuzeichnen, wenn Button gedrückt wurde.
         */
	public boolean action(Event evt, Object what)
	{
		if (evt.target == drawButton) {
			fraktalCanvas.calculatePic();
			fraktalCanvas.repaint();
		}
		return true;
	}


	//
	// Getter
	//
		
	public int getFormula()
	{
		return formulaChoice.getSelectedIndex();
	}
	
	public int getUpperLimit()
	{
		return Integer.parseInt(upperLimitTextField.getText());
	}
	
	public int getModulo()
	{
		return Integer.parseInt(moduloTextField.getText());
	}
	
	public boolean isClipping()
	{
		return clippingCheckbox.getState();
	}
	
	public int getDrawingMode()
	{
		return drawingModeChoice.getSelectedIndex();
	}

	public int getIntensity()
	{
		return Integer.parseInt(intensityTextField.getText());
	}

	public boolean isNormalize()
	{
		return normalizeCheckbox.getState();
	}
	
	public int getUp()
	{
		return Integer.parseInt(upTextField.getText());
	}

	public int getDown()
	{
		return Integer.parseInt(downTextField.getText());
	}

	public int getLeft()
	{
		return Integer.parseInt(leftTextField.getText());
	}

	public int getRight()
	{
		return Integer.parseInt(rightTextField.getText());
	}
}
