//! 指定した位置の文字が半角何個分かを返す CKetaXInt CNativeW::GetKetaOfChar( const wchar_t* pData, int nDataLen, int nIdx ) { //文字列範囲外なら 0 if( nIdx >= nDataLen ) return CKetaXInt(0); // サロゲートチェック BMP 以外は全角扱い 2008/7/5 Uchi if (IsUTF16High(pData[nIdx])) { return CKetaXInt(2); // 仮 } if (IsUTF16Low(pData[nIdx])) { if (nIdx > 0 && IsUTF16High(pData[nIdx - 1])) { // サロゲートペア(下位) return CKetaXInt(0); } // 単独(ブロークンペア) // return CKetaXInt(2); if( IsBinaryOnSurrogate(pData[nIdx]) ) return CKetaXInt(1); else return CKetaXInt(2); } //半角文字なら 1 if(WCODE::IsHankaku(pData[nIdx]) ) return CKetaXInt(1); //全角文字なら 2 else return CKetaXInt(2); }
/*! 現在の折り返し文字数に合わせて全データのレイアウト情報を再生成します @date 2004.04.03 Moca TABが使われると折り返し位置がずれるのを防ぐため, nPosXがインデントを含む幅を保持するように変更.m_nMaxLineKetasは 固定値となったが,既存コードの置き換えは避けて最初に値を代入するようにした. */ void CLayoutMgr::_DoLayout(bool bBlockingHook) { MY_RUNNINGTIMER( cRunningTimer, "CLayoutMgr::_DoLayout" ); /* 表示上のX位置 2004.03.28 Moca nPosXはインデント幅を含むように変更(TAB位置調整のため) */ int nAllLineNum; if( GetListenerCount() != 0 ){ NotifyProgress(0); /* 処理中のユーザー操作を可能にする */ if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } _Empty(); Init(); // Nov. 16, 2002 genta // 折り返し幅 <= TAB幅のとき無限ループするのを避けるため, // TABが折り返し幅以上の時はTAB=4としてしまう // 折り返し幅の最小値=10なのでこの値は問題ない if( GetTabSpace() >= GetMaxLineKetas() ){ m_nTabSpace = CKetaXInt(4); } nAllLineNum = m_pcDocLineMgr->GetLineCount(); SLayoutWork _sWork; SLayoutWork* pWork = &_sWork; pWork->pcDocLine = m_pcDocLineMgr->GetDocLineTop(); // 2002/2/10 aroka CDocLineMgr変更 pWork->pLayout = NULL; pWork->pcColorStrategy = NULL; pWork->colorPrev = COLORIDX_DEFAULT; pWork->nCurLine = CLogicInt(0); while( NULL != pWork->pcDocLine ){ pWork->cLineStr = pWork->pcDocLine->GetStringRefWithEOL(); pWork->eKinsokuType = KINSOKU_TYPE_NONE; //@@@ 2002.04.20 MIK pWork->nBgn = CLogicInt(0); pWork->nPos = CLogicInt(0); pWork->nWordBgn = CLogicInt(0); pWork->nWordLen = CLogicInt(0); pWork->nPosX = CLayoutInt(0); // 表示上のX位置 pWork->nIndent = CLayoutInt(0); // インデント幅 _MakeOneLine(pWork, &CLayoutMgr::_OnLine1); if( pWork->nPos - pWork->nBgn > 0 ){ // 2002/03/13 novice AddLineBottom( pWork->_CreateLayout(this) ); pWork->colorPrev = pWork->pcColorStrategy->GetStrategyColorSafe(); pWork->exInfoPrev.SetColorInfo(pWork->pcColorStrategy->GetStrategyColorInfoSafe()); } // 次の行へ pWork->nCurLine++; pWork->pcDocLine = pWork->pcDocLine->GetNextLine(); // 処理中のユーザー操作を可能にする if( GetListenerCount()!=0 && 0 < nAllLineNum && 0 == ( pWork->nCurLine % 1024 ) ){ NotifyProgress(::MulDiv( pWork->nCurLine, 100 , nAllLineNum ) ); if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } // 2002/03/13 novice } // 2011.12.31 Botの色分け情報は最後に設定 m_nLineTypeBot = pWork->pcColorStrategy->GetStrategyColorSafe(); m_cLayoutExInfoBot.SetColorInfo(pWork->pcColorStrategy->GetStrategyColorInfoSafe()); m_nPrevReferLine = CLayoutInt(0); m_pLayoutPrevRefer = NULL; if( GetListenerCount()!=0 ){ NotifyProgress(0); /* 処理中のユーザー操作を可能にする */ if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } }
/*! @brief 折り返しの動作を決定 トグルコマンド「現在のウィンドウ幅で折り返し」を行った場合の動作を決定する @retval TGWRAP_NONE No action @retval TGWRAP_FULL 最大値 @retval TGWRAP_WINDOW ウィンドウ幅 @retval TGWRAP_PROP 設定値 @date 2006.01.08 genta メニュー表示で同一の判定を使うため,Command_WRAPWINDOWWIDTH()より分離. @date 2006.01.08 genta 判定条件を見直し @date 2008.06.08 ryoji ウィンドウ幅設定にぶら下げ余白を追加 */ CEditView::TOGGLE_WRAP_ACTION CEditView::GetWrapMode( CKetaXInt* _newKetas ) { CKetaXInt& newKetas=*_newKetas; //@@@ 2002.01.14 YAZAKI 現在のウィンドウ幅で折り返されているときは、最大値にするコマンド。 //2002/04/08 YAZAKI ときどきウィンドウ幅で折り返されないことがあるバグ修正。 // 20051022 aroka 現在のウィンドウ幅→最大値→文書タイプの初期値 をトグルにするコマンド // ウィンドウ幅==文書タイプ||最大値==文書タイプ の場合があるため判定順序に注意する。 /* Jan. 8, 2006 genta じゅうじさんの要望により判定方法を再考.現在の幅に合わせるのを最優先に. 基本動作: 設定値→ウィンドウ幅 →(ウィンドウ幅と合っていなければ)→ウィンドウ幅→上へ戻る →(ウィンドウ幅と合っていたら)→最大値→設定値 ただし,最大値==設定値の場合には最大値→設定値の遷移が省略されて上に戻る ウィンドウ幅が極端に狭い場合にはウィンドウ幅に合わせることは出来ないが, 設定値と最大値のトグルは可能. 0)現在のテキストの折り返し方法!=指定桁で折り返す:変更不能 1)現在の折り返し幅==ウィンドウ幅 : 最大値 2)現在の折り返し幅!=ウィンドウ幅 3)→ウィンドウ幅が極端に狭い場合 4) └→折り返し幅!=最大値 : 最大値 5) └→折り返し幅==最大値 6) └→最大値==設定値 : 変更不能 7) └→最大値!=設定値 : 設定値 8)→ウィンドウ幅が十分にある 9) └→折り返し幅==最大値 a) └→最大値!=設定値 : 設定値 b) └→最大値==設定値 : ウィンドウ幅 c) └→ウィンドウ幅 */ if (GetDocument()->m_cLayoutMgr.GetMaxLineKetas() == ViewColNumToWrapColNum( GetTextArea().m_nViewColNum ) ){ // a) newKetas = CKetaXInt(MAXLINEKETAS); return TGWRAP_FULL; } else if( MINLINEKETAS > GetTextArea().m_nViewColNum - GetWrapOverhang() ){ // 2) // 3) if( GetDocument()->m_cLayoutMgr.GetMaxLineKetas() != MAXLINEKETAS ){ // 4) newKetas = CKetaXInt(MAXLINEKETAS); return TGWRAP_FULL; } else if( m_pTypeData->m_nMaxLineKetas == MAXLINEKETAS ){ // 5) // 6) return TGWRAP_NONE; } else { // 7) newKetas = m_pTypeData->m_nMaxLineKetas; return TGWRAP_PROP; } } else { // 8) if( GetDocument()->m_cLayoutMgr.GetMaxLineKetas() == MAXLINEKETAS && // 9) m_pTypeData->m_nMaxLineKetas != MAXLINEKETAS ){ // a) newKetas = m_pTypeData->m_nMaxLineKetas; return TGWRAP_PROP; } else { // b) c) // 現在のウィンドウ幅 newKetas = ViewColNumToWrapColNum( GetTextArea().m_nViewColNum ); return TGWRAP_WINDOW; } } }