From ff2f55d6f0a515c8c6e4186e124db28cc4056f5b Mon Sep 17 00:00:00 2001
From: Ravindra Vidhate <ravindra.vidhate@synerzip.com>
Date: Wed, 5 Mar 2014 11:38:22 +0530
Subject: fdo#35324: Text and picture water are not imported  and not preserved
 in RT.

Problem : Open docx file which has Text/Picture as water mark.
1. The text is not imported properly also picture water mark is also considered as shape.
2. It writes the watermarks in Document.xml, while it should write in only Header.xml.

Conflicts:
	sw/qa/extras/ooxmlexport/ooxmlexport.cxx

Reviewed on:
	https://gerrit.libreoffice.org/8457

Change-Id: Ic988858da25a4cba3ae16e614d920e2e16053a5f
---
 .../extras/ooxmlexport/data/pictureWatermark.docx  | Bin 0 -> 798086 bytes
 sw/qa/extras/ooxmlexport/data/textWatermark.docx   | Bin 0 -> 17870 bytes
 sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx        |  26 +++++++++
 sw/source/filter/ww8/wrtw8nds.cxx                  |  58 ++++++++++++++++++++-
 sw/source/filter/ww8/wrtww8.hxx                    |   2 +
 5 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 sw/qa/extras/ooxmlexport/data/pictureWatermark.docx
 create mode 100644 sw/qa/extras/ooxmlexport/data/textWatermark.docx

(limited to 'sw')

diff --git a/sw/qa/extras/ooxmlexport/data/pictureWatermark.docx b/sw/qa/extras/ooxmlexport/data/pictureWatermark.docx
new file mode 100644
index 000000000000..b526ecf37061
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/pictureWatermark.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/textWatermark.docx b/sw/qa/extras/ooxmlexport/data/textWatermark.docx
new file mode 100644
index 000000000000..c8bff75e028e
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textWatermark.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
index 8842cddef690..d46f58351630 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
@@ -911,6 +911,32 @@ DECLARE_OOXMLEXPORT_TEST(testDkVert, "dkvert.docx")
     CPPUNIT_ASSERT_EQUAL(sal_Int32(25), getProperty<drawing::Hatch>(xShape, "FillHatch").Distance);
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTextWatermark, "textWatermark.docx")
+{
+    //The problem was that the watermark ID was not preserved,
+    //and Word uses the object ID to identify if it is a watermark.
+    //It has to have the 'PowerPlusWaterMarkObject' string in it
+    xmlDocPtr pXmlHeader1 = parseExport("word/header1.xml");
+    if (!pXmlHeader1)
+       return;
+
+    assertXPath(pXmlHeader1, "/w:hdr[1]/w:p[1]/w:r[1]/w:pict[1]/v:shape[1]","id","PowerPlusWaterMarkObject93701316");
+}
+
+DECLARE_OOXMLEXPORT_TEST(testPictureWatermark, "pictureWatermark.docx")
+{
+    //The problem was that the watermark ID was not preserved,
+    //and Word uses the object ID to identify if it is a watermark.
+    //It has to have the 'WordPictureWaterMarkObject' string in it
+
+    xmlDocPtr pXmlHeader1 = parseExport("word/header1.xml");
+    if (!pXmlHeader1)
+       return;
+
+    // Check the watermark ID
+    assertXPath(pXmlHeader1, "/w:hdr[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Fallback[1]/w:pict[1]/v:rect[1]","id","WordPictureWatermark11962361");
+}
+
 #endif
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
index b10ece75f92e..abe9360a97e3 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -81,6 +81,7 @@
 #include <fmtrowsplt.hxx>
 #include <com/sun/star/i18n/ScriptType.hpp>
 #include <com/sun/star/i18n/WordType.hpp>
+#include <oox/export/vmlexport.hxx>
 
 #include <filter/msfilter/sprmids.hxx>
 
@@ -103,6 +104,7 @@ using namespace sw::util;
 using namespace sw::types;
 using namespace sw::mark;
 using namespace nsFieldFlags;
+using namespace ::oox::vml;
 
 static OUString lcl_getFieldCode( const IFieldmark* pFieldmark )
 {
@@ -518,6 +520,26 @@ void SwWW8AttrIter::OutAttr( sal_Int32 nSwPos, bool bRuby )
         m_rExport.AttrOutput().OutputItem( *pGrabBag );
 }
 
+bool SwWW8AttrIter::IsWatermarkFrame()
+{
+    if (maFlyFrms.size() != 1)
+        return false;
+
+    while ( maFlyIter != maFlyFrms.end() )
+    {
+        const SdrObject* pSdrObj = maFlyIter->GetFrmFmt().FindRealSdrObject();
+
+        if (pSdrObj)
+        {
+            if (VMLExport::IsWaterMarkShape(pSdrObj->GetName()))
+                  return true;
+        }
+        ++maFlyIter;
+    }
+
+    return false;
+}
+
 void SwWW8AttrIter::OutFlys(sal_Int32 nSwPos)
 {
     /*
@@ -533,7 +555,34 @@ void SwWW8AttrIter::OutFlys(sal_Int32 nSwPos)
         if ( nPos != nSwPos )
             break;
 
-        m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter );
+        const SdrObject* pSdrObj = maFlyIter->GetFrmFmt().FindRealSdrObject();
+
+        if (pSdrObj)
+        {
+            if (VMLExport::IsWaterMarkShape(pSdrObj->GetName()))
+            {
+                 // This is a watermark object. Should be written ONLY in the header
+                 if(m_rExport.nTxtTyp == TXT_HDFT)
+                 {
+                       // Should write a watermark in the header
+                       m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter );
+                 }
+                 else
+                 {
+                       // Should not write watermark object in the main body text
+                 }
+            }
+            else
+            {
+                 // This is not a watermark object - write normally
+                 m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter );
+            }
+        }
+        else
+        {
+            // This is not a watermark object - write normally
+            m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter );
+        }
         ++maFlyIter;
     }
 }
@@ -1904,6 +1953,13 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
             bLastCR = true;
     }
 
+    // In order to make sure watermark is stored in 'header.xml', check nTxtTyp.
+    // if it is document.xml, don't write the tags (watermark should be only in the 'header')
+    SwWW8AttrIter aWatermarkAttrIter( *this, rNode );
+    if (( TXT_HDFT != nTxtTyp) && aWatermarkAttrIter.IsWatermarkFrame())
+    {
+       return;
+    }
 
     bool bFlyInTable = mpParentFrame && IsInTable();
 
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 0dfcfb351683..9a1d7b5d0147 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -1539,6 +1539,8 @@ public:
     OUString GetSnippet(const OUString &rStr, sal_Int32 nAktPos,
         sal_Int32 nLen) const;
     const SwFmtDrop& GetSwFmtDrop() const { return mrSwFmtDrop; }
+
+    bool IsWatermarkFrame();
 };
 
 /// Class to collect and output the styles table.
-- 
cgit