Example #1
0
/*!
	ページ分割処理・カーソル位置の次の行から終わりまでを次の頁へ
	@param[in]	hWnd	ウインドウハンドル
	@param[in]	hInst	実存ハンドル
	@param[in]	iNow	今の行
	@return		HRESULT	終了状態コード
*/
HRESULT DocPageDivide( HWND hWnd, HINSTANCE hInst, INT iNow )
{
	INT	iDivLine = iNow + 1;
	INT	iLines, mRslt, iNewPage;
//	INT_PTR	iTotal, iNext;
	ONELINE	stLine;
	LINE_ITR	itLine, itEnd;

	ZeroONELINE( &stLine );

	//mRslt = MessageBox( hWnd, TEXT("分割しちゃったら復帰できないよ・・・\r\n本当にバラしていい?"), TEXT("確認です"), MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2 );
	mRslt = MessageBoxCheckBox( hWnd, hInst, 1 );
	if( IDNO == mRslt ){	return  E_ABORT;	}

//分割は、アンドゥをリセットすべし<要は削除なので、リセットしなくてもいいかもだ
//今の頁の該当部分を削除しちゃう

	iLines = DocNowFilePageLineCount(  );//DocPageParamGet( NULL, NULL );	//	行数確保

	if( iLines <= iDivLine )	return E_OUTOFMEMORY;

	//	今の頁の次に作成
	//iTotal = DocNowFilePageCount(  );
	//iNext = gixFocusPage + 1;	//	次の頁
	//if( iTotal <= iNext ){	iNext =  -1;	}	//	全頁より多いなら末端指定

	iNewPage = DocPageCreate( gixFocusPage );	//	新頁
	PageListInsert( iNewPage  );	//	ページリストビューに追加

	//	空の壱行が作られてるので、削除しておく
	(*gitFileIt).vcCont.at( iNewPage ).ltPage.clear(  );

	itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin( );
	std::advance( itLine, iDivLine );	//	該当行まで進める

	itEnd  = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.end( );	//	末端位置確保

	std::copy( itLine, itEnd, back_inserter( (*gitFileIt).vcCont.at( iNewPage ).ltPage ) );

	(*gitFileIt).vcCont.at( gixFocusPage ).ltPage.erase( itLine, itEnd );

	SqnFreeAll( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog) );	//	アンドゥログ削除

	//	バイト情報とかの取り直し
	DocPageByteCount( gitFileIt, gixFocusPage, NULL, NULL );
	DocPageInfoRenew( gixFocusPage, TRUE );

	DocPageByteCount( gitFileIt, iNewPage, NULL, NULL );
	DocPageInfoRenew( iNewPage, FALSE );

	ViewRedrawSetLine( -1 );

	return S_OK;
}
Example #2
0
/*!
	保持構造体に文字列を記録する
	@param[in]	*pvcUnits	保持ベクータへのポインター
	@param[in]	ptText		記録する文字列
	@param[in]	cchSize		文字数
	@return		HRESULT		終了状態コード
*/
HRESULT UserDefSetString( vector<ONELINE> *pvcUnits, LPCTSTR ptText, UINT cchSize )
{
	UINT	i;
	INT		yLine;
	ONELINE	stLine;
	LETTER	stLetter;

	ZeroONELINE( &stLine );

	pvcUnits->push_back( stLine );	//	壱発目

	yLine = 0;
	for( i = 0; cchSize > i; i++ )
	{
		if( CC_CR == ptText[i] && CC_LF == ptText[i+1] )	//	改行であったら
		{
			pvcUnits->push_back( stLine );

			i++;		//	0x0D,0x0Aだから、壱文字飛ばすのがポイント
			yLine++;	//	改行したからFocusは次の行へ
		}
		else if( CC_TAB == ptText[i] )
		{
			//	タブは挿入しない
		}
		else
		{
			DocLetterDataCheck( &stLetter, ptText[i] );
			//ZeroMemory( &stLetter, sizeof(LETTER) );
			//stLetter.cchMozi = ptText[i];
			//stLetter.rdWidth = ViewLetterWidthGet( ptText[i] );
			//stLetter.mzStyle = CT_NORMAL;
			//if( iswspace( ptText[i] ) ){	stLetter.mzStyle |= CT_SPACE;	}
			////	非シフトJIS文字を確認
			//if( !( DocIsSjisTrance( ptText[i], stLetter.acSjis ) ) ){	stLetter.mzStyle |= CT_CANTSJIS;	}
			//DocLetterByteCheck( &stLetter );	//	バイト数確認

			pvcUnits->at( yLine ).vcLine.push_back( stLetter );

			pvcUnits->at( yLine ).iDotCnt += stLetter.rdWidth;
			pvcUnits->at( yLine ).iByteSz += stLetter.mzByte;
		}
	}

	//	末尾とかの空白も含めてテンプレかなと思ってる

	return S_OK;
}
Example #3
0
/*!
	ページ追加処理・ファイルコア函数
	@param[in]	iAdding	この指定ページの次に追加・-1で末端に追加
	@return	INT	新規作成したページ番号
*/
INT DocPageCreate( INT iAdding )
{
	INT_PTR		iTotal, iNext;
	UINT_PTR	iAddPage = 0;
	INT		i;

	ONELINE	stLine;
	ONEPAGE	stPage;

	PAGE_ITR	itPage;

#ifdef DO_TRY_CATCH
	try{
#endif

	ZeroONELINE( &stLine  );	//	新規作成したら、壱行目が0文字な枠を作る

	//	こっちもZeroONEPAGEとかにまとめるか
	ZeroMemory( stPage.atPageName, sizeof(stPage.atPageName) );
//	stPage.dDotCnt = 0;
	stPage.dByteSz = 0;
	stPage.ltPage.clear(  );
	stPage.ltPage.push_back( stLine );	//	1頁の枠を作って
	stPage.dSelLineTop    =  -1;		//	無効は−1を注意
	stPage.dSelLineBottom =  -1;		//	
	stPage.ptRawData = NULL;
	SqnInitialise( &(stPage.stUndoLog) );

	//	今の頁の次に作成
	iTotal = DocNowFilePageCount(  );

	if( 0 <= iAdding )
	{
		iNext = iAdding + 1;	//	次の頁
		if( iTotal <= iNext ){	iNext =  -1;	}	//	全頁より多いなら末端指定
	}
	else
	{
		iNext = -1;
	}

	if( 0 >  iNext )	//	末尾に追加
	{
		(*gitFileIt).vcCont.push_back( stPage  );	//	ファイル構造体に追加

		iAddPage = DocNowFilePageCount( );
		iAddPage--;	//	末端に追加したんだから、個数数えて−1したら0インデックス番号
	}
	else
	{
		itPage = (*gitFileIt).vcCont.begin(  );
		for( i = 0; iNext >  i; i++ ){	itPage++;	}
		(*gitFileIt).vcCont.insert( itPage, stPage );

		iAddPage = iNext;
	}

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

	return iAddPage;	//	追加したページ番号
}
/*!
	指定行のドット位置(キャレット位置)で改行する
	@param[in]	nowDot	今のキャレットのドット位置
	@param[in]	rdLine	対象の行番号・絶対0インデックスか
	@return		HRESULT	終了状態コード
*/
HRESULT DocInputReturn( INT nowDot, INT rdLine )
{
	INT_PTR	iLetter, iLines, iCount;
	ONELINE	stLine;

	LETR_ITR	vcLtrItr, vcLtrEnd;

	LINE_ITR	itLine, ltLineItr;

#ifdef DO_TRY_CATCH
	try{
#endif

	iLines = DocNowFilePageLineCount( );

	if( iLines <= rdLine )	return E_OUTOFMEMORY;

	ZeroONELINE( &stLine );

	iLetter = DocLetterPosGetAdjust( &nowDot, rdLine, 0 );	//	今の文字位置を確認

	//	文字数確認
	itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin();
	std::advance( itLine, rdLine );

	iCount = itLine->vcLine.size( );

	if( iLetter < iCount )	//	もし行の途中で改行したら?
	{
		ltLineItr = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin( );
		std::advance( ltLineItr, (rdLine+1) );

		//	今の行の次の場所に行のデータを挿入
		(*gitFileIt).vcCont.at( gixFocusPage ).ltPage.insert( ltLineItr, stLine );

		//	その行の、文字データの先頭をとる
		ltLineItr = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin( );
		std::advance( ltLineItr, (rdLine+1) );	//	追加した行まで移動

		//	ぶった切った場所を設定しなおして
		itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin();
		std::advance( itLine, rdLine );

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

		//	その部分を次の行にコピーする
		std::copy( vcLtrItr, vcLtrEnd, back_inserter(ltLineItr->vcLine) );

		//	元の文字列を削除する
		itLine->vcLine.erase( vcLtrItr, vcLtrEnd );


		//	総ドット数再計算
		DocLineParamGet( rdLine,   NULL, NULL );
		DocLineParamGet( rdLine+1, NULL, NULL );
	}
	else	//	末端で改行した
	{
		if( (iLines - 1) == rdLine )	//	EOF的なところ
		{
			(*gitFileIt).vcCont.at( gixFocusPage ).ltPage.push_back( stLine );
		}
		else
		{
			ltLineItr = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin( );
			std::advance( ltLineItr, (rdLine+1) );	//	今の行を示した

			//	次の場所に行のデータを挿入
			(*gitFileIt).vcCont.at( gixFocusPage ).ltPage.insert( ltLineItr, stLine );
		}
	}

	DocBadSpaceCheck( rdLine   );	//	ここで空白チェキ
	DocBadSpaceCheck( rdLine+1 );	//	空白チェキ・次の行も確認

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

	return S_OK;
}