/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
/********************************************************************/
/**
 * @file AttribTool.h
 * @brief クラス MGAttribTool の宣言
 */
#pragma once

#include "Common/CommandStateOwner.h"
#include "Common/SelectState.h"

/// @class MGAttribTool AttribTool.h "EditCmd/AttribTool.h"
/// [編集＞オブジェクトのプロパティ] のコマンドクラス。
class MGAttribTool : public MGCommandStateOwner
{
	MGPickObjects m_target; ///< プロパティを編集する対象

public:
	/// コンストラクター
	/// @param[in] pDoc コマンド対象ドキュメント
	explicit MGAttribTool(fugenDoc* pDoc);

	virtual MGCommandBase* initial_clone(fugenDoc* pDoc)const;
	virtual bool initiate_tool();

	/// 編集ターゲットアクセス
	//@{
	MGPickObjects& GetTarget();
	void SetTarget(const MGPickObjects& target);
	//@}
};

/// @class MGAttribSelectState
/// MGAttribTool のヘルパークラス。編集対象を一つ選択する。
class MGAttribSelectState : public MGSelectState
{
public:
	/// コンストラクター
	/// @param[in] pOwner この子状態を持つ親状態。
	explicit MGAttribSelectState(MGAttribTool* pOwner);

	virtual bool initiate_tool();

	virtual bool OnKeyDown(fugenView* window, UINT nChar, UINT nRepCnt, UINT nFlags);

private:
	MGAttribTool* state_owner()
	{
		return static_cast<MGAttribTool*>(get_owner_command());
	}
};

/// @class MGAttribEditState
/// MGAttribTool のヘルパークラス。要素のプロパティーを編集する。
class MGAttribEditState : public MGCommandBase
{
public:
	/// コンストラクター
	/// @param[in] pOwner この子状態を持つ親状態。
	explicit MGAttribEditState(MGAttribTool* pOwner);

	virtual bool initiate_tool();

private:
	MGAttribTool* state_owner()
	{
		return static_cast<MGAttribTool*>(get_owner_command());
	}

	bool execute();
};
