/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
// fugenDoc7.cpp : fugenDoc クラスの動作の定義を行います。

#include "stdafx.h"
#include "fugenDoc.h"
#include "Undo/IActionTarget.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// メニュー[サーフェイス表示]のCOMMANDイベント関数
void fugenDoc::OnViewShading()
{
	ChangeViewMode(MGCL::SHADINGVIEW);
}

// メニュー[サーフェイス表示]のUPDATECOMMANDイベント関数
void fugenDoc::OnUpdateViewShading(CCmdUI *pCmdUI)
{
	pCmdUI->SetRadio(GetViewMode() == MGCL::SHADING);
}

// メニュー[ワイヤーフレーム表示]のCOMMANDイベント関数
void fugenDoc::OnViewWireframe()
{
	ChangeViewMode(MGCL::WIREVIEW);
}

// メニュー[ワイヤーフレーム表示]のUPDATECOMMANDイベント関数
void fugenDoc::OnUpdateViewWireframe(CCmdUI *pCmdUI)
{
	pCmdUI->SetRadio(GetViewMode() == MGCL::WIRE);
}

// メニュー[ワイヤー・サーフェイス表示]のCOMMANDイベント関数
void fugenDoc::OnViewWireAndShading()
{
	ChangeViewMode(MGCL::WIRE_AND_SHADINGVIEW);
}

// メニュー[ワイヤー・サーフェイス表示]のUPDATECOMMANDイベント関数
void fugenDoc::OnUpdateViewWireAndShading(CCmdUI *pCmdUI)
{
	pCmdUI->SetRadio(GetViewMode() == MGCL::WIRE_AND_SHADING);
}

void fugenDoc::ChangeViewMode(MGCL::VIEWMODE mode, bool bNotify)
{
	// 現在と同じモードを指定された場合は処理をしない
	if(mode == GetViewMode()){
		return;
	}

	m_viewMode=mode;

	// 必要ならば関連するビューを更新する。普通は必要。
	CWaitCursor wait;
	if(bNotify){
		UpdateAllStdViews();
	}

	// check post-condition
	ASSERT(GetViewMode() == mode);
}

// IActionTarget

IActionManager* fugenDoc::GetActionManager()
{
	return m_undoManager.get();
}

const IActionManager* fugenDoc::GetActionManager() const
{
	return m_undoManager.get();
}

void fugenDoc::SetActionManager(IActionManager* pMgr)
{
	//m_undoManager.reset(pMgr);
}

bool fugenDoc::IsDirty()const{
	fugenDoc* dc=const_cast<fugenDoc*>(this);
	return dc->IsModified() ? true:false;
}

void fugenDoc::SetDirtyFlag(bool bDirty){
	SetModifiedFlag(bDirty);
}

// StatusMessageまわり

void fugenDoc::SetStatusMessage(const CString& str){
	::AfxGetMainWnd()->SendMessage(
		WM_GL_STATUSBAR, 0, (LPARAM)(LPCTSTR)str);
}

// ステータスバーに表示する文字列を更新する
void fugenDoc::SetStatusMessage(UINT nIDS, ...){
	CString strDisplay;
	CString strFormat;
	VERIFY(strFormat.LoadString(nIDS));

	va_list argList;
	va_start(argList, nIDS);
	strDisplay.FormatV(strFormat, argList);
	va_end(argList);

	// ステータスバーに表示する
	SetStatusMessage(strDisplay);
}
