/*! 文字列(矩形もアリ)を挿入する @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] 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; }