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

import	java.awt.Dimension;
import	java.awt.Graphics;
import	java.awt.Graphics2D;

import	java.awt.font.TextLayout;

import	javax.swing.JComponent;

import	tsukuba_bunko.peko.Logger;


/**
 * テキストの末尾に表示する待ちマーカーです。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public class Marker	extends JComponent	implements Runnable	{

	/**
	 * マーカー文字
	 */
	private Line	_text = null;

	/**
	 * 点滅フラグ
	 */
	private boolean	_light = false;

	/**
	 * 点滅スレッド
	 */
	private Thread	_blinker = null;

	/**
	 * 点滅状態
	 */
	private boolean	_blinking = false;


	/**
	 * <code>Marker</code> のインスタンスを作成します。
	 */
	public Marker()
	{
		super();
	}


	/**
	 * マーカー文字を設定します。
	 * @param	text	マーカー文字
	 */
	public void setText( Line text )
	{
		_text = text;
		int	height = (int)(text.getAscent() + text.getDescent());
		int	width = (int)text.getTextLayout().getAdvance();
		Dimension	size = new Dimension( width, height );
		setPreferredSize( size );
		setSize( size );
	}

	/**
	 * マーカー文字を設定します。
	 * @param	text	マーカー文字
	 * @param	page	ページ
	 */
	public void setText( String text, Page page )
	{
		setForeground( page.getForeground() );
		TextLayout	layout = new TextLayout( text, page.getDefaultFont(), page.getFontRenderContext() );
		Line	line = new Line();
		line.setLineSpan( 0f );
		line.setTextLayout( layout );
		line.setForeground( page.getForeground() );
		line.setShadowColor( page.getShadow() );
		setText( line );
	}

	/**
	 * マーカー文字を取得します。
	 * @return	マーカー文字
	 */
	public Line getText()
	{
		return _text;
	}

	/**
	 * 点滅を開始します。
	 */
	public void start()
	{
		if( _blinker == null )	{
			synchronized( this )	{
				if( _blinker == null )	{
					_blinker = new Thread( this );
					_blinking = true;
					_blinker.start();
				}
			}
		}
	}

	/**
	 * 点滅を終了します。
	 */
	public void stop()
	{
		synchronized( this )	{
			_blinking = false;
			notify();
		}
	}

	/**
	 * マーカーの左下隅の位置を設定します。
	 * @param	x	X 座標値
	 * @param	y	Y 座標値
	 */
	public void setPosition( int x, int y )
	{
		if( _text != null )	{
			setLocation( x, (y - (int)(_text.getAscent() + _text.getDescent())) );
		}
		else	{
			setLocation( x, y );
		}
	}


//
//	Runnable の実装
//
	public void run()
	{
		Logger.debug( "[canvas.text] blinking start." );
		while( _blinking )	{
			synchronized( this )	{
				try	{
					wait( 520 );
				}
				catch( InterruptedException ie )	{
				}
			}
			_light = !_light;
			if( isVisible() )	{
				repaint();
			}
		}
		Logger.debug( "[canvas.text] blinking stop." );
	}


//
//	JComponent の実装
//
	protected void paintComponent( Graphics g )
	{
		if( !_light || (_text == null) || !isVisible() )	{
			return;
		}

		_text.draw( (Graphics2D)g, 0, _text.getAscent() );
	}
}
