/*-----------------------------------------------------------------------------
[名称]	BoxSelection.cpp
[概要]	BOX選択クラスの実装
[備考]	なし
[履歴]	2003-02-24	NC		コメント付加(moralog)
		2004-05-31	b040111 (4419)フローティング開始時の高速化(moralog)
-----------------------------------------------------------------------------*/


//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "Shitarabian.h"
#include "BoxSelection.h"
#include "ShitarabianDoc.h"
#include "EditDrawer.h"
#include "WhitespaceDefine.h"
#include "GeneralSetting.h"
#include "CommandMultiEdit.h"
#include "Padding.h"
#include "CommandDelete.h"
#include "CommandInput.h"
#include "CommandManager.h"
#include "ExeCommon.h"
#include "EmphasisLine.h"


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


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CBoxSelection::CBoxSelection()
{

}


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

}


/*-----------------------------------------------------------------------------
[名称]	選択状態判定
[機能]	選択中テキストがあるかを確認する。
[戻値]	BOOL	選択状態 [-] (TRUE:選択中、FALSE:選択中でない)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL	CBoxSelection::IsSelected()
{
	int		idxRow;
	for ( idxRow=0 ; idxRow<m_atSelectColumnz.GetSize() ; idxRow++ )
	{
		int		iStartColumn = m_atSelectColumnz[ idxRow].idxStart;
		int		iEndColumn = m_atSelectColumnz[ idxRow ].idxEnd;
		if ( iStartColumn < iEndColumn )
		{
			return( TRUE );
		}
	}

	return( FALSE );
}


/*-----------------------------------------------------------------------------
[名称]	選択状態初期化
[機能]	選択状態を解除する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void	CBoxSelection::SetSelectedNutral()
{
	m_lSelectEndX = m_lSelectStartX;
	m_lSelectEndY = m_lSelectStartY;
	m_atSelectColumnz.RemoveAll();
}


/*-----------------------------------------------------------------------------
[名称]	選択判定
[機能]	選択された文字かを判定する。
[戻値]	BOOL	選択状態 [-] (TRUE:選択されている、FALSE:選択されていない)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL	CBoxSelection::IsSelected(
	long	idxRow,			// I  :行　[-] (-) :-
	long	idxColumn		// I  :カラム [-] (-) :-
)
{
	long	lStartRow = GetSelectedStartRow();

	if ( lStartRow <= idxRow )
	if ( idxRow < lStartRow + m_atSelectColumnz.GetSize() )
	{
		int		iStartColumn = m_atSelectColumnz[ idxRow-lStartRow ].idxStart;
		int		iEndColumn = m_atSelectColumnz[ idxRow-lStartRow ].idxEnd;
		if ( iStartColumn <= idxColumn )
		if ( iEndColumn > idxColumn )
		if ( iStartColumn < iEndColumn )
		{
			return( TRUE );
		}
	}

	return( FALSE );
}


/*-----------------------------------------------------------------------------
[名称]	選択開始座標設定
[機能]	選択開始座標を設定する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void	CBoxSelection::SetSelectedStartPixel(
	CPoint&	ptStart			// I  :開始座標 [プレーンpixel] (-)
)
{
	m_lSelectStartX = ptStart.x;
	m_lSelectStartY = ptStart.y;
}


/*-----------------------------------------------------------------------------
[名称]	選択終了座標設定
[機能]	選択終了座標を設定する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void	CBoxSelection::SetSelectedEndPixel(
	CPoint&	ptEnd			// I  :終了座標 [文書座標pixel] (-)
)
{
	m_lSelectEndX = ptEnd.x;
	m_lSelectEndY = ptEnd.y;

	PixelToLinezReflect();
}


/*-----------------------------------------------------------------------------
[名称]	BOX選択領域更新
[機能]	開始・終了座標から、BOX選択領域（行ごとの選択カラム）を更新する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CBoxSelection::PixelToLinezReflect()
{
	CEditDrawer*		pDrawer = CEditDrawer::GetInstance();

	long	lStartRow = pDrawer->PixelToCaretRow( GetSelectedStartY(), m_pDoc); 
	long	lEndRow =  pDrawer->PixelToCaretRow( GetSelectedEndY(), m_pDoc); 

	long	lStartX = GetSelectedStartX();
	long	lEndX = GetSelectedEndX();

	m_atSelectColumnz.RemoveAll();
	m_atSelectColumnz.SetSize( lEndRow - lStartRow+1 );
	long	idxRow;
	for( idxRow=lStartRow ; idxRow<=lEndRow ; idxRow++ )
	{
		CEmphasisLine*	pEmphasisLine = m_pDoc->GetEmphasisLine( idxRow );
		if ( pEmphasisLine != NULL )
		{
			TSelectColumn	tColumn;
			tColumn.idxStart = 0;
			tColumn.idxEnd = 0;
			tColumn.idxStart = pEmphasisLine->PixelToCaretColumn(
				lStartX,
				FALSE
			);
			tColumn.idxEnd = pEmphasisLine->PixelToCaretColumn(
				lEndX,
				FALSE
			);
			m_atSelectColumnz.SetAt( idxRow-lStartRow, tColumn );
		}
	}

	// 基底クラスの属性を一応設定
	if ( m_atSelectColumnz.GetSize() > 0 )
	{
		CSelection::SetSelectedStart(
			lStartRow,
			m_atSelectColumnz[ 0 ].idxStart
			);
		CSelection::SetSelectedEnd(
			lEndRow,
			m_atSelectColumnz[ m_atSelectColumnz.GetSize()-1 ].idxEnd
		);
	}
	else
	{
		CSelection::SetSelectedStart(
			lStartRow,
			0
			);
		CSelection::SetSelectedEnd(
			lStartRow,
			0
		);
	}
}


/*-----------------------------------------------------------------------------
[名称]	選択文字列取得（パディングあり）
[機能]	選択文字列を取得し左側にパディングする。
[戻値]	BOOL	処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	COPY、CUT操作用処理。
		選択行がなくてもTRUEを戻す。

	pLeftOffsetで返るズレとは。
		|　　 ＿＿＿＿＿＿＿＿
		|　　|あ　　　　　　　|
		|　　|　 　＿＿＿ 　　|
		|　　|　　|い_|￣|＿　|
		|　　|←→|　|＿う＿| |
		|　　|　　|　 　|_|　 |
		|　　￣￣￣￣￣￣￣￣￣
		あ：選択範囲
		い：パディング
		う：有効な文字
		←→：ズレ

-----------------------------------------------------------------------------*/
BOOL CBoxSelection::GetSelectedLinezWithPadding(
	CStringArray*	pastrLinez,		// I   : BOX選択カラム群 [-] (-)
	long*			pLeftOffset		//   O : パディングによって生じる元のX位置とのズレ [-] (-)
)
{
	// 結果初期化
	pastrLinez->RemoveAll();

	// 選択行が無ければ処理しない
	if ( m_atSelectColumnz.GetSize() <= 0 )
	{
		return( TRUE );
	}

	// 選択行取得
	long	lStartRow = GetSelectedStartRow(); 
	long	lEndRow =  GetSelectedEndRow(); 

	// ピクセル計算のためDCを取得
	CEditDrawer*		pDrawer = CEditDrawer::GetInstance();
	HDC		hdc = ::GetDC( NULL );
	CDC		DC;
	DC.Attach( hdc );
	{

// ▼ (4419) BGN 2004.05.31 (moralog) フローティング開始時の高速化
		// 優先度最高の空白幅取得
		long	lWhitespaceWidth = 0;
		CWhitespaceDefine*	pWhitespace = CGeneralSetting::GetInstance()->GetWhitespace();
		CArray<TWhiteSpace, TWhiteSpace&>*	paCharz = pWhitespace->GetCharz();
		{
			if ( paCharz->GetSize() > 0 )
			{
				lWhitespaceWidth = pDrawer->GetCharWidth( &DC, paCharz->GetAt(0).strChar );
			}
		}
// ▲ (4419) END

		// 各選択行の、選択開始位置をPixelで得る
		long	lMinLeft =-1;
		CArray<int, int&> aLeftz;
		{
			aLeftz.SetSize( m_atSelectColumnz.GetSize() );
			long	idxRow;
			for( idxRow=lStartRow ; idxRow<=lEndRow ; idxRow++ )
			{
				long idxLine = idxRow - lStartRow;

// ▼ (4419) BGN 2004.06.01 (moralog) フローティング開始時の左余白最適化
				// 左端開始位置が空白ならば空白でない文字まで走査
				CPadding	Padding;
				m_atSelectColumnz[idxLine].idxStart = Padding.NextBlackSpaceColumn(
					*m_pDoc->GetLine( idxRow ),
					m_atSelectColumnz[idxLine].idxStart,
					*paCharz
				);
// ▲ (4419) END

				CEmphasisLine*	pEmphasisLine = m_pDoc->GetEmphasisLine( idxRow );
				if ( pEmphasisLine != NULL )
				{
				// 選択されたカラムのピクセル位置を得る

					// 有効文字開始位置のピクセル座標を得る
					long	lLeft = 0;
					lLeft = pEmphasisLine->CaretColumnToPixel(
						m_atSelectColumnz[idxLine].idxStart
					);
					aLeftz[ idxLine ] = lLeft;
					if ( lMinLeft < 0 )
					{
						lMinLeft = lLeft;
					}
					else
					if ( lMinLeft > lLeft )
					{
						lMinLeft = lLeft;
					}
				}
				else
				{
					// 途中でエラー行にぶち当たったらそこで終了
					lEndRow = idxRow-1;
					break;
				}
			}

			// 左端の余白を取り除く
			for( idxRow=lStartRow ; idxRow<=lEndRow ; idxRow++ )
			{
				long idxLine = idxRow - lStartRow;
				aLeftz[ idxLine ] = max( 0, aLeftz[ idxLine ] - lMinLeft );
				TRACE( "%d\n", aLeftz[ idxLine ] );
			}
		}

// ▼ (4419) BGN 2004.05.31 (moralog) フローティング開始時の高速化
		long	lOffset = lWhitespaceWidth*20;	// 優先度最高空白20から開始
/*
// ▽ oridinal BGN
		// 優先度最高の空白幅取得
		long	lWhitespaceWidth = 0;
		CWhitespaceDefine*	pWhitespace = CGeneralSetting::GetInstance()->GetWhitespace();
		CArray<TWhiteSpace, TWhiteSpace&>*	paCharz = pWhitespace->GetCharz();
		{
			if ( paCharz->GetSize() > 0 )
			{
				lWhitespaceWidth = pDrawer->GetCharWidth( &DC, paCharz->GetAt(0).strChar );
			}
		}

		long	lOffset = 0;
// △ oridinal END
*/
// ▲ (4419) END
		long	lMinGap = lWhitespaceWidth;
		long	lNiceOffset = 0;

		CPadding	Padding;

		if ( lWhitespaceWidth > 0 )
		// 最長制限チェック。
		while( lOffset < 500 )
		{
			// パディング幅を少しづつ長くして、全行満足する左余白パディング幅を得る
			// 1pixelづつ伸ばすのはアレなので、優先度最高の空白幅づつ伸ばしてみる

			long	lGap = 0;
			long	idxRow;
			for( idxRow=0 ; idxRow<aLeftz.GetSize() ; idxRow++ )
			{
				CString			strDstLine;
				// 全行についてパディング検査

				// ズレの累積を取る
				lGap += Padding.Padding(
					&DC,
					lOffset+aLeftz[idxRow],		// [Pixel]
					strDstLine,
					*pWhitespace->GetCharz(),
					TRUE
				);
			}

			// もっともズレの少なかったパディングを選択。
			if ( lGap < lMinGap )
			{
				lMinGap = lGap;
				lNiceOffset = lOffset;
			}
			if ( lGap == 0 )
			{
				break;
			}

			// 優先度最高の空白を全行にパディング扱い
			lOffset += lWhitespaceWidth;
		}

		TRACE( "最適パディング幅 = %d pixel\n", lNiceOffset );

		long	idxRow;
		for( idxRow=0 ; idxRow<m_atSelectColumnz.GetSize() ; idxRow++ )
		{
			CString						strOffset;
			// 全行についてパディング検査

			long lGap = Padding.Padding(
				&DC,
				lNiceOffset+aLeftz[idxRow],		// [Pixel]
				strOffset,
				*pWhitespace->GetCharz()
			);

			CString*	pstrSrcLine = m_pDoc->GetLine( idxRow+lStartRow );
			if ( pstrSrcLine != NULL )
			{
				long	idxColumnStart = m_atSelectColumnz[idxRow].idxStart;
				long	idxColumnEnd = m_atSelectColumnz[idxRow].idxEnd;

				long	idxByteStart = ::CaretColumnToByteColumn( *pstrSrcLine, idxColumnStart );
				long	idxByteEnd = ::CaretColumnToByteColumn( *pstrSrcLine, idxColumnEnd );

				// 合成してパディング済み行を得る
				CString		strLine = strOffset + pstrSrcLine->Mid( idxByteStart, idxByteEnd-idxByteStart );

				// デバッグ情報...
				{
					TRACE("%s%s|(gap=%d) ｽﾞﾚ=%d\n",
						strOffset,
						pstrSrcLine->Mid( idxByteStart, idxByteEnd-idxByteStart ),
						aLeftz[idxRow],
						lGap
					);
				}
				pastrLinez->Add( strLine );
			}
		}

// ▼ (4419) BGN 2004.05.31 (moralog) 先頭空白の同じパターンを除去
		// 先頭空白の同じパターンを除去する
		if( pastrLinez->GetSize() > 0 )
		{
			long		idxLine;
			CString		strSame = (*pastrLinez)[0];
			int			iMaxByte = strSame.GetLength();

			// 同じパターンの長さを得る
			for( idxLine=0 ; idxLine<pastrLinez->GetSize() ; idxLine++ )
			{
				CString		strLine = (*pastrLinez)[idxLine];

				// 空白以外文字までのバイト数を得る
				{
					int		iMaxColumn = Padding.NextBlackSpaceColumn(
						strLine,
						0,
						*paCharz
					);
					iMaxByte = min( iMaxByte, ::CaretColumnToByteColumn( strLine, iMaxColumn ) );
				}

				{
					// どこまで同じ？
					int			idxByte;
					LPCTSTR		pCharA = (LPCTSTR)strSame;
					LPCTSTR		pCharB = (LPCTSTR)(*pastrLinez)[idxLine];
					for( idxByte=0 ; idxByte<iMaxByte ; idxByte++ )
					{
						if ( pCharA[idxByte] != pCharB[idxByte] )
						{
							break;
						}
					}
					iMaxByte = min( iMaxByte, idxByte );
				}
			}

			for( idxLine=0 ; idxLine<pastrLinez->GetSize() ; idxLine++ )
			{
				// 左余白トリム
				CString		strTmp = (*pastrLinez)[idxLine].Mid( iMaxByte );
				// 右余白の除去
				(*pastrLinez)[idxLine] = Padding.TrimRight( strTmp, *paCharz );
			}

//			lMinLeft = pDrawer->StringToPixelX(
//				strSame.Left( iMaxByte ),
//				&DC
//			);
		}
// ▲ (4419) END

		// ズレを返す
		*pLeftOffset = lMinLeft-GetSelectedStartX();
	}
	DC.Detach();
	::ReleaseDC( NULL, hdc );

	return(TRUE);
}


/*-----------------------------------------------------------------------------
[名称]	選択文字列取得
[機能]	選択文字列を１行の文字列として取得する。
[戻値]	CString		選択文字列 [-] (-)
[備考]	なし
-----------------------------------------------------------------------------*/
CString	CBoxSelection::GetSelectedText()
{
	if ( m_pDoc == NULL )
	{
		return( _T("") );
	}

	// 選択行を取得
	CStringArray	astrLinez;
	long			lLeftGap;
	GetSelectedLinezWithPadding(
		&astrLinez,
		&lLeftGap
	);

	CString		strSelectedText;
	strSelectedText += astrLinez[ 0 ];
	for(int idxLine=1 ; idxLine<astrLinez.GetSize() ; idxLine++)
	{
		// 行を改行で連結
			strSelectedText += m_pDoc->ReturnChar();
			strSelectedText += astrLinez[ idxLine ];
	}

	return( strSelectedText );
}


/*-----------------------------------------------------------------------------
[名称]	選択文字列クリア
[機能]	選択文字列を空白に置き換える。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CBoxSelection::BoxClear() 
{
	CEditDrawer*	pDrawer = CEditDrawer::GetInstance();
	CShitarabianDoc* pDoc = m_pDoc;

	// Box選択範囲のクリア
	CCommandMultiEdit	cmdEdit;

	// 選択範囲に対して、
	//	選択範囲を前に拡張（空白部分を追加）
	//	選択範囲を後ろに拡張（空白部分を追加）

	int		idxStartRow = GetSelectedStartRow();
	CArray<TSelectColumn, TSelectColumn&>*	pLinez;
	pLinez = GetSelectedLinez();

	HDC hdc = ::GetDC( NULL );
	CDC*		pDC = CDC::FromHandle( hdc );
	
	if ( pDC == NULL )
	{
		return;
	}

	for( int idxLine=0 ; idxLine<pLinez->GetSize() ; idxLine++ )
	{
		// ピクセル長さを得る
		int		iBlankLength;
		{
			int			iStartPixelX = 0;
			int			iEndPixelX = 0;
			CEmphasisLine*	pEmphasisLine = pDoc->GetEmphasisLine( idxStartRow+idxLine );
			if ( pEmphasisLine != NULL )
			{
				iStartPixelX = pEmphasisLine->CaretColumnToPixel(
					pLinez->GetAt(idxLine).idxStart
				);
				iStartPixelX = pDrawer->PixelToZoomedPixel( iStartPixelX );

				iEndPixelX = pEmphasisLine->CaretColumnToPixel(
					pLinez->GetAt(idxLine).idxEnd
				);
				iEndPixelX = pDrawer->PixelToZoomedPixel( iEndPixelX );
			}
			iBlankLength = iEndPixelX - iStartPixelX;
		}

		// 選択部分の削除
		CCommandDelete	cmdDelete;
		cmdDelete.SetAttribute(
			idxStartRow+idxLine,
			pLinez->GetAt(idxLine).idxStart,
			idxStartRow+idxLine,
			pLinez->GetAt(idxLine).idxEnd
		);
		cmdEdit.Add( cmdDelete );

		// 空白の挿入
		{
			// 削除文字列の長さの空白を得る
			CString		strBlankz;
			{
				CPadding	Padding;
				CWhitespaceDefine*	pWhitespace = CGeneralSetting::GetInstance()->GetWhitespace();
				Padding.Padding(
					pDC,
					iBlankLength,		// [Pixel]
					strBlankz,
					*pWhitespace->GetCharz()
				);
			}

			// 挿入コマンドの登録
			CCommandInput	cmdInput;
			cmdInput.SetAttribute(
				strBlankz,
				idxStartRow+idxLine,
				pLinez->GetAt(idxLine).idxStart
			);
			cmdEdit.Add( cmdInput );
		}
	}

	::ReleaseDC( NULL, hdc );

	// please! Addしてから設定したほうがよさげ
	cmdEdit.Execute( pDoc );

	// コマンドマネージャに登録
	CCommandManager*	pCmd = CCommandManager::GetInstance();
	pCmd->Add( cmdEdit );
	// please! Addしてから設定したほうがよさげ

	// 選択状態の解除
	SetSelectedNutral();
}


/*-----------------------------------------------------------------------------
[名称]	行選択情報更新
[機能]	行ごとの選択情報を微調整する。
[戻値]	なし
[備考]	Ctrlを押しながらBOX選択領域周辺をクリックすることで
		BOX選択領域の大きさ（幅）を調整する機能。
		クリックされたほうに近い端（左右）が拡張／縮退される。
-----------------------------------------------------------------------------*/
void	CBoxSelection::SetLineInfo(
	int	idxRow,				// I  :行　[-] (-) ;- 
	int	idxColumn			// I  :カラム [-] (-) :-
)
{
	int		idxStartRow = GetSelectedStartRow();
	int		idxEndRow = GetSelectedEndRow();

	// 選択行内？
	if ( idxRow >= idxStartRow )
	if ( idxRow <= idxEndRow )
	{
		CArray<TSelectColumn, TSelectColumn&>*	pLinez;
		pLinez = GetSelectedLinez();

		// カラム位置によって左端か右端か決める
		int	iLeftDistance = pLinez->GetAt( idxRow-idxStartRow ).idxStart - idxColumn;
		int	iRightDistance = pLinez->GetAt( idxRow-idxStartRow ).idxEnd - idxColumn;

		// 上書き設定
		if( abs( iLeftDistance ) < abs( iRightDistance ) )
		{
			(*pLinez)[ idxRow-idxStartRow ].idxStart = idxColumn;
		}
		else
		{
			(*pLinez)[ idxRow-idxStartRow ].idxEnd = idxColumn;
		}

	}
}


/*-----------------------------------------------------------------------------
[名称]	行選択情報更新
[機能]	行ごとの選択情報を再設定する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void	CBoxSelection::SetLineInfo(
	int	idxRow,					// I  :行　[-] (-)
	int	idxStartColumn,			// I  :開始カラム [-] (-) :-
	int	idxEndColumn			// I  :終了カラム [-] (-) :-
)
{
	int		idxStartRow = GetSelectedStartRow();
	int		idxEndRow = GetSelectedEndRow();

	// 選択行内？
	if ( idxRow >= idxStartRow )
	if ( idxRow <= idxEndRow )
	{
		CArray<TSelectColumn, TSelectColumn&>*	pLinez;
		pLinez = GetSelectedLinez();

		// 上書き設定
		(*pLinez)[ idxRow-idxStartRow ].idxStart = idxStartColumn;
		(*pLinez)[ idxRow-idxStartRow ].idxEnd = idxEndColumn;
	}
}


/*-----------------------------------------------------------------------------
[名称]	選択座標設定
[機能]	BOX選択の開始Y位置を設定する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void	CBoxSelection::SetSelectedStartY(
	long	idxSelectY				// I  :開始座標　[Pixel] (-)
)
{
	if ( m_lSelectStartY < m_lSelectEndY )
	{
		m_lSelectStartY = idxSelectY;
	}
	else if ( m_lSelectStartY > m_lSelectEndY )
	{
		m_lSelectEndY = idxSelectY;
	}
	else
	{
		if ( m_lSelectStartX < m_lSelectEndX)
		{
			m_lSelectStartY = idxSelectY;
		}
		else
		{
			m_lSelectEndY = idxSelectY;
		}
	}
}


/*-----------------------------------------------------------------------------
[名称]	選択座標設定
[機能]	BOX選択の終了Y位置を設定する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void	CBoxSelection::SetSelectedEndY(
	long	idxSelectY				// I  :終了座標　[Pixel] (-)
)
{
	if ( m_lSelectStartY > m_lSelectEndY )
	{
		m_lSelectStartY = idxSelectY;
	}
	else if ( m_lSelectStartY < m_lSelectEndY )
	{
		m_lSelectEndY = idxSelectY;
	}
	else
	{
		if ( m_lSelectStartX > m_lSelectEndX)
		{
			m_lSelectStartY = idxSelectY;
		}
		else
		{
			m_lSelectEndY = idxSelectY;
		}
	}
}



/*-----------------------------------------------------------------------------
[名称]	選択情報トリム
[機能]	選択カラムの空白を削除する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void	CBoxSelection::TrimSelection()
{
	long	lStartRow = GetSelectedStartRow(); 
	long	lEndRow =  GetSelectedEndRow(); 

	// 行についてのループ
	long	idxRow;
	for( idxRow=lStartRow ; idxRow<=lEndRow ; idxRow++ )
	{
		long idxLine = idxRow - lStartRow;

		CEmphasisLine*	pEmphasisLine = m_pDoc->GetEmphasisLine( idxRow );
		if ( pEmphasisLine != NULL )
		{
			// 選択カラムのうち、空白でない文字の開始位置を探す
			long	idxBlackSpaceColumn;
			CPadding	Padding;
			CWhitespaceDefine*	pWhitespace = CGeneralSetting::GetInstance()->GetWhitespace();
			CArray<TWhiteSpace, TWhiteSpace&>*	paCharz = pWhitespace->GetCharz();
			idxBlackSpaceColumn = Padding.NextBlackSpaceColumn(
				*(pEmphasisLine->GetString()),
				m_atSelectColumnz[idxLine].idxStart,
				*paCharz
			);

			// 見つけた文字開始位置が選択位置の内側なら選択位置を更新
			if ( m_atSelectColumnz[idxLine].idxStart <= idxBlackSpaceColumn )
			{
				m_atSelectColumnz[idxLine].idxStart = idxBlackSpaceColumn;
			}
		}
	}
}

