offapi/com/sun/star/text/ContentControl.idl                      |    6 ++
 sw/inc/formatcontentcontrol.hxx                                  |    7 ++
 sw/inc/unoprnms.hxx                                              |    1 
 sw/qa/core/unocore/unocore.cxx                                   |    2 
 sw/qa/extras/ooxmlexport/ooxmlexport17.cxx                       |    2 
 sw/source/core/txtnode/attrcontentcontrol.cxx                    |    1 
 sw/source/core/unocore/unocontentcontrol.cxx                     |   28 
++++++++++
 sw/source/core/unocore/unomap1.cxx                               |    1 
 sw/source/filter/ww8/docxattributeoutput.cxx                     |    6 ++
 writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx               |    4 +
 writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx |binary
 writerfilter/source/dmapper/DomainMapper.cxx                     |   15 +++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx                |    6 ++
 writerfilter/source/dmapper/SdtHelper.cxx                        |    4 +
 writerfilter/source/dmapper/SdtHelper.hxx                        |    6 ++
 15 files changed, 89 insertions(+)

New commits:
commit 6c1a84b8af31761b9803c097751ca156922c89cd
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Wed Oct 5 15:18:53 2022 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Oct 7 12:07:56 2022 +0200

    sw content controls: preserve tag
    
    This is similar to <w15:color> to preserve <w:tag>.
    
    Resolves
    
<https://gerrit.libreoffice.org/c/core/+/137399/2#message-a5ba9f1e0dc9e586034758ee7c0a94e1533e8922>.
    
    (cherry picked from commit 5262aab9d220675f616579720b4bb43ee03cccfb)
    
    Conflicts:
            sw/source/core/unocore/unomap1.cxx
    
    Change-Id: I4fdab44aaf13ca812502ae79f38f32ec9468db11
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141025
    Tested-by: Miklos Vajna <vmik...@collabora.com>
    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 d07dbfc49256..8f390665c2b3 100644
--- a/offapi/com/sun/star/text/ContentControl.idl
+++ b/offapi/com/sun/star/text/ContentControl.idl
@@ -105,6 +105,12 @@ service ContentControl
         @since LibreOffice 7.5
     */
     [optional, property] string Alias;
+
+    /** The tag: just remembered.
+
+        @since LibreOffice 7.5
+    */
+    [optional, property] string Tag;
 };
 
 
diff --git a/sw/inc/formatcontentcontrol.hxx b/sw/inc/formatcontentcontrol.hxx
index 5806f0851db1..2cf220b9bcd1 100644
--- a/sw/inc/formatcontentcontrol.hxx
+++ b/sw/inc/formatcontentcontrol.hxx
@@ -168,6 +168,9 @@ class SW_DLLPUBLIC SwContentControl : public 
sw::BroadcastingModify
     /// The alias: just remembered.
     OUString m_aAlias;
 
+    /// The tag: just remembered.
+    OUString m_aTag;
+
     /// Stores a list item index, in case the doc model is not yet updated.
     std::optional<size_t> m_oSelectedListItem;
 
@@ -331,6 +334,10 @@ public:
 
     const OUString& GetAlias() const { return m_aAlias; }
 
+    void SetTag(const OUString& rTag) { m_aTag = rTag; }
+
+    const OUString& GetTag() const { return m_aTag; }
+
     void SetReadWrite(bool bReadWrite) { m_bReadWrite = bReadWrite; }
 
     bool GetReadWrite() const { return m_bReadWrite; }
diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx
index 623960f13516..4f952b733ad7 100644
--- a/sw/inc/unoprnms.hxx
+++ b/sw/inc/unoprnms.hxx
@@ -888,6 +888,7 @@
 #define UNO_NAME_DATA_BINDING_STORE_ITEM_ID "DataBindingStoreItemID"
 #define UNO_NAME_COLOR "Color"
 #define UNO_NAME_ALIAS "Alias"
+#define UNO_NAME_TAG "Tag"
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/core/unocore/unocore.cxx b/sw/qa/core/unocore/unocore.cxx
index 13a10c2f03f1..18286efe9ed9 100644
--- a/sw/qa/core/unocore/unocore.cxx
+++ b/sw/qa/core/unocore/unocore.cxx
@@ -573,6 +573,7 @@ CPPUNIT_TEST_FIXTURE(SwCoreUnocoreTest, 
testContentControlDate)
         "DataBindingStoreItemID", 
uno::Any(OUString("{241A8A02-7FFD-488D-8827-63FBE74E8BC9}")));
     xContentControlProps->setPropertyValue("Color", 
uno::Any(OUString("008000")));
     xContentControlProps->setPropertyValue("Alias", 
uno::Any(OUString("myalias")));
+    xContentControlProps->setPropertyValue("Tag", uno::Any(OUString("mytag")));
     xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
 
     // Then make sure that the specified properties are set:
@@ -597,6 +598,7 @@ CPPUNIT_TEST_FIXTURE(SwCoreUnocoreTest, 
testContentControlDate)
                          pContentControl->GetDataBindingStoreItemID());
     CPPUNIT_ASSERT_EQUAL(OUString("008000"), pContentControl->GetColor());
     CPPUNIT_ASSERT_EQUAL(OUString("myalias"), pContentControl->GetAlias());
+    CPPUNIT_ASSERT_EQUAL(OUString("mytag"), pContentControl->GetTag());
 }
 
 CPPUNIT_TEST_FIXTURE(SwCoreUnocoreTest, testContentControlPlainText)
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
index 761155ad1dc9..d7f85c501b47 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("DataBindingStoreItemID", 
uno::Any(OUString("{241A8A02-7FFD-488D-8827-63FBE74E8BC9}")));
     xContentControlProps->setPropertyValue("Color", 
uno::Any(OUString("008000")));
     xContentControlProps->setPropertyValue("Alias", 
uno::Any(OUString("myalias")));
+    xContentControlProps->setPropertyValue("Tag", uno::Any(OUString("mytag")));
     xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
 
     // When exporting to DOCX:
@@ -320,6 +321,7 @@ CPPUNIT_TEST_FIXTURE(Test, testDateContentControlExport)
     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/w:alias", "val", "myalias");
+    assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:tag", "val", "mytag");
 }
 
 DECLARE_OOXMLEXPORT_TEST(testTdf137466, "tdf137466.docx")
diff --git a/sw/source/core/txtnode/attrcontentcontrol.cxx 
b/sw/source/core/txtnode/attrcontentcontrol.cxx
index ebd0fe48d9db..399b954ea08f 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -404,6 +404,7 @@ void SwContentControl::dumpAsXml(xmlTextWriterPtr pWriter) 
const
                                       BAD_CAST(m_aColor.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()));
 
     if (!m_aListItems.empty())
     {
diff --git a/sw/source/core/unocore/unocontentcontrol.cxx 
b/sw/source/core/unocore/unocontentcontrol.cxx
index 774cc0f7fbcf..994c5db7346a 100644
--- a/sw/source/core/unocore/unocontentcontrol.cxx
+++ b/sw/source/core/unocore/unocontentcontrol.cxx
@@ -174,6 +174,7 @@ public:
     OUString m_aDataBindingStoreItemID;
     OUString m_aColor;
     OUString m_aAlias;
+    OUString m_aTag;
 
     Impl(SwXContentControl& rThis, SwDoc& rDoc, SwContentControl* 
pContentControl,
          const uno::Reference<text::XText>& xParentText,
@@ -547,6 +548,7 @@ void SwXContentControl::AttachImpl(const 
uno::Reference<text::XTextRange>& xText
     
pContentControl->SetDataBindingStoreItemID(m_pImpl->m_aDataBindingStoreItemID);
     pContentControl->SetColor(m_pImpl->m_aColor);
     pContentControl->SetAlias(m_pImpl->m_aAlias);
+    pContentControl->SetTag(m_pImpl->m_aTag);
 
     SwFormatContentControl aContentControl(pContentControl, nWhich);
     bool bSuccess
@@ -981,6 +983,21 @@ void SAL_CALL SwXContentControl::setPropertyValue(const 
OUString& rPropertyName,
             }
         }
     }
+    else if (rPropertyName == UNO_NAME_TAG)
+    {
+        OUString aValue;
+        if (rValue >>= aValue)
+        {
+            if (m_pImpl->m_bIsDescriptor)
+            {
+                m_pImpl->m_aTag = aValue;
+            }
+            else
+            {
+                m_pImpl->m_pContentControl->SetTag(aValue);
+            }
+        }
+    }
     else
     {
         throw beans::UnknownPropertyException();
@@ -1203,6 +1220,17 @@ uno::Any SAL_CALL 
SwXContentControl::getPropertyValue(const OUString& rPropertyN
             aRet <<= m_pImpl->m_pContentControl->GetAlias();
         }
     }
+    else if (rPropertyName == UNO_NAME_TAG)
+    {
+        if (m_pImpl->m_bIsDescriptor)
+        {
+            aRet <<= m_pImpl->m_aTag;
+        }
+        else
+        {
+            aRet <<= m_pImpl->m_pContentControl->GetTag();
+        }
+    }
     else
     {
         throw beans::UnknownPropertyException();
diff --git a/sw/source/core/unocore/unomap1.cxx 
b/sw/source/core/unocore/unomap1.cxx
index 158da137f1fe..6f563fe69d94 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_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_ALIAS, 0, cppu::UnoType<OUString>::get(), 
PROPERTY_NONE, 0 },
+        { u"" UNO_NAME_TAG, 0, cppu::UnoType<OUString>::get(), PROPERTY_NONE, 
0 },
         { u"", 0, css::uno::Type(), 0, 0 }
     };
 
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index 85c68a3e078d..0d54ef129784 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -2369,6 +2369,12 @@ void DocxAttributeOutput::WriteContentControlStart()
                                        m_pContentControl->GetAlias());
     }
 
+    if (!m_pContentControl->GetTag().isEmpty())
+    {
+        m_pSerializer->singleElementNS(XML_w, XML_tag, FSNS(XML_w, XML_val),
+                                       m_pContentControl->GetTag());
+    }
+
     if (m_pContentControl->GetShowingPlaceHolder())
     {
         m_pSerializer->singleElementNS(XML_w, XML_showingPlcHdr);
diff --git a/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx 
b/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx
index f6f67327fad8..5b62fdf55122 100644
--- a/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx
+++ b/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx
@@ -91,6 +91,10 @@ CPPUNIT_TEST_FIXTURE(Test, testSdtRunRichText)
     xContentControlProps->getPropertyValue("Alias") >>= aAlias;
     // This was empty.
     CPPUNIT_ASSERT_EQUAL(OUString("myalias"), aAlias);
+    OUString aTag;
+    xContentControlProps->getPropertyValue("Tag") >>= aTag;
+    // This was empty.
+    CPPUNIT_ASSERT_EQUAL(OUString("mytag"), aTag);
 }
 
 CPPUNIT_TEST_FIXTURE(Test, testSdtRunPlainText)
diff --git a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx 
b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx
index b3b25d8cc3ab..b7f291f776bf 100644
Binary files a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx 
and b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx differ
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index 21a7ddf27921..6abab8fd82f6 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2796,6 +2796,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
     case NS_ooxml::LN_CT_SdtPr_alias:
     case NS_ooxml::LN_CT_SdtPlaceholder_docPart:
     case NS_ooxml::LN_CT_SdtPr_color:
+    case NS_ooxml::LN_CT_SdtPr_tag:
     {
         if (!m_pImpl->GetSdtStarts().empty())
         {
@@ -2815,6 +2816,12 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
                 break;
             }
 
+            if (nSprmId == NS_ooxml::LN_CT_SdtPr_tag)
+            {
+                m_pImpl->m_pSdtHelper->SetTag(sStringValue);
+                break;
+            }
+
             if (nSprmId == NS_ooxml::LN_CT_SdtPr_checkbox)
             {
                 
m_pImpl->m_pSdtHelper->setControlType(SdtControlType::checkBox);
@@ -2846,6 +2853,14 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
                 break;
             }
         }
+        else
+        {
+            if (nSprmId == NS_ooxml::LN_CT_SdtPr_tag)
+            {
+                // Tag is only handled here in case of inline SDT.
+                break;
+            }
+        }
 
         // this is an unsupported SDT property, create a grab bag for it
         OUString sName;
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 9164f4e4b3a8..2f7cc6ca619a 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -937,6 +937,12 @@ void DomainMapper_Impl::PopSdt()
                                                
uno::Any(m_pSdtHelper->GetAlias()));
     }
 
+    if (!m_pSdtHelper->GetTag().isEmpty())
+    {
+        xContentControlProps->setPropertyValue("Tag",
+                                               
uno::Any(m_pSdtHelper->GetTag()));
+    }
+
     if (m_pSdtHelper->getControlType() == SdtControlType::checkBox)
     {
         xContentControlProps->setPropertyValue("Checkbox", uno::makeAny(true));
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx 
b/writerfilter/source/dmapper/SdtHelper.cxx
index 0801d78ef5fb..789bf893251e 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -472,6 +472,10 @@ void SdtHelper::SetAlias(const OUString& rAlias) { 
m_aAlias = rAlias; }
 
 const OUString& SdtHelper::GetAlias() const { return m_aAlias; }
 
+void SdtHelper::SetTag(const OUString& rTag) { m_aTag = rTag; }
+
+const OUString& SdtHelper::GetTag() const { return m_aTag; }
+
 } // namespace writerfilter::dmapper
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SdtHelper.hxx 
b/writerfilter/source/dmapper/SdtHelper.hxx
index 2a5970fe6997..73504c7024d7 100644
--- a/writerfilter/source/dmapper/SdtHelper.hxx
+++ b/writerfilter/source/dmapper/SdtHelper.hxx
@@ -128,6 +128,9 @@ class SdtHelper final : public virtual SvRefBase
     /// <w:sdtPr>'s <w:alias w:val="...">.
     OUString m_aAlias;
 
+    /// <w:sdtPr>'s <w:tag w:val="...">.
+    OUString m_aTag;
+
 public:
     explicit SdtHelper(DomainMapper_Impl& rDM_Impl,
                        css::uno::Reference<css::uno::XComponentContext> const& 
xContext);
@@ -210,6 +213,9 @@ public:
     void SetAlias(const OUString& rAlias);
     const OUString& GetAlias() const;
 
+    void SetTag(const OUString& rTag);
+    const OUString& GetTag() const;
+
     std::optional<OUString> getValueFromDataBinding();
 };
 

Reply via email to