sw/qa/extras/ooxmlexport/ooxmlexport17.cxx   |    6 ++++++
 sw/qa/extras/ooxmlexport/ooxmlexport3.cxx    |    4 ++++
 sw/source/filter/ww8/docxattributeoutput.cxx |   10 ++++++++++
 sw/source/filter/ww8/docxattributeoutput.hxx |    2 ++
 writerfilter/source/dmapper/DomainMapper.cxx |   20 +++++++++++++++-----
 5 files changed, 37 insertions(+), 5 deletions(-)

New commits:
commit 529cf56d77c391ef6083808e383b171e3d70980e
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Wed Dec 7 13:44:01 2022 -0500
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Wed Dec 21 07:56:12 2022 +0000

    tdf#149240 docx content controls: round-trip showingPlcHdr better
    
    ShowingPlaceHolder causes all the text in the control to be
    selected when the control gains the focus. Otherwise, just a
    cursor is placed at the click point.
    
    While round-tripping this attribute worked for inline SDTs,
    it was lost for block SDTs. But BlockSDTs are very easy
    to create. The MS templates are full of them.
    
    Also, these are boolean, but it could have a val=0 specified,
    in which case it is off, but we were importing it as on.
    
    Change-Id: I167afa935311a63bba408ecd489ae819485a5cb7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143818
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144621
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
index 63fda18c23f3..bb7f3d9458b6 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
@@ -496,6 +496,12 @@ DECLARE_OOXMLEXPORT_TEST(testTdf148111, "tdf148111.docx")
 
     // No more fields
     CPPUNIT_ASSERT(!xFields->hasMoreElements());
+
+    if (!mbExported)
+        return;
+    xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml");
+    // ShowingPlaceholder should be off for 0, false and "on". (This was 21 
before the fix)
+    assertXPath(pXmlDoc,"//w:p/w:sdt/w:sdtPr/w:showingPlcHdr", 12);
 }
 
 DECLARE_OOXMLEXPORT_TEST(testTdf81507, "tdf81507.docx")
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
index 2d1bc1035d5a..4e8f58f6294b 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
@@ -1013,6 +1013,10 @@ CPPUNIT_TEST_FIXTURE(Test, testGlossaryWithEmail)
         "and 
@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink'
 "
         "and @Target='mailto:emailgoesh...@example.com' "
         "and @TargetMode='External']");
+
+    // preserve the ShowingPlaceholder setting on both block SDTs.
+    pXmlDoc = parseExport("word/document.xml");
+    
assertXPath(pXmlDoc,"/w:document/w:body/w:p/w:sdt/w:sdtPr/w:showingPlcHdr", 2);
 }
 
 DECLARE_OOXMLEXPORT_TEST(testFdo71785, "fdo71785.docx")
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index f2aaefa22440..73d01152dfb5 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -623,6 +623,7 @@ void SdtBlockHelper::DeleteAndResetTheLists()
         m_aPlaceHolderDocPart.clear();
     if (!m_aColor.isEmpty())
         m_aColor.clear();
+    m_bShowingPlaceHolder = false;
     m_bHasId = false;
 }
 
@@ -715,6 +716,10 @@ void 
SdtBlockHelper::WriteExtraParams(::sax_fastparser::FSHelperPtr& pSerializer
         pSerializer->singleElementNS(XML_w, XML_docPart, FSNS(XML_w, XML_val), 
m_aPlaceHolderDocPart);
         pSerializer->endElementNS(XML_w, XML_placeholder);
     }
+
+    if (m_bShowingPlaceHolder)
+        pSerializer->singleElementNS(XML_w, XML_showingPlcHdr);
+
     if (!m_aColor.isEmpty())
     {
         pSerializer->singleElementNS(XML_w15, XML_color, FSNS(XML_w, XML_val), 
m_aColor);
@@ -827,6 +832,11 @@ void SdtBlockHelper::GetSdtParamsFromGrabBag(const 
uno::Sequence<beans::Property
                     m_aColor = sValue;
             }
         }
+        else if (aPropertyValue.Name == "ooxml:CT_SdtPr_showingPlcHdr")
+        {
+            if (!(aPropertyValue.Value >>= m_bShowingPlaceHolder))
+                SAL_WARN("sw.ww8", "DocxAttributeOutput::GrabBag: unexpected 
sdt ShowingPlcHdr");
+        }
         else if (aPropertyValue.Name == "ooxml:CT_SdtPr_alias" && 
m_aAlias.isEmpty())
         {
             if (!(aPropertyValue.Value >>= m_aAlias))
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx 
b/sw/source/filter/ww8/docxattributeoutput.hxx
index f61b4576a941..8191cfb523cf 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -130,6 +130,7 @@ public:
     SdtBlockHelper()
         : m_bHasId(false)
         , m_bStartedSdt(false)
+        , m_bShowingPlaceHolder(false)
         , m_nSdtPrToken(0)
     {}
 
@@ -141,6 +142,7 @@ public:
     rtl::Reference<sax_fastparser::FastAttributeList> m_pDataBindingAttrs;
     OUString m_aColor;
     OUString m_aPlaceHolderDocPart;
+    bool m_bShowingPlaceHolder;
     OUString m_aAlias;
     OUString m_aTag;
     OUString m_aLock;
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index 2dd9b0583445..d98b2d3491e3 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2794,11 +2794,6 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
         m_pImpl->disableInteropGrabBag();
     }
     break;
-    case NS_ooxml::LN_CT_SdtPr_showingPlcHdr:
-    {
-        m_pImpl->m_pSdtHelper->SetShowingPlcHdr();
-    }
-    break;
     case NS_ooxml::LN_CT_SdtPr_dataBinding:
     case NS_ooxml::LN_CT_SdtPr_equation:
     case NS_ooxml::LN_CT_SdtPr_checkbox:
@@ -2810,12 +2805,19 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
     case NS_ooxml::LN_CT_SdtPr_id:
     case NS_ooxml::LN_CT_SdtPr_alias:
     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_tag:
     case NS_ooxml::LN_CT_SdtPr_lock:
     {
         if (!m_pImpl->GetSdtStarts().empty())
         {
+            if (nSprmId == NS_ooxml::LN_CT_SdtPr_showingPlcHdr)
+            {
+                if (nIntValue)
+                    m_pImpl->m_pSdtHelper->SetShowingPlcHdr();
+            }
+
             if (nSprmId == NS_ooxml::LN_CT_SdtPr_color)
             {
                 writerfilter::Reference<Properties>::Pointer_t pProperties = 
rSprm.getProps();
@@ -2899,6 +2901,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
             case NS_ooxml::LN_CT_SdtPr_tag:         sName = 
"ooxml:CT_SdtPr_tag"; break;
             case NS_ooxml::LN_CT_SdtPr_lock:        sName = 
"ooxml:CT_SdtPr_lock"; break;
             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;
             default: assert(false);
         };
@@ -2927,6 +2930,13 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
             aValue.Value <<= sStringValue;
             m_pImpl->m_pSdtHelper->appendToInteropGrabBag(aValue);
         }
+        else if (nSprmId == NS_ooxml::LN_CT_SdtPr_showingPlcHdr)
+        {
+            beans::PropertyValue aValue;
+            aValue.Name = sName;
+            aValue.Value <<= bool(nIntValue);
+            m_pImpl->m_pSdtHelper->appendToInteropGrabBag(aValue);
+        }
         else
             m_pImpl->m_pSdtHelper->appendToInteropGrabBag(getInteropGrabBag());
         
m_pImpl->m_pSdtHelper->setOutsideAParagraph(m_pImpl->IsOutsideAParagraph());

Reply via email to