/*! 選択範囲のテキストを頁名称にする @return HRESULT 終了状態コード */ HRESULT DocSelText2PageName( VOID ) { INT cbSize; LPVOID pString = NULL; LPTSTR ptText; UINT_PTR cchSize, d; if( !( IsSelecting( NULL ) ) ) return E_ABORT; // 選択してないなら何もしない cbSize = DocSelectTextGetAlloc( D_UNI, &pString, NULL ); // 選択範囲をいただく TRACE( TEXT("BYTE:%d"), cbSize ); ptText = (LPTSTR)pString; StringCchLength( ptText, STRSAFE_MAX_CCH, &cchSize ); for( d = 0; cchSize > d; d++ ) // 改行カット { if( 0x0D == ptText[d] ) { ptText[d] = NULL; break; } } PageListNameRewrite( ptText ); FREE( pString ); return S_OK; }
/*! 選択範囲のデータをクリップボードする @param[in] bStyle 1ユニコードかシフトJISで、矩形かどうか @return コピーしたバイト数・NULLターミネータも含む */ INT DocExClipSelect( UINT bStyle ) { INT cbSize; LPVOID pString = NULL; // SJISの場合は、ユニコード文字は&#dddd;で確保される cbSize = DocSelectTextGetAlloc( bStyle, &pString, NULL ); TRACE( TEXT("BYTE:%d"), cbSize ); // もし選択範囲なかったら、Focus行の内容をコピるとか DocClipboardDataSet( pString, cbSize, bStyle ); FREE( pString ); return cbSize; }
/*! 編集の選択範囲からいただく @param[in] hWnd ウインドウハンドル @param[in] bSqSel 矩形であるかどうか */ UINT DraughtItemAddFromSelect( HWND hWnd, UINT bSqSel ) { LPTSTR ptString = NULL; UINT cchSize, cbSize; LPPOINT pstPos = NULL; UINT_PTR i, j, iTexts; LONG dMin = 0; INT insDot, yLine, iLines = 0, dOffset; LPTSTR ptSpace = NULL; LPSTR pcArts; wstring wsString; // 内部処理なのでUnicode固定 cbSize = DocSelectTextGetAlloc( D_UNI | bSqSel, (LPVOID *)(&ptString), (bSqSel & D_SQUARE) ? &pstPos : NULL ); StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize ); if( 0 >= cchSize ) return 0; // 文字列ないならなにもしない // オフセット設定が有る場合、その分を埋める空白が必要 if( pstPos ) // 最小オフセット値を探して、そこを左端にする { dMin = pstPos[0].x; yLine = 0; for( i = 0; cchSize > i; i++ ) { if( CC_CR == ptString[i] && CC_LF == ptString[i+1] ) // 改行であったら { // オフセット最小をさがす if( dMin > pstPos[yLine].x ){ dMin = pstPos[yLine].x; } i++; // 0x0D,0x0Aだから、壱文字飛ばすのがポイント yLine++; // 改行したからFocusは次の行へ } } // この時点で、yLineは行数になってる iLines = yLine; // 壱行目の空白を作って閃光入力しておく insDot = 0; dOffset = pstPos[0].x - dMin; ptSpace = DocPaddingSpaceUni( dOffset, NULL, NULL, NULL ); // 前方空白は無視されるのでユニコード使って問題無い StringCchLength( ptSpace, STRSAFE_MAX_CCH, &iTexts ); for( j = 0; iTexts > j; j++ ){ wsString += ptSpace[j]; } FREE(ptSpace); } yLine = 0; insDot = 0; for( i = 0; cchSize > i; i++ ) { if( CC_CR == ptString[i] && CC_LF == ptString[i+1] ) // 改行であったら { wsString += wstring( TEXT("\r\n") ); i++; // 0x0D,0x0Aだから、壱文字飛ばすのがポイント yLine++; // 改行したからFocusは次の行へ // オフセット分の空白を作る if( pstPos && (iLines > yLine) ) { dOffset = pstPos[yLine].x - dMin; ptSpace = DocPaddingSpaceUni( dOffset, NULL, NULL, NULL ); // 前方空白は無視されるのでユニコード使って問題無い StringCchLength( ptSpace, STRSAFE_MAX_CCH, &iTexts ); for( j = 0; iTexts > j; j++ ){ wsString += ptSpace[j]; } FREE(ptSpace); } } else if( CC_TAB == ptString[i] ){ /* タブは挿入しない */ } else{ wsString += ptString[i]; } } FREE(ptString); FREE(pstPos); pcArts = SjisEncodeAlloc( wsString.c_str() ); DraughtItemAdding( hWnd, pcArts ); FREE(pcArts); return yLine; }
/*! 選択されているところを全削除しちゃう @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; }