/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.console.gui;

import java.awt.BorderLayout;
import java.awt.Font;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Locale;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import org.logical_paradox.console.ConsoleConfig;
import org.logical_paradox.console.Document;
import org.logical_paradox.console.event.ListenerFactory;
import org.logical_paradox.console.event.handler.KeyPressEventHandler;

/**
 * コンソールパネル
 * 自由にコンソールの貼り付けができるように，JPanelとして実装する
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.8 $
 */
public class ConsolePanel extends JPanel {
	/**
	 * テキスト表示領域のコンポーネント
	 */
	private JTextArea textarea;
	private JTextComponentOutputStream out;
	private PrintWriter pw;

	private Document document;
	private ConsoleConfig config;

	/**
	 * コンストラクタ
	 * @param cfg コンフィグ
	 */
	public ConsolePanel(ConsoleConfig cfg) throws Exception {
		super();
		config = cfg;
		init();
	}

	/**
	 * GUIを初期化する
	 */
	protected void init() throws Exception {
		textarea = new JTextArea();
		textarea.setEditable(false);
		textarea.setLocale(Locale.JAPANESE);
		Font font = new Font(config.getFontFamily(), Font.PLAIN, 12);
		textarea.setBackground(config.getBackgroundColor());
		textarea.setForeground(config.getForegroundColor());
		textarea.setCaretColor(config.getForegroundColor());
		textarea.setFont(font);
		textarea.getCaret().setVisible(true);
		textarea.getCaret().setSelectionVisible(true);

		document = new Document(textarea, config.getPromptString());
		ListenerFactory factory = config.getListenerFactory();
		textarea.setLineWrap(true);
		textarea.addKeyListener(new KeyPressEventHandler(factory.getKeyPressListener(document)));

		out = new JTextComponentOutputStream(textarea);

		setLayout(new BorderLayout());
		add(new JScrollPane(textarea), BorderLayout.CENTER);
		setVisible(true);
		validate();
	}
	/**
	 * コンソールに文字列を表示させるための出力ストリームを返す
	 * @return 出力ストリーム
	 */
	public PrintWriter getPrintWriter() {
		if(pw == null) {
			pw = new PrintWriter(out);
		}
		return pw;
	}
	/**
	 * コンソールに文字列を表示させるための出力ストリームを返す
	 * @return 出力ストリーム
	 */
	public OutputStream getOutputStream() {
		return out;
	}
	/**
	 * コンソールを改行する
	 */
	public void crlf() {
		getPrintWriter().print("\n");
		getPrintWriter().flush();
	}
	public JTextArea getTextArea() {
		return textarea;
	}
	/**
	 * コンソール表示の初期化
	 */
	public void clear() {
		textarea.setText("");
	}
}
