📄 clayoutmgr_new.cpp
字号:
}
}
if( nPos - nBgn > 0 ){
// 2002/03/13 novice
if( nCOMMENTMODE == COLORIDX_COMMENT ){ /* 行コメントである */
nCOMMENTMODE = COLORIDX_TEXT;
}
AddLineBottom( CreateLayout(pCDocLine, nLineNum, nBgn, nPos - nBgn, nCOMMENTMODE_Prev, nIndent) );
m_nLineTypeBot = nCOMMENTMODE;
nCOMMENTMODE_Prev = nCOMMENTMODE;
}
nLineNum++;
if( NULL != hwndProgress && 0 < nAllLineNum && 0 == ( nLineNum % 1024 ) ){
::PostMessage( hwndProgress, PBM_SETPOS, nLineNum * 100 / nAllLineNum , 0 );
/* 処理中のユーザー操作を可能にする */
if( !::BlockingHook( NULL ) ){
return;
}
}
// pLine = m_pcDocLineMgr->GetNextLinrStr( &nLineLen );
pCDocLine = pCDocLine->m_pNext;;
// 2002/03/13 novice
if( nCOMMENTMODE_Prev == COLORIDX_COMMENT ){ /* 行コメントである */
nCOMMENTMODE_Prev = COLORIDX_TEXT;
}
nCOMMENTMODE = nCOMMENTMODE_Prev;
nCOMMENTEND = 0;
}
m_nPrevReferLine = 0;
m_pLayoutPrevRefer = NULL;
// m_pLayoutCurrent = NULL;
if( NULL != hwndProgress ){
::PostMessage( hwndProgress, PBM_SETPOS, 0, 0 );
/* 処理中のユーザー操作を可能にする */
if( !::BlockingHook( NULL ) ){
return;
}
}
return;
}
/*!
指定レイアウト行に対応する論理行の次の論理行から指定論理行数だけ再レイアウトする
@date 2002.10.07 YAZAKI rename from "DoLayout3_New"
@date 2004.04.03 Moca TABが使われると折り返し位置がずれるのを防ぐため,
nPosXがインデントを含む幅を保持するように変更.nMaxLineSizeは
固定値となったが,既存コードの置き換えは避けて最初に値を代入するようにした.
@note 2004.04.03 Moca
DoLayoutとは違ってレイアウト情報がリスト中間に挿入されるため,
挿入後にm_nLineTypeBotへコメントモードを指定してはならない
代わりに最終行のコメントモードを終了間際に確認している.
*/
int CLayoutMgr::DoLayout_Range(
CLayout* pLayoutPrev,
int nLineNum,
int nDelLogicalLineFrom,
int nDelLogicalColFrom,
int nCurrentLineType,
int* pnExtInsLineNum,
BOOL bDispSSTRING, /* シングルクォーテーション文字列を表示する */
BOOL bDispWSTRING /* ダブルクォーテーション文字列を表示する */
)
{
int nLineNumWork;
int nLineLen;
int nCurLine;
CDocLine* pCDocLine;
const char* pLine;
int nBgn;
//! メモリ上の位置(offset)
int nPos;
/* 表示上のX位置
2004.03.28 Moca nPosXはインデント幅を含むように変更(TAB位置調整のため)
*/
int nPosX;
int nCharChars;
int nCharChars2;
CLayout* pLayout;
int nModifyLayoutLinesNew;
int nCOMMENTMODE;
int nCOMMENTMODE_Prev;
int nCOMMENTEND;
bool bNeedChangeCOMMENTMODE = false; //@@@ 2002.09.23 YAZAKI bAddを名称変更
int nWordBgn;
int nWordLen;
bool bKinsokuFlag; //@@@ 2002.04.08 MIK
int nCharChars3; //@@@ 2002.04.17 MIK
int nKinsokuType; //@@@ 2002.04.20 MIK
int nIndent; // インデント幅
CLayout* pLayoutCalculated; // インデント幅計算済みのCLayout.
// 2004.04.09 genta 関数内では値が変化しないのでループの外に出す
int nMaxLineSize= m_nMaxLineSize;
nLineNumWork = 0;
*pnExtInsLineNum = 0;
if( 0 == nLineNum ){
return 0;
}
pLayout = pLayoutPrev;
if( NULL == pLayout ){
nCurLine = 0;
}else{
nCurLine = pLayout->m_nLinePhysical + 1;
}
nCOMMENTMODE = nCurrentLineType;
nCOMMENTMODE_Prev = nCOMMENTMODE;
// pLine = m_pcDocLineMgr->GetLineStr( nCurLine, &nLineLen );
pCDocLine = m_pcDocLineMgr->GetLineInfo( nCurLine );
// if( nCOMMENTMODE_Prev == 1 ){ /* 行コメントである */
// nCOMMENTMODE_Prev = 0;
// }
// nCOMMENTMODE = nCOMMENTMODE_Prev;
nCOMMENTEND = 0;
nModifyLayoutLinesNew = 0;
while( NULL != pCDocLine ){
pLine = pCDocLine->m_pLine->GetPtr( &nLineLen );
nPosX = 0;
nCharChars = 0;
nBgn = 0;
nPos = 0;
nWordBgn = 0;
nWordLen = 0;
nKinsokuType = KINSOKU_TYPE_NONE; //@@@ 2002.04.20 MIK
int nEol = pCDocLine->m_cEol.GetLen();
int nEol_1 = nEol - 1;
if( 0 > nEol_1 ){
nEol_1 = 0;
}
nIndent = 0; // インデント幅
pLayoutCalculated = pLayout; // インデント幅計算済みのCLayout.
while( nPos < nLineLen - nEol_1 ){
// インデント幅の計算コストを下げるための方策
if ( pLayout &&
pLayout != pLayoutCalculated ){
// 計算
// Oct, 1, 2002 genta Indentサイズを取得するように変更
nIndent = (this->*getIndentOffset)( pLayout );
// 2004.03.28 Moca nMaxLineSizeを引く方法だと、タブ幅の計算が合わないので、nPosXの初期値をnIndentにする
// nMaxLineSize = m_nMaxLineSize - nIndent;
// 計算済み
pLayoutCalculated = pLayout;
}
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[nPos] ) - &pLine[nPos];
if( 0 == nCharChars ){
nCharChars = 1;
}
SEARCH_START:;
//禁則処理中ならスキップする @@@ 2002.04.20 MIK
if( KINSOKU_TYPE_NONE != nKinsokuType )
{
//禁則処理の最後尾に達したら禁則処理中を解除する
if( nPos >= nWordBgn + nWordLen )
{
if( nKinsokuType == KINSOKU_TYPE_KINSOKU_KUTO
&& nPos == nWordBgn + nWordLen )
{
if( ! (m_bKinsokuRet && (nPos == nLineLen - nEol) && nEol ) ) //改行文字をぶら下げる //@@@ 2002.04.14 MIK
{
//@@@ 2002.09.23 YAZAKI 最適化
if( bNeedChangeCOMMENTMODE ){
pLayout = pLayout->m_pNext;
pLayout->m_nTypePrev = nCOMMENTMODE_Prev;
(*pnExtInsLineNum)++; // 再描画してほしい行数+1
}
else {
pLayout = InsertLineNext( pLayout, CreateLayout(pCDocLine, nCurLine, nBgn, nPos - nBgn, nCOMMENTMODE_Prev, nIndent) );
}
nCOMMENTMODE_Prev = nCOMMENTMODE;
nBgn = nPos;
// 2004.03.28 Moca nPosXはインデント幅を含むように変更(TAB位置調整のため)
nPosX = nIndent = (this->*getIndentOffset)( pLayout );
pLayoutCalculated = pLayout;
if( ( nDelLogicalLineFrom == nCurLine && nDelLogicalColFrom < nPos ) ||
( nDelLogicalLineFrom < nCurLine )
){
(nModifyLayoutLinesNew)++;;
}
}
}
nWordLen = 0;
nKinsokuType = KINSOKU_TYPE_NONE; //@@@ 2002.04.20 MIK
}
}
else
{
/* ワードラップ処理 */
if( m_bWordWrap /* 英文ワードラップをする */
&& nKinsokuType == KINSOKU_TYPE_NONE )
{
/* 英単語の先頭か */
if( nPos >= nBgn &&
nCharChars == 1 &&
IS_KEYWORD_CHAR( pLine[nPos] )
){
/* キーワード文字列の終端を探す */
int i;
for( i = nPos + 1; i <= nLineLen - 1; ){
nCharChars2 = CMemory::MemCharNext( pLine, nLineLen, &pLine[i] ) - &pLine[i];
if( 0 == nCharChars2 ){
nCharChars2 = 1;
}
if( nCharChars2 == 1 &&
IS_KEYWORD_CHAR( pLine[i] ) ){ //@@@ 2002.09.23 YAZAKI
}else{
break;
}
i += nCharChars2;
}
nWordBgn = nPos;
nWordLen = i - nPos;
nKinsokuType = KINSOKU_TYPE_WORDWRAP; //@@@ 2002.04.20 MIK
if( nPosX + i - nPos >= nMaxLineSize
&& nPos - nBgn > 0
){
//@@@ 2002.09.23 YAZAKI 最適化
if( bNeedChangeCOMMENTMODE ){
pLayout = pLayout->m_pNext;
pLayout->m_nTypePrev = nCOMMENTMODE_Prev;
(*pnExtInsLineNum)++; // 再描画してほしい行数+1
}
else {
pLayout = InsertLineNext( pLayout, CreateLayout(pCDocLine, nCurLine, nBgn, nPos - nBgn, nCOMMENTMODE_Prev, nIndent) );
}
nCOMMENTMODE_Prev = nCOMMENTMODE;
nBgn = nPos;
// 2004.03.28 Moca nPosXはインデント幅を含むように変更(TAB位置調整のため)
nPosX = nIndent = (this->*getIndentOffset)( pLayout );
pLayoutCalculated = pLayout;
if( ( nDelLogicalLineFrom == nCurLine && nDelLogicalColFrom < nPos ) ||
( nDelLogicalLineFrom < nCurLine )
){
(nModifyLayoutLinesNew)++;;
}
//? continue;
}
}
}
//@@@ 2002.04.07 MIK start
/* 句読点のぶらさげ */
if( m_bKinsokuKuto
&& (nMaxLineSize - nPosX < 2)
&& (nKinsokuType == KINSOKU_TYPE_NONE) )
{
bKinsokuFlag = false;
nCharChars2 = CMemory::MemCharNext( pLine, nLineLen, &pLine[nPos] ) - &pLine[nPos];
switch( nMaxLineSize - nPosX )
{
case 1: // 1文字前
if( nCharChars2 == 2 )
{
bKinsokuFlag = true;
}
break;
case 0: //
if( nCharChars2 == 1 || nCharChars2 == 2 )
{
bKinsokuFlag = true;
}
break;
}
if( bKinsokuFlag && IsKinsokuKuto( &pLine[nPos], nCharChars2 ) )
{
//nPos += nCharChars2; nPosX += nCharChars2;
nWordBgn = nPos;
nWordLen = nCharChars2;
nKinsokuType = KINSOKU_TYPE_KINSOKU_KUTO;
}
}
/* 行頭禁則 */
if( m_bKinsokuHead
&& (nMaxLineSize - nPosX < 4)
&& ( nPosX > nIndent ) // 2004.04.09 nPosXの解釈変更のため,行頭チェックも変更
&& (nKinsokuType == KINSOKU_TYPE_NONE) )
{
bKinsokuFlag = false;
nCharChars2 = CMemory::MemCharNext( pLine, nLineLen, &pLine[nPos] ) - &pLine[nPos];
nCharChars3 = CMemory::MemCharNext( pLine, nLineLen, &pLine[nPos+nCharChars2] ) - &pLine[nPos+nCharChars2];
switch( nMaxLineSize - nPosX )
{
// 321012 ↓マジックナンバー
// 3 "る)" : 22 ")"の2バイト目で折り返しのとき
// 2 "Z)" : 12 ")"の2バイト目で折り返しのとき
// 2 "る)": 22 ")"で折り返しのとき
// 2 "る)" : 21 ")"で折り返しのとき
// 1 "Z)": 12 ")"で折り返しのとき
// 1 "Z)" : 11 ")"で折り返しのとき
//↑何文字前か?
// ※ただし、"るZ"部分が禁則なら処理しない。
case 3: // 3文字前
if( nCharChars2 == 2 && nCharChars3 == 2 )
{
bKinsokuFlag = true;
}
break;
case 2: // 2文字前
if( 2 == nCharChars2 /*&& nCharChars3 > 0*/ )
{
bKinsokuFlag = true;
}
else if( nCharChars2 == 1 )
{
if( nCharChars3 == 2 )
{
bKinsokuFlag = true;
}
}
break;
case 1: // 1文字前
if( nCharChars2 == 1 /*&& nCharChars3 > 0*/ )
{
bKinsokuFlag = true;
}
break;
}
if( bKinsokuFlag
&& IsKinsokuHead( &pLine[nPos+nCharChars2], nCharChars3 )
&& ! IsKinsokuHead( &pLine[nPos], nCharChars2 ) //1文字前が行頭禁則でない
&& ! IsKinsokuKuto( &pLine[nPos], nCharChars2 ) ) //句読点でない
{
//nPos += nCharChars2 + nCharChars3; nPosX += nCharChars2 + nCharChars3;
nWordBgn = nPos;
nWordLen = nCharChars2 + nCharChars3;
nKinsokuType = KINSOKU_TYPE_KINSOKU_HEAD;
//@@@ 2002.09.23 YAZAKI 最適化
if( bNeedChangeCOMMENTMODE ){
pLayout = pLayout->m_pNext;
pLayout->m_nTypePrev = nCOMMENTMODE_Prev;
(*pnExtInsLineNum)++; // 再描画してほしい行数+1
}
else {
pLayout = InsertLineNext( pLayout, CreateLayout(pCDocLine, nCurLine, nBgn, nPos - nBgn, nCOMMENTMODE_Prev, nIndent) );
}
nCOMMENTMODE_Prev = nCOMMENTMODE;
nBgn = nPos;
// 2004.03.28 Moca nPosXはインデント幅を含むように変更(TAB位置調整のため)
nPosX = nIndent = (this->*getIndentOffset)( pLayout );
pLayoutCalculated = pLayout;
if( ( nDelLogicalLineFrom == nCurLine && nDelLogicalColFrom < nPos ) ||
( nDelLogicalLineFrom < nCurLine )
){
(nModifyLayoutLinesNew)++;;
}
}
}
/* 行末禁則 */
if( m_bKinsokuTail
&& (nMaxLineSize - nPosX < 4)
&& ( nPosX > nIndent ) // 2004.04.09 nPosXの解釈変更のため,行頭チェックも変更
&& (nKinsokuType == KINSOKU_TYPE_NONE) )
{ /* 行末禁則する && 行末付近 && 行頭でないこと(無限に禁則してしまいそう) */
bKinsokuFlag = false;
nCharChars2 = CMemory::MemCharNext( pLine, nLineLen, &pLine[nPos] ) - &pLine[nPos];
switch( nMaxLineSize - nPosX )
{
case 3: // 3文字前
if( nCharChars2 == 2 )
{
if( CMemory::MemCharNext( pLine, nLineLen, &pLine[nPos+nCharChars2] ) - &pLine[nPos+nCharChars2] == 2 )
{
// "(あ": "あ"の2バイト目で折り返しのとき
bKinsokuFlag = true;
}
}
break;
case 2: // 2文字前
if( nCharChars2 == 2 )
{
// "(あ": "あ"で折り返しのとき
bKinsokuFlag = true;
}
else if( nCharChars2 == 1 )
{
if( CMemory::MemCharNext( pLine, nLineLen, &pLine[nPos+nCharChars2] ) - &pLine[nPos+nCharChars2] == 2 )
{
// "(あ": "あ"の2バイト目で折り返しのとき
bKinsokuFlag = true;
}
}
break;
case 1: // 1文字前
if( nCharChars2 == 1 )
{
// "(あ": "あ"で折り返しのとき
bKinsokuFlag = true;
}
break;
}
if( bKinsokuFlag && IsKinsokuTail( &pLine[nPos], nCharChars2 ) )
{
//nPos += nCharChars2; nPosX += nCharChars2;
nWordBgn = nPos;
nWordLen = nCharChars2;
nKinsokuType = KINSOKU_TYPE_KINSOKU_TAIL;
//@@@ 2002.09.23 YAZAKI 最適化
if( bNeedChangeCOMMENTMODE ){
pLayout = pLayout->m_pNext;
pLayout->m_nTypePrev = nCOMMENTMODE_Prev;
(*pnExtInsLineNum)++; // 再描画してほしい行数+1
}
else {
pLayout = InsertLineNext( pLayout, CreateLayout(pCDocLine, nCurLine, nBgn, nPos - nBgn, nCOMMENTMODE_Prev, nIndent) );
}
nCOMMENTMODE_Prev = nCOMMENTMODE;
nBgn = nPos;
// 2004.03.28 Moca nPosXはインデント幅を含むように変更(TAB位置調整のため)
nPosX = nIndent = (this->*getIndentOffset)( pLayout );
pLayoutCalculated = pLayout;
if( ( nDelLogicalLineFrom == nCurLine && nDelLogicalColFrom < nPos ) ||
( nDelLogicalLineFrom < nCurLine )
){
(nModifyLayoutLinesNew)++;;
}
}
}
//@@@ 2002.04.08 MIK end
} // if( nKinsokuType != KINSOKU_TYPE_NONE )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -