/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * Copyright (c) 1999-2003 Tsukuba Bunko.
 *
 * $Id: ElementHandler.java,v 1.1.2.1 2003/12/11 10:13:39 ppoi Exp $
 */
package tsukuba_bunko.peko.scenario;

import	org.xml.sax.Attributes;
import	org.xml.sax.SAXException;

import	tsukuba_bunko.peko.PekoSystem;


/**
 * PSML Scene 要素を処理するハンドラの基本機能を定義します。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public abstract class ElementHandler	{

	/**
	 * PSML 1.0 "Scene" XML Namespace URI
	 */
	public static final String	NAMESPACE_SCENE = "http://tsukuba-bunko.org/ns/psml-scene";

	/**
	 * シーンコンテクスト
	 */
	protected SceneContext	_context = null;

	/**
	 * 親要素のハンドラ
	 */
	protected ElementHandler	_parent = null;

	/**
	 * シーンがこの要素の処理を以て終了するかどうか
	 */
	protected boolean	_endOfScene = false;


	/**
	 * <code>ElementHandler</code> のインスタンスを生成します。
	 */
	protected ElementHandler()
	{
		super();
	}

	/**
	 * シーンコンテクストを設定します。
	 * @param	context	シーンコンテクスト
	 */
	public void setSceneContext( SceneContext context )
	{
		_context = context;
	}

	/**
	 * シーンコンテクストを取得します。
	 * @return	シーンコンテクスト
	 */
	public SceneContext getSceneContext()
	{
		return _context;
	}

	/**
	 * 親要素を処理している ElementHandler を設定します。
	 * @param	handler	親要素のハンドラ
	 */
	public void setParentHandler( ElementHandler handler )
	{
		_parent = handler;
	}

	/**
	 * 親要素を処理している ElementHandler を取得します。
	 * @return	親要素のハンドラ
	 */
	public ElementHandler getParentHandler()
	{
		return _parent;
	}

	/**
	 * シーンがこの要素の処理を以て終了するかどうかを設定します。
	 * @param	end	シーンが終了する場合 <code>true</code>、それ以外の場合 <code>false</code>
	 */
	protected void setEndOfScene( boolean end )
	{
		_endOfScene = end;
	}

	/**
	 * シーンがこの要素の処理を以て終了するかどうかを判定します。
	 * @return	シーンが終了する場合 <code>true</code>、それ以外の場合 <code>false</code>
	 */
	public boolean isEndOfScene()
	{
		return _endOfScene;
	}

	/**
	 * 処理を一時停止します。
	 * @param	wait	最大停止時間
	 */
	protected void stop( long wait )
	{
		if( _context != null )	{
			if( _context.getSceneProcessor().isAborted() )	{
				return;
			}
			tsukuba_bunko.peko.Logger.debug( "[scenario.handler] stop using ElementHandler#stop(wait)." );
			PekoSystem.getInstance().getActionControler().stop( wait );
		}
	}

	/**
	 * 処理をユーザーのアクションがあるまで一時停止します。
	 */
	protected void stop()
	{
		if( _context != null )	{
			if( _context.getSceneProcessor().isAborted() )	{
				return;
			}
			tsukuba_bunko.peko.Logger.debug( "[scenario.handler] stop using ElementHandler#stop()." );
			PekoSystem.getInstance().getActionControler().stop();
		}
	}


//
//	SAX ContentHandler
//
	public void startDocument()
		throws SAXException
	{
	}

	public void endDocument()
		throws SAXException
	{
	}

	public void startElement( String namespaceURI, String localName, String qName, Attributes attrs )
		throws SAXException
	{
	}

	public void endElement( String namespaceURI, String localName, String qName )
		throws SAXException
	{
	}

	public void characters( char[] ch, int begin, int length )
		throws SAXException
	{
	}
}