/*! 示されたドット位置の直後の文字の選択状態の確認 @param[in] nowDot 対象のドット位置 @param[in] rdLine 対象の行番号・ドキュメントの0インデックス @return 非0選択状態 0選択してない */ UINT DocLetterSelStateGet( INT nowDot, INT rdLine ) { UINT dStyle; INT iLetter; INT_PTR iLines, iLength; LINE_ITR itLine; iLines = DocNowFilePageLineCount( ); if( iLines <= rdLine ) return 0; iLetter = DocLetterPosGetAdjust( &nowDot, rdLine, 0 ); // 今の文字位置を確認 // 直後の文字を確認 itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, rdLine ); if( (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.end() == itLine ){ return 0; } iLength = itLine->vcLine.size(); if( iLength <= iLetter ) return 0; // フラグ操作 dStyle = itLine->vcLine.at( iLetter ).mzStyle; if( dStyle & CT_SELECT ) return 1; return 0; }
/*! 行末空白削除の面倒見る・選択行とか @param[in] pXdot 今のドット位置を受けて戻す・削除に巻き込まれた対応 @param[in] dLine 今の行数 @return HRESULT 終了状態コード */ HRESULT DocLastSpaceErase( PINT pXdot, INT dLine ) { UINT_PTR iLines; INT iTop, iBottom, i, xDelDot, xMotoDot; BOOLEAN bFirst = TRUE; LPTSTR ptBuffer = NULL; RECT rect; LINE_ITR itLine; TRACE( TEXT("行末空白削除") ); // 範囲確認 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 ); // 選択範囲無くなる itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, iTop ); // 位置合わせ for( i = iTop; iBottom >= i; i++, itLine++ ) { xMotoDot = itLine->iDotCnt; ptBuffer = DocLastSpDel( &(itLine->vcLine) ); xDelDot = DocLineParamGet( i, NULL, NULL ); // サクった後の行末端すなわち削除位置 if( ptBuffer ) { SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, ptBuffer, xDelDot, i , bFirst ); bFirst = FALSE; } FREE( ptBuffer ); DocBadSpaceCheck( i ); // 状態をリセット・中で行書換でいいか? rect.top = i * LINE_HEIGHT; rect.bottom = rect.top + LINE_HEIGHT; rect.left = xDelDot; // 削ったら左側になる rect.right = xMotoDot + 20; // 元長さ+改行マーク ViewRedrawSetRect( &rect ); // ViewRedrawSetLine( i ); // 再描画COMMANDO } // キャレット位置ずれてたら適当に調整 DocLetterPosGetAdjust( pXdot, dLine, 0 ); // キャレット位置適当に調整 ViewDrawCaret( *pXdot, dLine, 1 ); DocPageInfoRenew( -1, 1 ); return S_OK; }
/*! 指定行のドット位置(キャレット位置)でバックスペース押した @param[in] pdDot 今のキャレットのドット位置の値へのポインター @param[in] pdLine 対象の行番号・絶対0インデックスか @return INT 非0改行あった 0壱行のみ */ INT DocInputBkSpace( PINT pdDot, PINT pdLine ) { INT_PTR iLines; INT iLetter, width = 0, neDot, bCrLf = 0; INT dLine = *pdLine; // 函数内で使う行番号・調整に注意 TCHAR ch; LINE_ITR itLine; iLines = DocNowFilePageLineCount( ); if( iLines <= dLine ) return 0; // はみ出してたらアウツ! iLetter = DocLetterPosGetAdjust( pdDot, dLine, 0 ); // 今の文字位置を確認 neDot = *pdDot; // TRACE( TEXT("後空白[D%d C%d]"), neDot, iLetter ); if( 0 == iLetter && 0 == dLine ) return 0; // 先頭かつ最初の行なら、なにもしない // バックスペースとは、壱文字戻ってDELETEである if( 0 != iLetter ) // 行の先頭でないなら { iLetter--; // キャレット一つ戻す itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, dLine ); width = itLine->vcLine.at( iLetter ).rdWidth; ch = itLine->vcLine.at( iLetter ).cchMozi; *pdDot = neDot - width; // 文字幅分ドットも戻して bCrLf = 0; SqnAppendLetter( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, ch, *pdDot, dLine, TRUE ); } else // 行の先頭であるなら { dLine--; *pdLine = dLine; // 前の行に移動して neDot = DocLineParamGet( dLine, &iLetter, NULL ); *pdDot = neDot; // CARET位置調整 bCrLf = 1; // ここでやって問題無いはず SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, CH_CRLFW, *pdDot, dLine, TRUE ); } DocLetterErase( *pdDot, dLine, iLetter ); DocBadSpaceCheck( dLine ); // 良くないスペースを調べておく return bCrLf; }
/*! 指定行のドット位置(キャレット位置)でデリート押した @param[in] xDot 今のキャレットのドット位置 @param[in] yLine 対象の行番号・絶対0インデックスか @return INT 非0改行削除・0文字削除 */ INT DocInputDelete( INT xDot, INT yLine ) { INT_PTR iLines; INT iCount, iLetter, iCrLf; TCHAR ch; LINE_ITR itLine; iLines = DocNowFilePageLineCount( ); if( iLines <= yLine ) return 0; // はみ出してたらアウツ! iLetter = DocLetterPosGetAdjust( &xDot, yLine, 0 ); // 今の文字位置を確認 // TRACE( TEXT("削除[D%d C%d]"), xDot, iLetter ); DocLineParamGet( yLine, &iCount, NULL ); // この行の文字数を斗留 if( iCount <= iLetter ) { if( iLines <= (yLine+1) ) return 0; // 完全に末端なら何もしない ch = CC_LF; } else { itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, yLine ); ch = itLine->vcLine.at( iLetter ).cchMozi; } iCrLf = DocLetterErase( xDot, yLine, iLetter ); if( 0 > iCrLf ){ return -1; } DocBadSpaceCheck( yLine ); // 良くないスペースを調べておく if( 0 < iCrLf ) { SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, CH_CRLFW, xDot, yLine, TRUE ); } else { SqnAppendLetter( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, ch, xDot, yLine, TRUE ); } return iCrLf; }
/*! 指定行のドット位置(キャレット位置)に文字列を矩形で追加する @param[in] pNowDot 今のキャレットのドット位置のポインター @param[in] pdLine 対象の行番号・絶対0インデックスか @param[in] ptStr 追加したい文字列 @param[in] cchSize 文字列の文字数・ヌルターミネータ含まず @param[out] *ppstPt 各挿入場所を入れるバッファのポインタをポインタ @return INT 処理した行数 */ INT DocSquareAdd( PINT pNowDot, PINT pdLine, LPCTSTR ptStr, INT cchSize, LPPOINT *ppstPt ) { LPCTSTR ptCaret, ptSprt; UINT_PTR cchMozi; INT dCrLf; INT dBaseDot, dBaseLine; LPPOINT pstBuf; dCrLf = 0; ptCaret = ptStr; dBaseLine = *pdLine; do { dBaseDot = *pNowDot; DocLetterPosGetAdjust( &dBaseDot, dBaseLine, 0 ); // 場所合わせ ptSprt = StrStr( ptCaret, CH_CRLFW ); // 改行のところまで if( !(ptSprt) ){ ptSprt = ptStr + cchSize; } // 末端まで改行がなかったら、末端文字の位置を入れる cchMozi = ptSprt - ptCaret; // そこまでの文字数求めて // 各行の追加場所を覚えておく pstBuf = (LPPOINT)realloc( *ppstPt, ( sizeof(POINT) * (dCrLf+1) ) ); if( pstBuf ){ *ppstPt = pstBuf; } else{ TRACE( TEXT("fatal mem error") ); return 0; } pstBuf += dCrLf; pstBuf->x = dBaseDot; pstBuf->y = dBaseLine; DocStringAdd( &dBaseDot, &dBaseLine, ptCaret, cchMozi ); ptCaret = NextLineW( ptSprt ); // 次の行の先頭に移動 if( *ptCaret ){ dBaseLine++; } // 行位置も進める dCrLf++; }while( *ptCaret ); // データ有る限りループで探す *pdLine = dBaseLine; // 末端位置を書き戻す *pNowDot = dBaseDot; return dCrLf; }
/*! 行頭に、文字(主に空白)を追加 @param[in] ch 追加する文字 @param[in] pXdot 今のドット位置を受けて戻す・削除に巻き込まれた対応 @param[in] dLine 今の行数 @return HRESULT 終了状態コード */ HRESULT DocTopLetterInsert( TCHAR ch, PINT pXdot, INT dLine ) { UINT_PTR iLines; INT iTop, iBottom, i, xDot = 0; BOOLEAN bFirst = TRUE, bSeled = FALSE; TRACE( TEXT("行頭空白を追加") ); // 範囲確認 iLines = DocNowFilePageLineCount( ); iTop = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop; iBottom = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom; if( 0 <= iTop && 0 <= iBottom ) bSeled = TRUE; if( 0 > iTop ) iTop = 0; if( 0 > iBottom ) iBottom = iLines - 1; // 選択範囲は、操作した行全体を選択状態にする for( i = iTop; iBottom >= i; i++ ) // 範囲内の各行について { // 先頭位置に文字桃得留。 xDot = DocInputLetter( 0, i, ch ); SqnAppendLetter( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_INSERT, ch, 0, i, bFirst ); bFirst = FALSE; if( bSeled ) { DocRangeSelStateToggle( -1, -1, i, 1 ); // 該当行全体を選択状態にする DocReturnSelStateToggle( i, 1 ); // 改行も選択で } DocBadSpaceCheck( i ); ViewRedrawSetLine( i ); } // キャレット位置ずれてたら適当に調整 *pXdot += xDot; DocLetterPosGetAdjust( pXdot, dLine, 0 ); // キャレット位置適当に調整 ViewDrawCaret( *pXdot, dLine, 1 ); DocPageInfoRenew( -1, 1 ); return S_OK; }
/*! 示されたドット位置の直後の文字の選択状態をON/OFFして、該当文字の幅を返す・単独では呼ばれない? @param[in] nowDot 対象のドット位置 @param[in] rdLine 対象の行番号・ドキュメントの0インデックス @param[in] dForce 0斗愚留 +選択状態 ー選択解除 @return 該当文字のドット数 */ INT DocLetterSelStateToggle( INT nowDot, INT rdLine, INT dForce ) { UINT dStyle, maeSty; INT dLtrDot = 0, iLetter, dByte; INT_PTR iLines, iLength; LINE_ITR itLine; iLines = DocNowFilePageLineCount( ); if( iLines <= rdLine ) return 0; iLetter = DocLetterPosGetAdjust( &nowDot, rdLine, 0 ); // 今の文字位置を確認 // 直後の文字の幅を確認 itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, rdLine ); if( (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.end() == itLine ){ return 0; } iLength = itLine->vcLine.size(); if( iLength <= iLetter ) return 0; dLtrDot = itLine->vcLine.at( iLetter ).rdWidth; dByte = itLine->vcLine.at( iLetter ).mzByte; // フラグ操作 dStyle = itLine->vcLine.at( iLetter ).mzStyle; maeSty = dStyle; if( 0 == dForce ){ dStyle ^= CT_SELECT; } else if( 0 < dForce ){ dStyle |= CT_SELECT; } else if( 0 > dForce ){ dStyle &= ~CT_SELECT; } itLine->vcLine.at( iLetter ).mzStyle = dStyle; TRACE( TEXT("L[%d] D[%d] B[%d] f[0x%X]"), rdLine, dLtrDot, dByte, dStyle ); if( maeSty != dStyle ) // フラグ操作されてたら { if( CT_SELECT & dStyle ) gdSelByte += dByte; else gdSelByte -= dByte; if( 0 > gdSelByte ) gdSelByte = 0; // 0未満になったら本当はおかしい } return dLtrDot; // ドット数戻してOK }
/*! 現在のドット位置を含んでいる空白エリアを1ドットずらすシーケンス @param[in] vk 方向・右か左か @param[in] pXdot 今のドット位置を受けて戻す @param[in] dLine 今の行数 @return INT 非0ズレ値 0失敗 */ INT DocSpaceShiftProc( UINT vk, PINT pXdot, INT dLine ) { INT dDot, dMozi, dPreByte; // 20110720 0文字で操作するとあぼーんするので確認しておく dDot = DocLineParamGet( dLine, &dMozi, &dPreByte ); if( 0 >= dMozi ) return 0; dDot = DocSpaceDifference( vk, pXdot, dLine, TRUE ); DocLetterPosGetAdjust( pXdot, dLine, 0 ); // この中のDocLineParamGetでバイト数が計算されてる ViewRedrawSetLine( dLine ); ViewDrawCaret( *pXdot, dLine, 1 ); return dDot; }
/*! 指定行のドット位置で文字数分削除する・改行は弐文字占有 @param[in] xDot 今のキャレットのドット位置 @param[in] yLine 対象の行番号・絶対0インデックスか @param[in] ptDummy 未使用・NULLで @param[in] cchSize 削除する文字数 @return INT 0改行無し 1〜改行をサクった回数 */ INT DocStringErase( INT xDot, INT yLine, LPTSTR ptDummy, INT cchSize ) { INT i, iCrLf, iLetter, rdCnt; // 今の文字位置・キャレットより末尾方向に削除するので、この位置は変わらない iLetter = DocLetterPosGetAdjust( &xDot, yLine, 0 ); // 今の文字位置を確認 rdCnt = 0; for( i = 0; cchSize > i; i++ ) // DEL連打ってこと { iCrLf = DocLetterErase( xDot, yLine, iLetter ); if( 0 > iCrLf ) break; // 異常発生 if( iCrLf ){ i++; rdCnt++; } } DocBadSpaceCheck( yLine ); // 良くないスペースを調べておく return rdCnt; }
/*! 行頭全角空白及びユニコード空白を削除する @param[in] pXdot 今のドット位置を受けて戻す・削除に巻き込まれた対応 @param[in] dLine 今の行数 @return HRESULT 終了状態コード */ HRESULT DocTopSpaceErase( PINT pXdot, INT dLine ) { UINT_PTR iLines; INT iTop, iBottom, i; BOOLEAN bFirst = TRUE, bSeled = FALSE; TCHAR ch; LETR_ITR vcLtrItr; LINE_ITR itLine; // 範囲確認 iLines = DocNowFilePageLineCount( ); iTop = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop; iBottom = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom; if( 0 <= iTop && 0 <= iBottom ) bSeled = TRUE; if( 0 > iTop ) iTop = 0; if( 0 > iBottom ) iBottom = iLines - 1; TRACE( TEXT("行頭空白を削除") ); // 選択範囲は、操作した行全体を選択状態にする itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, iTop ); // 位置合わせ for( i = iTop; iBottom >= i; i++, itLine++ ) // 範囲内の各行について { // 文字があるなら操作する if( 0 != itLine->vcLine.size( ) ) { vcLtrItr = itLine->vcLine.begin( ); ch = vcLtrItr->cchMozi; // 空白かつ半角ではない if( ( iswspace( ch ) && TEXT(' ') != ch ) ) { SqnAppendLetter( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, ch, 0, i, bFirst ); bFirst = FALSE; DocIterateDelete( vcLtrItr, i ); } } if( bSeled ) { DocRangeSelStateToggle( -1, -1, i, 1 ); // 該当行全体を選択状態にする DocReturnSelStateToggle( i, 1 ); // 改行も選択で } DocBadSpaceCheck( i ); // 状態をリセット ViewRedrawSetLine( i ); } // キャレット位置ずれてたら適当に調整 *pXdot = 0; DocLetterPosGetAdjust( pXdot, dLine, 0 ); // キャレット位置適当に調整 ViewDrawCaret( *pXdot, dLine, 1 ); DocPageInfoRenew( -1, 1 ); return S_OK; }
/*! ずれ調整を実行する @param[in] pxDot 調整位置 @param[in] yLine 対象行 @return INT 調整したドット量 */ INT DocDiffAdjExec( PINT pxDot, INT yLine ) { INT dMotoDot = 0; INT dBgnDot, dEndDot, dBgnCnt, dRngCnt, iSabun, dTgtDot, nDot; UINT_PTR cchSize, cchPlus; BOOLEAN bIsSpace; LPTSTR ptPlus, ptBuffer; wstring wsDelBuf, wsAddBuf; LETR_ITR vcLtrBgn, vcLtrEnd, vcItr; LINE_ITR itLine; itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, yLine ); // 調整値の状況を確認 dTgtDot = DocLineStateCheckWithDot( *pxDot, yLine, &dBgnDot, &dEndDot, &dBgnCnt, &dRngCnt, &bIsSpace ); if( !(bIsSpace) ) { NotifyBalloonExist( TEXT("連続するスペースの部分にカーソルを当てるですぅ"), TEXT("調整不可能"), NIIF_ERROR ); return 0; } //今現在の空白幅を確認 // 対象行の長さを確認 dMotoDot = DocLineParamGet( yLine, NULL, NULL ); iSabun = gdDiffLock - dMotoDot; // 差分確認・マイナスならはみ出してる //まず全角半角で埋めて、半角が多いようならピリオド付けて再計算 dTgtDot += iSabun; // 変更後のドット数 if( 41 > dTgtDot ) // ユニコード使うなら確認しなくても大丈夫? { NotifyBalloonExist( TEXT("もう少し幅がないと調整できないですぅ"), TEXT("狭すぎ"), NIIF_ERROR ); return 0; } //埋め文字列作成 ptPlus = DocPaddingSpaceWithPeriod( dTgtDot, NULL, NULL, NULL, FALSE ); if( !(ptPlus) ) { NotifyBalloonExist( TEXT("調整出来なかったですぅ"), TEXT("自動調整失敗"), NIIF_ERROR ); return 0; } StringCchLength( ptPlus, STRSAFE_MAX_CCH, &cchPlus ); vcLtrBgn = itLine->vcLine.begin( ); vcLtrBgn += dBgnCnt; // 該当位置まで移動して vcLtrEnd = vcLtrBgn; vcLtrEnd += dRngCnt; // そのエリアの終端も確認 wsDelBuf.clear(); for( vcItr = vcLtrBgn; vcLtrEnd != vcItr; vcItr++ ){ wsDelBuf += vcItr->cchMozi; } // 該当部分を削除 itLine->vcLine.erase( vcLtrBgn, vcLtrEnd ); nDot = dBgnDot; cchSize = wsDelBuf.size( ) + 1; ptBuffer = (LPTSTR)malloc( cchSize * sizeof(TCHAR) ); StringCchCopy( ptBuffer, cchSize, wsDelBuf.c_str( ) ); SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, ptBuffer, dBgnDot, yLine, TRUE ); FREE( ptBuffer ); //ここで文字列追加 DocStringAdd( &nDot, &yLine, ptPlus, cchPlus ); SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_INSERT, ptPlus, dBgnDot, yLine, FALSE ); FREE(ptPlus); //もろもろの位置合わせしておk *pxDot = nDot; DocLetterPosGetAdjust( pxDot, yLine, 0 ); ViewRedrawSetLine( yLine ); ViewDrawCaret( *pxDot, yLine, 1 ); return iSabun; }
/*! 指定ドット位置が含まれている、スペースか非スペースの文字の始点終点ドット数確保 @param[in] dDot 指定ドット・これの左の文字で判断 @param[in] rdLine 行数 @param[out] pLeft 始点ドット・行頭かも @param[out] pRight 終点ドット・行末かも @param[out] pStCnt 開始地点の文字数・NULLでも可 @param[out] pCount 間の文字数・NULLでも可 @param[out] pIsSp 該当はスペースであるか? @return 該当範囲のドット数 */ INT DocLineStateCheckWithDot( INT dDot, INT rdLine, PINT pLeft, PINT pRight, PINT pStCnt, PINT pCount, PBOOLEAN pIsSp ) { UINT_PTR iCount; INT bgnDot, endDot; INT iBgnCnt, iRngCnt; TCHAR ch, chb; UINT dMozis; INT bSpace; LETR_ITR itMozi, itHead, itTail, itTemp; LINE_ITR itLine; itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, rdLine ); if( !(pLeft) || !(pRight) || !(pIsSp) ){ return 0; } itMozi = itLine->vcLine.begin( ); iCount = itLine->vcLine.size( ); // この行の文字数確認 // 中身が無いならエラー if( 0 >= iCount ){ *pIsSp = FALSE; *pLeft = 0; *pRight = 0; return 0; } dMozis = DocLetterPosGetAdjust( &dDot , rdLine, 0 ); // 今の文字位置を確認 if( 1 <= dMozis ){ itMozi += (dMozis-1); } // キャレットの位置の左文字で判定 // 最初から先頭ならなにもしなくておk ch = itMozi->cchMozi; bSpace = iswspace( ch ); // その場所から頭方向に辿って、途切れ目を探す itHead = itLine->vcLine.begin( ); for( ; itHead != itMozi; itMozi-- ) { chb = itMozi->cchMozi; if( iswspace( chb ) != bSpace ){ itMozi++; break; } } // 先頭までイッちゃった場合・これが抜けてた if( itHead == itMozi ) { chb = itMozi->cchMozi; if( iswspace( chb ) != bSpace ){ itMozi++; } } // 基準と異なる文字にヒットしたか、先頭位置である // 先頭から、ヒット位置まで辿ってドット数と文字数確認 bgnDot = 0; iBgnCnt = 0; for( itTemp = itHead; itTemp != itMozi; itTemp++ ) { bgnDot += itTemp->rdWidth; // 文字幅増やして iBgnCnt++; // 文字数も増やす }//もし最初から先頭なら両方0のまま itTail = itLine->vcLine.end( ); // その場所から、同じグループの所まで確認 endDot = bgnDot; iRngCnt = 0; for( ; itTemp != itTail; itTemp++ ) { chb = itTemp->cchMozi; // 同じタイプである間加算続ける if( iswspace( chb ) != bSpace ){ break; } endDot += itTemp->rdWidth; iRngCnt++; } *pLeft = bgnDot; *pRight = endDot; *pIsSp = bSpace ? TRUE : FALSE; if( pCount ) *pCount = iRngCnt; if( pStCnt ) *pStCnt = iBgnCnt; return (endDot - bgnDot); }
/*! キャレット位置から、左右に1dotずつずらす。文字なら空白に置き換えながら @param[in] vk 方向・右か左か @param[in] pXdot 今のドット位置を受けて戻す @param[in] dLine 今の行数 @return HRESULT 終了状態コード */ HRESULT DocCentreWidthShift( UINT vk, PINT pXdot, INT dLine ) { UINT_PTR iLines, cchSz; UINT dRslt, dFirst; INT iBaseDot, iTop, iBottom, iBufDot; INT wid, iDot, iLin, iMzCnt; INT iFnlDot; BOOLEAN bSeled = FALSE; BOOLEAN bRight; // 非0右へ 0左へ LPTSTR ptRepl; TCHAR ch, chOneSp; LPUNDOBUFF pstUndoBuff; LETR_ITR vcLtrItr; LINE_ITR itLine; chOneSp = gaatPaddingSpDotW[1][0]; // 幅1dot・文字間に挿入 //中心部分が空白なら、その空白を伸び縮みさせる。 //文字と文字の間開けるなら、抽芯になってる字の左側を開けるようにする //潰すときは、抽芯字を空白に置き換えて、それを縮める pstUndoBuff = &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog); iBaseDot = *pXdot; // 基準点、なるべく動かないようにせないかん TRACE( TEXT("中間ずらし %dDOT"), iBaseDot ); iFnlDot = iBaseDot; if( VK_RIGHT == vk ) bRight = TRUE; else if( VK_LEFT == vk ) bRight = FALSE; else return E_INVALIDARG; if( 0 == iBaseDot ) // 基準が0なら、全体左右ずらしってこと { return DocPositionShift( vk, pXdot, dLine ); } // 範囲確認 iLines = DocNowFilePageLineCount( ); iTop = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop; iBottom = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom; if( 0 <= iTop && 0 <= iBottom ) bSeled = TRUE; if( 0 > iTop ) iTop = 0; if( 0 > iBottom ) iBottom = iLines - 1; // そのままだと容量が狂う・一旦選択状態を解除して計算しなおす if( bSeled ){ DocPageSelStateToggle( -1 ); } // 壱行ずつ面倒見ていく itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, iTop ); // 位置合わせ //なんか時々連続空白ができる dFirst = TRUE; // 順番に処理していく for( iLin = iTop; iBottom >= iLin; iLin++, itLine++ ) { iDot = itLine->iDotCnt; if( iBaseDot >= iDot ){ continue; } // 操作位置に満たないのなら、何もする必要は無い // 操作開始 iDot = iBaseDot; // 調整位置確定 iMzCnt = DocLetterPosGetAdjust( &iDot, iLin, -1 ); // 常に左側をみる // 操作する位置の文字確認 // 該当位置が空白なら、伸び縮み兼用 iBufDot = iDot; // 値ズレるのでそのまま使うとイケない dRslt = DocSpaceDifference( vk, &iBufDot, iLin, dFirst ); // iBufDotはズラしたら使えない if( dRslt ) // ズラし成功 { if( iLin == dLine ){ iFnlDot = iBaseDot; } // ずらした後の位置の面倒見る dFirst = FALSE; } else // 返り値0なら、文字なので処理を { vcLtrItr = itLine->vcLine.begin( ); std::advance( vcLtrItr, iMzCnt ); // 注目位置の文字まで移動して ch = vcLtrItr->cchMozi; wid = vcLtrItr->rdWidth; // 該当の文字の幅を確認 if( bRight ) // 右に動かす { if( iswspace( ch ) ) // 右側の文字は空白であったら { iBufDot = iDot + wid; // その空白を延ばす DocSpaceDifference( vk, &iBufDot, iLin, dFirst ); // iBufDotは使えない if( iLin == dLine ){ iFnlDot = iBaseDot; } // ずらした後の位置の面倒見る } else { SqnAppendLetter( pstUndoBuff, DO_INSERT, chOneSp, iDot, iLin, dFirst ); DocInputLetter( iDot, iLin, chOneSp ); // その場所に1dotスペース足せばおk if( iLin == dLine ){ iFnlDot = iDot + 1; } // ずらした後の位置の面倒見る } dFirst = FALSE; } else // 左に動かす { if( iLin == dLine ){ iFnlDot = iDot; } // ずらす前の位置の面倒見る // 今の文字を削除 SqnAppendLetter( pstUndoBuff, DO_DELETE, ch, iDot, iLin, dFirst ); dFirst = FALSE; DocIterateDelete( vcLtrItr , iLin ); if( 2 <= wid ) // 幅が1なら、削除だけでおk { ptRepl = DocPaddingSpaceMake( wid-1 ); // 必要な空白確保 StringCchLength( ptRepl , STRSAFE_MAX_CCH, &cchSz ); // 文字数確認 SqnAppendString( pstUndoBuff, DO_INSERT, ptRepl, iDot, iLin, dFirst ); dFirst = FALSE; DocStringAdd( &iDot, &iLin, ptRepl, cchSz ); // そして先頭に空白をアッー! FREE(ptRepl); // 開放忘れないように } } } if( bSeled ) // 選択状態でヤッてたのなら、選択状態を維持する { if( iLin == iTop ) { iDot = iBaseDot; DocLetterPosGetAdjust( &iDot, iLin, 0 ); // キャレット位置適当に調整 DocRangeSelStateToggle( iDot, -1, iLin , 1 ); // 該当行全体を選択状態にする } else { DocRangeSelStateToggle( -1, -1, iLin , 1 ); // 該当行全体を選択状態にする } // 次の行があるなら改行も選択で if( iBottom > iLin ) DocReturnSelStateToggle( iLin, 1 ); } DocBadSpaceCheck( iLin ); // 状態をリセット ViewRedrawSetLine( iLin ); } if( bSeled ) // 選択範囲はり直し { (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop = iTop; (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom = iBottom; } // キャレット位置調整 DocLetterPosGetAdjust( &iFnlDot, dLine, 0 ); // キャレット位置適当に調整 *pXdot = iFnlDot; // 位置を戻す ViewDrawCaret( iFnlDot, dLine, 1 ); // 再描画 DocPageByteCount( gitFileIt, gixFocusPage, NULL, NULL ); DocPageInfoRenew( -1, 1 ); return S_OK; }
/*! AA全体を、1dotずつずらす。文字なら空白に置き換えながら @param[in] vk 方向・右か左か @param[in] pXdot 今のドット位置を受けて戻す @param[in] dLine 今の行数 @return HRESULT 終了状態コード */ HRESULT DocPositionShift( UINT vk, PINT pXdot, INT dLine ) { UINT_PTR iLines, cchSz; INT iTop, iBottom, i; INT wid, iDot, iLin, iMzCnt; INT iTgtWid, iLefDot, iRitDot; BOOLEAN bFirst = TRUE, bSeled = FALSE, bDone = FALSE; BOOLEAN bRight; // 非0右へ 0左へ BOOLEAN bIsSp; LPTSTR ptRepl; TCHAR ch, chOneSp; LPUNDOBUFF pstUndoBuff; LETR_ITR vcLtrItr; LINE_ITR itLine; chOneSp = gaatPaddingSpDotW[1][0]; pstUndoBuff = &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog); TRACE( TEXT("全体ずらし") ); if( VK_RIGHT == vk ) bRight = TRUE; else if( VK_LEFT == vk ) bRight = FALSE; else return E_INVALIDARG; // 範囲確認 iLines = DocNowFilePageLineCount( ); iTop = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop; iBottom = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom; if( 0 <= iTop && 0 <= iBottom ) bSeled = TRUE; if( 0 > iTop ) iTop = 0; if( 0 > iBottom ) iBottom = iLines - 1; // そのままだと容量が狂う・一旦選択状態を解除して計算しなおす if( bSeled ){ DocPageSelStateToggle( -1 ); } // 壱行ずつ面倒見ていく itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, iTop ); // 位置合わせ for( i = iTop; iBottom >= i; i++, itLine++ ) { // 文字があるなら操作する if( 0 != itLine->vcLine.size( ) ) { // 先頭文字を確認 vcLtrItr = itLine->vcLine.begin( ); ch = vcLtrItr->cchMozi; wid = vcLtrItr->rdWidth; // 文字幅 bDone = FALSE; if( !(iswspace(ch)) ) // 空白ではなく { if( bRight ) // 右ずらしなら { // 先頭に1dotスペース足せばおk DocInputLetter( 0, i, chOneSp ); SqnAppendLetter( pstUndoBuff, DO_INSERT, chOneSp, 0, i, bFirst ); bFirst = FALSE; bDone = TRUE; // 処理しちゃった } else // 左イクなら、先頭文字を空白にして調整する { ptRepl = DocPaddingSpaceMake( wid ); // 必要な空白確保 StringCchLength( ptRepl, STRSAFE_MAX_CCH, &cchSz ); // 今の文字を削除 SqnAppendLetter( pstUndoBuff, DO_DELETE, ch, 0, i, bFirst ); bFirst = FALSE; DocIterateDelete( vcLtrItr, i ); // そして先頭に空白をアッー! iDot = 0; iLin = i; DocStringAdd( &iDot, &iLin, ptRepl, cchSz ); SqnAppendString( pstUndoBuff, DO_INSERT, ptRepl, 0, i, bFirst ); bFirst = FALSE; FREE(ptRepl); // 開放忘れないように } } // この先Beginイテレータ無効 if( !(bDone) ) // 未処理であるなら・この時点で、先頭文字は空白確定 { // 空白範囲を確認 iTgtWid = DocLineStateCheckWithDot( 0, i, &iLefDot, &iRitDot, NULL, &iMzCnt, &bIsSp ); if( bRight ) iTgtWid++; // 方向に合わせて else iTgtWid--; // ドット数を求める if( 0 > iTgtWid ) iTgtWid = 0; // マイナスは無いと思うけど念のため ptRepl = DocPaddingSpaceMake( iTgtWid ); // 必要な空白確保 // ターゲット幅が0ならNULLなので、先頭文字の削除だけでおk DocRangeDeleteByMozi( 0, i, 0, iMzCnt, &bFirst ); // 元の部分削除して if( ptRepl ) // 必要な文字を入れる { StringCchLength( ptRepl, STRSAFE_MAX_CCH, &cchSz ); iDot = 0; iLin = i; DocStringAdd( &iDot, &iLin, ptRepl, cchSz ); SqnAppendString( pstUndoBuff, DO_INSERT, ptRepl, 0, i, bFirst ); bFirst = FALSE; FREE(ptRepl); // 開放忘れないように } } if( bSeled ) // 選択状態でヤッてたのなら、選択状態を維持する { DocRangeSelStateToggle( -1, -1, i , 1 ); // 該当行全体を選択状態にする // 次の行があるなら改行も選択で if( iBottom > i ) DocReturnSelStateToggle( i, 1 ); } DocBadSpaceCheck( i ); // 状態をリセット ViewRedrawSetLine( i ); } } if( bSeled ) // 選択範囲はり直し { (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop = iTop; (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom = iBottom; } // キャレット位置調整 iDot = 0; DocLetterPosGetAdjust( &iDot, dLine, 0 ); // キャレット位置適当に調整 ViewDrawCaret( iDot, dLine, 1 ); DocPageByteCount( gitFileIt, gixFocusPage, NULL, NULL ); DocPageInfoRenew( -1, 1 ); return S_OK; }
/*! 全体又は選択範囲を右に寄せる @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; }
/*! 指定行のドット位置(キャレット位置)で改行する @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; }
/*! 行末文字を削除する。ただし空白だったら削除しない @param[in] pXdot 今のドット位置を受けて戻す・削除に巻き込まれた対応 @param[in] dLine 今の行数 @return HRESULT 終了状態コード */ HRESULT DocLastLetterErase( PINT pXdot, INT dLine ) { UINT_PTR iLines; INT iTop, iBottom, i, xDot = 0; TCHAR ch; BOOLEAN bFirst = TRUE, bSeled = FALSE; RECT rect; LETR_ITR vcLtrItr; LINE_ITR itLine; // 範囲確認 iLines = DocNowFilePageLineCount( ); iTop = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop; iBottom = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom; if( 0 <= iTop && 0 <= iBottom ) bSeled = TRUE; if( 0 > iTop ) iTop = 0; if( 0 > iBottom ) iBottom = iLines - 1; TRACE( TEXT("行末文字削除") ); // 選択してる場合は、操作行を全選択状態にする itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, iTop ); // 位置合わせ for( i = iTop; iBottom >= i; i++, itLine++ ) // 範囲内の各行について { // 文字があるなら操作する if( 0 != itLine->vcLine.size( ) ) { vcLtrItr = itLine->vcLine.end( ); vcLtrItr--; // 終端の一個前が末端文字 ch = vcLtrItr->cchMozi; rect.top = i * LINE_HEIGHT; rect.bottom = rect.top + LINE_HEIGHT; if( !( iswspace( ch ) ) ) { xDot = DocLineParamGet( i, NULL, NULL ); xDot -= vcLtrItr->rdWidth; SqnAppendLetter( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_DELETE, ch, xDot, i, bFirst ); bFirst = FALSE; DocIterateDelete( vcLtrItr, i ); rect.left = xDot; rect.right = xDot + 40; // 壱文字+改行・適当でよろし ViewRedrawSetRect( &rect ); // 末端だけ書き換えればいい? DocBadSpaceCheck( i ); // 良くないスペースを調べておく } } if( bSeled ) { DocRangeSelStateToggle( -1, -1, i , 1 ); // 該当行全体を選択状態にする DocReturnSelStateToggle( i, 1 ); // 改行も選択で } } // キャレット位置適当に調整 *pXdot = 0; DocLetterPosGetAdjust( pXdot, dLine, 0 ); // キャレット位置適当に調整 ViewDrawCaret( *pXdot, dLine, 1 ); DocPageInfoRenew( -1, 1 ); return S_OK; }
/*! 文字列(矩形もアリ)を挿入する @param[in,out] pNowDot 今のキャレットのドット位置 @param[in,out] pdLine 対象の行番号・絶対0インデックスか @param[in,out] pdMozi 今のキャレットの文字数・NULLでもおk @param[in] ptText 挿入する文字列 @param[in] dStyle 矩形かどうか、不可視特別か @param[in] bFirst アンドゥ用・これが最初のアクションか @return 0壱行ですんだ 非0複数行に渡った */ INT DocInsertString( PINT pNowDot, PINT pdLine, PINT pdMozi, LPCTSTR ptText, UINT dStyle, BOOLEAN bFirst ) { INT dBaseDot, dBaseLine, dNeedLine; INT dCrLf, i, dLastLine; UINT_PTR cchSize; LPPOINT pstPoint; dBaseDot = *pNowDot; dBaseLine = *pdLine; dLastLine = *pdLine; if( !(ptText) ) return 0; // 挿入文字列がないなら直ぐ終わってよい StringCchLength( ptText, STRSAFE_MAX_CCH, &cchSize ); if( dStyle & D_SQUARE ) // 矩形用 { // 使う行数 dNeedLine = DocStringInfoCount( ptText, cchSize, NULL, NULL ); bFirst = DocSquareAddPreMod( *pNowDot, *pdLine, dNeedLine, bFirst ); // 中でアンドゥ追加までやる。 pstPoint = NULL; // NULL化必須 dCrLf = DocSquareAdd( pNowDot, pdLine, ptText, cchSize, &pstPoint ); // 貼付前の整形を含めて1Groupとして扱う必要がある SqnAppendSquare( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_INSERT, ptText, pstPoint, dCrLf, bFirst ); bFirst = FALSE; FREE( pstPoint ); dLastLine = *pdLine; } else { // この中で改行とか面倒見る dCrLf = DocStringAdd( pNowDot, pdLine, ptText, cchSize ); SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_INSERT, ptText, dBaseDot, dBaseLine, bFirst ); bFirst = FALSE; dLastLine = DocPageParamGet( NULL, NULL );//再計算必要か? } if( dCrLf ) { for( i = dBaseLine; dLastLine >= i; i++ ){ ViewRedrawSetLine( i ); } } else { ViewRedrawSetLine( *pdLine ); } if( pdMozi ){ *pdMozi = DocLetterPosGetAdjust( pNowDot, *pdLine , 0 ); } // 今の文字位置を確認 // ヤバイ状態のときは操作しないようにする if( !(D_INVISI & dStyle) ) ViewDrawCaret( *pNowDot, *pdLine, TRUE ); return dCrLf; }
/*! 指定行のドット位置(キャレット位置)に壱文字追加する・この函数内ではアンドゥの面倒は見ない @param[in] nowDot 挿入するドット位置 @param[in] rdLine 対象の行番号・絶対0インデックスか @param[in] ch 追加したい文字 @return INT 追加した文字のドット数 */ INT DocInputLetter( INT nowDot, INT rdLine, TCHAR ch ) { INT_PTR iLetter, iCount, iLines; LETTER stLetter; LETR_ITR vcItr; LINE_ITR itLine; // アンドゥリドゥは呼んだところで #ifdef DO_TRY_CATCH try{ #endif if( 0 == ch ) { TRACE( TEXT("NULL文字が入った") ); return 0; } iLines = DocNowFilePageLineCount( ); if( iLines <= rdLine ) { TRACE( TEXT("OutOfRange 指定[%d] 行数[%d]"), rdLine, iLines ); return 0; } iLetter = DocLetterPosGetAdjust( &nowDot, rdLine, 0 ); // 今の文字位置を確認 itLine = (*gitFileIt).vcCont.at( gixFocusPage ).ltPage.begin(); std::advance( itLine, rdLine ); // 対象行までイテレートする // 文字数確認 iCount = itLine->vcLine.size( ); // データ作成 DocLetterDataCheck( &stLetter, ch ); // 指定行のドット位置(キャレット位置)に壱文字追加するとき if( iLetter >= iCount ) // 文字数同じなら末端に追加ということ { itLine->vcLine.push_back( stLetter ); } else // そうでないなら途中に追加 { vcItr = itLine->vcLine.begin( ); vcItr += iLetter; itLine->vcLine.insert( vcItr, stLetter ); } itLine->iDotCnt += stLetter.rdWidth; itLine->iByteSz += stLetter.mzByte; (*gitFileIt).vcCont.at( gixFocusPage ).dByteSz += stLetter.mzByte; // DocBadSpaceCheck( rdLine ); 呼んだところでまとめてやる #ifdef DO_TRY_CATCH } catch( exception &err ){ return ETC_MSG( err.what(), 0 ); } catch( ... ){ return ETC_MSG( ("etc error"), 0 ); } #endif return stLetter.rdWidth; }