editeng/source/editeng/editeng.cxx | 15 +++++++++++++-- editeng/source/editeng/editview.cxx | 7 ++++++- editeng/source/editeng/impedit.hxx | 2 +- editeng/source/editeng/impedit5.cxx | 6 +++--- editeng/source/editeng/textconv.cxx | 2 +- include/editeng/editdata.hxx | 2 ++ include/editeng/editeng.hxx | 1 + include/editeng/editview.hxx | 1 + 8 files changed, 28 insertions(+), 8 deletions(-)
New commits: commit a419deb3279e9d3571ac55fa77c1b162f4eaabea Author: Mark Hung <mark...@gmail.com> AuthorDate: Mon Oct 19 00:07:34 2020 +0800 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Mon Oct 26 10:25:45 2020 +0100 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 <mark...@gmail.com> (cherry picked from commit 5b74b3322fd51cf075eb0c218b3adb786a28b4c9) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104680 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index 73d85a07b7ce..9af0db1ccdc3 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -755,7 +755,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() @@ -1773,10 +1781,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 7c6698f7c2c8..7bfd9e616d40 100644 --- a/editeng/source/editeng/editview.cxx +++ b/editeng/source/editeng/editview.cxx @@ -559,10 +559,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 0ecf4c47eb36..86310e5339fe 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -847,7 +847,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 0e5a294e0149..b99d8c4a5db0 100644 --- a/editeng/source/editeng/impedit5.cxx +++ b/editeng/source/editeng/impedit5.cxx @@ -578,13 +578,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() ) @@ -615,7 +615,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 ); } diff --git a/include/editeng/editdata.hxx b/include/editeng/editdata.hxx index 8d3d39591a42..40c74cb2b8c6 100644 --- a/include/editeng/editdata.hxx +++ b/include/editeng/editdata.hxx @@ -42,6 +42,8 @@ enum class EEAnchorMode { VCenterLeft, VCenterHCenter, VCenterRight, BottomLeft, BottomHCenter, BottomRight }; +enum class EERemoveParaAttribsMode { RemoveAll, RemoveCharItems, RemoveNone }; + #define EE_PARA_NOT_FOUND SAL_MAX_INT32 #define EE_PARA_APPEND SAL_MAX_INT32 #define EE_PARA_ALL SAL_MAX_INT32 diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx index 292b620a9b95..46f5ccf520cc 100644 --- a/include/editeng/editeng.hxx +++ b/include/editeng/editeng.hxx @@ -609,6 +609,7 @@ public: void RemoveCharAttribs(sal_Int32 nPara, sal_uInt16 nWhich = 0, bool bRemoveFeatures = false); void RemoveCharAttribs(const EditSelection& rSel, bool bRemoveParaAttribs, sal_uInt16 nWhich); + void RemoveCharAttribs(const EditSelection& rSel, EERemoveParaAttribsMode eMode, sal_uInt16 nWhich); ViewsType& GetEditViews(); const ViewsType& GetEditViews() const; diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx index c750dcef9254..bf6374ca3ce8 100644 --- a/include/editeng/editview.hxx +++ b/include/editeng/editview.hxx @@ -234,6 +234,7 @@ public: SfxItemSet GetAttribs(); void SetAttribs( const SfxItemSet& rSet ); void RemoveAttribs( bool bRemoveParaAttribs = false, sal_uInt16 nWhich = 0 ); + void RemoveAttribs( EERemoveParaAttribsMode eMode, sal_uInt16 nWhich ); void RemoveCharAttribs( sal_Int32 nPara, sal_uInt16 nWhich ); void RemoveAttribsKeepLanguages( bool bRemoveParaAttribs ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits