This is an automated email from the ASF dual-hosted git repository. jimjag pushed a commit to branch odf-devel in repository https://gitbox.apache.org/repos/asf/openoffice.git
commit 678493df1e65ecb63649301df13f08fb045a3422 Author: Jim Jagielski <[email protected]> AuthorDate: Fri Oct 23 16:12:10 2026 -0400 xmloff: import the drawing page style fill of master pages --- main/xmloff/inc/PageMasterImportContext.hxx | 29 ++++ main/xmloff/inc/xmloff/PageMasterStyleMap.hxx | 2 + .../xmloff/inc/xmloff/XMLTextMasterPageContext.hxx | 1 + .../source/style/PageMasterImportContext.cxx | 172 +++++++++++++++++++++ .../source/style/PageMasterPropHdlFactory.cxx | 3 + main/xmloff/source/style/PageMasterStyleMap.cxx | 29 ++++ main/xmloff/source/style/xmlstyle.cxx | 12 ++ .../source/text/XMLTextMasterPageContext.cxx | 26 +++- 8 files changed, 273 insertions(+), 1 deletion(-) diff --git a/main/xmloff/inc/PageMasterImportContext.hxx b/main/xmloff/inc/PageMasterImportContext.hxx index 599318a105..8572416c4a 100644 --- a/main/xmloff/inc/PageMasterImportContext.hxx +++ b/main/xmloff/inc/PageMasterImportContext.hxx @@ -61,8 +61,37 @@ public: const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rPropSet ); + void FillPropertySetWithoutOldPageFill( + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertySet > & rPropSet ); + //text grid enhancement virtual void SetDefaults(); }; +class DrawingPageStyleContext : public XMLPropStyleContext +{ +private: + bool mbChecked; + bool mbUsable; + + void CheckFill(); + +public: + + TYPEINFO(); + + DrawingPageStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttrList, + SvXMLStylesContext& rStyles ); + virtual ~DrawingPageStyleContext(); + + bool HasFill() { CheckFill(); return mbUsable; } + + virtual void FillPropertySet( + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertySet > & rPropSet ); +}; + #endif diff --git a/main/xmloff/inc/xmloff/PageMasterStyleMap.hxx b/main/xmloff/inc/xmloff/PageMasterStyleMap.hxx index 5100f8c049..948dabbbcb 100644 --- a/main/xmloff/inc/xmloff/PageMasterStyleMap.hxx +++ b/main/xmloff/inc/xmloff/PageMasterStyleMap.hxx @@ -47,6 +47,7 @@ #define XML_PM_TYPE_FIRSTPAGENUMBER (XML_PM_TYPES_START + 14) #define XML_PM_TYPE_CENTER_HORIZONTAL (XML_PM_TYPES_START + 15) #define XML_PM_TYPE_CENTER_VERTICAL (XML_PM_TYPES_START + 16) +#define XML_PM_TYPE_BACKGROUNDSIZE (XML_PM_TYPES_START + 17) // control flags #define CTF_PM_FLAGMASK (XML_PM_CTF_START + 0x0F00) @@ -190,6 +191,7 @@ #define CTF_PM_FTN_DISTANCE (XML_PM_CTF_START + 0x0066) extern const XMLPropertyMapEntry aXMLPageMasterStyleMap[]; +extern const XMLPropertyMapEntry aXMLPageMasterDrawingPageStyleMap[]; extern const XMLPropertyMapEntry aXMLPageMasterHeaderImportStyleMap[]; extern const XMLPropertyMapEntry aXMLPageMasterFooterImportStyleMap[]; diff --git a/main/xmloff/inc/xmloff/XMLTextMasterPageContext.hxx b/main/xmloff/inc/xmloff/XMLTextMasterPageContext.hxx index 1fad8be3f8..60848f1dfb 100644 --- a/main/xmloff/inc/xmloff/XMLTextMasterPageContext.hxx +++ b/main/xmloff/inc/xmloff/XMLTextMasterPageContext.hxx @@ -42,6 +42,7 @@ class XMLOFF_DLLPUBLIC XMLTextMasterPageContext : public SvXMLStyleContext const ::rtl::OUString sFollowStyle; ::rtl::OUString sFollow; ::rtl::OUString sPageMasterName; + ::rtl::OUString sDrawingPageStyleName; ::com::sun::star::uno::Reference < ::com::sun::star::style::XStyle > xStyle; diff --git a/main/xmloff/source/style/PageMasterImportContext.cxx b/main/xmloff/source/style/PageMasterImportContext.cxx index af308aed0f..c7a4c717b9 100644 --- a/main/xmloff/source/style/PageMasterImportContext.cxx +++ b/main/xmloff/source/style/PageMasterImportContext.cxx @@ -36,6 +36,8 @@ //UUUU #include <xmlsdtypes.hxx> #include <com/sun/star/beans/XPropertySetInfo.hpp> +#include <com/sun/star/container/XNameContainer.hpp> +#include <com/sun/star/drawing/FillStyle.hpp> #include <xmloff/xmlerror.hxx> using namespace ::com::sun::star; @@ -318,6 +320,39 @@ void PageStyleContext::FillPropertySet(const uno::Reference<beans::XPropertySet } } +void PageStyleContext::FillPropertySetWithoutOldPageFill( const uno::Reference< beans::XPropertySet > & rPropSet ) +{ + static ::rtl::OUString s_FillStyle(RTL_CONSTASCII_USTRINGPARAM("FillStyle")); + + // a fill of the page layout itself already switches its old fill definitions off + if( doNewDrawingLayerFillStyleDefinitionsExist( s_FillStyle ) ) + { + FillPropertySet( rPropSet ); + return; + } + + // switched off for this call only: the page layout may be shared with master pages without a drawing page fill + ::std::vector< XMLPropertyState >& rProperties = GetProperties(); + ::std::vector< ::std::pair< size_t, sal_Int32 > > aSwitchedOff; + UniReference < SvXMLImportPropertyMapper > xImpPrMap = GetStyles()->GetImportPropertyMapper( GetFamily() ); + if( xImpPrMap.is() ) + { + const OldFillStyleDefinitionSet& rOld = getStandardSet(); + for( size_t i = 0; i < rProperties.size(); ++i ) + { + if( rProperties[i].mnIndex != -1 && + rOld.find( xImpPrMap->getPropertySetMapper()->GetEntryAPIName( rProperties[i].mnIndex ) ) != rOld.end() ) + { + aSwitchedOff.push_back( ::std::make_pair( i, rProperties[i].mnIndex ) ); + rProperties[i].mnIndex = -1; + } + } + } + FillPropertySet( rPropSet ); + for( size_t i = 0; i < aSwitchedOff.size(); ++i ) + rProperties[aSwitchedOff[i].first].mnIndex = aSwitchedOff[i].second; +} + // text grid enhancement for better CJK support //set default page layout style void PageStyleContext::SetDefaults( ) @@ -333,4 +368,141 @@ void PageStyleContext::SetDefaults( ) } } +TYPEINIT1( DrawingPageStyleContext, XMLPropStyleContext ); + +DrawingPageStyleContext::DrawingPageStyleContext( SvXMLImport& rImport, + sal_uInt16 nPrfx, const rtl::OUString& rLName, + const uno::Reference< xml::sax::XAttributeList > & xAttrList, + SvXMLStylesContext& rStyles ) : + XMLPropStyleContext( rImport, nPrfx, rLName, xAttrList, rStyles, XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID ), + mbChecked( false ), + mbUsable( false ) +{ +} + +DrawingPageStyleContext::~DrawingPageStyleContext() +{ +} + +static bool lcl_FillNameExists( SvXMLImport& rImport, const Reference< container::XNameContainer >& rTable, + sal_uInt16 nFamily, const rtl::OUString& rName ) +{ + return rName.getLength() && rTable.is() && rTable->hasByName( rImport.GetStyleDisplayName( nFamily, rName ) ); +} + +// An incomplete fill is ignored as a whole, so the fill of the page layout stays. +void DrawingPageStyleContext::CheckFill() +{ + UniReference < SvXMLImportPropertyMapper > xImpPrMap = GetStyles()->GetImportPropertyMapper( GetFamily() ); + if( !mbChecked && xImpPrMap.is() ) + { + mbChecked = true; + const UniReference< XMLPropertySetMapper >& rMapper = xImpPrMap->getPropertySetMapper(); + ::std::vector< XMLPropertyState >& rProperties = GetProperties(); + drawing::FillStyle eStyle = drawing::FillStyle_NONE; + bool bColor = false; + rtl::OUString aGradient, aHatch, aBitmap, aTrans; + XMLPropertyState* pTrans = NULL; + + for( ::std::vector< XMLPropertyState >::iterator a = rProperties.begin(); a != rProperties.end(); ++a ) + { + if( a->mnIndex == -1 ) + continue; + const rtl::OUString& rName = rMapper->GetEntryAPIName( a->mnIndex ); + if( rName.equalsAscii( "FillStyle" ) ) + { + sal_Int32 nValue = 0; + if( !( a->maValue >>= eStyle ) && ( a->maValue >>= nValue ) ) + eStyle = static_cast< drawing::FillStyle >( nValue ); + } + else if( rName.equalsAscii( "FillColor" ) ) + bColor = true; + else if( rName.equalsAscii( "FillGradientName" ) ) + a->maValue >>= aGradient; + else if( rName.equalsAscii( "FillHatchName" ) ) + a->maValue >>= aHatch; + else if( rName.equalsAscii( "FillBitmapName" ) ) + a->maValue >>= aBitmap; + else if( rName.equalsAscii( "FillTransparenceGradientName" ) ) + { + a->maValue >>= aTrans; + pTrans = &(*a); + } + } + + SvXMLImport& rImport = GetImport(); + switch( eStyle ) + { + case drawing::FillStyle_SOLID: + mbUsable = bColor; + break; + case drawing::FillStyle_GRADIENT: + mbUsable = lcl_FillNameExists( rImport, rImport.GetGradientHelper(), XML_STYLE_FAMILY_SD_GRADIENT_ID, aGradient ); + break; + case drawing::FillStyle_HATCH: + mbUsable = lcl_FillNameExists( rImport, rImport.GetHatchHelper(), XML_STYLE_FAMILY_SD_HATCH_ID, aHatch ); + break; + case drawing::FillStyle_BITMAP: + mbUsable = lcl_FillNameExists( rImport, rImport.GetBitmapHelper(), XML_STYLE_FAMILY_SD_FILL_IMAGE_ID, aBitmap ); + break; + default: + break; + } + + if( mbUsable && pTrans && !lcl_FillNameExists( rImport, rImport.GetTransGradientHelper(), XML_STYLE_FAMILY_SD_GRADIENT_ID, aTrans ) ) + pTrans->mnIndex = -1; + } +} + +void DrawingPageStyleContext::FillPropertySet( const uno::Reference< beans::XPropertySet > & rPropSet ) +{ + UniReference < SvXMLImportPropertyMapper > xImpPrMap = GetStyles()->GetImportPropertyMapper( GetFamily() ); + if( !xImpPrMap.is() || !HasFill() ) + return; + const UniReference< XMLPropertySetMapper >& rMapper = xImpPrMap->getPropertySetMapper(); + ::std::vector< XMLPropertyState >& rProperties = GetProperties(); + + // as in PageStyleContext::FillPropertySet: names set in the bulk call left gradient and hatch at their defaults + struct _ContextID_Index_Pair aContextIDs[] = + { + { CTF_PM_FILLGRADIENTNAME, -1 }, + { CTF_PM_FILLTRANSNAME, -1 }, + { CTF_PM_FILLHATCHNAME, -1 }, + { CTF_PM_FILLBITMAPNAME, -1 }, + { -1, -1 } + }; + static const sal_uInt16 aFamilies[] = + { + XML_STYLE_FAMILY_SD_GRADIENT_ID, + XML_STYLE_FAMILY_SD_GRADIENT_ID, + XML_STYLE_FAMILY_SD_HATCH_ID, + XML_STYLE_FAMILY_SD_FILL_IMAGE_ID + }; + + xImpPrMap->FillPropertySet( rProperties, rPropSet, aContextIDs ); + + Reference< XPropertySetInfo > xInfo( rPropSet->getPropertySetInfo() ); + for( sal_uInt16 i = 0; aContextIDs[i].nContextID != -1; i++ ) + { + if( aContextIDs[i].nIndex == -1 ) + continue; + const XMLPropertyState& rState = rProperties[aContextIDs[i].nIndex]; + const rtl::OUString& rPropertyName = rMapper->GetEntryAPIName( rState.mnIndex ); + rtl::OUString sStyleName; + rState.maValue >>= sStyleName; + sStyleName = GetImport().GetStyleDisplayName( aFamilies[i], sStyleName ); + try + { + if( xInfo->hasPropertyByName( rPropertyName ) ) + rPropSet->setPropertyValue( rPropertyName, Any( sStyleName ) ); + } + catch( lang::IllegalArgumentException& e ) + { + Sequence< rtl::OUString > aSeq( 1 ); + aSeq[0] = sStyleName; + GetImport().SetError( XMLERROR_STYLE_PROP_VALUE | XMLERROR_FLAG_WARNING, aSeq, e.Message, NULL ); + } + } +} + //eof diff --git a/main/xmloff/source/style/PageMasterPropHdlFactory.cxx b/main/xmloff/source/style/PageMasterPropHdlFactory.cxx index e7e58dfb2a..e0c00dfda9 100644 --- a/main/xmloff/source/style/PageMasterPropHdlFactory.cxx +++ b/main/xmloff/source/style/PageMasterPropHdlFactory.cxx @@ -137,6 +137,9 @@ const XMLPropertyHandler* XMLPageMasterPropHdlFactory::GetPropertyHandler( sal_I case XML_PM_TYPE_CENTER_VERTICAL: pHdl = new XMLPMPropHdl_CenterVertical(); break; + case XML_PM_TYPE_BACKGROUNDSIZE: + pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken( XML_FULL ), GetXMLToken( XML_BORDER ) ); + break; case XML_TYPE_TEXT_COLUMNS: pHdl = new XMLTextColumnsPropertyHandler; break; diff --git a/main/xmloff/source/style/PageMasterStyleMap.cxx b/main/xmloff/source/style/PageMasterStyleMap.cxx index aa69b897bd..1e27c61b75 100644 --- a/main/xmloff/source/style/PageMasterStyleMap.cxx +++ b/main/xmloff/source/style/PageMasterStyleMap.cxx @@ -285,4 +285,33 @@ const XMLPropertyMapEntry aXMLPageMasterStyleMap[] = { 0L, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFVER_010 } // index 190 }; +#define DPMAP(name,prefix,token,type,context) _MAP(name,prefix,token,type|XML_TYPE_PROP_DRAWING_PAGE,context) + +const XMLPropertyMapEntry aXMLPageMasterDrawingPageStyleMap[] = +{ + DPMAP( "FillStyle", XML_NAMESPACE_DRAW, XML_FILL, XML_SW_TYPE_FILLSTYLE, 0 ), + DPMAP( "BackgroundFullSize", XML_NAMESPACE_DRAW, XML_BACKGROUND_SIZE, XML_PM_TYPE_BACKGROUNDSIZE, 0 ), + DPMAP( "FillColor", XML_NAMESPACE_DRAW, XML_FILL_COLOR, XML_TYPE_COLOR, 0 ), + DPMAP( "FillColor2", XML_NAMESPACE_DRAW, XML_SECONDARY_FILL_COLOR, XML_TYPE_COLOR, 0 ), + DPMAP( "FillGradientName", XML_NAMESPACE_DRAW, XML_FILL_GRADIENT_NAME, XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_PM_FILLGRADIENTNAME ), + DPMAP( "FillGradientStepCount", XML_NAMESPACE_DRAW, XML_GRADIENT_STEP_COUNT, XML_TYPE_NUMBER16, 0 ), + DPMAP( "FillHatchName", XML_NAMESPACE_DRAW, XML_FILL_HATCH_NAME, XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_PM_FILLHATCHNAME ), + DPMAP( "FillBackground", XML_NAMESPACE_DRAW, XML_FILL_HATCH_SOLID, XML_TYPE_BOOL, 0 ), + DPMAP( "FillBitmapName", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_NAME, XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_PM_FILLBITMAPNAME ), + DPMAP( "FillTransparence", XML_NAMESPACE_DRAW, XML_OPACITY, XML_TYPE_NEG_PERCENT16|MID_FLAG_MULTI_PROPERTY, 0 ), + DPMAP( "FillTransparenceGradientName", XML_NAMESPACE_DRAW, XML_OPACITY_NAME, XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_PM_FILLTRANSNAME ), + DPMAP( "FillBitmapSizeX", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH, XML_SW_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ), + DPMAP( "FillBitmapLogicalSize", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH, XML_SW_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ), + DPMAP( "FillBitmapSizeY", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT, XML_SW_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0 ), + DPMAP( "FillBitmapLogicalSize", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT, XML_SW_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0 ), + DPMAP( "FillBitmapMode", XML_NAMESPACE_STYLE, XML_REPEAT, XML_SW_TYPE_BITMAP_MODE|MID_FLAG_MULTI_PROPERTY, 0 ), + DPMAP( "FillBitmapPositionOffsetX", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT_X, XML_TYPE_PERCENT, 0 ), + DPMAP( "FillBitmapPositionOffsetY", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT_Y, XML_TYPE_PERCENT, 0 ), + DPMAP( "FillBitmapRectanglePoint", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT, XML_SW_TYPE_BITMAP_REFPOINT, 0 ), + DPMAP( "FillBitmapOffsetX", XML_NAMESPACE_DRAW, XML_TILE_REPEAT_OFFSET, XML_SW_TYPE_BITMAPREPOFFSETX|MID_FLAG_MULTI_PROPERTY, CTF_PM_REPEAT_OFFSET_X ), + DPMAP( "FillBitmapOffsetY", XML_NAMESPACE_DRAW, XML_TILE_REPEAT_OFFSET, XML_SW_TYPE_BITMAPREPOFFSETY|MID_FLAG_MULTI_PROPERTY, CTF_PM_REPEAT_OFFSET_Y ), + + { 0L, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFVER_010 } +}; + //eof diff --git a/main/xmloff/source/style/xmlstyle.cxx b/main/xmloff/source/style/xmlstyle.cxx index d66b9e0524..2052614d3e 100644 --- a/main/xmloff/source/style/xmlstyle.cxx +++ b/main/xmloff/source/style/xmlstyle.cxx @@ -37,6 +37,8 @@ #ifndef _XMLOFF_PAGEMASTERPROPMAPPER_HXX #include "PageMasterPropMapper.hxx" #endif +#include "PageMasterPropHdlFactory.hxx" +#include <xmloff/PageMasterStyleMap.hxx> #include <tools/debug.hxx> #include <tools/list.hxx> #include <svl/cntnrsrt.hxx> @@ -585,6 +587,11 @@ SvXMLStyleContext *SvXMLStylesContext::CreateStyleStyleChildContext( case XML_STYLE_FAMILY_SD_POOL_ID: pStyle = new XMLShapeStyleContext( GetImport(), nPrefix, rLocalName, xAttrList, *this, nFamily ); + break; + + case XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID: + pStyle = new DrawingPageStyleContext( GetImport(), nPrefix, rLocalName, + xAttrList, *this ); } return pStyle; @@ -737,6 +744,11 @@ UniReference < SvXMLImportPropertyMapper > SvXMLStylesContext::GetImportProperty } xMapper = mxPageImpPropMapper; break; + case XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID: + xMapper = new SvXMLImportPropertyMapper( + new XMLPageMasterPropSetMapper( aXMLPageMasterDrawingPageStyleMap, new XMLPageMasterPropHdlFactory ), + ((SvXMLStylesContext*)this)->GetImport() ); + break; } return xMapper; diff --git a/main/xmloff/source/text/XMLTextMasterPageContext.cxx b/main/xmloff/source/text/XMLTextMasterPageContext.cxx index 804b764f94..16cdff2fc9 100644 --- a/main/xmloff/source/text/XMLTextMasterPageContext.cxx +++ b/main/xmloff/source/text/XMLTextMasterPageContext.cxx @@ -112,6 +112,10 @@ XMLTextMasterPageContext::XMLTextMasterPageContext( SvXMLImport& rImport, sPageMasterName = xAttrList->getValueByIndex( i ); } } + else if( XML_NAMESPACE_DRAW == nPrefix && IsXMLToken( aLocalName, XML_STYLE_NAME ) ) + { + sDrawingPageStyleName = xAttrList->getValueByIndex( i ); + } } if( sDisplayName.getLength() ) @@ -250,15 +254,35 @@ void XMLTextMasterPageContext::Finish( sal_Bool bOverwrite ) if( xStyle.is() && (IsNew() || bOverwrite) ) { Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY ); + DrawingPageStyleContext* pDrawingPage = 0; + if( sDrawingPageStyleName.getLength() && + xPropSet->getPropertySetInfo()->hasPropertyByName( OUString( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ) ) ) ) + { + const SvXMLStylesContext* pStyles = GetImport().GetAutoStyles(); + const SvXMLStyleContext* pStyle = pStyles ? pStyles->FindStyleChildContext( + XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID, sDrawingPageStyleName, sal_True ) : 0; + pStyles = GetImport().GetStyles(); + if( !pStyle && pStyles ) + pStyle = pStyles->FindStyleChildContext( XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID, + sDrawingPageStyleName, sal_True ); + pDrawingPage = PTR_CAST( DrawingPageStyleContext, pStyle ); + if( pDrawingPage && !pDrawingPage->HasFill() ) + pDrawingPage = 0; + } if( sPageMasterName.getLength() ) { XMLPropStyleContext* pStyle = GetImport().GetTextImport()->FindPageMaster( sPageMasterName ); - if (pStyle) + PageStyleContext* pPageStyle = PTR_CAST( PageStyleContext, pStyle ); + if( pDrawingPage && pPageStyle ) + pPageStyle->FillPropertySetWithoutOldPageFill( xPropSet ); + else if (pStyle) { pStyle->FillPropertySet(xPropSet); } } + if( pDrawingPage ) + pDrawingPage->FillPropertySet( xPropSet ); Reference < XNameContainer > xPageStyles = GetImport().GetTextImport()->GetPageStyles();
