Ejemplo n.º 1
0
/*!
	指定行のドット位置(キャレット位置)で壱文字削除
	@param[in]	xDot	今のキャレットのドット位置の値
	@param[in]	yLine	対象の行番号・絶対0インデックスか
	@param[in]	iLetter	対象の文字位置
	@return	INT			正:改行削除・0:文字削除 負:異常発生
*/
INT DocLetterErase( INT xDot, INT yLine, INT iLetter )
{
	INT		iCount, iRslt;

	LETR_ITR	vcLtrItr;
	LINE_ITR	itLine;


	iRslt = DocLineParamGet( yLine, &iCount, NULL );	//	この行の文字数を斗留
	if( 0 > iRslt ){	return -1;	}

	//	ここからDELETEの処理
	if( iCount > iLetter )	//	末端でないなら、今の文字消せばOK
	{
		itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin();
		std::advance( itLine, yLine );

		vcLtrItr  = itLine->vcLine.begin( );
		vcLtrItr += iLetter;	//	今の文字位置を示した

		DocIterateDelete( vcLtrItr, yLine );
		return 0;
	}
	else
	{
		DocLineCombine( yLine );
		return 1;
	}

//	return 0;	//	制御が渡らないコード
}
Ejemplo n.º 2
0
/*!
	選択されているところを全削除しちゃう
	@param[in]	pdDot	キャレットドット位置・書き換える必要がある
	@param[in]	pdLine	行番号・書き換える必要がある
	@param[in]	bSqSel	矩形選択してるのかどうか・D_SQUARE
	@param[in]	bFirst	アンドゥ用・これが最初のアクションか
	@return	非0改行あった 0壱行のみ
*/
INT DocSelectedDelete( PINT pdDot, PINT pdLine, UINT bSqSel, BOOLEAN bFirst )
{
//	UINT_PTR	iLines;
	UINT_PTR	iMozis;
	INT			i, j, dBeginX = 0, dBeginY = 0, cbSize;
	INT			iLct, k, bCrLf;
	LPTSTR		ptText;
	LPPOINT		pstPt;

	LETR_ITR	itLtr, itEnd, itHead, itTail;
	LINE_ITR	itLine;

#ifdef DO_TRY_CATCH
	try{
#endif

	bSqSel &= D_SQUARE;	//	矩形ビットだけ残す

	//	ページ全体の行数
//	iLines = DocNowFilePageLineCount( );
	i = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop;
	j = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom;
	TRACE( TEXT("範囲削除[T%d - B%d]"), i, j );
	if( 0 > i ){	return 0;	}	//	選択範囲が無かった


//アンドゥバッファリングの準備
	iLct = j - i + 1;	//	含まれる行なので、数えるの注意
	cbSize = DocSelectTextGetAlloc( D_UNI | bSqSel, (LPVOID *)(&ptText), NULL );
	pstPt = (LPPOINT)malloc( iLct * sizeof(POINT) );
	ZeroMemory( pstPt, iLct * sizeof(POINT) );
	k = iLct - 1;

	bCrLf = iLct - 1;

	dBeginY = i;	//	選択肢のある行

	itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin();
	std::advance( itLine, j );

	for( ; i <= j; j--, k--, itLine-- )//beginを超えたらアウツ!
	{
		//	continueは使えない・

		iMozis = itLine->vcLine.size( );
		if( 0 < iMozis )
		{
			itLtr = itLine->vcLine.begin(  );
			itEnd = itLine->vcLine.end(  );
			itHead = itEnd;
			itTail = itEnd;

			dBeginX = 0;

			//	最初の選択部分を検索
			for( ; itLtr != itEnd; itLtr++ )
			{
				if( CT_SELECT & itLtr->mzStyle )
				{
					itHead =  itLtr;
					break;
				}

				dBeginX += itLtr->rdWidth;	//	意味があるのは最後のところなので、常時上書きでおk
			}

			//	選択されてない所まで検索
			for( ; itLtr != itEnd; itLtr++ )
			{
				if( !(CT_SELECT & itLtr->mzStyle) )
				{
					itTail =  itLtr;
					break;
				}
			}
		}

		pstPt[k].x = dBeginX;
		pstPt[k].y = j;

		if( 0 < iMozis )
		{
			//	該当範囲を削除・末端は、該当部分の直前までが対象・末端自体は非対象
			itLine->vcLine.erase( itHead, itTail );
		}

		//	改行が含まれていたら
		if( CT_SELRTN & itLine->dStyle ){	DocLineCombine( j );	}

		DocLineParamGet( j, NULL, NULL );	//	バイト数再計算

		//	矩形の場合は、各行毎に面倒みないかん
		if( D_SQUARE & bSqSel ){	DocBadSpaceCheck( j );	}

		//	改行サクるとこれによりatが無効になる?
	
	//	iLines = DocNowFilePageLineCount( );	//	ページ全体の行数再設定?

		if( (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin() == itLine )	break;
		//	位置的に末端だったらループせずに終わる
	}

	ViewSelPageAll( -1 );	//	選択範囲無くなる

	//	カーソル位置移動せないかん
	*pdDot = dBeginX;	*pdLine = dBeginY;

	//	最終的に残っている行のチェックだけすればいい
	if( !(D_SQUARE & bSqSel)  ){	DocBadSpaceCheck( dBeginY );	}

	if( bSqSel ){	SqnAppendSquare( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, ptText, pstPt, iLct , bFirst );	}
	else{		SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, ptText, dBeginX, dBeginY, bFirst );	}

	FREE( ptText );

	FREE( pstPt );

#ifdef DO_TRY_CATCH
	}
	catch( exception &err ){	return (INT)ETC_MSG( err.what(), 0 );	}
	catch( ... ){	return (INT)ETC_MSG( ("etc error"), 0 );	}
#endif

	return bCrLf;
}