offapi/com/sun/star/text/ContentControl.idl       |    6 ++++
 oox/source/token/tokens.txt                       |    1 
 sw/inc/formatcontentcontrol.hxx                   |    7 +++++
 sw/inc/unoprnms.hxx                               |    1 
 sw/qa/extras/ooxmlexport/ooxmlexport17.cxx        |    2 +
 sw/source/core/txtnode/attrcontentcontrol.cxx     |    2 +
 sw/source/core/unocore/unocontentcontrol.cxx      |   28 ++++++++++++++++++++++
 sw/source/core/unocore/unomap1.cxx                |    1 
 sw/source/filter/ww8/docxattributeoutput.cxx      |   18 ++++++++++++++
 sw/source/filter/ww8/docxattributeoutput.hxx      |    1 
 writerfilter/source/dmapper/DomainMapper.cxx      |   16 ++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |    6 ++++
 writerfilter/source/dmapper/SdtHelper.cxx         |    4 +++
 writerfilter/source/dmapper/SdtHelper.hxx         |    6 ++++
 writerfilter/source/ooxml/model.xml               |   12 +++++++++
 15 files changed, 111 insertions(+)

New commits:
commit a3d79543e0221ee810e0b2dd871d2afbf5ee198b
Author:     offtkp <parisop...@gmail.com>
AuthorDate: Wed Dec 28 00:10:34 2022 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Tue Jan 3 08:04:12 2023 +0000

    docx: Preserve w15:appearance SdtPr attribute
    
    Now roundtrips the w15:appearance value which dictates whether there's
    an effect when hovering a placeholder.
    
    Change-Id: I3c911a0cfe31e235b9d981bbff0c1bb5827a85ef
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144845
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/offapi/com/sun/star/text/ContentControl.idl 
b/offapi/com/sun/star/text/ContentControl.idl
index cb980a24b0ff..c2fe46757656 100644
--- a/offapi/com/sun/star/text/ContentControl.idl
+++ b/offapi/com/sun/star/text/ContentControl.idl
@@ -92,6 +92,12 @@ service ContentControl
     */
     [optional, property] string Color;
 
+    /** The appearance: just remembered.
+
+        @since LibreOffice 7.5
+    */
+    [optional, property] string Appearance;
+
     /** Combo box that allows free-form text as well, i.e. not dropdown.
 
         @since LibreOffice 7.5
diff --git a/oox/source/token/tokens.txt b/oox/source/token/tokens.txt
index b66321243320..25951891d2a7 100644
--- a/oox/source/token/tokens.txt
+++ b/oox/source/token/tokens.txt
@@ -600,6 +600,7 @@ anyType
 anyURI
 appName
 appWorkspace
+appearance
 apples
 applyAlignment
 applyAlignmentFormats
diff --git a/sw/inc/formatcontentcontrol.hxx b/sw/inc/formatcontentcontrol.hxx
index 889faeb89a07..c27253a5aab8 100644
--- a/sw/inc/formatcontentcontrol.hxx
+++ b/sw/inc/formatcontentcontrol.hxx
@@ -170,6 +170,9 @@ class SW_DLLPUBLIC SwContentControl : public 
sw::BroadcastingModify
     /// The color: just remembered.
     OUString m_aColor;
 
+    /// The appearance: just remembered.
+    OUString m_aAppearance;
+
     /// The alias: just remembered.
     OUString m_aAlias;
 
@@ -353,6 +356,10 @@ public:
 
     const OUString& GetColor() const { return m_aColor; }
 
+    void SetAppearance(const OUString& rAppearance) { m_aAppearance = 
rAppearance; }
+
+    const OUString& GetAppearance() const { return m_aAppearance; }
+
     void SetAlias(const OUString& rAlias) { m_aAlias = rAlias; }
 
     const OUString& GetAlias() const { return m_aAlias; }
diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx
index 17b13d02dc8e..42a38fdef0aa 100644
--- a/sw/inc/unoprnms.hxx
+++ b/sw/inc/unoprnms.hxx
@@ -915,6 +915,7 @@ inline constexpr OUStringLiteral 
UNO_NAME_DATA_BINDING_PREFIX_MAPPINGS
 inline constexpr OUStringLiteral UNO_NAME_DATA_BINDING_XPATH = 
u"DataBindingXpath";
 inline constexpr OUStringLiteral UNO_NAME_DATA_BINDING_STORE_ITEM_ID = 
u"DataBindingStoreItemID";
 inline constexpr OUStringLiteral UNO_NAME_COLOR = u"Color";
+inline constexpr OUStringLiteral UNO_NAME_APPEARANCE = u"Appearance";
 inline constexpr OUStringLiteral UNO_NAME_ALIAS = u"Alias";
 inline constexpr OUStringLiteral UNO_NAME_TAG = u"Tag";
 inline constexpr OUStringLiteral UNO_NAME_ID = u"Id";
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
index f3188551362a..86673055a0cd 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
@@ -421,6 +421,7 @@ CPPUNIT_TEST_FIXTURE(Test, testDateContentControlExport)
     xContentControlProps->setPropertyValue("DataBindingXpath", 
uno::Any(OUString("/ns0:employees[1]/ns0:employee[1]/ns0:hireDate[1]")));
     xContentControlProps->setPropertyValue("DataBindingStoreItemID", 
uno::Any(OUString("{241A8A02-7FFD-488D-8827-63FBE74E8BC9}")));
     xContentControlProps->setPropertyValue("Color", 
uno::Any(OUString("008000")));
+    xContentControlProps->setPropertyValue("Appearance", 
uno::Any(OUString("hidden")));
     xContentControlProps->setPropertyValue("Alias", 
uno::Any(OUString("myalias")));
     xContentControlProps->setPropertyValue("Tag", uno::Any(OUString("mytag")));
     xContentControlProps->setPropertyValue("Id", 
uno::Any(static_cast<sal_Int32>(123)));
@@ -447,6 +448,7 @@ CPPUNIT_TEST_FIXTURE(Test, testDateContentControlExport)
     assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dataBinding", "xpath", 
"/ns0:employees[1]/ns0:employee[1]/ns0:hireDate[1]");
     assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dataBinding", "storeItemID", 
"{241A8A02-7FFD-488D-8827-63FBE74E8BC9}");
     assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w15:color", "val", "008000");
+    assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w15:appearance", "val", "hidden");
     assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:alias", "val", "myalias");
     assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:tag", "val", "mytag");
     assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:id", "val", "123");
diff --git a/sw/source/core/txtnode/attrcontentcontrol.cxx 
b/sw/source/core/txtnode/attrcontentcontrol.cxx
index 36a02a7902c0..1a949874a5ed 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -557,6 +557,8 @@ void SwContentControl::dumpAsXml(xmlTextWriterPtr pWriter) 
const
                                       
BAD_CAST(m_aDataBindingStoreItemID.toUtf8().getStr()));
     (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("color"),
                                       BAD_CAST(m_aColor.toUtf8().getStr()));
+    (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("appearance"),
+                                      
BAD_CAST(m_aAppearance.toUtf8().getStr()));
     (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("alias"),
                                       BAD_CAST(m_aAlias.toUtf8().getStr()));
     (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("tag"), 
BAD_CAST(m_aTag.toUtf8().getStr()));
diff --git a/sw/source/core/unocore/unocontentcontrol.cxx 
b/sw/source/core/unocore/unocontentcontrol.cxx
index 5cce5c804c49..b8546a0a6e28 100644
--- a/sw/source/core/unocore/unocontentcontrol.cxx
+++ b/sw/source/core/unocore/unocontentcontrol.cxx
@@ -176,6 +176,7 @@ public:
     OUString m_aDataBindingXpath;
     OUString m_aDataBindingStoreItemID;
     OUString m_aColor;
+    OUString m_aAppearance;
     OUString m_aAlias;
     OUString m_aTag;
     sal_Int32 m_nId;
@@ -493,6 +494,7 @@ void SwXContentControl::AttachImpl(const 
uno::Reference<text::XTextRange>& xText
     pContentControl->SetDataBindingXpath(m_pImpl->m_aDataBindingXpath);
     
pContentControl->SetDataBindingStoreItemID(m_pImpl->m_aDataBindingStoreItemID);
     pContentControl->SetColor(m_pImpl->m_aColor);
+    pContentControl->SetAppearance(m_pImpl->m_aAppearance);
     pContentControl->SetAlias(m_pImpl->m_aAlias);
     pContentControl->SetTag(m_pImpl->m_aTag);
     pContentControl->SetId(m_pImpl->m_nId);
@@ -943,6 +945,21 @@ void SAL_CALL SwXContentControl::setPropertyValue(const 
OUString& rPropertyName,
             }
         }
     }
+    else if (rPropertyName == UNO_NAME_APPEARANCE)
+    {
+        OUString aValue;
+        if (rValue >>= aValue)
+        {
+            if (m_pImpl->m_bIsDescriptor)
+            {
+                m_pImpl->m_aAppearance = aValue;
+            }
+            else
+            {
+                m_pImpl->m_pContentControl->SetAppearance(aValue);
+            }
+        }
+    }
     else if (rPropertyName == UNO_NAME_ALIAS)
     {
         OUString aValue;
@@ -1240,6 +1257,17 @@ uno::Any SAL_CALL 
SwXContentControl::getPropertyValue(const OUString& rPropertyN
             aRet <<= m_pImpl->m_pContentControl->GetColor();
         }
     }
+    else if (rPropertyName == UNO_NAME_APPEARANCE)
+    {
+        if (m_pImpl->m_bIsDescriptor)
+        {
+            aRet <<= m_pImpl->m_aAppearance;
+        }
+        else
+        {
+            aRet <<= m_pImpl->m_pContentControl->GetAppearance();
+        }
+    }
     else if (rPropertyName == UNO_NAME_ALIAS)
     {
         if (m_pImpl->m_bIsDescriptor)
diff --git a/sw/source/core/unocore/unomap1.cxx 
b/sw/source/core/unocore/unomap1.cxx
index fee5e1dbe94b..0d3e6870458f 100644
--- a/sw/source/core/unocore/unomap1.cxx
+++ b/sw/source/core/unocore/unomap1.cxx
@@ -1014,6 +1014,7 @@ o3tl::span<const SfxItemPropertyMapEntry> 
SwUnoPropertyMapProvider::GetContentCo
         { UNO_NAME_DATA_BINDING_XPATH, 0, cppu::UnoType<OUString>::get(), 
PROPERTY_NONE, 0 },
         { UNO_NAME_DATA_BINDING_STORE_ITEM_ID, 0, 
cppu::UnoType<OUString>::get(), PROPERTY_NONE, 0 },
         { UNO_NAME_COLOR, 0, cppu::UnoType<OUString>::get(), PROPERTY_NONE, 0 
},
+        { UNO_NAME_APPEARANCE, 0, cppu::UnoType<OUString>::get(), 
PROPERTY_NONE, 0 },
         { UNO_NAME_ALIAS, 0, cppu::UnoType<OUString>::get(), PROPERTY_NONE, 0 
},
         { UNO_NAME_TAG, 0, cppu::UnoType<OUString>::get(), PROPERTY_NONE, 0 },
         { UNO_NAME_ID, 0, cppu::UnoType<sal_Int32>::get(), PROPERTY_NONE, 0 },
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index a30cabad7ea7..8aec04ef8df0 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -623,6 +623,8 @@ void SdtBlockHelper::DeleteAndResetTheLists()
         m_aPlaceHolderDocPart.clear();
     if (!m_aColor.isEmpty())
         m_aColor.clear();
+    if (!m_aAppearance.isEmpty())
+        m_aAppearance.clear();
     m_bShowingPlaceHolder = false;
     m_nId = 0;
     m_nTabIndex = 0;
@@ -722,6 +724,11 @@ void SdtBlockHelper::WriteExtraParams(const 
::sax_fastparser::FSHelperPtr& pSeri
         pSerializer->singleElementNS(XML_w15, XML_color, FSNS(XML_w, XML_val), 
m_aColor);
     }
 
+    if (!m_aAppearance.isEmpty())
+    {
+        pSerializer->singleElementNS(XML_w15, XML_appearance, FSNS(XML_w15, 
XML_val), m_aAppearance);
+    }
+
     if (!m_aAlias.isEmpty())
         pSerializer->singleElementNS(XML_w, XML_alias, FSNS(XML_w, XML_val), 
m_aAlias);
 
@@ -833,6 +840,11 @@ void SdtBlockHelper::GetSdtParamsFromGrabBag(const 
uno::Sequence<beans::Property
                     m_aColor = sValue;
             }
         }
+        else if (aPropertyValue.Name == "ooxml:CT_SdtPr_appearance")
+        {
+            if (!(aPropertyValue.Value >>= m_aAppearance))
+                SAL_WARN("sw.ww8", "DocxAttributeOutput::GrabBag: unexpected 
sdt appearance value");
+        }
         else if (aPropertyValue.Name == "ooxml:CT_SdtPr_showingPlcHdr")
         {
             if (!(aPropertyValue.Value >>= m_bShowingPlaceHolder))
@@ -2403,6 +2415,12 @@ void DocxAttributeOutput::WriteContentControlStart()
                                        m_pContentControl->GetColor());
     }
 
+    if (!m_pContentControl->GetAppearance().isEmpty())
+    {
+        m_pSerializer->singleElementNS(XML_w15, XML_appearance, FSNS(XML_w15, 
XML_val),
+                                       m_pContentControl->GetAppearance());
+    }
+
     if (!m_pContentControl->GetAlias().isEmpty())
     {
         m_pSerializer->singleElementNS(XML_w, XML_alias, FSNS(XML_w, XML_val),
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx 
b/sw/source/filter/ww8/docxattributeoutput.hxx
index c5ce31c08296..e3f0e39733bd 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -142,6 +142,7 @@ public:
     rtl::Reference<sax_fastparser::FastAttributeList> m_pTextAttrs;
     rtl::Reference<sax_fastparser::FastAttributeList> m_pDataBindingAttrs;
     OUString m_aColor;
+    OUString m_aAppearance;
     OUString m_aPlaceHolderDocPart;
     bool m_bShowingPlaceHolder;
     OUString m_aAlias;
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index 032a7bc44b42..649b17a1214a 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1233,6 +1233,10 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
             m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, 
"ooxml:CT_SdtColor_val", sStringValue);
             m_pImpl->m_pSdtHelper->SetColor(sStringValue);
             break;
+        case NS_ooxml::LN_CT_SdtAppearance_val:
+            m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, 
"ooxml:CT_SdtAppearance_val", sStringValue);
+            m_pImpl->m_pSdtHelper->SetAppearance(sStringValue);
+        break;
         case NS_ooxml::LN_CT_SdtText_multiLine:
             m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, 
"ooxml:CT_SdtText_multiLine", sStringValue);
             break;
@@ -2863,6 +2867,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
     case NS_ooxml::LN_CT_SdtPlaceholder_docPart:
     case NS_ooxml::LN_CT_SdtPr_showingPlcHdr:
     case NS_ooxml::LN_CT_SdtPr_color:
+    case NS_ooxml::LN_CT_SdtPr_appearance:
     case NS_ooxml::LN_CT_SdtPr_tag:
     case NS_ooxml::LN_CT_SdtPr_tabIndex:
     case NS_ooxml::LN_CT_SdtPr_lock:
@@ -2885,6 +2890,16 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
                 break;
             }
 
+            if (nSprmId == NS_ooxml::LN_CT_SdtPr_appearance)
+            {
+                writerfilter::Reference<Properties>::Pointer_t pProperties = 
rSprm.getProps();
+                if (pProperties)
+                {
+                    pProperties->resolve(*this);
+                }
+                break;
+            }
+
             if (nSprmId == NS_ooxml::LN_CT_SdtPr_alias)
             {
                 m_pImpl->m_pSdtHelper->SetAlias(sStringValue);
@@ -2967,6 +2982,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
             case NS_ooxml::LN_CT_SdtPlaceholder_docPart: sName = 
"ooxml:CT_SdtPlaceholder_docPart"; break;
             case NS_ooxml::LN_CT_SdtPr_showingPlcHdr: sName = 
"ooxml:CT_SdtPr_showingPlcHdr"; break;
             case NS_ooxml::LN_CT_SdtPr_color:       sName = 
"ooxml:CT_SdtPr_color"; break;
+            case NS_ooxml::LN_CT_SdtPr_appearance:  sName = 
"ooxml:CT_SdtPr_appearance"; break;
             default: assert(false);
         };
         if (
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index fb3de8824ddd..626520f9cb6e 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -943,6 +943,12 @@ void DomainMapper_Impl::PopSdt()
                                                
uno::Any(m_pSdtHelper->GetColor()));
     }
 
+    if (!m_pSdtHelper->GetAppearance().isEmpty())
+    {
+        xContentControlProps->setPropertyValue("Appearance",
+                                               
uno::Any(m_pSdtHelper->GetAppearance()));
+    }
+
     if (!m_pSdtHelper->GetAlias().isEmpty())
     {
         xContentControlProps->setPropertyValue("Alias",
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx 
b/writerfilter/source/dmapper/SdtHelper.cxx
index 2eece1c06df6..f7642c464889 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -536,6 +536,10 @@ void SdtHelper::SetColor(const OUString& rColor) { 
m_aColor = rColor; }
 
 const OUString& SdtHelper::GetColor() const { return m_aColor; }
 
+void SdtHelper::SetAppearance(const OUString& rAppearance) { m_aAppearance = 
rAppearance; }
+
+const OUString& SdtHelper::GetAppearance() const { return m_aAppearance; }
+
 void SdtHelper::SetAlias(const OUString& rAlias) { m_aAlias = rAlias; }
 
 const OUString& SdtHelper::GetAlias() const { return m_aAlias; }
diff --git a/writerfilter/source/dmapper/SdtHelper.hxx 
b/writerfilter/source/dmapper/SdtHelper.hxx
index 35bedde509c0..6803db16ef06 100644
--- a/writerfilter/source/dmapper/SdtHelper.hxx
+++ b/writerfilter/source/dmapper/SdtHelper.hxx
@@ -126,6 +126,9 @@ class SdtHelper final : public virtual SvRefBase
     /// <w:sdtPr>'s <w15:color w:val="...">.
     OUString m_aColor;
 
+    /// <w:sdtPr>'s <w15:appearance w:val="...">.
+    OUString m_aAppearance;
+
     /// <w:sdtPr>'s <w:alias w:val="...">.
     OUString m_aAlias;
 
@@ -220,6 +223,9 @@ public:
     void SetColor(const OUString& rColor);
     const OUString& GetColor() const;
 
+    void SetAppearance(const OUString& rAppearance);
+    const OUString& GetAppearance() const;
+
     void SetAlias(const OUString& rAlias);
     const OUString& GetAlias() const;
 
diff --git a/writerfilter/source/ooxml/model.xml 
b/writerfilter/source/ooxml/model.xml
index 8706d3fc2150..6ec446d67d48 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -13972,6 +13972,11 @@
           <data type="string"/>
         </attribute>
       </define>
+      <define name="CT_SdtAppearance">
+        <attribute name="w15:val">
+          <data type="string"/>
+        </attribute>
+      </define>
       <define name="CT_SdtPr">
         <choice>
           <element name="rPr">
@@ -14046,6 +14051,9 @@
           <element name="w15:color">
             <ref name="CT_SdtColor"/>
           </element>
+          <element name="w15:appearance">
+            <ref name="CT_SdtAppearance"/>
+          </element>
         </choice>
       </define>
       <define name="CT_SdtEndPr">
@@ -18292,6 +18300,9 @@
     <resource name="CT_SdtColor" resource="Properties">
       <attribute name="val" tokenid="ooxml:CT_SdtColor_val"/>
     </resource>
+    <resource name="CT_SdtAppearance" resource="Properties">
+      <attribute name="w15:val" tokenid="ooxml:CT_SdtAppearance_val"/>
+    </resource>
     <resource name="CT_SdtPr" resource="Properties">
       <element name="rPr" tokenid="ooxml:CT_SdtPr_rPr"/>
       <element name="alias" tokenid="ooxml:CT_SdtPr_alias"/>
@@ -18317,6 +18328,7 @@
       <element name="group" tokenid="ooxml:CT_SdtPr_group"/>
       <element name="bibliography" tokenid="ooxml:CT_SdtPr_bibliography"/>
       <element name="w15:color" tokenid="ooxml:CT_SdtPr_color"/>
+      <element name="w15:appearance" tokenid="ooxml:CT_SdtPr_appearance"/>
     </resource>
     <resource name="CT_SdtEndPr" resource="Properties">
       <element name="rPr" tokenid="ooxml:CT_SdtEndPr_rPr"/>

Reply via email to