#if !defined(AFX_SPLINECURVEUPDATETANGENTTOOL_H__1DDFF931_BB1A_4112_B57C_4BB069442872__INCLUDED_)
#define AFX_SPLINECURVEUPDATETANGENTTOOL_H__1DDFF931_BB1A_4112_B57C_4BB069442872__INCLUDED_

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

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

// class MGSplineCurveUpdateTangentTool
//
// 接ベクトル変更コマンド
class MGSplineCurveUpdateTangentTool : public MGCommandStateOwner{
public:
	explicit MGSplineCurveUpdateTangentTool(fugenDoc* pDoc);
	virtual MGCommandBase* initial_clone(fugenDoc* pDoc)const;
	virtual bool initiate_tool();

private:
	bool m_target_is_start; // 変更する接ベクトルが始点側ならtrue、終点側ならfalse
	MGPickObject m_pickedCurve; // ピックされた曲線
	MGLBRep* m_targetCurve; // Original Curve
	std::unique_ptr<MGLBRep> m_curve; // 接ベクトル変更後の曲線

	friend class MGSplineCurveSelectTarget;
	friend class MGSplineCurveUpdateTangent;
};

// class MGSplineCurveSelectTarget
// 
// 接ベクトルを変更する曲線を選択する state
class MGSplineCurveSelectTarget : public MGSelectState{
public:
	MGSplineCurveSelectTarget(MGSplineCurveUpdateTangentTool* owner);
	MGSplineCurveUpdateTangentTool* state_owner(){
		return static_cast<MGSplineCurveUpdateTangentTool*>(get_owner_command());
	}

	virtual bool initiate_tool();
	virtual bool OnSelected(fugenView* pView, MGPickObjects&, MGPickObjects&);
};

// class MGSplineCurveUpdateTangent
// 
// 変更する制御点をマウスで指定する state
class MGSplineCurveUpdateTangent : public MGLocateState{
public:
	MGSplineCurveUpdateTangent(MGSplineCurveUpdateTangentTool* owner);
	MGSplineCurveUpdateTangentTool* state_owner(){
		return static_cast<MGSplineCurveUpdateTangentTool*>(get_owner_command());
	}

	virtual bool OnLocated(const MGLocateInfo& info);
	virtual bool initiate_tool();
	virtual bool OnKeyDown(fugenView* pView, UINT nChar, UINT nRepCnt, UINT nFlags);
	virtual void do_make_temporary_display(mgSysGL& sgl,fugenView* pSView);
};

#endif // !defined(AFX_SPLINECURVEUPDATETANGENTTOOL_H__1DDFF931_BB1A_4112_B57C_4BB069442872__INCLUDED_)
