sw/source/core/doc/extinput.cxx | 43 +++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 18 deletions(-)
New commits: commit 2b136504538a0b32e6ca9ae8fae8c41c084f4394 Author: Mark Hung <mark...@gmail.com> Date: Tue Sep 8 07:29:38 2015 +0800 Fix tdf#87500 - Freeze with English/Japanese mixture undo. Language poolitem will be inserted after user completes editing with IME, making it refer to valid range when undo. Change-Id: Id2876aa74dba6f7d134b8e2df4d9b36a8f429bb1 Reviewed-on: https://gerrit.libreoffice.org/18392 Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> Reviewed-on: https://gerrit.libreoffice.org/18877 Tested-by: Jenkins <c...@libreoffice.org> diff --git a/sw/source/core/doc/extinput.cxx b/sw/source/core/doc/extinput.cxx index 362842a..9e82eca 100644 --- a/sw/source/core/doc/extinput.cxx +++ b/sw/source/core/doc/extinput.cxx @@ -59,6 +59,9 @@ SwExtTextInput::~SwExtTextInput() sal_Int32 nEndCnt = GetMark()->nContent.GetIndex(); if( nEndCnt != nSttCnt ) { + // Prevent IME edited text being grouped with non-IME edited text. + bool bKeepGroupUndo = pDoc->GetIDocumentUndoRedo().DoesGroupUndo(); + pDoc->GetIDocumentUndoRedo().DoGroupUndo(false); if( nEndCnt < nSttCnt ) { std::swap(nSttCnt, nEndCnt); @@ -66,24 +69,6 @@ SwExtTextInput::~SwExtTextInput() // In order to get Undo/Redlining etc. working correctly, // we need to go through the Doc interface - if(eInputLanguage != LANGUAGE_DONTKNOW) - { - // #i41974# Only set language attribute - // for CJK/CTL scripts. - bool bLang = true; - sal_uInt16 nWhich = RES_CHRATR_LANGUAGE; - switch(SvtLanguageOptions::GetI18NScriptTypeOfLanguage(eInputLanguage)) - { - case i18n::ScriptType::ASIAN: nWhich = RES_CHRATR_CJK_LANGUAGE; break; - case i18n::ScriptType::COMPLEX: nWhich = RES_CHRATR_CTL_LANGUAGE; break; - default: bLang = false; - } - if ( bLang ) - { - SvxLanguageItem aLangItem( eInputLanguage, nWhich ); - pDoc->getIDocumentContentOperations().InsertPoolItem(*this, aLangItem ); - } - } rIdx = nSttCnt; const OUString sText( pTNd->GetText().copy(nSttCnt, nEndCnt - nSttCnt)); if( bIsOverwriteCursor && !sOverwriteText.isEmpty() ) @@ -124,6 +109,28 @@ SwExtTextInput::~SwExtTextInput() pDoc->getIDocumentContentOperations().InsertString( *this, sText ); } } + pDoc->GetIDocumentUndoRedo().DoGroupUndo(bKeepGroupUndo); + if (eInputLanguage != LANGUAGE_DONTKNOW) + { + sal_uInt16 nWhich = RES_CHRATR_LANGUAGE; + sal_Int16 nScriptType = SvtLanguageOptions::GetI18NScriptTypeOfLanguage(eInputLanguage); + switch(nScriptType) + { + case i18n::ScriptType::ASIAN: + nWhich = RES_CHRATR_CJK_LANGUAGE; break; + case i18n::ScriptType::COMPLEX: + nWhich = RES_CHRATR_CTL_LANGUAGE; break; + } + // #i41974# Only set language attribute for CJK/CTL scripts. + if (RES_CHRATR_LANGUAGE != nWhich && pTNd->GetLang( nSttCnt, nEndCnt-nSttCnt, nScriptType) != eInputLanguage) + { + SvxLanguageItem aLangItem( eInputLanguage, nWhich ); + rIdx = nSttCnt; + GetMark()->nContent = nEndCnt; + pDoc->getIDocumentContentOperations().InsertPoolItem(*this, aLangItem ); + } + + } } } }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits