/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/* ***************************************************** */

/**
 * @file LinePerp1Tool.h
 * @brief MGLinePerp1Tool クラスのインターフェイス
 */
#if !defined(AFX_LINEPERP1TOOL_H__B8E3A376_C1ED_4AE7_AA4B_94F0D3D7405F__INCLUDED_)
#define AFX_LINEPERP1TOOL_H__B8E3A376_C1ED_4AE7_AA4B_94F0D3D7405F__INCLUDED_

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

#include "Common/LocateOnOBjects.h"

class MGStraight;

/// @class MGLinePerp1Tool LinePerp1Tool.h "CurveCmd/LinePerp1Tool.h"
///
/// Creates a line perpendicular from a curve.
class MGLinePerp1Tool : public MGLocateState{
public:
	explicit MGLinePerp1Tool(fugenDoc* pDoc);
	explicit MGLinePerp1Tool(MGCommandStateOwner* owner);
	virtual MGCommandBase* initial_clone(fugenDoc* pDoc)const;
	virtual bool OnKeyDown(fugenView* pView, UINT nChar, UINT nRepCnt, UINT nFlags);
	virtual bool OnLocated(const MGLocateInfo& info);
	virtual void do_make_temporary_display(mgSysGL& sgl,fugenView* pSView);

private:
	void prompt_message() const;
	void fix_start_pos();

	// m_line, m_line_t を更新
	void update_lines(const MGPosition& Plast);
	
	const MGCurve* m_curve; ///< 垂線をとるための曲線
	double         m_param; ///< 垂線をとる曲線のピック位置パラメータ

	std::unique_ptr<MGCurve>  m_line; ///< 一時描画用
	std::unique_ptr<MGCurve>  m_line_t; ///< 一時描画用 (接線)
	std::unique_ptr<MGStraight> m_line_fix;
	// _t というプレフィクスは tangent の頭文字からつけてみた

	// 各種オプション
	// ちなみに、これらはコマンドが正常終了しても記憶されない
	bool m_bBoth          : 1; ///< 1点目の入力の意味 (true 中点; false 始点)
};

#endif // !defined(AFX_LINEPERP1TOOL_H__B8E3A376_C1ED_4AE7_AA4B_94F0D3D7405F__INCLUDED_)
