svx/source/inc/cell.hxx | 1 + svx/source/table/cell.cxx | 42 +++++++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 13 deletions(-)
New commits: commit 21c09b87dbebd38fff8efb7f70b1a16e9b8aa5df Author: Noel Grandin <[email protected]> AuthorDate: Wed Feb 18 15:27:11 2026 +0200 Commit: Noel Grandin <[email protected]> CommitDate: Fri Feb 20 17:44:23 2026 +0100 tdf#168647 speed up copy of DataTable chart cells (2) Improve how sdr::Cell handles setting multiple properties at the same time. Takes the copy time from 8s to 4s for me. Change-Id: I3370ebace7641d8bbb4ea67f4ee205c039da810e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199624 Reviewed-by: Noel Grandin <[email protected]> Tested-by: Jenkins diff --git a/svx/source/inc/cell.hxx b/svx/source/inc/cell.hxx index 7dca8959ffc4..0177bd923175 100644 --- a/svx/source/inc/cell.hxx +++ b/svx/source/inc/cell.hxx @@ -183,6 +183,7 @@ private: SVX_DLLPRIVATE void SetObjectItem(const SfxPoolItem& rItem); SVX_DLLPRIVATE static css::uno::Any GetAnyForItem( SfxItemSet const & aSet, const SfxItemPropertyMapEntry* pMap ); + SVX_DLLPRIVATE void setPropertyValueImpl( const OUString& aPropertyName, const css::uno::Any& aValue, SfxItemSet& rSet ); /// @throws css::uno::RuntimeException SVX_DLLPRIVATE Cell( SdrTableObj& rTableObj ); diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx index 7cfb7d1f68a3..e7e2c42c0675 100644 --- a/svx/source/table/cell.cxx +++ b/svx/source/table/cell.cxx @@ -979,6 +979,17 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& if(mpProperties == nullptr) throw DisposedException(); + SfxItemSet aSet(GetObject().getSdrModelFromSdrObject().GetItemPool()); + + setPropertyValueImpl(rPropertyName, rValue, aSet); + + GetObject().getSdrModelFromSdrObject().SetChanged(); + mpProperties->SetMergedItemSetAndBroadcast( aSet ); +} + +// Code shared between setPropertyValue and setPropertyValues +void Cell::setPropertyValueImpl( const OUString& rPropertyName, const Any& rValue, SfxItemSet& rSet ) +{ const SfxItemPropertyMapEntry* pMap = mpPropSet->getPropertyMapEntry(rPropertyName); if( !pMap ) throw UnknownPropertyException( rPropertyName, getXWeak()); @@ -1035,8 +1046,8 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& aBox.SetAllDistances(pBorder->Distance); //TODO aBoxInfo.SetValid(SvxBoxInfoItemValidFlags::DISTANCE, pBorder->IsDistanceValid); - mpProperties->SetObjectItem(aBox); - mpProperties->SetObjectItem(aBoxInfo); + rSet.Put(aBox); + rSet.Put(aBoxInfo); return; } case OWN_ATTR_FILLBMP_MODE: @@ -1051,8 +1062,8 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& eMode = static_cast<BitmapMode>(nMode); } - mpProperties->SetObjectItem( XFillBmpStretchItem( eMode == BitmapMode_STRETCH ) ); - mpProperties->SetObjectItem( XFillBmpTileItem( eMode == BitmapMode_REPEAT ) ); + rSet.Put( XFillBmpStretchItem( eMode == BitmapMode_STRETCH ) ); + rSet.Put( XFillBmpTileItem( eMode == BitmapMode_REPEAT ) ); return; } case SDRATTR_TABLE_TEXT_ROTATION: @@ -1064,7 +1075,7 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& if (nRotVal != 27000 && nRotVal != 9000 && nRotVal != 0) throw IllegalArgumentException(); - mpProperties->SetObjectItem(SvxTextRotateItem(Degree10(nRotVal/10), SDRATTR_TABLE_TEXT_ROTATION)); + rSet.Put(SvxTextRotateItem(Degree10(nRotVal/10), SDRATTR_TABLE_TEXT_ROTATION)); return; } case SDRATTR_TABLE_CELL_GRABBAG: @@ -1077,8 +1088,11 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& } default: { - SfxItemSet aSet(GetObject().getSdrModelFromSdrObject().GetItemPool(), pMap->nWID, pMap->nWID); - aSet.Put(mpProperties->GetItem(pMap->nWID)); + // Sometimes we have multiple property names (like FillColor and FillComplexColor) + // that map to the same item, so when setting multiple properties at the same time, + // we need to be careful to not overwrite things we have already set. + if (!rSet.HasItem(pMap->nWID)) + rSet.Put(mpProperties->GetItem(pMap->nWID)); bool bSpecial = false; @@ -1097,7 +1111,7 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& OUString aApiName; if( rValue >>= aApiName ) { - if(SvxShape::SetFillAttribute(pMap->nWID, aApiName, aSet, &GetObject().getSdrModelFromSdrObject())) + if(SvxShape::SetFillAttribute(pMap->nWID, aApiName, rSet, &GetObject().getSdrModelFromSdrObject())) bSpecial = true; } } @@ -1105,11 +1119,9 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& break; } - if( !bSpecial && !SvxUnoTextRangeBase::SetPropertyValueHelper( pMap, rValue, aSet )) - SvxItemPropertySet_setPropertyValue( pMap, rValue, aSet ); + if( !bSpecial && !SvxUnoTextRangeBase::SetPropertyValueHelper( pMap, rValue, rSet )) + SvxItemPropertySet_setPropertyValue( pMap, rValue, rSet ); - GetObject().getSdrModelFromSdrObject().SetChanged(); - mpProperties->SetMergedItemSetAndBroadcast( aSet ); return; } } @@ -1241,12 +1253,13 @@ void SAL_CALL Cell::setPropertyValues( const Sequence< OUString >& aPropertyName const OUString* pNames = aPropertyNames.getConstArray(); const Any* pValues = aValues.getConstArray(); + SfxItemSet aSet(GetObject().getSdrModelFromSdrObject().GetItemPool()); for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pValues++ ) { try { - setPropertyValue( *pNames, *pValues ); + setPropertyValueImpl( *pNames, *pValues, aSet ); } catch( UnknownPropertyException& ) { @@ -1257,6 +1270,9 @@ void SAL_CALL Cell::setPropertyValues( const Sequence< OUString >& aPropertyName TOOLS_WARN_EXCEPTION("svx.table", ""); } } + + GetObject().getSdrModelFromSdrObject().SetChanged(); + mpProperties->SetMergedItemSetAndBroadcast( aSet ); }
