/*! 全体又は選択範囲を右に寄せる @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] 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; }
/*! 抽出対象領域を取り出す @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; }