sw/qa/extras/ww8export/data/tdf147861_customField.doc |binary
 sw/qa/extras/ww8export/ww8export3.cxx                 |   19 ++++++++++++++++++
 sw/source/filter/ww8/ww8par5.cxx                      |   13 ++++++++++--
 3 files changed, 30 insertions(+), 2 deletions(-)

New commits:
commit 32de5733f41f3263f0eab894c737ebac3db65067
Author:     Justin Luth <justin_l...@sil.org>
AuthorDate: Wed Mar 9 11:38:26 2022 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Apr 1 14:10:08 2022 +0200

    tdf#147861 ww8import: use GetFieldResult, not current DocProperty
    
    In all the testing I could think of on DOCX and DOC examples
    (and only a very few exist in the unit tests)
    the actual value of the DocProperty was irrelevant to
    what Word shows as the document loads.
    It always takes the in-document, as-last-seen static text.
    
    As a way to hack a fix using existing capabilities,
    I marked as FIXEDFLD the unknown custom fields
    that weren't handled separately.
    That fixes what is displayed as the import value,
    (which of course means that F9 will no longer
    return a modification back to the DocProperty value).
    
    It also means the (fixed) field is lost on export,
    but a follow-up patch handles that for DOC/RTF/DOCX.
    
    There were NO DI_CUSTOM examples in existing ww8 tests, but:
    -ooxmlexport8:  fdo74745.docx, fdo81486.docx
    -ooxmlexport10: tdf92157.docx
    and in these cases the plain text matched the variable anyway,
    but a manual manipulation showed that LO is importing DOCX wrong
    as well, so a similar import fix needs to happen for RTF/DOCX.
    
    My fear is that there are some special-magic-associations
    that worked properly the old way by accident that I will
    break by marking them as fixed. No backporting please
    since obviously very few people report bugs about fields.
    
    (cherry picked from commit 377e6f7e8556516b6d1698c58857a5662e6f5660)
    
    Change-Id: I3f167eb3bd570b66ee829241bf9d31d557fc8749
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132398
    Tested-by: Miklos Vajna <vmik...@collabora.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/qa/extras/ww8export/data/tdf147861_customField.doc 
b/sw/qa/extras/ww8export/data/tdf147861_customField.doc
new file mode 100644
index 000000000000..f18d65f4059e
Binary files /dev/null and 
b/sw/qa/extras/ww8export/data/tdf147861_customField.doc differ
diff --git a/sw/qa/extras/ww8export/ww8export3.cxx 
b/sw/qa/extras/ww8export/ww8export3.cxx
index a292af9d3da6..e798a8cf66b6 100644
--- a/sw/qa/extras/ww8export/ww8export3.cxx
+++ b/sw/qa/extras/ww8export/ww8export3.cxx
@@ -17,6 +17,7 @@
 #include <com/sun/star/graphic/XGraphic.hpp>
 #include <com/sun/star/table/ShadowFormat.hpp>
 #include <com/sun/star/text/XFormField.hpp>
+#include <com/sun/star/text/XTextField.hpp>
 #include <com/sun/star/text/XTextTable.hpp>
 #include <com/sun/star/text/XTextTablesSupplier.hpp>
 #include <com/sun/star/text/WritingMode2.hpp>
@@ -99,6 +100,24 @@ DECLARE_WW8EXPORT_TEST(testTdf100961_fixedDateTime, 
"tdf100961_fixedDateTime.doc
     CPPUNIT_ASSERT_EQUAL(sal_uInt16(8), datetime.Seconds);
 }
 
+DECLARE_WW8EXPORT_TEST(testTdf147861_customField, "tdf147861_customField.doc")
+{
+    // These should each be specific values, not a shared DocProperty
+    getParagraph(1, "CustomEditedTitle"); // edited
+    getParagraph(2, " INSERT Custom Title here"); // matches current 
DocProperty
+    getParagraph(3, "My Title"); // edited
+
+    if (mbExported)
+        return;
+
+    // Verify that these are fields, and not just plain text
+    uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, 
uno::UNO_QUERY);
+    auto xFieldsAccess(xTextFieldsSupplier->getTextFields());
+    uno::Reference<container::XEnumeration> 
xFields(xFieldsAccess->createEnumeration());
+    uno::Reference<text::XTextField> xField(xFields->nextElement(), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("CustomEditedTitle"), 
xField->getPresentation(false));
+}
+
 DECLARE_WW8EXPORT_TEST(testTdf138345_paraCharHighlight, 
"tdf138345_paraCharHighlight.doc")
 {
     uno::Reference<beans::XPropertySet> xRun(getRun(getParagraph(9), 1, "A 
side benefit is that "), uno::UNO_QUERY_THROW);
diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
index 85af5106bfaa..76461ab6c86a 100644
--- a/sw/source/filter/ww8/ww8par5.cxx
+++ b/sw/source/filter/ww8/ww8par5.cxx
@@ -1645,8 +1645,17 @@ eF_ResT SwWW8ImplReader::Read_F_DocInfo( WW8FieldDesc* 
pF, OUString& rStr )
 
         if( !bFieldFound )
         {
-            SwDocInfoField aField( static_cast<SwDocInfoFieldType*>(
-                m_rDoc.getIDocumentFieldsAccess().GetSysFieldType( 
SwFieldIds::DocInfo )), DI_CUSTOM|nReg, aDocProperty, GetFieldResult( pF ) );
+            // LO always automatically updates a DocInfo field from the 
File-Properties-Custom Prop
+            // while MS Word requires the user to manually refresh the field 
(with F9).
+            // In other words, Word lets the field to be out of sync with the 
controlling variable.
+            // Marking as FIXEDFLD solves the automatic replacement problem, 
but of course prevents
+            // Writer from making any changes, even on an F9 refresh.
+            // TODO: If the field already matches the DocProperty, no need to 
mark as fixed.
+            // TODO: Extend LO to allow a linked field that doesn't 
automatically update.
+            const auto pType(static_cast<SwDocInfoFieldType*>(
+                
m_rDoc.getIDocumentFieldsAccess().GetSysFieldType(SwFieldIds::DocInfo)));
+            const OUString sDisplayed = GetFieldResult(pF);
+            SwDocInfoField aField(pType, DI_CUSTOM | DI_SUB_FIXED | nReg, 
aDocProperty, sDisplayed);
             m_rDoc.getIDocumentContentOperations().InsertPoolItem(*m_pPaM, 
SwFormatField(aField));
 
             return eF_ResT::OK;

Reply via email to