Esempio n. 1
0
/*!
	全体又は選択範囲を右に寄せる
	@param[in]	pXdot	今のドット位置を受けて戻す
	@param[in]	dLine	今の行数
	@return		HRESULT	終了状態コード
*/
HRESULT DocRightSlide( PINT pXdot, INT dLine )
{
	UINT_PTR	iLines;
	INT			iTop, iBottom, i;
	INT			dSliDot, dRitDot, dPaDot, dInBgn;
	INT			dMozi, dLefDot, dAdDot;
	BOOLEAN		bFirst = TRUE;
	LPTSTR		ptBuffer = NULL;

	LINE_ITR	itLine;

	TRACE( TEXT("右寄せ") );

	//	右寄せ限界確認
	dSliDot = InitParamValue( INIT_LOAD, VL_RIGHT_SLIDE, 790 );

	//	範囲確認
	iLines = DocNowFilePageLineCount( );
	iTop    = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop;
	iBottom = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom;

	if( 0 > iTop )		iTop = 0;
	if( 0 > iBottom )	iBottom = iLines - 1;


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

	dRitDot = DocPageMaxDotGet( iTop, iBottom );	//	一番右のドット確認

	dPaDot = dSliDot - dRitDot;
	if( 0 > dPaDot )
	{
		NotifyBalloonExist( TEXT("はみ出してるみたい"), TEXT("失敗"), NIIF_ERROR );
		return E_FAIL;
	}

	itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin();
	std::advance( itLine, iTop );	//	位置合わせ

	for( i = iTop; iBottom >= i; i++, itLine++ )
	{
		dAdDot = dPaDot;
		//	行頭の開き状態を確認
		dLefDot = LayerHeadSpaceCheck( &(itLine->vcLine), &dMozi );
		if( 0 < dLefDot )
		{
			dAdDot += dLefDot;
			//	手前に空白があるなら、その分含めてずらし用スペースを計算
			DocRangeDeleteByMozi( 0, i, 0, dMozi, &bFirst );	bFirst = FALSE;
		}

		//	先頭からうめちゃう
		dInBgn = 0;
		ptBuffer = DocPaddingSpaceWithPeriod( dAdDot, NULL, NULL, NULL, TRUE );
		DocInsertString( &dInBgn, &i, NULL, ptBuffer, 0, bFirst );	bFirst = FALSE;
		FREE(ptBuffer);

		ViewRedrawSetLine( i );
	}

	//	キャレット位置適当に調整
	*pXdot = 0;
	DocLetterPosGetAdjust( pXdot, dLine, 0 );	//	キャレット位置適当に調整
	ViewDrawCaret( *pXdot, dLine, 1 );

	DocPageInfoRenew( -1, 1 );

	return S_OK;
}
Esempio n. 2
0
/*!
	指定範囲に右揃え線を付ける
	@param[in]	dTop	開始行・含む・−1で最初から
	@param[in]	dBottom	終了行・含む・−1で最後まで
	@return		HRESULT	終了状態コード
*/
HRESULT DocRightGuideSet( INT dTop, INT dBottom )
{
	//	処理が終わったら、呼んだ方で選択範囲の解除と画面更新すること

	UINT_PTR	iLines, cchSize;
	INT			baseDot, i, j, iMz, nDot, sDot, lDot, iUnt, iPadot;
	TCHAR		ch, atBuffer[MAX_PATH];
	LPTSTR		ptBuffer;
	BOOLEAN		bFirst;
	wstring		wsBuffer;

	//	範囲確認
	iLines = DocNowFilePageLineCount( );
	if( 0 > dTop )		dTop = 0;
	if( 0 > dBottom )	dBottom = iLines - 1;

	//	
	ZeroMemory( atBuffer, sizeof(atBuffer) );
	atBuffer[0] = RIGHT_WALL;
	InitParamString( INIT_LOAD, VS_RGUIDE_MOZI, atBuffer );

	//	一番長いとところを確認
	baseDot = DocPageMaxDotGet( dTop, dBottom );

	bFirst = TRUE;
	//	各行毎に追加する感じで
	for( i = dTop; dBottom >= i; i++ )
	{
		nDot = DocLineParamGet( i , NULL, NULL );	//	呼び出せば中で面倒みてくれる
		sDot = baseDot - nDot;
		iUnt = sDot / SPACE_ZEN;	//	埋める分
		sDot = sDot % SPACE_ZEN;	//	はみ出しドット確認
		//	変数使い回し注意

		iPadot = nDot;
		wsBuffer.clear( );	//	アンドゥバッファ用記録

		for( j = 0; iUnt > j; j++ )
		{
			ch = TEXT(' ');	//	入れるのは全角空白確定
			wsBuffer += ch;
			lDot  = DocInputLetter( nDot, i, ch );
			nDot += lDot;
		}

		//	20120315	ユニコードモードならゆにゆにっとする
		if( gbUniPad  ){	iMz = lstrlen( gaatDotPtrnUnic[sDot]  );	}
		else{				iMz = lstrlen( gaatDotPtrnPeriod[sDot] );	}

		//	揃え線までの空白を埋める
		for( j = 0; iMz > j; j++ )
		{
			if( gbUniPad  ){	ch = gaatDotPtrnUnic[sDot][j];	}	//	20120315
			else{			ch = gaatDotPtrnPeriod[sDot][j];	}

			wsBuffer += ch;
			lDot  = DocInputLetter( nDot, i, ch );
			nDot += lDot;
		}

		//	揃え末端文字入れ込む
		wsBuffer += atBuffer[0];
		lDot  = DocInputLetter( nDot, i, atBuffer[0] );
		nDot += lDot;

		DocBadSpaceCheck( i );	//	ここで空白チェキ

		//	入れた文字を統合してアンドゥバッファリング
		cchSize = wsBuffer.size( ) + 1;
		ptBuffer = (LPTSTR)malloc( cchSize * sizeof(TCHAR) );
		StringCchCopy( ptBuffer, cchSize, wsBuffer.c_str(  ) );

		SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_INSERT, ptBuffer, iPadot, i, bFirst );
		bFirst = FALSE;

		FREE( ptBuffer );
	}


	return S_OK;
}
Esempio n. 3
0
/*!
	抽出対象領域を取り出す
	@param[in]	hInst	実存値
	@return		HRESULT	終了状態コード
*/
HRESULT DocExtractExecute( HINSTANCE hInst )
{
	INT	dOffDot, dCount;
	BOOLEAN	bLnFirst, bMzFirst, bIsVoid;
	LPTSTR	ptSpace, ptString;
	UINT_PTR	cch;//, i;

	LINE_ITR	itLnFirst, itLnLast, itLnErate, itLnEnd;
	LETR_ITR	itMozi, itMzEnd;

	wstring	wsBuffer;


	if( 0 >= DocNowFilePageCount( ) )	return S_FALSE;

	//	開始行と終止行・オフセット量を検索
	itLnErate = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin();
	itLnEnd   = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.end();
	itLnFirst = itLnErate;
	itLnLast  = itLnEnd;

	dOffDot = DocPageMaxDotGet( -1, -1 );	//	MAX位置を初期にしとけばおk

	bLnFirst = TRUE;

	for( ; itLnEnd != itLnErate; itLnErate++ )	//	行サーチ
	{
		itMozi  = itLnErate->vcLine.begin();
		itMzEnd = itLnErate->vcLine.end();

		dCount = 0;

		for( ; itMzEnd != itMozi; itMozi++ )	//	文字サーチ
		{
			if( CT_SELECT & itMozi->mzStyle )	//	選択状態発見
			{
				if( bLnFirst )	//	最初の行が未発見であれば
				{
					itLnFirst = itLnErate;	//	今の行を記録する
					bLnFirst = FALSE;
				}
				itLnLast  = itLnErate;	//	選択状態があるので終止行を更新

				//	そこまでのオフセット量よりさらに小さければ更新
				if( dOffDot > dCount )	dOffDot = dCount;

				break;	//	次の行に移動
			}

			dCount += itMozi->rdWidth;	//	そこまでのドット数をため込む

		}
	}
	if( itLnLast != itLnEnd )	 itLnLast++;	//	終止の次の行を示しておく

	if( bLnFirst )	return  S_FALSE;	//	選択範囲がなかったら死にます

	wsBuffer.clear();

	//	開始行から内容を確保していく
	for( itLnErate = itLnFirst; itLnLast != itLnErate; itLnErate++ )	//	行サーチ
	{
		itMozi  = itLnErate->vcLine.begin();
		itMzEnd = itLnErate->vcLine.end();

		bMzFirst = TRUE;
		bIsVoid  = FALSE;
		dCount   = 0;

		for( ; itMzEnd != itMozi; itMozi++ )	//	文字サーチ
		{
			if( CT_SELECT & itMozi->mzStyle )	//	選択状態発見
			{
				if( bIsVoid )	//	直前まで未選択状態
				{
					if( bMzFirst )	//	最初の空白部分であれば
					{
						dCount -= dOffDot;	//	オフセットする
						if( 0 > dCount )	dCount = 0;
						bMzFirst = FALSE;
					}

					//	埋めSpaceを作る・不可ならNULLが返る
					ptSpace = DocPaddingSpaceMake( dCount );
					if( ptSpace )
					{
						wsBuffer += ptSpace;
						//StringCchLength( ptSpace, STRSAFE_MAX_CCH, &cch );
						//for( i = 0; cch > i; i++ )
						//{
						//	wsBuffer += (ptSpace[i]);
						//}
						FREE(ptSpace);
					}
				}

				wsBuffer += itMozi->cchMozi;
				dCount =  0;	//	リセット
				bIsVoid = FALSE;
			}
			else
			{
				dCount += itMozi->rdWidth;	//	そこまでのドット数をため込む
				bIsVoid = TRUE;
			}
		}

		wsBuffer += CH_CRLFW;	//	改行追加
	}
	//	この時点で、wsBufferに全体が入っているはず

	cch = wsBuffer.size( ) + 1;
	ptString = (LPTSTR)malloc( cch * sizeof(TCHAR) );
	StringCchCopy( ptString, cch, wsBuffer.c_str( ) );

	if( hInst )	//	実存してるならレイヤボックスへ
	{
		LayerBoxVisibalise( hInst, ptString, 0x00 );
	}
	else	//	ないならクルッペボード
	{
		DocClipboardDataSet( ptString, cch * sizeof(TCHAR), D_UNI );
	}


	FREE(ptString);

	return S_OK;
}