/*-----------------------------------------------------------------------------
[名称]	CommandModify.cpp
[概要]	行差し替えコマンドクラスの実装
[備考]	なし
[履歴]	2003-03-10	NC		新規作成(moralog)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "Shitarabian.h"
#include "CommandModify.h"
#include "ShitarabianDoc.h"
#include "CommandInput.h"
#include "CommandCaret.h"
#include "Common.h"
#include "EmphasisDefine.h"
#include "GeneralSetting.h"

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


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CCommandModify::CCommandModify()
:	m_idxRow( 0 )
,	m_strNewLine()
,	m_strOldLine()
,	m_nLine( 0 )
{
}


/*-----------------------------------------------------------------------------
[名称]	デストラクタ
[機能]	インスタンスの破棄。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CCommandModify::~CCommandModify()
{

}


/*-----------------------------------------------------------------------------
[名称]	複製
[機能]	新しいインスタンスを生成して複製する。
[戻値]	ICommand*	複製されたインスタンスへのポインタ [-] (-)
[備考]	なし
-----------------------------------------------------------------------------*/
ICommand*	CCommandModify::Duplicate()
{
	ICommand*	pcmdNew;

	pcmdNew = new CCommandModify;
	pcmdNew->Copy( *this );

	return( pcmdNew );
}


/*-----------------------------------------------------------------------------
[名称]	複製
[機能]	新しいインスタンスを生成して複製する。
[戻値]	ICommand*	複製されたインスタンスへのポインタ [-] (-)
[備考]	なし
-----------------------------------------------------------------------------*/
void		CCommandModify::Copy(
	ICommand&	cmdSrc			// I  :コピー元インスタンス [-] (-) :-
)
{
	CCommandModify*	pModify;
	pModify = dynamic_cast<CCommandModify*>(&cmdSrc);

	if ( pModify != NULL )
	{
		m_idxRow = pModify->m_idxRow;
		m_strNewLine = pModify->m_strNewLine;
		m_strOldLine = pModify->m_strOldLine;
		m_nLine = pModify->m_nLine;
	}
	else
	{
		// 異なる型のコピーをしようとした
		ASSERT( FALSE );
	}
}


/*-----------------------------------------------------------------------------
[名称]	実行
[機能]	行差し替えコマンドを実行する。
[戻値]	BOOL	処理結果 [-] (TURE:成功、FALSE:失敗)
[備考]	SetAttribute()されていること。
-----------------------------------------------------------------------------*/
BOOL		CCommandModify::Execute(
	CShitarabianDoc* pDoc		// I  :操作対象ドキュメント [-] (-) :-
)
{
	// もし複数行であればそのように
	long		nLine;
	CStringList	lstAddz;
	{
		CString		strDelimiter( pDoc->ReturnChar() );
		nLine = ::StringToList(
			m_strNewLine,
			&lstAddz,
			strDelimiter
		);
	}

	// 属性の補完
	m_strOldLine = *(pDoc->GetLine( m_idxRow ));
	m_nLine = nLine;

	// 行の挿入
	switch ( nLine )
	{
	case 0:
		pDoc->GetEmphasisLine( m_idxRow )->SetString( "" );
// please! うまくいかないなー
//		// 行を削除する
//		pDoc->DeleteLine( m_idxRow );
////		// （行を削除したのでインデクス情報を再構築）
////		pDoc->GetPosition( 0 );
		return( TRUE );
		break;
	case 1:
		pDoc->GetEmphasisLine( m_idxRow )->SetString( m_strNewLine );
		// DetailEmphasisの破棄を伴う
		break;
	default:
		// １行目は上書きする
		pDoc->GetEmphasisLine( m_idxRow )->SetString( lstAddz.GetHead() );
		// ２行目以降を挿入する
		lstAddz.RemoveHead();
		pDoc->InsertLinez(
			m_idxRow+1,
			lstAddz
		);
		break;
	}

	// 表示色解析
	pDoc->GetEmphasisLine( m_idxRow )->SetMultiLineEmphasisAnalized( FALSE );
	pDoc->AnalizeMultiLineEmphasis(
		CGeneralSetting::GetInstance()->GetEmphasisDefine(),
		m_idxRow
	);

	// 再描画情報更新
	if ( nLine == 1 )
	{
	// 行数変更なし
		pDoc->SetUpdateStartRow( m_idxRow );
		pDoc->SetUpdateEndRow( m_idxRow );
	}
	else
	{
	// 行数変更あり
		pDoc->SetUpdateStartRow( m_idxRow );
		pDoc->SetUpdateEndRow( AllRow );
	}

	return( TRUE );
}


/*-----------------------------------------------------------------------------
[名称]	取り消し
[機能]	行差し替えコマンドを取り消す。
[戻値]	BOOL	処理結果 [-] (TURE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL		CCommandModify::UnExecute(
	CShitarabianDoc* pDoc		// I  :操作対象ドキュメント [-] (-) :-
)
{
	// 行の差し替え
	pDoc->GetEmphasisLine( m_idxRow )->SetString( m_strOldLine );
	pDoc->GetEmphasisLine( m_idxRow )->SetMultiLineEmphasisAnalized( FALSE );

	// 行の削除
	pDoc->DeleteLinez( m_idxRow+1, m_nLine-1 );

	// 表示色解析
	pDoc->AnalizeMultiLineEmphasis(
		CGeneralSetting::GetInstance()->GetEmphasisDefine(),
		m_idxRow
	);

	// 再描画情報更新
	if ( m_nLine == 1 )
	{
	// 行数変更なし
		pDoc->SetUpdateStartRow( m_idxRow );
		pDoc->SetUpdateEndRow( m_idxRow );
	}
	else
	{
	// 行数変更あり
		pDoc->SetUpdateStartRow( m_idxRow );
		pDoc->SetUpdateEndRow( AllRow );
	}

	return( TRUE );
}


/*-----------------------------------------------------------------------------
[名称]	属性設定
[機能]	インスタンスの属性を設定する。
[戻値]	なし
[備考]	Execute()前に必ず行っておくこと。
-----------------------------------------------------------------------------*/
void		CCommandModify::SetAttribute(
	long		idxRow,					// 差し替え対象位置 [行] (-)
	CString&	strNewLine				// 差し替え文字列 [-] (-)
)
{
	m_idxRow =		idxRow;
	m_strNewLine =	strNewLine;
}


