summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2015-09-08 07:29:38 +0800
committerCaolán McNamara <caolanm@redhat.com>2015-09-26 11:46:06 +0000
commit2b136504538a0b32e6ca9ae8fae8c41c084f4394 (patch)
tree1b7a5fe6b9598a1c6c2fa181d611d7bd96e23072
parent1e15cf04b5e167de1bfc5c19019dcae2042e1414 (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.cxx43
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 );
+ }
+
+ }
}
}
}