diff options
author | Mark Hung <marklh9@gmail.com> | 2015-09-08 07:29:38 +0800 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-09-26 11:46:06 +0000 |
commit | 2b136504538a0b32e6ca9ae8fae8c41c084f4394 (patch) | |
tree | 1b7a5fe6b9598a1c6c2fa181d611d7bd96e23072 | |
parent | 1e15cf04b5e167de1bfc5c19019dcae2042e1414 (diff) |
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 <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-on: https://gerrit.libreoffice.org/18877
Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r-- | sw/source/core/doc/extinput.cxx | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/sw/source/core/doc/extinput.cxx b/sw/source/core/doc/extinput.cxx index 362842a2fce9..9e82eca40289 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 ); + } + + } } } } |