Index: openoffice.org.orig/sw/source/core/text/frmcrsr.cxx =================================================================== RCS file: /cvs/sw/sw/source/core/text/frmcrsr.cxx,v --- openoffice.org.orig/sw/source/core/text/frmcrsr.cxx 16 Sep 2006 21:33:39 -0000 1.42 +++ openoffice.org.orig/sw/source/core/text/frmcrsr.cxx 5 Feb 2007 13:42:51 -0000 @@ -83,6 +83,10 @@ #include "swfntcch.hxx" // SwFontAccess #include "flyfrm.hxx" +#include +#include +#include "breakit.hxx" + #if OSL_DEBUG_LEVEL > 1 #include "txtpaint.hxx" #endif @@ -309,7 +313,33 @@ nMaxY = pFrm->SwitchVerticalToHorizontal( nMaxY ); sal_Bool bGoOn = sal_True; - xub_StrLen nOffset = rPos.nContent.GetIndex(); + xub_StrLen nOffset = rPos.nContent.GetIndex(); + + // #i74188 Ensure that the cursor is not drawn inside a combined char + const SwTxtNode* pTxtNd = ((const SwTxtFrm*)this)->GetTxtNode(); + if( pTxtNd && ::com::sun::star::i18n::ScriptType::COMPLEX == + pBreakIt->xBreak->getScriptType( pTxtNd->GetTxt(), nOffset ) ) + { + sal_Int32 nCount = 1; + const ::com::sun::star::lang::Locale &rLocale = + pBreakIt->GetLocale( pTxtNd->GetLang( nOffset ) ); + xub_StrLen nRight = (xub_StrLen)pBreakIt->xBreak->nextCharacters( + pTxtNd->GetTxt(), nOffset, rLocale, + ::com::sun::star::i18n::CharacterIteratorMode::SKIPCELL, + nCount, nCount ); + + xub_StrLen nLeft = (xub_StrLen)pBreakIt->xBreak->previousCharacters( + pTxtNd->GetTxt(), nRight, rLocale, + ::com::sun::star::i18n::CharacterIteratorMode::SKIPCELL, + nCount, nCount ); + + if ( ( nLeft != nOffset ) && ( nRight != nOffset ) ) + { + nOffset = ( Abs( nRight - nOffset ) < Abs( nLeft - nOffset ) ) ? + nRight : nLeft; + } + } + xub_StrLen nNextOfst; do