/*! 矩形貼付をする前に、 場の状況を確認して、必要なら整形する @param[in] xDot 追加開始するドット位置 @param[in] yLine 追加開始する行番号 @param[in] dNeedLine 使う行数 @param[in] bFirst アンドゥの非0初めてのグループ 0続きの処理 @return INT 非0しなかった 0処理した */ INT DocSquareAddPreMod( INT xDot, INT yLine, INT dNeedLine, BOOLEAN bFirst ) { // 行増やすのと、所定の位置までスペースで埋める INT_PTR iLines; INT iBaseDot, iBaseLine, iMinus, i; UINT cchBuf; LPTSTR ptBuffer = NULL; // この頁の行数 iLines = DocNowFilePageLineCount( ); // 全体行数より、追加行数が多かったら、改行増やす if( iLines < (dNeedLine + yLine) ) { iMinus = (dNeedLine + yLine) - iLines; // 追加する行数 DocAdditionalLine( iMinus, &bFirst );// bFirst = FALSE; // この頁の行数取り直し iLines = DocNowFilePageLineCount( ); } // 各行のドット数を確認して、足りないところをパディングする //多い分には問題無し・足りないのが3以下なら無視、あとは適当にパディングを作る //良い感じの数が無かったら増減して作れるまでさがす for( i = 0; dNeedLine > i; i++ ) { iBaseLine = yLine + i; iBaseDot = DocLineParamGet( iBaseLine, NULL, NULL ); // 基準から存在ドットを引くと、+なら足りない iMinus = xDot - iBaseDot; if( gbUniPad ){ if( 0 >= iMinus ) continue; } else{ if( 3 >= iMinus ) continue; } // 余るか3以下なら気にする必要は無い ptBuffer = DocPaddingSpaceWithPeriod( iMinus, NULL, NULL, NULL, FALSE ); if( !ptBuffer ) // まずは綺麗に納めるのを試みて、ダメならズレありで再計算 { ptBuffer = DocPaddingSpaceWithGap( iMinus, NULL, NULL ); } if( !ptBuffer ){ continue; } StringCchLength( ptBuffer, STRSAFE_MAX_CCH, &cchBuf ); SqnAppendString( &((*gitFileIt).vcCont.at( gixFocusPage ).stUndoLog), DO_INSERT, ptBuffer, iBaseDot, iBaseLine, bFirst ); bFirst = FALSE; DocStringAdd( &iBaseDot, &iBaseLine, ptBuffer, cchBuf ); FREE( ptBuffer ); } return bFirst; }
/*! 選択されたユーザ定義アイテムの処理 @param[in] hWnd 多分メインウインドウハンドル @param[in] idNum アイテム番号0〜15 @return HRESULT 終了状態コード */ HRESULT UserDefItemInsert( HWND hWnd, UINT idNum ) { INT iLines, yLine, iMinus, i, dmyDot; INT_PTR dNeedLine; LPTSTR ptText; BOOLEAN bFirst = TRUE; // はみ出したらアウツ! if( gdItemCnt <= idNum ) return E_OUTOFMEMORY; // 今のカーソル行から、行先頭に、各行の内容を挿入していく yLine = gdDocLine; dNeedLine = gstUserItem[idNum].vcUnits.size( ); // まずは頁行数かくぬん iLines = DocPageParamGet( NULL , NULL ); // 行数確認・入れ替えていけるか // 全体行数より、追加行数が多かったら、改行増やす if( iLines < (dNeedLine + yLine) ) { iMinus = (dNeedLine + yLine) - iLines; // 追加する行数 DocAdditionalLine( iMinus, &bFirst );// bFirst = FALSE; // この頁の行数取り直し iLines = DocPageParamGet( NULL , NULL ); // 再計算いるか? } for( i = 0; dNeedLine > i; i++, yLine++ ) { ptText = UserDefTextLineAlloc( idNum, i ); dmyDot = 0; DocInsertString( &dmyDot, &yLine, NULL, ptText, 0, bFirst ); bFirst = FALSE; FREE(ptText); } return S_OK; }
/*! 頁番号挿入のアレ @param[in] hInst アプリの実存 @param[in] hWnd 親ウインドウハンドル・NULLで破壊処理 @return HRESULT 終了状態コード */ HRESULT DocPageNumInsert( HINSTANCE hInst, HWND hWnd ) { INT dNowPageBuffer; INT iLine, iDot; INT_PTR iRslt, maxPage, iNow; UINT ixNumber; BOOLEAN bFirst = TRUE; TCHAR atText[MAX_PATH]; PAGENUMINFO stInfo; // 今の頁を待避 dNowPageBuffer = gixFocusPage; maxPage = DocNowFilePageCount( ); // 頁数を確認 ZeroMemory( &stInfo, sizeof(PAGENUMINFO) ); stInfo.dStartNum = 1; // 設定を確認 stInfo.bInUnder = InitParamValue( INIT_LOAD, VL_PAGE_UNDER, BST_UNCHECKED ); // 頁番号を最下行に挿入するか stInfo.bOverride = InitParamValue( INIT_LOAD, VL_PAGE_OVWRITE, BST_UNCHECKED ); // 該当行の内容を削除して上書するか // 文字列フォーマット StringCchCopy( stInfo.atStyle, MAX_PATH, TEXT("%u") ); // デフォ設定 InitParamString( INIT_LOAD, VS_PAGE_FORMAT, stInfo.atStyle ); iRslt = DialogBoxParam( hInst, MAKEINTRESOURCE(IDD_PAGENUMBER_DLG), hWnd, PageNumDlgProc, (LPARAM)(&stInfo) ); if( IDOK == iRslt ) // 挿入する { #pragma message("ディレイロードしたら、頁番号挿入がおかしくなるはず") ixNumber = stInfo.dStartNum; // 開始番号について InitParamString( INIT_SAVE, VS_PAGE_FORMAT, stInfo.atStyle ); // 設定を保存 InitParamValue( INIT_SAVE, VL_PAGE_UNDER, stInfo.bInUnder ); InitParamValue( INIT_SAVE, VL_PAGE_OVWRITE, stInfo.bOverride ); for( iNow = 0; maxPage > iNow; iNow++, ixNumber++ ) { StringCchPrintf( atText, MAX_PATH, stInfo.atStyle, ixNumber ); if( NowPageInfoGet( iNow, NULL ) ) // ディレってないなら0 { // ディレイ文字列を操作するか DocDelayPageNumInsert( gitFileIt, iNow, &stInfo, atText ); // 展開する・頁が多いと重い・しなくていい //DocDelayPageLoad( gitFileIt, iNow ); } else { gixFocusPage = iNow; // 内部操作 if( stInfo.bInUnder ) // 頁最下部に挿入 { if( stInfo.bOverride ) // 該当行消して挿入である { iLine = DocPageParamGet( NULL, NULL ); iLine--; if( 0 > iLine ){ iLine = 0; } DocLineErase( iLine , &bFirst ); // 中でアンドゥ操作変換 } else { iLine = DocAdditionalLine( 1, &bFirst );// bFirst = FALSE; } } else // 壱行目に挿入 { iDot = 0; iLine = 0; if( stInfo.bOverride ) // 該当行消して挿入である { DocLineErase( 0 , &bFirst ); // 中でアンドゥ操作変換 } else { DocInsertString( &iDot, &iLine, NULL, CH_CRLFW, 0, bFirst ); bFirst = FALSE; } iLine = 0; } iDot = 0; // 頁番号の内容挿入 DocInsertString( &iDot, &iLine, NULL, atText, 0, bFirst ); bFirst = FALSE; } } // 頁元に戻す gixFocusPage = dNowPageBuffer; ViewRedrawSetLine( -1 ); } return S_OK; }
/*! 各行の末端から800くらいまでを、指定した文字で埋める。 @param[in] ptFill 埋め文字列 */ HRESULT DocScreenFill( LPTSTR ptFill ) { UINT_PTR dLines, dRiDot, cchSize; BOOLEAN bSel = TRUE, bFirst; INT iTop, iBottom, i, iUnt, j, remain; INT nDot, sDot, mDot; LPTSTR ptBuffer; wstring wsBuffer; // 現在行数と、右ドット数・ルーラ位置を使う dLines = DocNowFilePageLineCount( ); dRiDot = gdRightRuler; // 選択範囲あるならそっち優先。ないなら画面全体 iTop = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineTop; iBottom = (*gitFileIt).vcCont.at( gixFocusPage ).dSelLineBottom; if( 0 > iTop || 0 > iBottom ){ iTop = 0; iBottom = dLines - 1; bSel = FALSE; } ViewSelPageAll( -1 ); // 選択範囲無くなる // 埋め文字列の幅 mDot = ViewStringWidthGet( ptFill ); bFirst = TRUE; // 各行毎に追加する感じで for( i = iTop; iBottom >= i; i++ ) { nDot = DocLineParamGet( i , NULL, NULL ); // 呼び出せば中で面倒みてくれる sDot = dRiDot - nDot; // 残りドット if( 0 >= sDot ){ continue; } // 右端超えてるならなにもせんでいい iUnt = (sDot / mDot) + 1; // 埋める分・はみ出し・適当で良い // 入れる文字列作成 wsBuffer.clear( ); for( j = 0; iUnt > j; j++ ){ wsBuffer += wstring( ptFill ); } cchSize = wsBuffer.size( ) + 1; ptBuffer = (LPTSTR)malloc( cchSize * sizeof(TCHAR) ); StringCchCopy( ptBuffer, cchSize, wsBuffer.c_str( ) ); // 末端にブチこむ DocInsertString( &nDot, &i, NULL, ptBuffer, 0, bFirst ); bFirst = FALSE; FREE(ptBuffer); DocBadSpaceCheck( i ); // ここで空白チェキ・あまり意味はないが色換えは必要 } if( !(bSel) ) // 非選択状態で { remain = 40 - dLines; // とりあえず40行とする if( 0 < remain ) // 足りないなら { DocAdditionalLine( remain, &bFirst ); // とりあえず改行して dLines = DocNowFilePageLineCount( ); iUnt = (dRiDot / mDot) + 1; // 埋める分・はみ出し・適当で良い // 入れる文字列作成 wsBuffer.clear( ); for( j = 0; iUnt > j; j++ ){ wsBuffer += wstring( ptFill ); } cchSize = wsBuffer.size( ) + 1; ptBuffer = (LPTSTR)malloc( cchSize * sizeof(TCHAR) ); StringCchCopy( ptBuffer, cchSize, wsBuffer.c_str( ) ); iTop = iBottom + 1; iBottom = dLines - 1; for( i = iTop; iBottom >= i; i++ ) { // 末端にブチこむ nDot = DocLineParamGet( i , NULL, NULL ); // 多分0のハズ DocInsertString( &nDot, &i, NULL, ptBuffer, 0, bFirst ); bFirst = FALSE; DocBadSpaceCheck( i ); // ここで空白チェキ・あまり意味はないが色換えは必要 } FREE(ptBuffer); } } DocPageInfoRenew( -1, 1 ); return S_OK; }