diff options
author | Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de> | 2022-06-13 08:53:22 +0200 |
---|---|---|
committer | Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de> | 2022-06-16 15:44:53 +0200 |
commit | c4cf2e82e8d0aaef9b1daedc033d6edf647e5284 (patch) | |
tree | 86baca7fce89d0527d8177a7c4bb9a0e804cfc64 | |
parent | 3d2e26d8b7a99d0a622741ef4327e8cbc93bbe02 (diff) |
tdf#128150 Add OOXML import/export for "use background fill"
and allow editing this fill property in area dlg
Change-Id: Ic63ba11e9d499d4a0fb22f6739587e3e25140b8f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134406
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>
25 files changed, 175 insertions, 56 deletions
diff --git a/cui/source/inc/cuitabarea.hxx b/cui/source/inc/cuitabarea.hxx index aa4e07343bd2..fa22f56e040f 100644 --- a/cui/source/inc/cuitabarea.hxx +++ b/cui/source/inc/cuitabarea.hxx @@ -241,6 +241,7 @@ protected: std::unique_ptr<weld::Toggleable> m_xBtnHatch; std::unique_ptr<weld::Toggleable> m_xBtnBitmap; std::unique_ptr<weld::Toggleable> m_xBtnPattern; + std::unique_ptr<weld::Toggleable> m_xBtnUseBackground; void SetOptimalSize(weld::DialogController* pController); diff --git a/cui/source/tabpages/tparea.cxx b/cui/source/tabpages/tparea.cxx index f7bbf34ef676..5a94566d83c5 100644 --- a/cui/source/tabpages/tparea.cxx +++ b/cui/source/tabpages/tparea.cxx @@ -19,6 +19,7 @@ #include <svx/svxids.hrc> #include <svx/xfillit0.hxx> +#include <svx/xfilluseslidebackgrounditem.hxx> #include <svx/xflbckit.hxx> #include <svx/drawitem.hxx> #include <svx/xflclit.hxx> @@ -41,7 +42,8 @@ enum FillType GRADIENT, HATCH, BITMAP, - PATTERN + PATTERN, + USE_BACKGROUND_FILL }; } @@ -89,6 +91,7 @@ SvxAreaTabPage::SvxAreaTabPage(weld::Container* pPage, weld::DialogController* p , m_xBtnHatch(m_xBuilder->weld_toggle_button("btnhatch")) , m_xBtnBitmap(m_xBuilder->weld_toggle_button("btnbitmap")) , m_xBtnPattern(m_xBuilder->weld_toggle_button("btnpattern")) + , m_xBtnUseBackground(m_xBuilder->weld_toggle_button("btnusebackground")) { maBox.AddButton(m_xBtnNone.get()); maBox.AddButton(m_xBtnColor.get()); @@ -96,6 +99,7 @@ SvxAreaTabPage::SvxAreaTabPage(weld::Container* pPage, weld::DialogController* p maBox.AddButton(m_xBtnHatch.get()); maBox.AddButton(m_xBtnBitmap.get()); maBox.AddButton(m_xBtnPattern.get()); + maBox.AddButton(m_xBtnUseBackground.get()); Link<weld::Toggleable&, void> aLink = LINK(this, SvxAreaTabPage, SelectFillTypeHdl_Impl); m_xBtnNone->connect_toggled(aLink); m_xBtnColor->connect_toggled(aLink); @@ -103,6 +107,7 @@ SvxAreaTabPage::SvxAreaTabPage(weld::Container* pPage, weld::DialogController* p m_xBtnHatch->connect_toggled(aLink); m_xBtnBitmap->connect_toggled(aLink); m_xBtnPattern->connect_toggled(aLink); + m_xBtnUseBackground->connect_toggled(aLink); SetExchangeSupport(); } @@ -166,7 +171,11 @@ void SvxAreaTabPage::ActivatePage( const SfxItemSet& rSet ) default: case drawing::FillStyle_NONE: { - SelectFillType(*m_xBtnNone); + XFillUseSlideBackgroundItem aBckItem( rSet.Get(XATTR_FILLUSESLIDEBACKGROUND)); + if (aBckItem.GetValue()) + SelectFillType(*m_xBtnUseBackground); + else + SelectFillType(*m_xBtnNone); break; } case drawing::FillStyle_SOLID: @@ -184,7 +193,7 @@ void SvxAreaTabPage::ActivatePage( const SfxItemSet& rSet ) case drawing::FillStyle_HATCH: { m_rXFSet.Put( rSet.Get(XATTR_FILLHATCH) ); - m_rXFSet.Put( rSet.Get(XATTR_FILLBACKGROUND) ); + m_rXFSet.Put( rSet.Get(XATTR_FILLUSESLIDEBACKGROUND) ); m_rXFSet.Put( rSet.Get(XATTR_FILLCOLOR) ); SelectFillType(*m_xBtnHatch); break; @@ -222,6 +231,8 @@ DeactivateRC SvxAreaTabPage::DeactivatePage( SfxItemSet* _pSet ) { XFillStyleItem aStyleItem( drawing::FillStyle_NONE ); _pSet->Put( aStyleItem ); + XFillUseSlideBackgroundItem aFillBgItem( false ); + _pSet->Put( aFillBgItem ); } break; } @@ -235,6 +246,17 @@ DeactivateRC SvxAreaTabPage::DeactivatePage( SfxItemSet* _pSet ) return DeactivatePage_Impl<SvxBitmapTabPage&>(_pSet); case PATTERN: return DeactivatePage_Impl<SvxPatternTabPage>(_pSet); + case USE_BACKGROUND_FILL: + { + if ( m_bBtnClicked ) + { + XFillStyleItem aStyleItem( drawing::FillStyle_NONE ); + _pSet->Put( aStyleItem ); + XFillUseSlideBackgroundItem aFillBgItem( true ); + _pSet->Put( aFillBgItem ); + } + break; + } default: break; } @@ -255,6 +277,7 @@ bool SvxAreaTabPage::FillItemSet( SfxItemSet* rAttrs ) case TRANSPARENT: { rAttrs->Put( XFillStyleItem( drawing::FillStyle_NONE ) ); + rAttrs->Put( XFillUseSlideBackgroundItem( false ) ); return true; } case SOLID: @@ -277,6 +300,12 @@ bool SvxAreaTabPage::FillItemSet( SfxItemSet* rAttrs ) { return FillItemSet_Impl<SvxPatternTabPage>( rAttrs ); } + case USE_BACKGROUND_FILL: + { + rAttrs->Put( XFillStyleItem( drawing::FillStyle_NONE ) ); + rAttrs->Put( XFillUseSlideBackgroundItem( true ) ); + return true; + } default: return false; } @@ -344,6 +373,7 @@ std::unique_ptr<SfxTabPage> lcl_CreateFillStyleTabPage(sal_uInt16 nId, weld::Con case HATCH: fnCreate = &SvxHatchTabPage::Create; break; case BITMAP: fnCreate = &SvxBitmapTabPage::Create; break; case PATTERN: fnCreate = &SvxPatternTabPage::Create; break; + case USE_BACKGROUND_FILL: fnCreate = nullptr; break; } return fnCreate ? (*fnCreate)( pPage, pController, &rSet ) : nullptr; } diff --git a/cui/uiconfig/ui/areatabpage.ui b/cui/uiconfig/ui/areatabpage.ui index f1c671b804bc..4555c0df0207 100644 --- a/cui/uiconfig/ui/areatabpage.ui +++ b/cui/uiconfig/ui/areatabpage.ui @@ -155,6 +155,24 @@ <property name="position">6</property> </packing> </child> + <child> + <object class="GtkToggleButton" id="btnusebackground"> + <property name="label" translatable="yes" context="areatabpage|btnusebackground">Use Background</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="btnusebackground-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="areatabpage|extended_tip|btnusebackground">Displays the underlying slide background.</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> diff --git a/include/editeng/unoprnms.hxx b/include/editeng/unoprnms.hxx index ff234150329f..0df739ee5285 100644 --- a/include/editeng/unoprnms.hxx +++ b/include/editeng/unoprnms.hxx @@ -41,6 +41,7 @@ inline constexpr OUStringLiteral UNO_NAME_FILLBITMAPURL = u"FillBitmapURL"; inline constexpr OUStringLiteral UNO_NAME_FILLBITMAPNAME = u"FillBitmapName"; inline constexpr OUStringLiteral UNO_NAME_FILLGRADIENTSTEPCOUNT = u"FillGradientStepCount"; inline constexpr OUStringLiteral UNO_NAME_FILLBACKGROUND = u"FillBackground"; +inline constexpr OUStringLiteral UNO_NAME_FILLUSESLIDEBACKGROUND = u"FillUseSlideBackground"; inline constexpr OUStringLiteral UNO_NAME_FILLCOLOR_2 = u"FillColor2"; inline constexpr OUStringLiteral UNO_NAME_EDGEKIND = u"EdgeKind"; diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx index e845b399f5f8..5f4173c9de87 100644 --- a/include/oox/drawingml/shape.hxx +++ b/include/oox/drawingml/shape.hxx @@ -255,8 +255,6 @@ public: void setVerticalShapesCount(sal_Int32 nVerticalShapesCount) { mnVerticalShapesCount = nVerticalShapesCount; } sal_Int32 getVerticalShapesCount() const { return mnVerticalShapesCount; } - void setUseBgFill(bool bUseBgFill) { mbUseBgFill = bUseBgFill; } - /// Changes reference semantics to value semantics for fill properties. void cloneFillProperties(); @@ -407,9 +405,6 @@ private: /// Number of child shapes to be layouted vertically inside org chart in-diagram shape. sal_Int32 mnVerticalShapesCount = 0; - /// The shape fill should be set to that of the slide background surface. - bool mbUseBgFill = false; - // Is this a connector shape? bool mbConnector = false; diff --git a/include/oox/drawingml/shapepropertymap.hxx b/include/oox/drawingml/shapepropertymap.hxx index 11670c02edf4..7870ddee304b 100644 --- a/include/oox/drawingml/shapepropertymap.hxx +++ b/include/oox/drawingml/shapepropertymap.hxx @@ -70,6 +70,7 @@ enum class ShapeProperty FillBitmapRectanglePoint, FillHatch, ///< Explicit fill hatch or name of a fill hatch stored in a global container. FillBackground, + FillUseSlideBackground, FillBitmapName, ShadowXDistance, ShadowSizeX, diff --git a/include/svx/strings.hrc b/include/svx/strings.hrc index 17f2b17d6081..6df58387733f 100644 --- a/include/svx/strings.hrc +++ b/include/svx/strings.hrc @@ -347,6 +347,7 @@ #define SIP_XA_FILLBMP_POSOFFSETX NC_("SIP_XA_FILLBMP_POSOFFSETX", "Tile position X in %") #define SIP_XA_FILLBMP_POSOFFSETY NC_("SIP_XA_FILLBMP_POSOFFSETY", "Tile position Y in %") #define SIP_XA_FILLBACKGROUND NC_("SIP_XA_FILLBACKGROUND", "Background fill") +#define SIP_XA_FILLUSESLIDEBACKGROUND NC_("SIP_XA_FILLUSESLIDEBACKGROUND", "Use slide background fill") #define SIP_XATTRSET_FILL NC_("SIP_XATTRSET_FILL", "Area attributes") #define SIP_XA_FORMTXTSTYLE NC_("SIP_XA_FORMTXTSTYLE", "Fontwork style") #define SIP_XA_FORMTXTADJUST NC_("SIP_XA_FORMTXTADJUST", "Fontwork alignment") diff --git a/include/svx/unoshprp.hxx b/include/svx/unoshprp.hxx index bd08927d5039..b32b8672c77c 100644 --- a/include/svx/unoshprp.hxx +++ b/include/svx/unoshprp.hxx @@ -292,7 +292,9 @@ { UNO_NAME_FILLCOLOR_THEME, XATTR_FILLCOLOR, ::cppu::UnoType<sal_Int16>::get(), 0, MID_COLOR_THEME_INDEX}, \ { UNO_NAME_FILLCOLOR_LUM_MOD, XATTR_FILLCOLOR, ::cppu::UnoType<sal_Int16>::get(), 0, MID_COLOR_LUM_MOD}, \ { UNO_NAME_FILLCOLOR_LUM_OFF, XATTR_FILLCOLOR, ::cppu::UnoType<sal_Int16>::get(), 0, MID_COLOR_LUM_OFF}, \ - { UNO_NAME_GRAPHIC_GRAPHICCROP, SDRATTR_GRAFCROP , ::cppu::UnoType<css::text::GraphicCrop>::get(), 0, 0 }, + { UNO_NAME_GRAPHIC_GRAPHICCROP, SDRATTR_GRAFCROP , ::cppu::UnoType<css::text::GraphicCrop>::get(), 0, 0 }, \ + { UNO_NAME_FILLUSESLIDEBACKGROUND, XATTR_FILLUSESLIDEBACKGROUND, cppu::UnoType<bool>::get(), 0, 0}, + #define EDGERADIUS_PROPERTIES \ { UNO_NAME_EDGERADIUS, SDRATTR_CORNER_RADIUS , ::cppu::UnoType<sal_Int32>::get() , 0, 0, PropertyMoreFlags::METRIC_ITEM}, diff --git a/include/svx/xdef.hxx b/include/svx/xdef.hxx index e7740ee15ddc..906b566caa78 100644 --- a/include/svx/xdef.hxx +++ b/include/svx/xdef.hxx @@ -49,6 +49,7 @@ class XFillGradientItem; class XFillHatchItem; class XFillStyleItem; class XFillTransparenceItem; +class XFillUseSlideBackgroundItem; class XFormTextAdjustItem; class XFormTextDistanceItem; class XFormTextHideFormItem; @@ -124,7 +125,8 @@ constexpr TypedWhichId<XFillBmpStretchItem> XATTR_FILLBMP_STRETCH ( constexpr TypedWhichId<XFillBmpPosOffsetXItem> XATTR_FILLBMP_POSOFFSETX (XATTR_FILL_FIRST + 17); /* V3: 1041 */ constexpr TypedWhichId<XFillBmpPosOffsetYItem> XATTR_FILLBMP_POSOFFSETY (XATTR_FILL_FIRST + 18); /* V3: 1042 */ constexpr TypedWhichId<XFillBackgroundItem> XATTR_FILLBACKGROUND (XATTR_FILL_FIRST + 19); /* V3: 1043 */ -constexpr sal_uInt16 XATTR_FILL_LAST (XATTR_FILLBACKGROUND); +constexpr TypedWhichId<XFillUseSlideBackgroundItem> XATTR_FILLUSESLIDEBACKGROUND (XATTR_FILL_FIRST + 20); +constexpr sal_uInt16 XATTR_FILL_LAST (XATTR_FILLUSESLIDEBACKGROUND); constexpr TypedWhichId<XFillAttrSetItem> XATTRSET_FILL (XATTR_FILL_LAST + 1); /* V3: 1047 V2: 1030 */ constexpr sal_uInt16 XATTR_TEXT_FIRST (XATTRSET_FILL + 1); diff --git a/include/svx/xfilluseslidebackgrounditem.hxx b/include/svx/xfilluseslidebackgrounditem.hxx new file mode 100644 index 000000000000..5a5cba891554 --- /dev/null +++ b/include/svx/xfilluseslidebackgrounditem.hxx @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <svl/eitem.hxx> +#include <svx/svxdllapi.h> + +/** Item to enable slide background for filled objects */ + +class SVXCORE_DLLPUBLIC XFillUseSlideBackgroundItem final : public SfxBoolItem +{ +public: + XFillUseSlideBackgroundItem(bool bFill = false); + + SVX_DLLPRIVATE virtual XFillUseSlideBackgroundItem* Clone(SfxItemPool* pPool + = nullptr) const override; + + SVX_DLLPRIVATE virtual bool GetPresentation(SfxItemPresentation ePres, MapUnit eCoreMetric, + MapUnit ePresMetric, OUString& rText, + const IntlWrapper&) const override; + + void dumpAsXml(xmlTextWriterPtr pWriter) const override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/offapi/com/sun/star/drawing/FillProperties.idl b/offapi/com/sun/star/drawing/FillProperties.idl index 9da98ab2d2d6..2e6ff1927424 100644 --- a/offapi/com/sun/star/drawing/FillProperties.idl +++ b/offapi/com/sun/star/drawing/FillProperties.idl @@ -216,6 +216,13 @@ published service FillProperties */ [optional, property] com::sun::star::text::GraphicCrop GraphicCrop; + /** If this is `TRUE`, and FillStyle is FillStyle::NONE: + The area displays the slide background + + @since LibreOffice 8.0 + */ + [optional, property] boolean FillUseSlideBackground; + }; diff --git a/oox/inc/drawingml/fillproperties.hxx b/oox/inc/drawingml/fillproperties.hxx index 532cb0ec3975..b4f3d00fabc6 100644 --- a/oox/inc/drawingml/fillproperties.hxx +++ b/oox/inc/drawingml/fillproperties.hxx @@ -128,6 +128,7 @@ struct FillProperties { OptValue< sal_Int32 > moFillType; /// Fill type (OOXML token). Color maFillColor; /// Solid fill color and transparence. + OptValue< bool > moUseBgFill; /// Whether the background is used as fill type GradientFillProperties maGradientProps; /// Properties for gradient fills. PatternFillProperties maPatternProps; /// Properties for pattern fills. BlipFillProperties maBlipProps; /// Properties for bitmap fills. diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx index 7d6c41a81fc6..93fea51194ef 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -348,6 +348,7 @@ void FillProperties::assignUsed( const FillProperties& rSourceProps ) { moFillType.assignIfUsed( rSourceProps.moFillType ); maFillColor.assignIfUsed( rSourceProps.maFillColor ); + moUseBgFill.assignIfUsed( rSourceProps.moUseBgFill ); maGradientProps.assignUsed( rSourceProps.maGradientProps ); maPatternProps.assignUsed( rSourceProps.maPatternProps ); maBlipProps.assignUsed( rSourceProps.maBlipProps ); @@ -390,7 +391,10 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap, switch( moFillType.get() ) { case XML_noFill: + { eFillStyle = FillStyle_NONE; + rPropMap.setProperty(ShapeProperty::FillUseSlideBackground, moUseBgFill.get(false)); + } break; case XML_solidFill: diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 8ef86298fd8b..cff9a5018c6a 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -191,7 +191,6 @@ Shape::Shape( const ShapePtr& pSourceShape ) , mnZOrderOff(pSourceShape->mnZOrderOff) , mnDataNodeType(pSourceShape->mnDataNodeType) , mfAspectRatio(pSourceShape->mfAspectRatio) -, mbUseBgFill(pSourceShape->mbUseBgFill) , mpDiagramHelper( nullptr ) , msDiagramDataModelID(pSourceShape->msDiagramDataModelID) {} @@ -1197,7 +1196,7 @@ Reference< XShape > const & Shape::createAndInsert( } if( const ShapeStyleRef* pFillRef = getShapeStyleRef( XML_fillRef ) ) { - if (!mbUseBgFill) + if (!getFillProperties().moUseBgFill.get(false)) { nFillPhClr = pFillRef->maPhClr.getColor(rGraphicHelper); nFillPhClrTheme = pFillRef->maPhClr.getSchemeColorIndex(); diff --git a/oox/source/drawingml/shapepropertymap.cxx b/oox/source/drawingml/shapepropertymap.cxx index 59413ba1dc98..57014b4780a6 100644 --- a/oox/source/drawingml/shapepropertymap.cxx +++ b/oox/source/drawingml/shapepropertymap.cxx @@ -47,6 +47,7 @@ const ShapePropertyIds spnDefaultShapeIds = PROP_FillBitmapPositionOffsetX, PROP_FillBitmapPositionOffsetY, PROP_FillBitmapRectanglePoint, PROP_FillHatch, PROP_FillBackground, + PROP_FillUseSlideBackground, PROP_FillBitmapName, PROP_ShadowXDistance, PROP_ShadowSizeX, diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index dad1ce7a5c44..8d16911311ec 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -4766,6 +4766,10 @@ void DrawingML::WriteFill( const Reference< XPropertySet >& xPropSet ) aFillStyle = FillStyle_NONE; } + bool bUseBackground(false); + if (GetProperty(xPropSet, "FillUseSlideBackground")) + xPropSet->getPropertyValue("FillUseSlideBackground") >>= bUseBackground; + switch( aFillStyle ) { case FillStyle_SOLID : @@ -4781,7 +4785,8 @@ void DrawingML::WriteFill( const Reference< XPropertySet >& xPropSet ) WritePattFill( xPropSet ); break; case FillStyle_NONE: - mpFS->singleElementNS(XML_a, XML_noFill); + if (!bUseBackground) // attribute `useBgFill` will be written at parent p:sp shape + mpFS->singleElementNS(XML_a, XML_noFill); break; default: ; diff --git a/oox/source/ppt/pptshapegroupcontext.cxx b/oox/source/ppt/pptshapegroupcontext.cxx index 4ca58a383af8..17d3e6c5815e 100644 --- a/oox/source/ppt/pptshapegroupcontext.cxx +++ b/oox/source/ppt/pptshapegroupcontext.cxx @@ -101,33 +101,10 @@ ContextHandlerRef PPTShapeGroupContext::onCreateContext( sal_Int32 aElementToken { auto pShape = std::make_shared<PPTShape>( meShapeLocation, "com.sun.star.drawing.CustomShape" ); bool bUseBgFill = rAttribs.getBool(XML_useBgFill, false); - pShape->setUseBgFill(bUseBgFill); if (bUseBgFill) { - oox::drawingml::FillPropertiesPtr pBackgroundPropertiesPtr = mpSlidePersistPtr->getBackgroundProperties(); - if (!pBackgroundPropertiesPtr) - { - // The shape wants a background, but the slide doesn't have one. - SlidePersistPtr pMaster = mpSlidePersistPtr->getMasterPersist(); - if (pMaster) - { - oox::drawingml::FillPropertiesPtr pMasterBackground - = pMaster->getBackgroundProperties(); - if (pMasterBackground) - { - if (pMasterBackground->moFillType.has() - && pMasterBackground->moFillType.get() == XML_solidFill) - { - // Master has a solid background, use that. - pBackgroundPropertiesPtr = pMasterBackground; - } - } - } - } - if (pBackgroundPropertiesPtr) - { - pShape->getFillProperties().assignUsed(*pBackgroundPropertiesPtr); - } + pShape->getFillProperties().moFillType = XML_noFill; + pShape->getFillProperties().moUseBgFill = true; } pShape->setModelId(rAttribs.getString( XML_modelId ).get()); return new PPTShapeContext( *this, mpSlidePersistPtr, mpGroupShapePtr, pShape ); diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index 8467d3683875..8f17d34dbe49 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -187,6 +187,7 @@ FillStyle FillTransparence FillTransparenceGradient FillTransparenceGradientName +FillUseSlideBackground Filter FilterCriteriaSource FilterOptions diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx index fd875abe79cc..3bddc580c07d 100644 --- a/sd/qa/unit/import-tests2.cxx +++ b/sd/qa/unit/import-tests2.cxx @@ -18,7 +18,9 @@ #include <svx/svdotable.hxx> #include <svx/xfillit0.hxx> +#include <svx/xfilluseslidebackgrounditem.hxx> #include <svx/xflclit.hxx> +#include <svx/xflbckit.hxx> #include <svx/xlineit0.hxx> #include <svx/xlnclit.hxx> #include <svx/sdooitm.hxx> @@ -223,10 +225,14 @@ void SdImportTest2::testTdf93868() drawing::FillStyle_SOLID, dynamic_cast<const XFillStyleItem&>(pPage->GetObj(0)->GetMergedItem(XATTR_FILLSTYLE)) .GetValue()); + CPPUNIT_ASSERT_EQUAL( - drawing::FillStyle_GRADIENT, + drawing::FillStyle_NONE, dynamic_cast<const XFillStyleItem&>(pPage->GetObj(1)->GetMergedItem(XATTR_FILLSTYLE)) .GetValue()); + CPPUNIT_ASSERT_EQUAL(true, dynamic_cast<const XFillUseSlideBackgroundItem&>( + pPage->GetObj(1)->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND)) + .GetValue()); xDocShRef->DoClose(); } @@ -744,7 +750,10 @@ void SdImportTest2::testTdf105150() = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE)); // This was drawing::FillStyle_NONE, <p:sp useBgFill="1"> was ignored when // the slide didn't have an explicit background fill. - CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rFillStyleItem.GetValue()); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); + auto& rFillBackgroundItem = dynamic_cast<const XFillUseSlideBackgroundItem&>( + pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND)); + CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue()); xDocShRef->DoClose(); } @@ -1730,16 +1739,10 @@ void SdImportTest2::testTdf127964() const SdrObject* pObj = pPage->GetObj(0); auto& rFillStyleItem = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE)); - CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rFillStyleItem.GetValue()); - - auto& rFillColorItem - = dynamic_cast<const XFillColorItem&>(pObj->GetMergedItem(XATTR_FILLCOLOR)); - // Without the accompanying fix in place, this test would have failed with: - // - Expected: 4294967295 - // - Actual : 5210557 - // i.e. instead of transparent (which then got rendered as white), the shape fill color was - // blue. - CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, rFillColorItem.GetColorValue()); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue()); + auto& rFillBackgroundItem = dynamic_cast<const XFillUseSlideBackgroundItem&>( + pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND)); + CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue()); xDocShRef->DoClose(); } diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index 444c765a8914..d6ece36a5380 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -1696,7 +1696,15 @@ bool PowerPointShapeExport::WritePlaceholder(const Reference< XShape >& xShape, ShapeExport& PowerPointShapeExport::WritePlaceholderShape(const Reference< XShape >& xShape, PlaceholderType ePlaceholder) { - mpFS->startElementNS(XML_p, XML_sp); + Reference<XPropertySet> xProps(xShape, UNO_QUERY); + bool bUseBackground(false); + if (xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName("FillUseSlideBackground")) + xProps->getPropertyValue("FillUseSlideBackground") >>= bUseBackground; + + if (bUseBackground) + mpFS->startElementNS(XML_p, XML_sp, XML_useBgFill, "1"); + else + mpFS->startElementNS(XML_p, XML_sp); // non visual shape properties mpFS->startElementNS(XML_p, XML_nvSpPr); @@ -1734,7 +1742,6 @@ ShapeExport& PowerPointShapeExport::WritePlaceholderShape(const Reference< XShap mpFS->startElementNS(XML_p, XML_spPr); WriteShapeTransformation(xShape, XML_a); WritePresetShape("rect"); - Reference< XPropertySet > xProps(xShape, UNO_QUERY); if (xProps.is()) { WriteBlipFill(xProps, "Graphic"); diff --git a/svl/source/items/poolitem.cxx b/svl/source/items/poolitem.cxx index a0c971c0c878..205f75b89bcd 100644 --- a/svl/source/items/poolitem.cxx +++ b/svl/source/items/poolitem.cxx @@ -289,6 +289,7 @@ // class Svx3DCloseFrontItem : public SfxBoolItem // class Svx3DCloseBackItem : public SfxBoolItem // class XFillBackgroundItem : public SfxBoolItem +// class XFillUseSlideBackgroundItem : public SfxBoolItem // class XFillBmpSizeLogItem : public SfxBoolItem // class XFillBmpTileItem : public SfxBoolItem // class XFillBmpStretchItem : public SfxBoolItem diff --git a/svx/source/svdraw/svdattr.cxx b/svx/source/svdraw/svdattr.cxx index 920b38882024..c0057b6aee70 100644 --- a/svx/source/svdraw/svdattr.cxx +++ b/svx/source/svdraw/svdattr.cxx @@ -441,6 +441,7 @@ OUString SdrItemPool::GetItemName(sal_uInt16 nWhich) case XATTR_FILLBMP_POSOFFSETX : pResId = SIP_XA_FILLBMP_POSOFFSETX;break; case XATTR_FILLBMP_POSOFFSETY : pResId = SIP_XA_FILLBMP_POSOFFSETY;break; case XATTR_FILLBACKGROUND : pResId = SIP_XA_FILLBACKGROUND;break; + case XATTR_FILLUSESLIDEBACKGROUND: pResId = SIP_XA_FILLUSESLIDEBACKGROUND;break; case XATTRSET_FILL : pResId = SIP_XATTRSET_FILL;break; diff --git a/svx/source/xoutdev/xattr2.cxx b/svx/source/xoutdev/xattr2.cxx index e4136c9280ab..ad1b3b2959e5 100644 --- a/svx/source/xoutdev/xattr2.cxx +++ b/svx/source/xoutdev/xattr2.cxx @@ -39,6 +39,7 @@ #include <svx/xflbstit.hxx> #include <svx/xflboxy.hxx> #include <svx/xflbckit.hxx> +#include <svx/xfilluseslidebackgrounditem.hxx> #include <svx/dialmgr.hxx> #include <svx/xdef.hxx> #include <AffineMatrixItem.hxx> @@ -701,4 +702,30 @@ void XFillBackgroundItem::dumpAsXml(xmlTextWriterPtr pWriter) const (void)xmlTextWriterEndElement(pWriter); } +XFillUseSlideBackgroundItem::XFillUseSlideBackgroundItem( bool bFill ) : + SfxBoolItem( XATTR_FILLUSESLIDEBACKGROUND, bFill ) +{ +} + +XFillUseSlideBackgroundItem* XFillUseSlideBackgroundItem::Clone( SfxItemPool* /*pPool*/) const +{ + return new XFillUseSlideBackgroundItem( *this ); +} + +bool XFillUseSlideBackgroundItem::GetPresentation( SfxItemPresentation /*ePres*/, MapUnit /*eCoreUnit*/, + MapUnit /*ePresUnit*/, OUString& rText, const IntlWrapper&) const +{ + rText.clear(); + return true; +} + +void XFillUseSlideBackgroundItem::dumpAsXml(xmlTextWriterPtr pWriter) const +{ + (void)xmlTextWriterStartElement(pWriter, BAD_CAST("XFillUseSlideBackgroundItem")); + (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr())); + (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("value"), BAD_CAST(OString::boolean(GetValue()).getStr())); + (void)xmlTextWriterEndElement(pWriter); +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/xoutdev/xpool.cxx b/svx/source/xoutdev/xpool.cxx index 804aed87ca5e..771b79ac4991 100644 --- a/svx/source/xoutdev/xpool.cxx +++ b/svx/source/xoutdev/xpool.cxx @@ -42,6 +42,7 @@ #include <svx/xlinjoit.hxx> #include <svx/xlncapit.hxx> #include <svx/xfillit0.hxx> +#include <svx/xfilluseslidebackgrounditem.hxx> #include <svx/xtextit0.hxx> #include <svx/xlnasit.hxx> #include <svx/xlndsit.hxx> @@ -126,6 +127,7 @@ XOutdevItemPool::XOutdevItemPool(SfxItemPool* _pMaster) rPoolDefaults[XATTR_FILLFLOATTRANSPARENCE -XATTR_START] = new XFillFloatTransparenceItem( XGradient(COL_BLACK, COL_BLACK), false ); rPoolDefaults[XATTR_SECONDARYFILLCOLOR -XATTR_START] = new XSecondaryFillColorItem(aNullStr, aNullFillCol); rPoolDefaults[XATTR_FILLBACKGROUND -XATTR_START] = new XFillBackgroundItem; + rPoolDefaults[XATTR_FILLUSESLIDEBACKGROUND -XATTR_START] = new XFillUseSlideBackgroundItem; rPoolDefaults[XATTR_FORMTXTSTYLE -XATTR_START] = new XFormTextStyleItem; rPoolDefaults[XATTR_FORMTXTADJUST -XATTR_START] = new XFormTextAdjustItem; rPoolDefaults[XATTR_FORMTXTDISTANCE -XATTR_START] = new XFormTextDistanceItem; diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index e598f7785747..0ca6f1368253 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -1198,22 +1198,22 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf137025) // SDRATTR_TEXT_LEFTDIST assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject" - "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item[@whichId='1071']", + "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item[@whichId='1072']", "value", "567"); // SDRATTR_TEXT_RIGHTDIST assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject" - "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item[@whichId='1072']", + "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item[@whichId='1073']", "value", "1134"); // SDRATTR_TEXT_UPPERDIST assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject" - "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item[@whichId='1073']", + "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item[@whichId='1074']", "value", "1701"); // SDRATTR_TEXT_LOWERDIST assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject" - "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item[@whichId='1074']", + "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item[@whichId='1075']", "value", "2268"); // Check the textbox-shape import too |