sw/source/core/edit/edfcol.cxx |   97 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 87 insertions(+), 10 deletions(-)

New commits:
commit 0e30d1c9a7d09da5e76c9d3484170dd2ae2812ad
Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk>
Date:   Mon Oct 16 09:51:46 2017 -0400

    TSCP: remove old classification fields before adding new
    
    Change-Id: I282fc52f0b91b65a5e40a5e13b46fb65a1783176
    Reviewed-on: https://gerrit.libreoffice.org/43428
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Ashod Nakashian <ashnak...@gmail.com>

diff --git a/sw/source/core/edit/edfcol.cxx b/sw/source/core/edit/edfcol.cxx
index 3afe595b2570..5cd5dd70a77c 100644
--- a/sw/source/core/edit/edfcol.cxx
+++ b/sw/source/core/edit/edfcol.cxx
@@ -112,9 +112,10 @@ std::vector<OUString> lcl_getUsedPageStyles(SwViewShell 
const * pShell)
     return aReturn;
 }
 
-/// Search for a field named rFieldName of type rServiceName in xText.
-bool lcl_hasField(const uno::Reference<text::XText>& xText, const OUString& 
rServiceName, const OUString& rFieldName)
+/// Search for a field named rFieldName of type rServiceName in xText and 
return it.
+uno::Reference<text::XTextField> lcl_findClassificationField(const 
uno::Reference<text::XText>& xText, const OUString& rServiceName, const 
OUString& rFieldName)
 {
+    uno::Reference<text::XTextField> xField;
     uno::Reference<container::XEnumerationAccess> 
xParagraphEnumerationAccess(xText, uno::UNO_QUERY);
     uno::Reference<container::XEnumeration> xParagraphs = 
xParagraphEnumerationAccess->createEnumeration();
     while (xParagraphs->hasMoreElements())
@@ -137,14 +138,21 @@ bool lcl_hasField(const uno::Reference<text::XText>& 
xText, const OUString& rSer
             OUString aName;
             uno::Reference<beans::XPropertySet> xPropertySet(xTextField, 
uno::UNO_QUERY);
             xPropertySet->getPropertyValue(UNO_NAME_NAME) >>= aName;
-            if (aName != rFieldName)
-                continue;
-
-            return true;
+            if (aName == rFieldName)
+            {
+                xField = uno::Reference<text::XTextField>(xTextField, 
uno::UNO_QUERY);
+                break;
+            }
         }
     }
 
-    return false;
+    return xField;
+}
+
+/// Search for a field named rFieldName of type rServiceName in xText and 
return true iff found.
+bool lcl_hasField(const uno::Reference<text::XText>& xText, const OUString& 
rServiceName, const OUString& rFieldName)
+{
+    return lcl_findClassificationField(xText, rServiceName, rFieldName).is();
 }
 
 /// Search for a frame with WATERMARK_NAME in name of type rServiceName in 
xText. Returns found name in rShapeName.
@@ -517,6 +525,78 @@ void 
SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
 
     uno::Reference<document::XDocumentProperties> xDocumentProperties = 
SfxObjectShell::Current()->getDocProperties();
 
+    // First, we need to remove the old ones.
+    //TODO: we should get this as a param, since we pass it to the dialog.
+    const OUString sPolicy = 
SfxClassificationHelper::policyTypeToString(SfxClassificationHelper::getPolicyType());
+    const std::vector<OUString> aUsedPageStyles = lcl_getUsedPageStyles(this);
+    for (const OUString& rPageStyleName : aUsedPageStyles)
+    {
+        uno::Reference<beans::XPropertySet> 
xPageStyle(xStyleFamily->getByName(rPageStyleName), uno::UNO_QUERY);
+
+        // HEADER
+        bool bHeaderIsOn = false;
+        xPageStyle->getPropertyValue(UNO_NAME_HEADER_IS_ON) >>= bHeaderIsOn;
+        uno::Reference<text::XText> xHeaderText;
+        if (bHeaderIsOn)
+            xPageStyle->getPropertyValue(UNO_NAME_HEADER_TEXT) >>= xHeaderText;
+
+        // FOOTER
+        bool bFooterIsOn = false;
+        xPageStyle->getPropertyValue(UNO_NAME_FOOTER_IS_ON) >>= bFooterIsOn;
+        uno::Reference<text::XText> xFooterText;
+        if (bFooterIsOn)
+            xPageStyle->getPropertyValue(UNO_NAME_FOOTER_TEXT) >>= xFooterText;
+
+        sal_Int32 nTextNumber = 1;
+        OUString sKey;
+        for (svx::ClassificationResult const & rResult : 
CollectAdvancedClassification())
+        {
+            sKey = "";
+            switch(rResult.meType)
+            {
+                case svx::ClassificationType::TEXT:
+                {
+                    sKey = sPolicy + "Marking:Text:" + 
OUString::number(nTextNumber++);
+                }
+                break;
+
+                case svx::ClassificationType::CATEGORY:
+                {
+                    sKey = sPolicy + "BusinessAuthorizationCategory:Name";
+                }
+                break;
+
+                case svx::ClassificationType::MARKING:
+                {
+                    sKey = sPolicy + "Extension:Marking";
+                }
+                break;
+
+                case svx::ClassificationType::INTELLECTUAL_PROPERTY_PART:
+                {
+                    sKey = sPolicy + "Extension:IntellectualPropertyPart";
+                }
+                break;
+
+                default:
+                break;
+            }
+
+            if (!sKey.isEmpty())
+            {
+                uno::Reference<css::text::XTextField> xField = 
lcl_findClassificationField(xHeaderText, DocInfoServiceName, sKey);
+                if (xField.is())
+                {
+                    if (xHeaderText.is())
+                        xHeaderText->removeTextContent(xField);
+
+                    if (xFooterText.is())
+                        xFooterText->removeTextContent(xField);
+                }
+            }
+        }
+    }
+
     // Clear properties
     uno::Reference<beans::XPropertyContainer> xPropertyContainer = 
xDocumentProperties->getUserDefinedProperties();
     lcl_removeAllProperties(xPropertyContainer);
@@ -532,9 +612,6 @@ void 
SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
         }
     }
 
-    const OUString sPolicy = 
SfxClassificationHelper::policyTypeToString(SfxClassificationHelper::getPolicyType());
-
-    const std::vector<OUString> aUsedPageStyles = lcl_getUsedPageStyles(this);
     for (const OUString& rPageStyleName : aUsedPageStyles)
     {
         uno::Reference<beans::XPropertySet> 
xPageStyle(xStyleFamily->getByName(rPageStyleName), uno::UNO_QUERY);
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to