package ckelling.baukasten;

/**
 *  ConsoleWindow.java
 *
 *  Ein Konsolen-Fenster, in dem Vorgänge im Rechner mitprotokolliert werden können.
 *  Verfügt über einen Knopf zum Löschen des Inhaltes und eine
 *  Checkbox, über die ausgewählt werden kann, ob das Protokoll
 *  "ausführlich" sein soll.
 *
 *  @author   Carsten Kelling
 *  @version  1.0.0,  29.06.97
 */
import java.awt.*;

public class ConsoleWindow extends Frame {
	
	private boolean			verbose;
	private boolean			locked;
	private StringBuffer	arrivedWhenLocked;

	public ConsoleWindow() {

		arrivedWhenLocked = new StringBuffer(1000);

		//{{INIT_CONTROLS
		GridBagLayout gridBagLayout;
		gridBagLayout = new GridBagLayout();
		setLayout(gridBagLayout);
		addNotify();
		resize(insets().left + insets().right + 403,insets().top + insets().bottom + 351);
		setFont(new Font("Helvetica", Font.PLAIN, 12));
		setBackground(new Color(12632256));
		textArea1 = new java.awt.TextArea();
		textArea1.reshape(insets().left + 10,insets().top + 10,383,298);
		textArea1.setFont(new Font("Courier", Font.BOLD, 12));
		GridBagConstraints gbc;
		gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.weightx = 1.0;
		gbc.weighty = 1.0;
		gbc.fill = GridBagConstraints.BOTH;
		gbc.insets = new Insets(10,10,0,10);
		gridBagLayout.setConstraints(textArea1, gbc);
		add(textArea1);
		buttonPanel = new java.awt.Panel();
		buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,30,5));
		buttonPanel.reshape(insets().left + 10,insets().top + 308,383,33);
		gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.weightx = 1.0;
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.insets = new Insets(0,10,10,10);
		gridBagLayout.setConstraints(buttonPanel, gbc);
		add(buttonPanel);
		buttonClear = new java.awt.Button("Löschen");
		buttonClear.reshape(112,5,62,23);
		buttonPanel.add(buttonClear);
		checkboxVerbose = new java.awt.Checkbox("Ausführlich");
		checkboxVerbose.reshape(179,5,91,23);
		buttonPanel.add(checkboxVerbose);
		checkboxVerbose.setState(true);
		setTitle("Befehlsgeschichte");
		//}}

		hide();
		locked = false;
		verbose = checkboxVerbose.getState();
		move(0, 0);

		//{{INIT_MENUS
		//}}

	}

	public ConsoleWindow(String title) {
	    this();
	    setTitle(title);
	}

	/**
	 *  Text wird an den schon vorhandenen angehängt.
	 *
	 *  @see #appendIfVerbose
	 *  @see #lock
	 *  @see #unlock
	 */
	public void append(String str)
	{
		if ((! isShowing()) || locked)
			arrivedWhenLocked.append(str);
		else	
			textArea1.appendText(str);
	}

	/**
	 *  Text wird an den schon vorhandenen nur dann angehängt,
	 *  falls "ausführlich" angewählt ist.
	 *
	 *  @see #append
	 *  @see #lock
	 *  @see #unlock
	 *  @see #setVerbose
	 *  @see #isVerbose
	 */
	public void appendIfVerbose(String str)
	{
		if (verbose)
		{
			if ((! isShowing()) || locked)
				arrivedWhenLocked.append(str);
			else	
				textArea1.appendText(str);
		}
	}
	
	/**
	 * Löschen des gesamten Textes
	 */ 
	public void clear()
	{
		textArea1.setText("");
		arrivedWhenLocked = new StringBuffer(1000);
	}

	/**
	 * Werden "ausführliche" Texte angezeigt?
	 *
	 * @see #appendIfVerbose
	 * @see #setVerbose
	 */ 
	public boolean isVerbose()
	{
		return verbose;
	}
	
	/**
	 * Setzen der Konsole auf "ausführliche" oder "einfache" Protokolle.
	 *
	 * @see #isVerbose
	 * @see #appendIfVerbose
	 */
	public void setVerbose(boolean b)
	{
		verbose = b;
	}
	
	/**
	 * Macht die Konsole sichtbar. Text, der angehängt wurde, als die
	 * Konsole unsichtbar war, wird nun angefügt.
	 */ 
    public synchronized void show() {
    	if ((! locked) && arrivedWhenLocked.length() >0)
    	{
    		textArea1.appendText(arrivedWhenLocked.toString());
    		arrivedWhenLocked = new StringBuffer(1000);
    	}
    	super.show();
    }
    
    /**
     * Aus Geschwindigkeitsgründen:
     * Aufrufe von append() und appendIfVerbose() führen zu keiner sichtbaren
     * Änderung, die angefügten Texte werden aber gespeichert.
     *
     * @see #append
     * @see #appendIfVerbose
     * @see #unlock
     */
    public synchronized void lock()
    {
    	locked = true;
    }
    
    /**
     * Bei jedem Aufruf von append() oder appendIfVerbose() wird der neue Text
     * sofort angezeigt.
     * Text, der angefügt wurde, als die Konsole verriegelt war, 
     * wird nun angezeigt.
     *
     * @see #append
     * @see #appendIfVerbose
     * @see #lock
     */
    public synchronized void unlock()
    {
    	locked = false;
    	
    	if (isShowing() && arrivedWhenLocked.length() >0)
    	{
    		textArea1.appendText(arrivedWhenLocked.toString());
    		arrivedWhenLocked = new StringBuffer(1000);
    	}
    }

	public boolean handleEvent(Event event) {
    	/**
    	if (event.id == Event.WINDOW_DESTROY) {
            hide();         // hide the Frame
            dispose();
            return true;
    	}
    	*/
    	if ( (event.id == Event.ACTION_EVENT) && (event.target == checkboxVerbose) )
    	{
    		verbose = checkboxVerbose.getState();
    		if (! verbose)
    			textArea1.appendText("\n");
    		return true;
    	}
    	else if ( (event.id == Event.ACTION_EVENT) && (event.target == buttonClear) )
    	{
    		textArea1.setText("");
    		return true;
    	}
		return super.handleEvent(event);
	}

	//{{DECLARE_CONTROLS
	java.awt.TextArea textArea1;
	java.awt.Panel buttonPanel;
	java.awt.Button buttonClear;
	java.awt.Checkbox checkboxVerbose;
	//}}

	//{{DECLARE_MENUS
	//}}
}
