/**
 * $Id: HistoryDriver.java,v 1.2 2005/07/02 16:52:32 rampil Exp $
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.console.event.history;

import java.util.ArrayList;

/**
 * ヒストリドライバ
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class HistoryDriver {
	/** ヒストリとして記録されるレコード数 */
	public static final int HISTORY_BUFFER_SIZE = 16;

	/** ヒストリ */
	private ArrayList history = new ArrayList();

	/** 現在のカーソル位置 */
	private int pos = 0;

	/** ヒストリバッファのサイズ */
	private final int historyBufferSize;

	/**
	 * コンストラクタ
	 */
	public HistoryDriver() {
		this(HISTORY_BUFFER_SIZE);
	}
	/**
	 * コンストラクタ
	 * @param hbs ヒストリバッファのサイズ
	 */
	public HistoryDriver(int hbs) {
		historyBufferSize = hbs;
	}
	/**
	 * 履歴にレコードを追加する
	 * @param line 履歴
	 */
	public void addHistory(String line) {
		// 空行はヒストリに加えない
		if(line == null || line.trim().length() == 0) {
			return;
		}
		synchronized(history) {
			history.add(line);
			while(historyBufferSize < history.size()) {
				history.remove(0);
			}
		}
	}
	/**
	 * 以前の履歴を返す
	 * @return 履歴
	 */
	public String back() {
		String line = null;
		synchronized(history) {
			if(history.size() == 0) {
				return "";
			} else if(history.size() <= pos) {
				pos = history.size() -1;
			}
			pos--;

			if(pos < 0) {
				pos = history.size() -1;
			}
			line = (String)history.get(pos);
		}
		return line;
	}
	/**
	 * 次の履歴を返す
	 * @return 履歴
	 */
	public String forward() {
		String line = null;
		synchronized(history) {
			if(history.size() <= pos) {
				pos = 0;
			}
			line = (String)history.get(pos);
			pos++;

			if(pos == history.size()) {
				pos = 0;
			}
		}
		return line;
	}
}
