#include "stdafx.h"
#include "refCActivity.h"

namespace FDK
{
// public:

	CActivity::CActivity()
	{
		//this->Disposed = gcnew CDisposed();

		this->_b活性化してる = gcnew CAtom<bool>( false );
		this->_b初めての進行 = gcnew CAtom<bool>( true );
		this->list子Activities = gcnew List<CActivity^>();
	}

	// 活性化・非活性化は子Activitiesへ再帰する。

	void CActivity::t活性化()
	{
		//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );

		if( this->b活性化してる )
			return;

		this->b活性化してる = true;
		this->b初めての進行 = true;

		// すべての 子Activity について再帰的に活性化。
		for each( CActivity^ activity in this->list子Activities )
			activity->t活性化();

		// 自分の活性化とデバイスリソースの作成。（子Activityを修正できるように、自分が後。）
		this->On活性化();
		this->Onデバイスリソースの作成();
	}
	void CActivity::t非活性化()
	{
		//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );

		if( this->b活性化してない )
			return;

		this->b活性化してない = true;

		// 自分の非活性化とデバイスリソースの解放。（子Activityを修正できるように、自分が先。）
		this->On非活性化();
		this->Onデバイスリソースの解放();

		// すべての 子Activity について再帰的に非活性化。
		for each( CActivity^ activity in this->list子Activities )
			activity->t非活性化();
	}
	
	//進行・描画前・描画については子Activitiesへの再帰呼び出しは行わない。必要な時に必要な順番で呼び出すこと。
	
	int CActivity::t進行()
	{
		//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );

		if( this->b活性化してない )
			return -1;		// 活性化していないときは -1 を返す。

		return this->On進行();
	}
	void CActivity::t描画前()
	{
		//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );

		if( this->b活性化してない )
			return;

		this->On描画前();
	}
	void CActivity::t描画( IntPtr hDevice )
	{
		//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );

		if( this->b活性化してない )
			return;

		Debug::Assert( !hDevice.Equals( IntPtr::Zero ) );

		this->On描画( hDevice );
	}

	// デバイスリソースの作成・解放は子Activitiesへ再帰する。

	void CActivity::tデバイスリソースの作成()
	{
		//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );

		if( this->b活性化してない )
			return;

		// 自分について作成。
		this->Onデバイスリソースの作成();

		// すべての 子Activity について再帰的に作成。
		for each( CActivity^ activity in this->list子Activities )
			activity->Onデバイスリソースの作成();
	}
	void CActivity::tデバイスリソースの解放()
	{
		//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );

		if( this->b活性化してない )
			return;

		// すべての 子Activity について再帰的に解放。
		for each( CActivity^ activity in this->list子Activities )
			activity->Onデバイスリソースの解放();

		// 自分について解放。
		this->Onデバイスリソースの解放();
	}
}