diff options
author | Mark Hung <marklh9@gmail.com> | 2020-10-19 00:07:34 +0800 |
---|---|---|
committer | Mark Hung <marklh9@gmail.com> | 2020-10-23 15:36:22 +0200 |
commit | 5b74b3322fd51cf075eb0c218b3adb786a28b4c9 (patch) | |
tree | 360adde43c0211572b46f5e4913fe105a63fc1a7 /editeng | |
parent | f4c56849b52be5e6daebdffb1f54eccbce277414 (diff) |
tdf#104378: don't reset para attributes while
converting Chinese characters.
In TextConvWrapper::ChangeText_impl, calls to
EditView::RemoveAttribs() reset the paragraph attributes.
That makes SvxLanguageItem of EE_CHAR_LANGUAGE_CJK become
LANGUAGE_DONTKNOW. Hence it always stops converting after the
first success.
This patch overload EditView::RemoveAttribs() so that it is
possible to clear all character attributes of the selction
without touching paragraph attributes.
Before, bRemoveParaAttribs either removes items between
EE_ITEMS_START and EE_CHAR_END, or removes items between
EE_CHAR_START and EE_CHAR_END. The patch add a new enum
class EERemoveParaAttribsMode, with the following values:
1. RemoveAll : correspond to the old bRemoveParaAttribs = true
2. RemoveCharItems: correspond to the old bRemoveParaAttribs = false
3. RemoveNone: new thing for "don't touch para attributes."
Change-Id: I5132e708dea9e2066f13f1b001bd954d7b477f56
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104484
Tested-by: Jenkins
Reviewed-by: Mark Hung <marklh9@gmail.com>
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/source/editeng/editeng.cxx | 15 | ||||
-rw-r--r-- | editeng/source/editeng/editview.cxx | 7 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.hxx | 2 | ||||
-rw-r--r-- | editeng/source/editeng/impedit5.cxx | 6 | ||||
-rw-r--r-- | editeng/source/editeng/textconv.cxx | 2 |
5 files changed, 24 insertions, 8 deletions
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index 91bb8217ec3f..da9520aae81a 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -754,7 +754,15 @@ void EditEngine::RemoveCharAttribs(sal_Int32 nPara, sal_uInt16 nWhich, bool bRem void EditEngine::RemoveCharAttribs(const EditSelection& rSel, bool bRemoveParaAttribs, sal_uInt16 nWhich) { - pImpEditEngine->RemoveCharAttribs(rSel, bRemoveParaAttribs, nWhich); + const EERemoveParaAttribsMode eMode = bRemoveParaAttribs? + EERemoveParaAttribsMode::RemoveAll : + EERemoveParaAttribsMode::RemoveCharItems; + pImpEditEngine->RemoveCharAttribs(rSel, eMode, nWhich); +} + +void EditEngine::RemoveCharAttribs(const EditSelection& rSel, EERemoveParaAttribsMode eMode, sal_uInt16 nWhich) +{ + pImpEditEngine->RemoveCharAttribs(rSel, eMode, nWhich); } EditEngine::ViewsType& EditEngine::GetEditViews() @@ -1770,10 +1778,13 @@ SfxItemSet EditEngine::GetAttribs( sal_Int32 nPara, sal_Int32 nStart, sal_Int32 void EditEngine::RemoveAttribs( const ESelection& rSelection, bool bRemoveParaAttribs, sal_uInt16 nWhich ) { + const EERemoveParaAttribsMode eMode = bRemoveParaAttribs? + EERemoveParaAttribsMode::RemoveAll : + EERemoveParaAttribsMode::RemoveCharItems; pImpEditEngine->UndoActionStart( EDITUNDO_RESETATTRIBS ); EditSelection aSel( pImpEditEngine->ConvertSelection( rSelection.nStartPara, rSelection.nStartPos, rSelection.nEndPara, rSelection.nEndPos ) ); - pImpEditEngine->RemoveCharAttribs( aSel, bRemoveParaAttribs, nWhich ); + pImpEditEngine->RemoveCharAttribs( aSel, eMode, nWhich ); pImpEditEngine->UndoActionEnd(); pImpEditEngine->FormatAndUpdate(); } diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx index f13a67870902..94012cf70651 100644 --- a/editeng/source/editeng/editview.cxx +++ b/editeng/source/editeng/editview.cxx @@ -568,10 +568,15 @@ void EditView::RemoveAttribsKeepLanguages( bool bRemoveParaAttribs ) void EditView::RemoveAttribs( bool bRemoveParaAttribs, sal_uInt16 nWhich ) { + RemoveAttribs(bRemoveParaAttribs ? EERemoveParaAttribsMode::RemoveAll + : EERemoveParaAttribsMode::RemoveCharItems, nWhich); +} +void EditView::RemoveAttribs( EERemoveParaAttribsMode eMode, sal_uInt16 nWhich ) +{ pImpEditView->DrawSelectionXOR(); pImpEditView->pEditEngine->UndoActionStart( EDITUNDO_RESETATTRIBS ); - pImpEditView->pEditEngine->RemoveCharAttribs( pImpEditView->GetEditSelection(), bRemoveParaAttribs, nWhich ); + pImpEditView->pEditEngine->RemoveCharAttribs( pImpEditView->GetEditSelection(), eMode, nWhich ); pImpEditView->pEditEngine->UndoActionEnd(); pImpEditView->pEditEngine->FormatAndUpdate( this ); } diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index 9ab6c7fdfe88..921c0dfe5498 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -900,7 +900,7 @@ public: SfxItemSet GetAttribs( sal_Int32 nPara, sal_Int32 nStart, sal_Int32 nEnd, GetAttribsFlags nFlags = GetAttribsFlags::ALL ) const; SfxItemSet GetAttribs( EditSelection aSel, EditEngineAttribs nOnlyHardAttrib = EditEngineAttribs::All ); void SetAttribs( EditSelection aSel, const SfxItemSet& rSet, SetAttribsMode nSpecial = SetAttribsMode::NONE ); - void RemoveCharAttribs( EditSelection aSel, bool bRemoveParaAttribs, sal_uInt16 nWhich ); + void RemoveCharAttribs( EditSelection aSel, EERemoveParaAttribsMode eMode, sal_uInt16 nWhich ); void RemoveCharAttribs( sal_Int32 nPara, sal_uInt16 nWhich = 0, bool bRemoveFeatures = false ); void SetFlatMode( bool bFlat ); diff --git a/editeng/source/editeng/impedit5.cxx b/editeng/source/editeng/impedit5.cxx index b871247fa70d..248d78455dc4 100644 --- a/editeng/source/editeng/impedit5.cxx +++ b/editeng/source/editeng/impedit5.cxx @@ -577,13 +577,13 @@ void ImpEditEngine::SetAttribs( EditSelection aSel, const SfxItemSet& rSet, SetA } } -void ImpEditEngine::RemoveCharAttribs( EditSelection aSel, bool bRemoveParaAttribs, sal_uInt16 nWhich ) +void ImpEditEngine::RemoveCharAttribs( EditSelection aSel, EERemoveParaAttribsMode eMode, sal_uInt16 nWhich ) { aSel.Adjust( aEditDoc ); sal_Int32 nStartNode = aEditDoc.GetPos( aSel.Min().GetNode() ); sal_Int32 nEndNode = aEditDoc.GetPos( aSel.Max().GetNode() ); - + bool bRemoveParaAttribs = eMode == EERemoveParaAttribsMode::RemoveAll; const SfxItemSet* _pEmptyItemSet = bRemoveParaAttribs ? &GetEmptyItemSet() : nullptr; if ( IsUndoEnabled() && !IsInUndo() && aStatus.DoUndoAttribs() ) @@ -614,7 +614,7 @@ void ImpEditEngine::RemoveCharAttribs( EditSelection aSel, bool bRemoveParaAttri { SetParaAttribs( nNode, *_pEmptyItemSet ); // Invalidated } - else + else if (eMode == EERemoveParaAttribsMode::RemoveCharItems) { // For 'Format-Standard' also the character attributes should // disappear, which were set as paragraph attributes by the diff --git a/editeng/source/editeng/textconv.cxx b/editeng/source/editeng/textconv.cxx index ed08c698f5e6..3caa1124ce2b 100644 --- a/editeng/source/editeng/textconv.cxx +++ b/editeng/source/editeng/textconv.cxx @@ -515,7 +515,7 @@ void TextConvWrapper::ChangeText_impl( const OUString &rNewText, bool bKeepAttri // all attributes now. (Those attributes that may take effect left // to the position where the new text gets inserted after the old text // was deleted) - m_pEditView->RemoveAttribs(); + m_pEditView->RemoveAttribs(EERemoveParaAttribsMode::RemoveNone, 0); // apply saved attributes to new inserted text m_pEditView->SetAttribs( aSet ); } |