//2008.07.27 kobake static bool _GetKeywordLength( const CLayoutMgr& cLayoutMgr, const CStringRef& cLineStr, //!< [in] CLogicInt nPos, //!< [in] CLogicInt* p_nWordBgn, //!< [out] CLogicInt* p_nWordLen, //!< [out] CLayoutInt* p_nWordKetas //!< [out] ) { //キーワード長をカウントする CLogicInt nWordBgn = nPos; CLogicInt nWordLen = CLogicInt(0); CLayoutInt nWordKetas = CLayoutInt(0); while(nPos<cLineStr.GetLength() && IS_KEYWORD_CHAR(cLineStr.At(nPos))){ CLayoutInt k = cLayoutMgr.GetLayoutXOfChar(cLineStr, nPos); if(0 == k)k = CLayoutInt(1); nWordLen+=1; nWordKetas+=k; nPos++; } //結果 if(nWordLen>0){ *p_nWordBgn = nWordBgn; *p_nWordLen = nWordLen; *p_nWordKetas = nWordKetas; return true; } else{ return false; } }
void CLayoutMgr::_DoWordWrap(SLayoutWork* pWork, PF_OnLine pfOnLine) { if( pWork->eKinsokuType == KINSOKU_TYPE_NONE ) { /* 英単語の先頭か */ if( pWork->nPos >= pWork->nBgn && IS_KEYWORD_CHAR(pWork->cLineStr.At(pWork->nPos)) ){ // キーワード長を取得 CLayoutInt nWordKetas = CLayoutInt(0); _GetKeywordLength( *this, pWork->cLineStr, pWork->nPos, &pWork->nWordBgn, &pWork->nWordLen, &nWordKetas ); pWork->eKinsokuType = KINSOKU_TYPE_WORDWRAP; //@@@ 2002.04.20 MIK if( pWork->nPosX+nWordKetas >= GetMaxLineLayout() && pWork->nPos - pWork->nBgn > 0 ) { (this->*pfOnLine)(pWork); } } } }
bool _IsPosKeywordHead(const CStringRef& cStr, int nPos) { return (nPos==0 || !IS_KEYWORD_CHAR(cStr.At(nPos-1))); }