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

Reply via email to