This is an automated email from the ASF dual-hosted git repository.

jimjag pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit 133c6580916191e3f51cdef1f04f1b673d0077f1
Author: Jim Jagielski <[email protected]>
AuthorDate: Wed Nov 4 12:16:25 2026 -0500

    svx, xmloff: add a Decorative shape property and write it as 
draw:decorative in ODF 1.4
    
    The OWN_ATTR id range is full (EE_ITEMS_START follows it), so the new id 
sits just below it. There is no undo for the flag.
---
 main/svx/inc/svx/svdobj.hxx          |  4 ++++
 main/svx/inc/svx/unoshprp.hxx        |  7 ++++++-
 main/svx/source/svdraw/svdobj.cxx    | 24 +++++++++++++++++++++++-
 main/svx/source/unodraw/unoprov.cxx  |  7 +++++++
 main/svx/source/unodraw/unoshape.cxx | 32 +++++++++++++++++++++++++++++++-
 main/xmloff/source/draw/sdpropls.cxx |  1 +
 6 files changed, 72 insertions(+), 3 deletions(-)

diff --git a/main/svx/inc/svx/svdobj.hxx b/main/svx/inc/svx/svdobj.hxx
index 8cce8185b0..6ee75fe017 100644
--- a/main/svx/inc/svx/svdobj.hxx
+++ b/main/svx/inc/svx/svdobj.hxx
@@ -310,6 +310,7 @@ public:
        String                                          aObjName;
        String                                          aObjTitle;
        String                                          aObjDescription;
+       bool                                            mbDecorative;
 
        // Name to be used by applications
        XubString                                       aHTMLName;
@@ -599,6 +600,9 @@ public:
        String GetTitle() const;
        void SetDescription(const String& rStr);
        String GetDescription() const;
+       // ODF 1.4 draw:decorative; not covered by undo
+       void SetDecorative(bool bNew);
+       bool IsDecorative() const;
 
        // support for HTMLName
        void SetHTMLName(const String& rStr);
diff --git a/main/svx/inc/svx/unoshprp.hxx b/main/svx/inc/svx/unoshprp.hxx
index 8c12089c21..900aef2560 100644
--- a/main/svx/inc/svx/unoshprp.hxx
+++ b/main/svx/inc/svx/unoshprp.hxx
@@ -188,6 +188,10 @@
 
 #define OWN_ATTR_EDGE_POLYPOLYGONBEZIER                        
(OWN_ATTR_VALUE_START+88)       // maximum is OWN_ATTR_VALUE_START+88, see 
svl/inc/svl/solar.hrc
 
+// ODF 1.4 draw:decorative. The range above is full (EE_ITEMS_START follows 
it), so this id lies just below it and the
+// range checks in unoshape.cxx test it explicitly.
+#define OWN_ATTR_MISC_OBJ_DECORATIVE                   (OWN_ATTR_VALUE_START-1)
+
 // #FontWork#
 #define FONTWORK_PROPERTIES \
        { MAP_CHAR_LEN("FontWorkStyle"),                        
XATTR_FORMTXTSTYLE,                     /*ENUM*/&::getCppuType((const 
sal_Int32*)0),    0,      0}, \
@@ -331,7 +335,8 @@
        { MAP_CHAR_LEN("UINamePlural"),                                 
OWN_ATTR_UINAME_PLURAL                  , &::getCppuType((const 
::rtl::OUString*)0),    ::com::sun::star::beans::PropertyAttribute::READONLY,   
0},     \
        /* #i68101# */ \
        { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_TITLE),                
OWN_ATTR_MISC_OBJ_TITLE                 , &::getCppuType((const 
::rtl::OUString*)0),    0,      0}, \
-       { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0},
+       { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0}, \
+       { MAP_CHAR_LEN("Decorative"),                                   
OWN_ATTR_MISC_OBJ_DECORATIVE    , &::getBooleanCppuType(),                      
                        0,      0},
 
 #define LINKTARGET_PROPERTIES \
        { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYNAME),       OWN_ATTR_LDNAME         
                , &::getCppuType((const ::rtl::OUString*)0),    
::com::sun::star::beans::PropertyAttribute::READONLY, 0}, \
diff --git a/main/svx/source/svdraw/svdobj.cxx 
b/main/svx/source/svdraw/svdobj.cxx
index ab0c7f3de6..947beb865f 100644
--- a/main/svx/source/svdraw/svdobj.cxx
+++ b/main/svx/source/svdraw/svdobj.cxx
@@ -251,7 +251,8 @@ SdrObjPlusData::SdrObjPlusData():
        pBroadcast(NULL),
        pUserDataList(NULL),
        pGluePoints(NULL),
-       pAutoTimer(NULL)
+       pAutoTimer(NULL),
+       mbDecorative(false)
 {
 }
 
@@ -288,6 +289,7 @@ SdrObjPlusData* SdrObjPlusData::Clone(SdrObject* pObj1) 
const
        pNeuPlusData->aObjName = aObjName;
        pNeuPlusData->aObjTitle = aObjTitle;
        pNeuPlusData->aObjDescription = aObjDescription;
+       pNeuPlusData->mbDecorative = mbDecorative;
 
        if (pAutoTimer!=NULL) {
                pNeuPlusData->pAutoTimer=new AutoTimer;
@@ -839,6 +841,26 @@ String SdrObject::GetDescription() const
        return String();
 }
 
+void SdrObject::SetDecorative(bool bNew)
+{
+       if(bNew && !pPlusData)
+       {
+               ImpForcePlusData();
+       }
+
+       if(pPlusData && pPlusData->mbDecorative != bNew)
+       {
+               pPlusData->mbDecorative = bNew;
+               SetChanged();
+               BroadcastObjectChange();
+       }
+}
+
+bool SdrObject::IsDecorative() const
+{
+       return pPlusData && pPlusData->mbDecorative;
+}
+
 void SdrObject::SetHTMLName(const String& rStr)
 {
        if(rStr.Len() && !pPlusData)
diff --git a/main/svx/source/unodraw/unoprov.cxx 
b/main/svx/source/unodraw/unoprov.cxx
index dcfa435b6f..01eb22f6d7 100644
--- a/main/svx/source/unodraw/unoprov.cxx
+++ b/main/svx/source/unodraw/unoprov.cxx
@@ -521,6 +521,7 @@ SfxItemPropertyMapEntry* ImplGetSvxPluginPropertyMap()
                // #i68101#
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_TITLE),                
OWN_ATTR_MISC_OBJ_TITLE                 , &::getCppuType((const 
::rtl::OUString*)0),    0,      0},
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0},
+               { MAP_CHAR_LEN("Decorative"),                                   
        OWN_ATTR_MISC_OBJ_DECORATIVE    , &::getBooleanCppuType(),              
                                0,      0},
                {0,0,0,0,0,0}
 
        };
@@ -556,6 +557,7 @@ SfxItemPropertyMapEntry* ImplGetSvxFramePropertyMap()
                // #i68101#
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_TITLE),                
OWN_ATTR_MISC_OBJ_TITLE                 , &::getCppuType((const 
::rtl::OUString*)0),    0,      0},
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0},
+               { MAP_CHAR_LEN("Decorative"),                                   
        OWN_ATTR_MISC_OBJ_DECORATIVE    , &::getBooleanCppuType(),              
                                0,      0},
                {0,0,0,0,0,0}
 
        };
@@ -590,6 +592,7 @@ SfxItemPropertyMapEntry* ImplGetSvxAppletPropertyMap()
                // #i68101#
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_TITLE),                
OWN_ATTR_MISC_OBJ_TITLE                 , &::getCppuType((const 
::rtl::OUString*)0),    0,      0},
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0},
+               { MAP_CHAR_LEN("Decorative"),                                   
        OWN_ATTR_MISC_OBJ_DECORATIVE    , &::getBooleanCppuType(),              
                                0,      0},
                {0,0,0,0,0,0}
 
        };
@@ -641,6 +644,7 @@ SfxItemPropertyMapEntry* ImplGetSvxControlShapePropertyMap()
                // #i68101#
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_TITLE),                
OWN_ATTR_MISC_OBJ_TITLE                 , &::getCppuType((const 
::rtl::OUString*)0),    0,      0},
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0},
+               { MAP_CHAR_LEN("Decorative"),                                   
        OWN_ATTR_MISC_OBJ_DECORATIVE    , &::getBooleanCppuType(),              
                                0,      0},
                // #i112587#
         { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_PRINTABLE),   SDRATTR_OBJPRINTABLE    
                , &::getBooleanCppuType(),                                      
        0,      0},
         { MAP_CHAR_LEN("Visible"),                                             
SDRATTR_OBJVISIBLE                              , &::getBooleanCppuType(),      
                                        0,      0},
@@ -667,6 +671,7 @@ SfxItemPropertyMapEntry* ImplGetSvxPageShapePropertyMap()
                // #i68101#
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_TITLE),                
OWN_ATTR_MISC_OBJ_TITLE                 , &::getCppuType((const 
::rtl::OUString*)0),    0,      0},
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0},
+               { MAP_CHAR_LEN("Decorative"),                                   
        OWN_ATTR_MISC_OBJ_DECORATIVE    , &::getBooleanCppuType(),              
                                0,      0},
                {0,0,0,0,0,0}
 
        };
@@ -756,6 +761,7 @@ SfxItemPropertyMapEntry* ImplGetSvxMediaShapePropertyMap()
                // #i68101#
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_TITLE),                
OWN_ATTR_MISC_OBJ_TITLE                 , &::getCppuType((const 
::rtl::OUString*)0),    0,      0},
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0},
+               { MAP_CHAR_LEN("Decorative"),                                   
        OWN_ATTR_MISC_OBJ_DECORATIVE    , &::getBooleanCppuType(),              
                                0,      0},
                {0,0,0,0,0,0}
 
        };
@@ -780,6 +786,7 @@ SfxItemPropertyMapEntry* ImplGetSvxTableShapePropertyMap()
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_NAME),                 
SDRATTR_OBJECTNAME                              , &::getCppuType((const 
::rtl::OUString*)0),    0,      0},
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_TITLE),                
OWN_ATTR_MISC_OBJ_TITLE                 , &::getCppuType((const 
::rtl::OUString*)0),    0,      0},
                { MAP_CHAR_LEN(UNO_NAME_MISC_OBJ_DESCRIPTION),  
OWN_ATTR_MISC_OBJ_DESCRIPTION   , &::getCppuType((const ::rtl::OUString*)0),    
0,      0},
+               { MAP_CHAR_LEN("Decorative"),                                   
        OWN_ATTR_MISC_OBJ_DECORATIVE    , &::getBooleanCppuType(),              
                                0,      0},
                { MAP_CHAR_LEN("Model"),                                        
        OWN_ATTR_OLEMODEL                               , 
&::com::sun::star::table::XTable::static_type(), 
::com::sun::star::beans::PropertyAttribute::READONLY, 0},
                { MAP_CHAR_LEN("TableTemplate"),                                
OWN_ATTR_TABLETEMPLATE                  , 
&::com::sun::star::container::XIndexAccess::static_type(), 0, 0},
                { MAP_CHAR_LEN("UseFirstRowStyle"),                             
OWN_ATTR_TABLETEMPLATE_FIRSTROW, &::getBooleanCppuType(),0, 0},
diff --git a/main/svx/source/unodraw/unoshape.cxx 
b/main/svx/source/unodraw/unoshape.cxx
index 084664e485..7acf7b8f9f 100644
--- a/main/svx/source/unodraw/unoshape.cxx
+++ b/main/svx/source/unodraw/unoshape.cxx
@@ -686,7 +686,7 @@ void SvxItemPropertySet_ObtainSettingsFromPropertySet(const 
SvxItemPropertySet&
                                        if(pEntry)
                                        {
                                                // entry found
-                                               if(pEntry->nWID >= 
OWN_ATTR_VALUE_START && pEntry->nWID <= OWN_ATTR_VALUE_END)
+                                               if((pEntry->nWID >= 
OWN_ATTR_VALUE_START && pEntry->nWID <= OWN_ATTR_VALUE_END) || pEntry->nWID == 
OWN_ATTR_MISC_OBJ_DECORATIVE)
                                                {
                                                        // Special ID im 
PropertySet, kann nur direkt am
                                                        // Objekt gesetzt 
werden+
@@ -2584,6 +2584,17 @@ bool SvxShape::setPropertyValueImpl( const 
::rtl::OUString&, const SfxItemProper
                break;
        }
 
+       case OWN_ATTR_MISC_OBJ_DECORATIVE:
+       {
+               sal_Bool bDecorative = sal_False;
+               if( rValue >>= bDecorative )
+               {
+                       mpObj->SetDecorative( bDecorative );
+                       return true;
+               }
+               break;
+       }
+
        case SDRATTR_OBJPRINTABLE:
        {
                sal_Bool bPrintable = sal_Bool();
@@ -2979,6 +2990,10 @@ bool SvxShape::getPropertyValueImpl( const 
::rtl::OUString&, const SfxItemProper
                break;
        }
 
+       case OWN_ATTR_MISC_OBJ_DECORATIVE:
+               rValue <<= static_cast<sal_Bool>( mpObj->IsDecorative() );
+               break;
+
        case SDRATTR_OBJPRINTABLE:
                rValue <<= static_cast<sal_Bool>( mpObj->IsPrintable() );
                break;
@@ -3084,6 +3099,11 @@ bool SvxShape::getPropertyStateImpl( const 
SfxItemPropertySimpleEntry* pProperty
                        rState = beans::PropertyState_AMBIGUOUS_VALUE;
                }
        }
+       else if( pProperty->nWID == OWN_ATTR_MISC_OBJ_DECORATIVE )
+       {
+               // a default of false must not make every shape export the 
property
+               rState = mpObj->IsDecorative() ? 
beans::PropertyState_DIRECT_VALUE : beans::PropertyState_DEFAULT_VALUE;
+       }
        else if((( pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID 
<= OWN_ATTR_VALUE_END ) ||
           ( pProperty->nWID >= SDRATTR_NOTPERSIST_FIRST && pProperty->nWID <= 
SDRATTR_NOTPERSIST_LAST )) && ( pProperty->nWID != SDRATTR_TEXTDIRECTION ) )
        {
@@ -3107,6 +3127,11 @@ bool SvxShape::setPropertyToDefaultImpl( const 
SfxItemPropertySimpleEntry* pProp
                mpObj->ClearMergedItem( XATTR_FILLBMP_TILE );
                return true;
        }
+       else if( pProperty->nWID == OWN_ATTR_MISC_OBJ_DECORATIVE )
+       {
+               mpObj->SetDecorative( false );
+               return true;
+       }
        else if((pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID <= 
OWN_ATTR_VALUE_END ) ||
           ( pProperty->nWID >= SDRATTR_NOTPERSIST_FIRST && pProperty->nWID <= 
SDRATTR_NOTPERSIST_LAST ))
        {
@@ -3197,6 +3222,11 @@ uno::Any SAL_CALL SvxShape::_getPropertyDefault( const 
OUString& aPropertyName )
        if( !mpObj.is() || pMap == NULL || mpModel == NULL )
                throw beans::UnknownPropertyException();
 
+       if( pMap->nWID == OWN_ATTR_MISC_OBJ_DECORATIVE )
+       {
+               return uno::makeAny( sal_False );
+       }
+
        if(( pMap->nWID >= OWN_ATTR_VALUE_START && pMap->nWID <= 
OWN_ATTR_VALUE_END ) ||
           ( pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= 
SDRATTR_NOTPERSIST_LAST ))
        {
diff --git a/main/xmloff/source/draw/sdpropls.cxx 
b/main/xmloff/source/draw/sdpropls.cxx
index 8fc0b5588d..fb3771282e 100644
--- a/main/xmloff/source/draw/sdpropls.cxx
+++ b/main/xmloff/source/draw/sdpropls.cxx
@@ -296,6 +296,7 @@ const XMLPropertyMapEntry aXMLSDProperties[] =
        // misc object properties
        GMAP( "MoveProtect",                            XML_NAMESPACE_STYLE, 
XML_PROTECT,                               
XML_SD_TYPE_MOVE_PROTECT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, 
CTF_SD_MOVE_PROTECT ),
        GMAP( "SizeProtect",                            XML_NAMESPACE_STYLE, 
XML_PROTECT,                               
XML_SD_TYPE_SIZE_PROTECT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, 
CTF_SD_SIZE_PROTECT ),
+       GMAPV( "Decorative",                                    
XML_NAMESPACE_DRAW, XML_DECORATIVE,                             XML_TYPE_BOOL, 
0, SvtSaveOptions::ODFVER_014 ),
        MAP_END()
 };
 

Reply via email to