summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2020-10-19 00:07:34 +0800
committerMark Hung <marklh9@gmail.com>2020-10-23 15:36:22 +0200
commit5b74b3322fd51cf075eb0c218b3adb786a28b4c9 (patch)
tree360adde43c0211572b46f5e4913fe105a63fc1a7 /editeng
parentf4c56849b52be5e6daebdffb1f54eccbce277414 (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.cxx15
-rw-r--r--editeng/source/editeng/editview.cxx7
-rw-r--r--editeng/source/editeng/impedit.hxx2
-rw-r--r--editeng/source/editeng/impedit5.cxx6
-rw-r--r--editeng/source/editeng/textconv.cxx2
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 );
}