/**
 * @file Obj.h
 * @brief スプライトの表示属性(座標位置、etc)などを保持しているインターフェース、定数の定義を行う。
 * 
 * @author S.F.
 * @version $Id:
 *
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.
 */

/// 重複インクルード防止マクロ
#if !defined(AFX_OBJ_H__848EAA84_F65D_4C04_982A_EC1A7484C2E7__INCLUDED_)
#define AFX_OBJ_H__848EAA84_F65D_4C04_982A_EC1A7484C2E7__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "sf.h"
extern "C" {
namespace sf {
	namespace system {
		namespace console {

typedef	int OBJNO;///< OBJNO型の定義

/** スプライト表示属性インターフェース.
 * Objインターフェースは、スプライトの表示属性を保持します。
 * Obj自身が、リストのノードとなっていて、Obj::Listに登録されます。*/
class SFDLL Obj
{
public:
	/// コンストラクタ
	Obj();
	/// デストラクタ
	virtual ~Obj();

	/// オブジェを描画する
	virtual void draw() = 0;

	// ACCESS //

	/** Spriteインターフェースのアドレスを取得する 
	 * @return Spriteインターフェースのポインタ */
	virtual sprite::Sprite * const sprite() const = 0;
	
	/** Spriteインターフェースのアドレスを設定する 
	 * @param value Spriteインターフェースのポインタ*/
	virtual void sprite(sprite::Sprite* const value) = 0;

	/** スプライトインデックスを参照する. 
	 * インデックスは、Spriteビットマップの中の何番目を表示するかをさします。
	 * @return インデックス */
	virtual const int index() const = 0;
	
	/** スプライトインデックスを設定する 
	 * @param value スプライトインデックス */
	virtual void index(const int value) = 0;

	/** 表示・非表示属性を参照する 
	 * @retval true 表示
	 * @retval false 非表示 */
	virtual const bool visibility() const = 0;

	/** 表示・非表示属性を設定する 
	 * @retval true 表示
	 * @retval false 非表示 */
	virtual void visibility(const bool value) = 0;

	/** 前のノードのポインタを取得する 
	 @return Objインターフェースのポインタ。
	 nullの場合はこれ以上前にデータはない	*/
	virtual Obj * const previous() const  = 0;

	/** 前のノードのポインタを設定する 
	 @param value Objインターフェースのポインタ*/
	virtual void previous(Obj * const value) = 0;
	
	/** 次のノードのポインタを取得する 
	 @return Objインターフェースのポインタ。
	 nullの場合はこれ以上後にデータはない	*/
	virtual Obj * const next() const  = 0;

	/** 次のノードのポインタを設定する 
	 @param value Objインターフェースのポインタ*/
	virtual void next(Obj * const value) = 0;

	/** z座標を取得する 
	 * @return z座標 */
	virtual const float z() const  = 0;
	
	/** z座標を設定する 
	 * @param value z座標 */
	virtual void	z(const float value) = 0;

	/** 描画モードを設定する 
	 * @param value DrawMode */
	virtual void drawMode(const DrawMode value) = 0;
	/** 描画モードを参照する 
	 * @return DrawMode */
	virtual const DrawMode drawMode() const  = 0;

	///双方向リストを保持するクラス 
	/*! Objのリストを保持します。<br>
	すべてスタティックメンバで構築してみました。*/
	class SFDLL List
	{
	public:
		/** Objを挿入する.
		 * @param value Objのポインタ */
		static void insertObj(Obj *value);
		
		/** Objを削除する.
		 * @param value Objのポインタ */
		static void deleteObj(Obj *value);

		/** 先頭に移動する.
		 * @return Objのポインタ NULLの場合はデータがない*/
		static Obj * moveTop();
		
		/** 終端に移動する.
		 * @return value Objのポインタ NULLの場合はデータがない*/
		static Obj * moveBottom();

		/** 次に移動する.
		 * @return value Objのポインタ NULLの場合はデータがない*/
		static Obj * moveNext();

		/** 前に移動する.
		 * @return value Objのポインタ NULLの場合はデータがない*/
		static Obj * movePrevious();
		
	private:
		
		static Obj* mspCurrent;///< カレントノード
		static Obj* mspTop;///< 先頭ノード
		static Obj* mspBottom;///< 終端ノード
		static int mCount;///< ノードの数
		
	};// List

};// Obj


		}
	}
}
}
#endif // !defined(AFX_OBJ_H__848EAA84_F65D_4C04_982A_EC1A7484C2E7__INCLUDED_)
