/*! ページ分割処理・カーソル位置の次の行から終わりまでを次の頁へ @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; }
/*! 保持構造体に文字列を記録する @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; }
/*! ページ追加処理・ファイルコア函数 @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; }