writerfilter/source/dmapper/DomainMapper.cxx |   92 ++++++++++++++-------------
 writerfilter/source/dmapper/SdtHelper.cxx    |   13 +--
 writerfilter/source/dmapper/SdtHelper.hxx    |   18 +++--
 3 files changed, 64 insertions(+), 59 deletions(-)

New commits:
commit 137a7c116f58134107d4fcc399da5854639853b8
Author:     Vasily Melenchuk <vasily.melenc...@cib.de>
AuthorDate: Thu Nov 18 15:04:00 2021 +0300
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Feb 18 08:14:59 2022 +0100

    writerfilter: extend SdtHelper for better support control types
    
    There is much more different controls which must be supprorted
    in future. So approach with isInsideDropDownControl() and
    validateDateFormat() is not sufficient. Use enum to determine
    and store control type.
    
    Change-Id: Ibea7fde117c059053195be213a3ae821644f277c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125471
    Tested-by: Jenkins
    Reviewed-by: Vasily Melenchuk <vasily.melenc...@cib.de>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127149
    Tested-by: Thorsten Behrens <thorsten.behr...@allotropia.de>
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130037
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index c6d718790763..b3c6b5d0c7c5 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1031,10 +1031,17 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
             else
                 m_pImpl->setSdtEndDeferred(true);
 
-            if (m_pImpl->m_pSdtHelper->isInsideDropDownControl())
-                m_pImpl->m_pSdtHelper->createDropDownControl();
-            else if (m_pImpl->m_pSdtHelper->validateDateFormat())
-                m_pImpl->m_pSdtHelper->createDateContentControl();
+            switch (m_pImpl->m_pSdtHelper->getControlType())
+            {
+                case SdtControlType::dropDown:
+                    m_pImpl->m_pSdtHelper->createDropDownControl();
+                    break;
+                case SdtControlType::datePicker:
+                    m_pImpl->m_pSdtHelper->createDateContentControl();
+                    break;
+                case SdtControlType::unknown:
+                default:;
+            }
         break;
         case NS_ooxml::LN_CT_SdtListItem_displayText:
             // TODO handle when this is != value
@@ -2542,7 +2549,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
     case NS_ooxml::LN_CT_SdtPr_dropDownList:
     case NS_ooxml::LN_CT_SdtPr_comboBox:
     {
-        m_pImpl->m_pSdtHelper->setInsideDropDownControl(true);
+        m_pImpl->m_pSdtHelper->setControlType(SdtControlType::dropDown);
         writerfilter::Reference<Properties>::Pointer_t pProperties = 
rSprm.getProps();
         if (pProperties.get() != nullptr)
             pProperties->resolve(*this);
@@ -2557,6 +2564,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const 
PropertyMapPtr& rContext )
     break;
     case NS_ooxml::LN_CT_SdtPr_date:
     {
+        m_pImpl->m_pSdtHelper->setControlType(SdtControlType::datePicker);
         resolveSprmProps(*this, rSprm);
         
m_pImpl->m_pSdtHelper->setDateFieldStartRange(GetCurrentTextRange()->getEnd());
     }
@@ -3385,7 +3393,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, 
size_t len)
     }
 
     bool bNewLine = len == 1 && (sText[0] == 0x0d || sText[0] == 0x07);
-    if (m_pImpl->m_pSdtHelper->isInsideDropDownControl())
+    if (m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::dropDown)
     {
         if (bNewLine)
             // Dropdown control has single-line texts, so in case of newline, 
create the control.
@@ -3396,43 +3404,48 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, 
size_t len)
             return;
         }
     }
+    else if (m_pImpl->m_pSdtHelper->getControlType() == 
SdtControlType::datePicker)
+    {
+        if (!m_pImpl->m_pSdtHelper->isInteropGrabBagEmpty())
+        {
+            m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear();
+        }
+        else if (IsInHeaderFooter() && m_pImpl->IsDiscardHeaderFooter())
+        {
+            m_pImpl->m_pSdtHelper->getDateFormat().truncate();
+            m_pImpl->m_pSdtHelper->getLocale().truncate();
+            m_pImpl->m_pSdtHelper->setControlType(SdtControlType::unknown);
+            return;
+        }
+    }
     else if (!m_pImpl->m_pSdtHelper->isInteropGrabBagEmpty())
     {
-         // Ignore grabbag when we have a date field, it can conflict during 
export
-        if(m_pImpl->m_pSdtHelper->validateDateFormat())
+        // there are unsupported SDT properties in the document
+        // save them in the paragraph interop grab bag
+        if (m_pImpl->IsDiscardHeaderFooter())
         {
+            // Unless we're supposed to ignore this header/footer.
             m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear();
+            return;
         }
-        else
+        
if((m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_checkbox") 
||
+                
m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_text") ||
+                
m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_dataBinding") 
||
+                
m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_citation") ||
+                
(m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_id") &&
+                        m_pImpl->m_pSdtHelper->getInteropGrabBagSize() == 1)) 
&& !m_pImpl->m_pSdtHelper->isOutsideAParagraph())
         {
+            PropertyMapPtr pContext = 
m_pImpl->GetTopContextOfType(CONTEXT_CHARACTER);
 
-            // there are unsupported SDT properties in the document
-            // save them in the paragraph interop grab bag
-            if (m_pImpl->IsDiscardHeaderFooter())
-            {
-                // Unless we're supposed to ignore this header/footer.
-                m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear();
-                return;
-            }
-            
if((m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_checkbox") 
||
-                    
m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_text") ||
-                    
m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_dataBinding") 
||
-                    
m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_citation") ||
-                    
(m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_id") &&
-                            m_pImpl->m_pSdtHelper->getInteropGrabBagSize() == 
1)) && !m_pImpl->m_pSdtHelper->isOutsideAParagraph())
-            {
-                PropertyMapPtr pContext = 
m_pImpl->GetTopContextOfType(CONTEXT_CHARACTER);
-
-                if (m_pImpl->IsOpenField())
-                    // We have a field, insert the SDT properties to the 
field's grab-bag, so they won't be lost.
-                    pContext = m_pImpl->GetTopFieldContext()->getProperties();
+            if (m_pImpl->IsOpenField())
+                // We have a field, insert the SDT properties to the field's 
grab-bag, so they won't be lost.
+                pContext = m_pImpl->GetTopFieldContext()->getProperties();
 
-                pContext->Insert(PROP_SDTPR, 
uno::makeAny(m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear()), true, 
CHAR_GRAB_BAG);
-            }
-            else
-                
m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)->Insert(PROP_SDTPR,
-                        
uno::makeAny(m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear()), true, 
PARA_GRAB_BAG);
+            pContext->Insert(PROP_SDTPR, 
uno::makeAny(m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear()), true, 
CHAR_GRAB_BAG);
         }
+        else
+            m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)->Insert(PROP_SDTPR,
+                    
uno::makeAny(m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear()), true, 
PARA_GRAB_BAG);
     }
     else if (len == 1 && sText[0] == 0x03)
     {
@@ -3458,15 +3471,6 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, 
size_t len)
             return;
         }
     }
-    else if (m_pImpl->m_pSdtHelper->validateDateFormat())
-    {
-        if(IsInHeaderFooter() && m_pImpl->IsDiscardHeaderFooter())
-        {
-            m_pImpl->m_pSdtHelper->getDateFormat().truncate();
-            m_pImpl->m_pSdtHelper->getLocale().truncate();
-            return;
-        }
-    }
     if (!m_pImpl->hasTableManager())
         return;
 
@@ -4016,7 +4020,7 @@ void DomainMapper::HandleRedline( Sprm& rSprm )
 
 void DomainMapper::finishParagraph(const bool bRemove)
 {
-    if (m_pImpl->m_pSdtHelper->validateDateFormat())
+    if (m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::datePicker)
         m_pImpl->m_pSdtHelper->createDateContentControl();
     m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH), 
bRemove);
 }
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx 
b/writerfilter/source/dmapper/SdtHelper.cxx
index 154e7660d842..a1918d1f3756 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -70,7 +70,7 @@ static awt::Size lcl_getOptimalWidth(const 
StyleSheetTablePtr& pStyleSheet,
 
 SdtHelper::SdtHelper(DomainMapper_Impl& rDM_Impl)
     : m_rDM_Impl(rDM_Impl)
-    , m_bInsideDropDownControl(false)
+    , m_aControlType(SdtControlType::unknown)
     , m_bHasElements(false)
     , m_bOutsideAParagraph(false)
 {
@@ -80,7 +80,7 @@ SdtHelper::~SdtHelper() = default;
 
 void SdtHelper::createDropDownControl()
 {
-    assert(m_bInsideDropDownControl);
+    assert(getControlType() == SdtControlType::dropDown);
 
     const bool bDropDown
         = 
officecfg::Office::Writer::Filter::Import::DOCX::ImportComboBoxAsDropDown::get();
@@ -135,12 +135,7 @@ void SdtHelper::createDropDownControl()
 
     // clean up
     m_aDropDownItems.clear();
-    m_bInsideDropDownControl = false;
-}
-
-bool SdtHelper::validateDateFormat()
-{
-    return !m_sDateFormat.toString().isEmpty() && 
!m_sLocale.toString().isEmpty();
+    setControlType(SdtControlType::unknown);
 }
 
 void SdtHelper::createDateContentControl()
@@ -203,6 +198,8 @@ void SdtHelper::createDateContentControl()
             }
         }
     }
+
+    setControlType(SdtControlType::unknown);
 }
 
 void SdtHelper::createControlShape(awt::Size aSize,
diff --git a/writerfilter/source/dmapper/SdtHelper.hxx 
b/writerfilter/source/dmapper/SdtHelper.hxx
index 3cce8e3658af..3eb18e5d9e65 100644
--- a/writerfilter/source/dmapper/SdtHelper.hxx
+++ b/writerfilter/source/dmapper/SdtHelper.hxx
@@ -39,6 +39,13 @@ namespace dmapper
 {
 class DomainMapper_Impl;
 
+enum class SdtControlType
+{
+    datePicker,
+    dropDown,
+    unknown
+};
+
 /**
  * Helper to create form controls from w:sdt tokens.
  *
@@ -51,8 +58,8 @@ class SdtHelper final : public virtual SvRefBase
 
     /// Items of the drop-down control.
     std::vector<OUString> m_aDropDownItems;
-    /// Indicator of a drop-down control
-    bool m_bInsideDropDownControl;
+    /// Type of sdt control
+    SdtControlType m_aControlType;
     /// Pieces of the default text -- currently used only by the dropdown 
control.
     OUStringBuffer m_aSdtTexts;
     /// Date ISO string contained in the w:date element, used by the date 
control.
@@ -91,9 +98,6 @@ public:
         m_xDateFieldStartRange = xStartRange;
     }
 
-    /// Decides if we have enough information to create a date control.
-    bool validateDateFormat();
-
     OUStringBuffer& getLocale() { return m_sLocale; }
     /// If createControlShape() was ever called.
     bool hasElements() const { return m_bHasElements; }
@@ -105,8 +109,8 @@ public:
 
     bool isOutsideAParagraph() const { return m_bOutsideAParagraph; }
 
-    bool isInsideDropDownControl() const { return m_bInsideDropDownControl; }
-    void setInsideDropDownControl(bool bInside) { m_bInsideDropDownControl = 
bInside; }
+    SdtControlType getControlType() { return m_aControlType; }
+    void setControlType(SdtControlType aType) { m_aControlType = aType; }
 
     /// Create drop-down control from w:sdt's w:dropDownList.
     void createDropDownControl();

Reply via email to