/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/* ***************************************************** */
/********************************************************************/
#pragma once
#include "Undo/ActionBase.h"
#include "mg/Plane.h"

struct IPlaneActionTarget;

/// @class CPlaneAction PlaneAction.h "Undo/PlaneAction.h"
///
/// クラス CPlaneAction は各ビューに持っている作業平面の変更を表現する。
/// ビューベースのアクションなので、GelAction とは異なる振る舞いをする。
class CPlaneAction : public CActionBase
{
	MGPlane m_plOld; ///< オリジナルの作業平面の形状
	MGPlane m_plNew; ///< 修正後の作業平面の形状

public:
	/// 標準形コンストラクター
	/// @param[in] pView 作業平面を持つビュー。
	/// @param[in] pl 変更後の作業平面の幾何情報。
	CPlaneAction(IPlaneActionTarget* pView, const MGPlane& pl);

	/// デストラクタ
	virtual ~CPlaneAction();

	virtual void Do();
	virtual void Redo();
	virtual void Undo();

	// サブクラス固有のメソッド群

	IPlaneActionTarget* GetTargetView();

	/// オリジナルの作業平面
	const MGPlane& GetOldPlane() const;
	void SetOldPlane(const MGPlane& pl);

	/// 変更後の作業平面
	const MGPlane& GetNewPlane() const;
	void SetNewPlane(const MGPlane& pl);

private:
	void updatePlaneView(const MGPlane& pl);
};
