diff options
author | Justin Luth <justin.luth@collabora.com> | 2018-10-20 19:18:02 +0300 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2018-11-16 15:41:42 +0100 |
commit | 46c1a75b144a4c5fd1f4ab0113b87fe030bebd27 (patch) | |
tree | 42e35e1795d0f73b563e7efd4dba0ac26affb336 /sw | |
parent | 8def8ca39d28ad34106767d14273b7b7d1b0b882 (diff) |
tdf79435 doc/docx: round-trip legacy input formfields
GrabBag the settings which LO doesn't implement
(which is all of them) so that the document
round-trips without losing the config settings.
Change-Id: I00de6c483af68073634430dd74fd445e981573ab
Reviewed-on: https://gerrit.libreoffice.org/62241
Tested-by: Jenkins
Reviewed-by: Justin Luth <justin_luth@sil.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/tdf79435_legacyInputFields.doc | bin | 0 -> 13312 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport12.cxx | 59 | ||||
-rw-r--r-- | sw/qa/extras/ww8export/data/tdf79435_legacyInputFields.docx | bin | 0 -> 12593 bytes | |||
-rw-r--r-- | sw/qa/extras/ww8export/ww8export.cxx | 2 | ||||
-rw-r--r-- | sw/qa/extras/ww8export/ww8export3.cxx | 53 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 109 | ||||
-rw-r--r-- | sw/source/filter/ww8/wrtww8.cxx | 121 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par.hxx | 12 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par3.cxx | 36 |
9 files changed, 353 insertions, 39 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf79435_legacyInputFields.doc b/sw/qa/extras/ooxmlexport/data/tdf79435_legacyInputFields.doc Binary files differnew file mode 100644 index 000000000000..da7fade8091c --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf79435_legacyInputFields.doc diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx index 8a98742a0532..864d97178cb2 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx @@ -30,6 +30,7 @@ #include <com/sun/star/text/WrapTextMode.hpp> #include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/text/XBookmarksSupplier.hpp> +#include <com/sun/star/text/XFormField.hpp> #include <com/sun/star/text/XFootnote.hpp> #include <com/sun/star/text/XPageCursor.hpp> #include <com/sun/star/text/XTextColumns.hpp> @@ -723,6 +724,64 @@ DECLARE_OOXMLEXPORT_TEST(testObjectCrossReference, "object_cross_reference.odt") CPPUNIT_ASSERT_EQUAL(sal_uInt16(21), nIndex); } +DECLARE_OOXMLEXPORT_TEST(testTdf79435_legacyInputFields, "tdf79435_legacyInputFields.doc") +{ + //using .doc input file to verify cross-format compatability. + uno::Reference<text::XFormField> xFormField; + xFormField + = getProperty<uno::Reference<text::XFormField>>(getRun(getParagraph(5), 3), "Bookmark"); + uno::Reference<container::XNameContainer> xParameters(xFormField->getParameters()); + + OUString sTmp; + xParameters->getByName("EntryMacro") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("test"), sTmp); + xParameters->getByName("Help") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("F1Help"), sTmp); + xParameters->getByName("ExitMacro") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("test"), sTmp); + xParameters->getByName("Hint") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("StatusHelp"), sTmp); + xParameters->getByName("Content") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("Camelcase"), sTmp); + xParameters->getByName("Format") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("TITLE CASE"), sTmp); + + sal_uInt16 nMaxLength = 0; + xParameters->getByName("MaxLength") >>= nMaxLength; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Max Length", sal_uInt16(10), nMaxLength); + + // too bad this is based on character runs - just found try trial and error. + xFormField + = getProperty<uno::Reference<text::XFormField>>(getRun(getParagraph(6), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("calculated"), sTmp); + + xFormField + = getProperty<uno::Reference<text::XFormField>>(getRun(getParagraph(7), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("currentDate"), sTmp); + + xFormField + = getProperty<uno::Reference<text::XFormField>>(getRun(getParagraph(7), 6), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("currentTime"), sTmp); + + xFormField + = getProperty<uno::Reference<text::XFormField>>(getRun(getParagraph(8), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("number"), sTmp); + + xFormField + = getProperty<uno::Reference<text::XFormField>>(getRun(getParagraph(8), 6), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("date"), sTmp); +} + DECLARE_OOXMLEXPORT_TEST(testTdf120224_textControlCrossRef, "tdf120224_textControlCrossRef.docx") { uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); diff --git a/sw/qa/extras/ww8export/data/tdf79435_legacyInputFields.docx b/sw/qa/extras/ww8export/data/tdf79435_legacyInputFields.docx Binary files differnew file mode 100644 index 000000000000..55d1a1f22962 --- /dev/null +++ b/sw/qa/extras/ww8export/data/tdf79435_legacyInputFields.docx diff --git a/sw/qa/extras/ww8export/ww8export.cxx b/sw/qa/extras/ww8export/ww8export.cxx index cb73378615e7..bac74e82d83a 100644 --- a/sw/qa/extras/ww8export/ww8export.cxx +++ b/sw/qa/extras/ww8export/ww8export.cxx @@ -1116,7 +1116,7 @@ DECLARE_WW8EXPORT_TEST(testBnc636128, "bnc636128.doc") uno::Reference<text::XFormField> xFormField = getProperty< uno::Reference<text::XFormField> >(getRun(getParagraph(1), 2), "Bookmark"); uno::Reference<container::XNameContainer> xParameters = xFormField->getParameters(); // This resulted in a container.NoSuchElementException. - CPPUNIT_ASSERT_EQUAL(OUString("5"), xParameters->getByName("MaxLength").get<OUString>()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), xParameters->getByName("MaxLength").get<sal_uInt16>()); } diff --git a/sw/qa/extras/ww8export/ww8export3.cxx b/sw/qa/extras/ww8export/ww8export3.cxx index d5a888e60dd6..901450dc78e5 100644 --- a/sw/qa/extras/ww8export/ww8export3.cxx +++ b/sw/qa/extras/ww8export/ww8export3.cxx @@ -12,6 +12,7 @@ #include <IDocumentSettingAccess.hxx> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/text/XFormField.hpp> #include <com/sun/star/text/XTextFramesSupplier.hpp> #include <com/sun/star/text/XTextTable.hpp> #include <com/sun/star/text/XTextTablesSupplier.hpp> @@ -66,6 +67,58 @@ DECLARE_WW8EXPORT_TEST(testFdo53985, "fdo53985.doc") CPPUNIT_ASSERT_EQUAL_MESSAGE("Section4 is protected", false, getProperty<bool>(xSect, "IsProtected")); } +DECLARE_WW8EXPORT_TEST(testTdf79435_legacyInputFields, "tdf79435_legacyInputFields.docx") +{ + //using .docx input file to verify cross-format compatability. + uno::Reference<text::XFormField> xFormField; + xFormField = getProperty< uno::Reference<text::XFormField> >(getRun(getParagraph(5), 3), "Bookmark"); + uno::Reference<container::XNameContainer> xParameters(xFormField->getParameters()); + + OUString sTmp; + xParameters->getByName("EntryMacro") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("test"), sTmp); + xParameters->getByName("Help") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("F1Help"), sTmp); + xParameters->getByName("ExitMacro") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("test"), sTmp); + xParameters->getByName("Description") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("StatusHelp"), sTmp); + xParameters->getByName("Content") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("Camelcase"), sTmp); + xParameters->getByName("Format") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("TITLE CASE"), sTmp); + + sal_uInt16 nMaxLength = 0; + xParameters->getByName("MaxLength") >>= nMaxLength; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Max Length", sal_uInt16(10), nMaxLength); + + // too bad this is based on character runs - just found try trial and error. + xFormField = getProperty< uno::Reference<text::XFormField> >(getRun(getParagraph(6), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("calculated"), sTmp); + + xFormField = getProperty< uno::Reference<text::XFormField> >(getRun(getParagraph(7), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("currentDate"), sTmp); + + xFormField = getProperty< uno::Reference<text::XFormField> >(getRun(getParagraph(7), 6), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("currentTime"), sTmp); + + xFormField = getProperty< uno::Reference<text::XFormField> >(getRun(getParagraph(8), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("number"), sTmp); + + xFormField = getProperty< uno::Reference<text::XFormField> >(getRun(getParagraph(8), 6), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("date"), sTmp); +} + DECLARE_WW8EXPORT_TEST(testTdf120225_textControlCrossRef, "tdf120225_textControlCrossRef.doc") { uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index e2a5ebeee009..81c1b4fecff1 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -178,7 +178,11 @@ static const sal_Int32 Tag_StartSection = 17; class FFDataWriterHelper { ::sax_fastparser::FSHelperPtr m_pSerializer; - void writeCommonStart( const OUString& rName ) + void writeCommonStart( const OUString& rName, + const OUString& rEntryMacro, + const OUString& rExitMacro, + const OUString& rHelp, + const OUString& rHint ) { m_pSerializer->startElementNS( XML_w, XML_ffData, FSEND ); m_pSerializer->singleElementNS( XML_w, XML_name, @@ -188,6 +192,33 @@ class FFDataWriterHelper m_pSerializer->singleElementNS( XML_w, XML_calcOnExit, FSNS( XML_w, XML_val ), "0", FSEND ); + + if ( !rEntryMacro.isEmpty() ) + m_pSerializer->singleElementNS( XML_w, XML_entryMacro, + FSNS(XML_w, XML_val), + OUStringToOString( rEntryMacro, RTL_TEXTENCODING_UTF8 ).getStr(), + FSEND ); + + if ( !rExitMacro.isEmpty() ) + m_pSerializer->singleElementNS( XML_w, XML_exitMacro, + FSNS(XML_w, XML_val), + OUStringToOString( rExitMacro, RTL_TEXTENCODING_UTF8 ).getStr(), + FSEND ); + + if ( !rHelp.isEmpty() ) + m_pSerializer->singleElementNS( XML_w, XML_helpText, + FSNS(XML_w, XML_type), OString("text"), + FSNS(XML_w, XML_val), + OUStringToOString( rHelp, RTL_TEXTENCODING_UTF8 ).getStr(), + FSEND ); + + if ( !rHint.isEmpty() ) + m_pSerializer->singleElementNS( XML_w, XML_statusText, + FSNS(XML_w, XML_type), OString("text"), + FSNS(XML_w, XML_val), + OUStringToOString( rHint, RTL_TEXTENCODING_UTF8 ).getStr(), + FSEND ); + } void writeFinish() { @@ -195,9 +226,14 @@ class FFDataWriterHelper } public: explicit FFDataWriterHelper( const ::sax_fastparser::FSHelperPtr& rSerializer ) : m_pSerializer( rSerializer ){} - void WriteFormCheckbox( const OUString& rName, bool bChecked ) - { - writeCommonStart( rName ); + void WriteFormCheckbox( const OUString& rName, + const OUString& rEntryMacro, + const OUString& rExitMacro, + const OUString& rHelp, + const OUString& rHint, + bool bChecked ) + { + writeCommonStart( rName, rEntryMacro, rExitMacro, rHelp, rHint ); // Checkbox specific bits m_pSerializer->startElementNS( XML_w, XML_checkBox, FSEND ); // currently hardcoding autosize @@ -209,9 +245,39 @@ public: m_pSerializer->endElementNS( XML_w, XML_checkBox ); writeFinish(); } - void WriteFormText( const OUString& rName ) - { - writeCommonStart( rName ); + void WriteFormText( const OUString& rName, + const OUString& rEntryMacro, + const OUString& rExitMacro, + const OUString& rHelp, + const OUString& rHint, + const OUString& rType, + const OUString& rDefaultText, + sal_uInt16 nMaxLength, + const OUString& rFormat ) + { + writeCommonStart( rName, rEntryMacro, rExitMacro, rHelp, rHint ); + + m_pSerializer->startElementNS( XML_w, XML_textInput, FSEND ); + if ( !rType.isEmpty() ) + m_pSerializer->singleElementNS( XML_w, XML_type, + FSNS(XML_w, XML_val), + OUStringToOString( rType, RTL_TEXTENCODING_UTF8 ).getStr(), + FSEND ); + if ( !rDefaultText.isEmpty() ) + m_pSerializer->singleElementNS( XML_w, XML_default, + FSNS(XML_w, XML_val), + OUStringToOString( rDefaultText, RTL_TEXTENCODING_UTF8 ).getStr(), + FSEND ); + if ( nMaxLength ) + m_pSerializer->singleElementNS( XML_w, XML_maxLength, + FSNS(XML_w, XML_val), OString::number(nMaxLength), FSEND ); + if ( !rFormat.isEmpty() ) + m_pSerializer->singleElementNS( XML_w, XML_format, + FSNS(XML_w, XML_val), + OUStringToOString( rFormat, RTL_TEXTENCODING_UTF8 ).getStr(), + FSEND ); + m_pSerializer->endElementNS( XML_w, XML_textInput ); + writeFinish(); } }; @@ -1641,12 +1707,24 @@ void DocxAttributeOutput::DoWriteAnnotationMarks() void DocxAttributeOutput::WriteFFData( const FieldInfos& rInfos ) { const ::sw::mark::IFieldmark& rFieldmark = *rInfos.pFieldmark; + FieldMarkParamsHelper params( rFieldmark ); + + OUString sEntryMacro; + params.extractParam("EntryMacro", sEntryMacro); + OUString sExitMacro; + params.extractParam("ExitMacro", sExitMacro); + OUString sHelp; + params.extractParam("Help", sHelp); + OUString sHint; + params.extractParam("Hint", sHint); // .docx StatusText + if ( sHint.isEmpty() ) + params.extractParam("Description", sHint); // .doc StatusText + if ( rInfos.eType == ww::eFORMDROPDOWN ) { uno::Sequence< OUString> vListEntries; OUString sName, sSelected; - FieldMarkParamsHelper params( rFieldmark ); params.extractParam( ODF_FORMDROPDOWN_LISTENTRY, vListEntries ); sName = params.getName(); sal_Int32 nSelectedIndex = 0; @@ -1664,7 +1742,6 @@ void DocxAttributeOutput::WriteFFData( const FieldInfos& rInfos ) OUString sName; bool bChecked = false; - FieldMarkParamsHelper params( rFieldmark ); params.extractParam( ODF_FORMCHECKBOX_NAME, sName ); const sw::mark::ICheckboxFieldmark* pCheckboxFm = dynamic_cast<const sw::mark::ICheckboxFieldmark*>(&rFieldmark); @@ -1672,13 +1749,21 @@ void DocxAttributeOutput::WriteFFData( const FieldInfos& rInfos ) bChecked = true; FFDataWriterHelper ffdataOut( m_pSerializer ); - ffdataOut.WriteFormCheckbox( sName, bChecked ); + ffdataOut.WriteFormCheckbox( sName, sEntryMacro, sExitMacro, sHelp, sHint, bChecked ); } else if ( rInfos.eType == ww::eFORMTEXT ) { - FieldMarkParamsHelper params( rFieldmark ); + OUString sType; + params.extractParam("Type", sType); + OUString sDefaultText; + params.extractParam("Content", sDefaultText); + sal_uInt16 nMaxLength = 0; + params.extractParam("MaxLength", nMaxLength); + OUString sFormat; + params.extractParam("Format", sFormat); FFDataWriterHelper ffdataOut( m_pSerializer ); - ffdataOut.WriteFormText( params.getName() ); + ffdataOut.WriteFormText( params.getName(), sEntryMacro, sExitMacro, sHelp, sHint, + sType, sDefaultText, nMaxLength, sFormat ); } } diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index f0ab7e1ed7c4..1895ae523cb3 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -3831,10 +3831,16 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) if ( rFieldmark.GetFieldname() == ODF_FORMDROPDOWN ) type=2; - ::sw::mark::IFieldmark::parameter_map_t::const_iterator pNameParameter = rFieldmark.GetParameters()->find("name"); + ::sw::mark::IFieldmark::parameter_map_t::const_iterator pParameter = rFieldmark.GetParameters()->find("name"); OUString ffname; - if(pNameParameter != rFieldmark.GetParameters()->end()) - pNameParameter->second >>= ffname; + if ( pParameter != rFieldmark.GetParameters()->end() ) + { + OUString aName; + pParameter->second >>= aName; + assert( aName.getLength() < 21 && "jluth seeing if following documentation will cause problems." ); + const sal_Int32 nLen = std::min( sal_Int32(20), aName.getLength() ); + ffname = aName.copy(0, nLen); + } sal_uLong nDataStt = pDataStrm->Tell(); m_pChpPlc->AppendFkpEntry(Strm().Tell()); @@ -3877,17 +3883,109 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) ffres = 0; } aFieldHeader.bits |= ( (ffres<<2) & 0x7C ); + + OUString ffdeftext; + OUString ffformat; + OUString ffhelptext = rFieldmark.GetFieldHelptext(); + if ( ffhelptext.getLength() > 255 ) + ffhelptext = ffhelptext.copy(0, 255); + OUString ffstattext; + OUString ffentrymcr; + OUString ffexitmcr; if (type == 0) // iTypeText { - sw::mark::IFieldmark::parameter_map_t::const_iterator pParameter = rFieldmark.GetParameters()->find("MaxLength"); - if (pParameter != rFieldmark.GetParameters()->end()) + sal_uInt16 nType = 0; + pParameter = rFieldmark.GetParameters()->find("Type"); + if ( pParameter != rFieldmark.GetParameters()->end() ) + { + OUString aType; + pParameter->second >>= aType; + if ( aType == "number" ) nType = 1; + else if ( aType == "date" ) nType = 2; + else if ( aType == "currentTime" ) nType = 3; + else if ( aType == "currentDate" ) nType = 4; + else if ( aType == "calculated" ) nType = 5; + aFieldHeader.bits |= nType<<11; // FFDataBits-F 00111000 00000000 + } + + if ( nType < 3 || nType == 5 ) // not currentTime or currentDate + { + pParameter = rFieldmark.GetParameters()->find("Content"); + if ( pParameter != rFieldmark.GetParameters()->end() ) + { + OUString aDefaultText; + pParameter->second >>= aDefaultText; + assert( aDefaultText.getLength() < 256 && "jluth seeing if following documentation will cause problems." ); + const sal_Int32 nLen = std::min( sal_Int32(255), aDefaultText.getLength() ); + ffdeftext = aDefaultText.copy (0, nLen); + } + } + + pParameter = rFieldmark.GetParameters()->find("MaxLength"); + if ( pParameter != rFieldmark.GetParameters()->end() ) + { + sal_uInt16 nLength = 0; + pParameter->second >>= nLength; + assert( nLength < 32768 && "jluth seeing if following documentation will cause problems." ); + nLength = std::min( sal_uInt16(32767), nLength ); + aFieldHeader.cch = nLength; + } + + pParameter = rFieldmark.GetParameters()->find("Format"); + if ( pParameter != rFieldmark.GetParameters()->end() ) { - OUString aLength; - pParameter->second >>= aLength; - aFieldHeader.cch = aLength.toUInt32(); + OUString aFormat; + pParameter->second >>= aFormat; + const sal_Int32 nLen = std::min( sal_Int32(64), aFormat.getLength() ); + assert( nLen < 65 && "jluth seeing if following documentation will cause problems." ); + ffformat = aFormat.copy(0, nLen); } } + pParameter = rFieldmark.GetParameters()->find("Help"); //help + if ( ffhelptext.isEmpty() && pParameter != rFieldmark.GetParameters()->end() ) + { + OUString aHelpText; + pParameter->second >>= aHelpText; + const sal_Int32 nLen = std::min( sal_Int32(255), aHelpText.getLength() ); + ffhelptext = aHelpText.copy (0, nLen); + } + if ( !ffhelptext.isEmpty() ) + aFieldHeader.bits |= 0x1<<7; + + pParameter = rFieldmark.GetParameters()->find("Description"); // doc tooltip + if ( pParameter == rFieldmark.GetParameters()->end() ) + pParameter = rFieldmark.GetParameters()->find("Hint"); //docx tooltip + if ( pParameter != rFieldmark.GetParameters()->end() ) + { + OUString aStatusText; + pParameter->second >>= aStatusText; + const sal_Int32 nLen = std::min( sal_Int32(138), aStatusText.getLength() ); + ffstattext = aStatusText.copy (0, nLen); + } + if ( !ffstattext.isEmpty() ) + aFieldHeader.bits |= 0x1<<8; + + pParameter = rFieldmark.GetParameters()->find("EntryMacro"); + if ( pParameter != rFieldmark.GetParameters()->end() ) + { + OUString aEntryMacro; + pParameter->second >>= aEntryMacro; + assert( aEntryMacro.getLength() < 33 && "jluth seeing if following documentation will cause problems." ); + const sal_Int32 nLen = std::min( sal_Int32(32), aEntryMacro.getLength() ); + ffentrymcr = aEntryMacro.copy (0, nLen); + } + + pParameter = rFieldmark.GetParameters()->find("ExitMacro"); + if ( pParameter != rFieldmark.GetParameters()->end() ) + { + OUString aExitMacro; + pParameter->second >>= aExitMacro; + assert( aExitMacro.getLength() < 33 && "jluth seeing if following documentation will cause problems." ); + const sal_Int32 nLen = std::min( sal_Int32(32), aExitMacro.getLength() ); + ffexitmcr = aExitMacro.copy (0, nLen); + } + std::vector< OUString > aListItems; if (type==2) { @@ -3902,13 +4000,6 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) } } - const OUString ffdeftext; - const OUString ffformat; - const OUString ffhelptext; - const OUString ffstattext; - const OUString ffentrymcr; - const OUString ffexitmcr; - const sal_uInt8 aFieldData[] = { 0x44,0, // the start of "next" data diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index 5cffd97a179e..fc8ab8c5d2b7 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -652,17 +652,16 @@ protected: public: WW8FormulaControl(const OUString& rN, SwWW8ImplReader &rRdr) : mrRdr(rRdr), mfUnknown(0), mfDropdownIndex(0), - mfToolTip(0), mfNoMark(0), mfUseSize(0), mfNumbersOnly(0), mfDateOnly(0), - mfUnused(0), mhpsCheckBox(20), mnChecked(0), mnMaxLen(0), msName( rN ) + mfToolTip(0), mfNoMark(0), mfType(0), + mfUnused(0), mhpsCheckBox(20), mnChecked(0), mnMaxLen(0), + mbHelp(false), msName( rN ) { } sal_uInt8 mfUnknown:2; sal_uInt8 mfDropdownIndex:6; sal_uInt8 mfToolTip:1; sal_uInt8 mfNoMark:1; - sal_uInt8 mfUseSize:1; - sal_uInt8 mfNumbersOnly:1; - sal_uInt8 mfDateOnly:1; + sal_uInt8 mfType:3; sal_uInt8 mfUnused:3; sal_uInt16 mhpsCheckBox; @@ -673,8 +672,11 @@ public: OUString msTitle; OUString msDefault; OUString msFormatting; + bool mbHelp; OUString msHelp; OUString msToolTip; + OUString msEntryMcr; + OUString msExitMcr; std::vector<OUString> maListEntries; virtual ~WW8FormulaControl() {} void FormulaRead(SwWw8ControlType nWhich,SvStream *pD); diff --git a/sw/source/filter/ww8/ww8par3.cxx b/sw/source/filter/ww8/ww8par3.cxx index 53d5016661ef..0aec993a1159 100644 --- a/sw/source/filter/ww8/ww8par3.cxx +++ b/sw/source/filter/ww8/ww8par3.cxx @@ -159,9 +159,31 @@ eF_ResT SwWW8ImplReader::Read_F_FormTextBox( WW8FieldDesc* pF, OUString& rStr ) m_aFieldStack.back().SetBookmarkName(aBookmarkName); m_aFieldStack.back().SetBookmarkType(ODF_FORMTEXT); m_aFieldStack.back().getParameters()["Description"] <<= aFormula.msToolTip; + if ( aFormula.mbHelp && !aFormula.msHelp.isEmpty() ) + m_aFieldStack.back().getParameters()["Help"] <<= aFormula.msHelp; m_aFieldStack.back().getParameters()["Name"] <<= aFormula.msTitle; if (aFormula.mnMaxLen) - m_aFieldStack.back().getParameters()["MaxLength"] <<= OUString::number(aFormula.mnMaxLen); + m_aFieldStack.back().getParameters()["MaxLength"] <<= aFormula.mnMaxLen; + + if ( aFormula.mfType == 1 ) + m_aFieldStack.back().getParameters()["Type"] <<= OUString("number"); + else if ( aFormula.mfType == 2 ) + m_aFieldStack.back().getParameters()["Type"] <<= OUString("date"); + else if ( aFormula.mfType == 3 ) + m_aFieldStack.back().getParameters()["Type"] <<= OUString("currentTime"); + else if ( aFormula.mfType == 4 ) + m_aFieldStack.back().getParameters()["Type"] <<= OUString("currentDate"); + else if ( aFormula.mfType == 5 ) + m_aFieldStack.back().getParameters()["Type"] <<= OUString("calculated"); + + if ( !aFormula.msDefault.isEmpty() ) + m_aFieldStack.back().getParameters()["Content"] <<= aFormula.msDefault; + if ( !aFormula.msFormatting.isEmpty() ) + m_aFieldStack.back().getParameters()["Format"] <<= aFormula.msFormatting; + if ( !aFormula.msEntryMcr.isEmpty() ) + m_aFieldStack.back().getParameters()["EntryMacro"] <<= aFormula.msEntryMcr; + if ( !aFormula.msExitMcr.isEmpty() ) + m_aFieldStack.back().getParameters()["ExitMacro"] <<= aFormula.msExitMcr; } return eF_ResT::TEXT; } @@ -2186,8 +2208,10 @@ void WW8FormulaControl::FormulaRead(SwWw8ControlType nWhich, // xstzStatText msToolTip = read_uInt16_BeltAndBracesString(*pDataStream); - /*String sEntryMacro =*/ read_uInt16_BeltAndBracesString(*pDataStream); - /*String sExitMcr =*/ read_uInt16_BeltAndBracesString(*pDataStream); + // xstzEntryMcr + msEntryMcr = read_uInt16_BeltAndBracesString(*pDataStream); + //xstzExitMcr + msExitMcr = read_uInt16_BeltAndBracesString(*pDataStream); if (nWhich == WW8_CT_DROPDOWN) { @@ -2227,12 +2251,12 @@ void WW8FormulaControl::FormulaRead(SwWw8ControlType nWhich, } mfDropdownIndex = iRes; + mbHelp = bits1 & 0x80; + nField = bits2; mfToolTip = nField & 0x01; mfNoMark = (nField & 0x02)>>1; - mfUseSize = (nField & 0x04)>>2; - mfNumbersOnly= (nField & 0x08)>>3; - mfDateOnly = (nField & 0x10)>>4; + mfType = (nField & 0x38)>>3; mfUnused = (nField & 0xE0)>>5; } |