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 d20c11d4418053b1c5583255f626032a37a7e65e
Author:     offtkp <[email protected]>
AuthorDate: Wed Dec 28 00:10:34 2022 +0200
Commit:     Miklos Vajna <[email protected]>
CommitDate: Wed Jan 4 08:58:23 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 <[email protected]>
    (cherry picked from commit 2fe73bd2362287afc8242289a900821186b36137)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144994
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/offapi/com/sun/star/text/ContentControl.idl 
b/offapi/com/sun/star/text/ContentControl.idl
index cb980a24b0ff..34beff3cb127 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.6
+    */
+    [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 1b634835254c..c68d10f7de1e 100644
--- a/oox/source/token/tokens.txt
+++ b/oox/source/token/tokens.txt
@@ -599,6 +599,7 @@ anyType
 anyURI
 appName
 appWorkspace
+appearance
 apples
 applyAlignment
 applyAlignmentFormats
diff --git a/sw/inc/formatcontentcontrol.hxx b/sw/inc/formatcontentcontrol.hxx
index 9c142ed711f0..f65b67d37cc4 100644
--- a/sw/inc/formatcontentcontrol.hxx
+++ b/sw/inc/formatcontentcontrol.hxx
@@ -169,6 +169,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;
 
@@ -355,6 +358,10 @@ public:
 
     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 3c6b5d8464ab..3a8df7c69182 100644
--- a/sw/inc/unoprnms.hxx
+++ b/sw/inc/unoprnms.hxx
@@ -889,6 +889,7 @@
 #define UNO_NAME_DATA_BINDING_XPATH "DataBindingXpath"
 #define UNO_NAME_DATA_BINDING_STORE_ITEM_ID "DataBindingStoreItemID"
 #define UNO_NAME_COLOR "Color"
+#define UNO_NAME_APPEARANCE "Appearance"
 #define UNO_NAME_ALIAS "Alias"
 #define UNO_NAME_TAG "Tag"
 #define UNO_NAME_ID "Id"
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
index a9daa8042f15..395f0dbf03fc 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
@@ -298,6 +298,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)));
@@ -325,6 +326,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 f1279c9cc66d..d324f52513a5 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -551,6 +551,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 ee8cebe913c5..1c37d5cbfc05 100644
--- a/sw/source/core/unocore/unocontentcontrol.cxx
+++ b/sw/source/core/unocore/unocontentcontrol.cxx
@@ -175,6 +175,7 @@ public:
     OUString m_aDataBindingXpath;
     OUString m_aDataBindingStoreItemID;
     OUString m_aColor;
+    OUString m_aAppearance;
     OUString m_aAlias;
     OUString m_aTag;
     sal_Int32 m_nId;
@@ -556,6 +557,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);
@@ -1006,6 +1008,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;
@@ -1303,6 +1320,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 5e96a882029a..0fe6db437118 100644
--- a/sw/source/core/unocore/unomap1.cxx
+++ b/sw/source/core/unocore/unomap1.cxx
@@ -1045,6 +1045,7 @@ const SfxItemPropertyMapEntry* 
SwUnoPropertyMapProvider::GetContentControlProper
         { u"" UNO_NAME_DATA_BINDING_XPATH, 0, cppu::UnoType<OUString>::get(), 
PROPERTY_NONE, 0 },
         { u"" UNO_NAME_DATA_BINDING_STORE_ITEM_ID, 0, 
cppu::UnoType<OUString>::get(), PROPERTY_NONE, 0 },
         { u"" UNO_NAME_COLOR, 0, cppu::UnoType<OUString>::get(), 
PROPERTY_NONE, 0 },
+        { u"" UNO_NAME_APPEARANCE, 0, cppu::UnoType<OUString>::get(), 
PROPERTY_NONE, 0 },
         { u"" UNO_NAME_ALIAS, 0, cppu::UnoType<OUString>::get(), 
PROPERTY_NONE, 0 },
         { u"" UNO_NAME_TAG, 0, cppu::UnoType<OUString>::get(), PROPERTY_NONE, 
0 },
         { u"" 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 d3bdc6fa6164..f1599b6bba3a 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(::sax_fastparser::FSHelperPtr& pSerializer
         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))
@@ -2401,6 +2413,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 9628eb3942cc..14b8e8075de5 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 a3007aeb1b3a..034e27079c7c 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1205,6 +1205,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;
@@ -2807,6 +2811,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:
@@ -2829,6 +2834,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);
@@ -2911,6 +2926,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 0946a5eb8c9c..cd9ab435e23e 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -931,6 +931,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 a80c03ed4ba5..99fd0de0de9d 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -475,6 +475,10 @@ void SdtHelper::SetColor(const OUString& rColor) { 
m_aColor = rColor; }
 
 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 38fda74ec55f..1f45268eaa06 100644
--- a/writerfilter/source/dmapper/SdtHelper.hxx
+++ b/writerfilter/source/dmapper/SdtHelper.hxx
@@ -125,6 +125,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;
 
@@ -219,6 +222,9 @@ public:
     void SetColor(const OUString& rColor);
     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 833af5f1aa27..b0dea8f744c3 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -13946,6 +13946,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">
@@ -14020,6 +14025,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">
@@ -18263,6 +18271,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"/>
@@ -18288,6 +18299,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