diff options
author | Phil Krylov <phil.krylov@gmail.com> | 2019-02-10 04:31:15 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2019-03-13 11:27:52 +0100 |
commit | 6abed0ea006f3616e40faf2ae782cf64f8ac2914 (patch) | |
tree | edb02b8c979b886b65816aa0b56f60ddbd7708be /sw | |
parent | 3df0d6e3e161a63282e58f31b197c2d1ba28a6b5 (diff) |
tdf#79717 save/restore character format on selection overwrite
Change-Id: Ic82c50d07cf4a2208a6e2956c8b9ebc4f8630b31
Reviewed-on: https://gerrit.libreoffice.org/67597
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/uibase/wrtsh/wrtsh1.cxx | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx b/sw/source/uibase/wrtsh/wrtsh1.cxx index 6d9a11eeb984..8ea052499b4f 100644 --- a/sw/source/uibase/wrtsh/wrtsh1.cxx +++ b/sw/source/uibase/wrtsh/wrtsh1.cxx @@ -41,6 +41,7 @@ #include <svtools/ehdl.hxx> #include <svtools/soerr.hxx> #include <unotools/moduleoptions.hxx> +#include <editeng/rsiditem.hxx> #include <editeng/sizeitem.hxx> #include <editeng/formatbreakitem.hxx> #include <editeng/svxacorr.hxx> @@ -185,6 +186,10 @@ void SwWrtShell::Insert( const OUString &rStr ) bCallIns = m_bIns /*|| bHasSel*/; bool bDeleted = false; + SfxItemSet aCharAttrSet( + GetAttrPool(), + svl::Items<RES_CHRATR_BEGIN, RES_CHRATR_END - 1>{}); + if( bHasSel || ( !m_bIns && SelectHiddenRange() ) ) { // Only here parenthesizing, because the normal @@ -204,6 +209,13 @@ void SwWrtShell::Insert( const OUString &rStr ) aRewriter.AddRule(UndoArg3, aTmpStr); } + // tdf#79717 Save character formatting of the start of the selection + const SwPosition *pStart = GetCursor()->Start(); + SwPaM aPaM(pStart->nNode.GetNode(), pStart->nContent.GetIndex(), + pStart->nNode.GetNode(), pStart->nContent.GetIndex() + 1); + aCharAttrSet.ClearItem(RES_CHRATR_RSID); + GetPaMAttr(&aPaM, aCharAttrSet); + StartUndo(SwUndoId::REPLACE, &aRewriter); bStarted = true; bDeleted = DelRight(); @@ -212,6 +224,22 @@ void SwWrtShell::Insert( const OUString &rStr ) bCallIns ? SwEditShell::Insert2( rStr, bDeleted ) : SwEditShell::Overwrite( rStr ); + if( bDeleted ) + { + // tdf#79717 Restore formatting of the deleted selection + SwPosition* pEnd = GetCursor()->Start(); + SwPaM aPaM(pEnd->nNode.GetNode(), pEnd->nContent.GetIndex() - rStr.getLength(), + pEnd->nNode.GetNode(), pEnd->nContent.GetIndex()); + + std::set<sal_uInt16> aAttribs; + for (sal_uInt16 i = RES_CHRATR_BEGIN; i < RES_CHRATR_END; ++i) + if (i != sal_uInt16(RES_CHRATR_RSID)) + aAttribs.insert(aAttribs.end(), i); + ResetAttr(aAttribs, &aPaM); + + SetAttrSet(aCharAttrSet, SetAttrMode::DEFAULT, &aPaM); + } + if( bStarted ) { EndAllAction(); |