diff options
| author | Mike Kaganski <mike.kaganski@collabora.com> | 2019-08-17 10:52:14 +0300 |
|---|---|---|
| committer | Miklos Vajna <vmiklos@collabora.com> | 2019-08-21 15:57:57 +0200 |
| commit | ad2fde8797bd7753987dc1bbbae35fb1cc5ce1df (patch) | |
| tree | 6cf53f4015d87e046bcd7867aaf5524c311942d9 | |
| parent | 1e8ac689396f7779e4b1e82378f2f61e12be9bfc (diff) | |
tdf#126787: extend/restore item set ranges to hold RES_PARATR_GRABBAG
The original item set did not include that in its ranges list, so it
ignored attempts to set its value.
Change-Id: I5f928206f0614f0cfd54652e77d7dc6b9833fb26
Reviewed-on: https://gerrit.libreoffice.org/77617
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
(cherry picked from commit 202c9a7d826c95fc05db912a8d19c598a240f1cd)
Reviewed-on: https://gerrit.libreoffice.org/77620
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
| -rw-r--r-- | sw/source/uibase/utlui/uitool.cxx | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/sw/source/uibase/utlui/uitool.cxx b/sw/source/uibase/utlui/uitool.cxx index c3581e6df888..0ed3fe8b24a5 100644 --- a/sw/source/uibase/utlui/uitool.cxx +++ b/sw/source/uibase/utlui/uitool.cxx @@ -148,10 +148,21 @@ void ConvertAttrCharToGen(SfxItemSet& rSet) std::unique_ptr<SfxGrabBagItem> pGrabBag; const SfxPoolItem *pTmpItem; if (SfxItemState::SET == rSet.GetItemState(RES_PARATR_GRABBAG, false, &pTmpItem)) + { + SAL_WARN("sw.ui", "Unexpected: non-empty paragraph grab bag in character item set!"); pGrabBag.reset(static_cast<SfxGrabBagItem*>(pTmpItem->Clone())); + } else pGrabBag.reset(new SfxGrabBagItem(RES_PARATR_GRABBAG)); pGrabBag->GetGrabBag()["DialogUseCharAttr"] <<= true; + // Store initial ranges to allow restoring later + const sal_uInt16* pRanges = rSet.GetRanges(); + const sal_uInt16* pEnd = pRanges; + while (*pEnd) + ++pEnd; + const uno::Sequence<sal_uInt16> aOrigRanges(pRanges, pEnd - pRanges + 1); + pGrabBag->GetGrabBag()["OrigItemSetRanges"] <<= aOrigRanges; + rSet.MergeRange(RES_PARATR_GRABBAG, RES_PARATR_GRABBAG); rSet.Put(std::move(pGrabBag)); } @@ -177,19 +188,40 @@ void ConvertAttrGenToChar(SfxItemSet& rSet, const SfxItemSet& rOrigSet) } rSet.Put( aGrabBag ); } - if (SfxItemState::SET == rOrigSet.GetItemState(RES_PARATR_GRABBAG, false, &pTmpItem)) + } + rSet.ClearItem( RES_BACKGROUND ); + + if (SfxItemState::SET == rOrigSet.GetItemState(RES_PARATR_GRABBAG, false, &pTmpItem)) + { + SfxGrabBagItem aGrabBag(*static_cast<const SfxGrabBagItem*>(pTmpItem)); + std::map<OUString, css::uno::Any>& rMap = aGrabBag.GetGrabBag(); + auto aIterator = rMap.find("OrigItemSetRanges"); + if (aIterator != rMap.end()) { - SfxGrabBagItem aGrabBag(*static_cast<const SfxGrabBagItem*>(pTmpItem)); - std::map<OUString, css::uno::Any>& rMap = aGrabBag.GetGrabBag(); - // Remove temporary GrabBag entry - rMap.erase("DialogUseCharAttr"); - if (rMap.empty()) - rSet.ClearItem(RES_PARATR_GRABBAG); - else - rSet.Put(aGrabBag); + if (uno::Sequence<sal_uInt16> aOrigRanges; (aIterator->second >>= aOrigRanges) + && aOrigRanges.getLength() % 2 == 1 + && *(std::cend(aOrigRanges) - 1) == 0) + rSet.SetRanges(aOrigRanges.getConstArray()); + } + } + if (SfxItemState::SET == rSet.GetItemState(RES_PARATR_GRABBAG, false, &pTmpItem)) + { + // In fact, we should not reach here: it shouldn't have been there; and even if it was, it + // should have been erased on the previous step when restoring original ranges + SAL_WARN("sw.ui", "Unexpected: paragraph grab bag in character item set!"); + SfxGrabBagItem aGrabBag(*static_cast<const SfxGrabBagItem*>(pTmpItem)); + std::map<OUString, css::uno::Any>& rMap = aGrabBag.GetGrabBag(); + // Remove temporary GrabBag entries + rMap.erase("DialogUseCharAttr"); + rMap.erase("OrigItemSetRanges"); + if (rMap.empty()) + rSet.ClearItem(RES_PARATR_GRABBAG); + else + { + SAL_WARN("sw.ui", "Unexpected: non-empty paragraph grab bag in character item set!"); + rSet.Put(aGrabBag); } } - rSet.ClearItem( RES_BACKGROUND ); } void ApplyCharBackground(const Color& rBackgroundColor, SwWrtShell& rShell) |
