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

import java.awt.event.KeyEvent;

import org.logical_paradox.console.Document;
import org.logical_paradox.console.event.ConsoleEventObject;
import org.logical_paradox.console.event.KeyPressListener;
import org.logical_paradox.shell.Shell;
import org.logical_paradox.shell.exception.ParserException;
import org.logical_paradox.shell.exception.TerminationException;

/**
 * キー押下リスナー(実装)
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class KeyPressListenerImpl implements KeyPressListener {
	private Document document;
	private Shell shell;

	/**
	 * コンストラクタ
	 * @param d ドキュメント
	 * @param shell シェル
	 */
	public KeyPressListenerImpl(Document d, Shell s) {
		document = d;
		shell = s;
		document.prompt();
		document.relocate();
	}
	/**
	 * キー入力確定時に呼ばれるハンドラ
	 * @param e イベントオブジェクト
	 */
	public void onKeyPressed(ConsoleEventObject e) {
		if(document.isJapaneseMode() == true) {
			return;
		}
		switch(e.getKeyCode()) {
			case KeyEvent.VK_UP:			// カーソル上
			case KeyEvent.VK_DOWN:			// カーソル下
			case KeyEvent.VK_SHIFT:		// SHIFT
			case KeyEvent.VK_CONTROL:		// CTRL
			case KeyEvent.VK_CAPS_LOCK:	// CAPSLOCK
				break;
			case KeyEvent.VK_FULL_WIDTH:
			case KeyEvent.VK_HALF_WIDTH:
			case KeyEvent.VK_INPUT_METHOD_ON_OFF:
				return;
			// カーソル左
			case KeyEvent.VK_LEFT:
				document.moveToLeft();
				break;
			// カーソル右
			case KeyEvent.VK_RIGHT:
				document.moveToRight();
				break;
			// HOME
			case KeyEvent.VK_HOME:
				// 一度カーソルを一番最後へ移動する
				document.moveToEnd();
				// 行頭へカーソルを移動する
				document.moveToLineBegin();
				break;
			// DEL
			case KeyEvent.VK_DELETE:
				document.delete();
				break;
			// END
			case KeyEvent.VK_END:
				document.moveToEnd();
				break;
			// BS
			case KeyEvent.VK_BACK_SPACE:
				document.backSpace();					// BS
				break;									
			// ENTER
			case KeyEvent.VK_ENTER:
				// ENTERキー押下時はコマンド行を抽出してパーザーにかける
				document.CRLF();
				if(document.getCommitedLine().trim().equals("") == false) {
					try {
						shell.execute(document.getOutputStream(), document.getCommitedLine());
					} catch (org.logical_paradox.shell.exception.CommandExecutionException e1) {
						// コマンドの実行に失敗した場合
						document.insert(e1.toString());
						document.CRLF();
					} catch (ParserException e1) {
						// 指定されたコマンドの構文に間違いがあった場合
						document.insert(e1.toString());
						document.CRLF();
					} catch(TerminationException te) {
						// 終了シグナルを受信した場合,プログラムを終了する
						System.exit(0);
					}
				}
				// プロンプト表示
				document.prompt();
				e.getKeyEvent().consume();
				break;
			default:
				if(e.getKeyEvent().getID() == KeyEvent.KEY_TYPED && e.getKeyChar() == KeyEvent.VK_BACK_SPACE) {
					document.backSpace();					// BS
				} else if(Character.isISOControl(e.getKeyChar()) == false) {
					document.insert(e.getKeyChar());		// 文字は挿入
				}
				break;
		}
		// キー入力はswingのほうでハンドリングさせたくないので，ここで消費する
		e.getKeyEvent().consume();
	}
}
