diff options
author | Patrick Jaap <patrick.jaap@tu-dresden.de> | 2019-02-13 14:58:29 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2019-02-25 09:45:28 +0100 |
commit | 167d4a9920b5858c3fc8cfb2a34b4f6dc5d5676a (patch) | |
tree | 9b27dccfdda77df0030e2576344b519a89638cad | |
parent | f7643f5ada35ed205516a583f583bde7865ddf10 (diff) |
Fix: Use correct relative table width in docx export
It removes the HACK where the doc model was changed.
We introduce a pointer to a surrounding frame: an indicator
telling us that the table was placed in a frame to make it
floating.
During export, remove the frame and use the relative width of the
surrounding frame.
Change-Id: I43b45d9a9e67ee755782c9f18df22ae1d4014689
Reviewed-on: https://gerrit.libreoffice.org/67775
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport13.cxx | 9 | ||||
-rw-r--r-- | sw/qa/extras/uiwriter/data2/frame_size_export.docx | bin | 0 -> 13929 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter2.cxx | 19 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 23 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxexport.hxx | 7 |
5 files changed, 48 insertions, 10 deletions
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx index 4d0d6fa70501..d52f546790c9 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx @@ -138,6 +138,15 @@ DECLARE_OOXMLEXPORT_TEST(testTdf116371, "tdf116371.odt") CPPUNIT_ASSERT_EQUAL(sal_Int32(24188), frameRect.Width); } +DECLARE_OOXMLEXPORT_TEST(testFrameSizeExport, "floating-tables-anchor.docx") +{ + // Make sure the table width is 4000 + xmlDocPtr pXmlDoc = parseExport("word/document.xml"); + if (!pXmlDoc) + return; + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tblPr/w:tblW", "w", "4000"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/uiwriter/data2/frame_size_export.docx b/sw/qa/extras/uiwriter/data2/frame_size_export.docx Binary files differnew file mode 100644 index 000000000000..86147f311038 --- /dev/null +++ b/sw/qa/extras/uiwriter/data2/frame_size_export.docx diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index 33b8ac9b53ed..2f248a996b7c 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -61,6 +61,7 @@ public: void testTdf122942(); void testTdf52391(); void testTdf101873(); + void testTableWidth(); CPPUNIT_TEST_SUITE(SwUiWriterTest2); CPPUNIT_TEST(testRedlineMoveInsertInDelete); @@ -83,6 +84,7 @@ public: CPPUNIT_TEST(testTdf122942); CPPUNIT_TEST(testTdf52391); CPPUNIT_TEST(testTdf101873); + CPPUNIT_TEST(testTableWidth); CPPUNIT_TEST_SUITE_END(); private: @@ -914,6 +916,23 @@ void SwUiWriterTest2::testTdf101873() CPPUNIT_ASSERT_EQUAL(OUString("something"), pShellCursor->GetText()); } +void SwUiWriterTest2::testTableWidth() +{ + load(DATA_DIRECTORY, "frame_size_export.docx"); + + uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString("Office Open XML Text"); + xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); + + // after exporting: table width was overwritten in the doc model + uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), + getProperty<sal_Int16>(xTables->getByIndex(0), "RelativeWidth")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest2); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 8e3b4af3303d..21a4b343810b 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -330,10 +330,14 @@ void DocxAttributeOutput::WriteFloatingTable(ww8::Frame const* pParentFrame) //Save data here and restore when out of scope ExportDataSaveRestore aDataGuard(GetExport(), nStt, nEnd, pParentFrame); - // unset parent frame, otherwise exporter thinks we are still in a frame + // set a floatingTableFrame AND unset parent frame, + // otherwise exporter thinks we are still in a frame + m_rExport.SetFloatingTableFrame(pParentFrame); m_rExport.m_pParentFrame = nullptr; GetExport().WriteText(); + + m_rExport.SetFloatingTableFrame(nullptr); } static void checkAndWriteFloatingTables(DocxAttributeOutput& rDocxAttributeOutput) @@ -383,15 +387,7 @@ static void checkAndWriteFloatingTables(DocxAttributeOutput& rDocxAttributeOutpu if (aTableGrabBag.find("TablePosition") == aTableGrabBag.end()) continue; - // overwrite the table size from the surrounding frame format - // TODO remove this de-const HACK - const SwFormatFrameSize& aFramesize = pFrameFormat->GetFrameSize(); - SwFormatFrameSize* pFormatFrameSize = const_cast<SwFormatFrameSize*>(&pTableFormat->GetFrameSize()); - if(pFormatFrameSize) - { - *pFormatFrameSize = aFramesize; - } - + // write table to docx ww8::Frame aFrame(*pFrameFormat,*pPosition); rDocxAttributeOutput.WriteFloatingTable(&aFrame); } @@ -3702,6 +3698,13 @@ void DocxAttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t SwFrameFormat *pTableFormat = pTable->GetFrameFormat( ); const SwFormatFrameSize &rSize = pTableFormat->GetFrameSize(); int nWidthPercent = rSize.GetWidthPercent(); + // If we export a floating table: we use the widthPercent of the surrounding frame + const ww8::Frame* pFloatingTableFrame = m_rExport.GetFloatingTableFrame(); + if (pFloatingTableFrame) + { + const SwFormatFrameSize &rFrameSize = pFloatingTableFrame->GetFrameFormat().GetFrameSize(); + nWidthPercent = rFrameSize.GetWidthPercent(); + } uno::Reference<beans::XPropertySet> xPropertySet(SwXTextTables::GetObject(*pTable->GetFrameFormat( )),uno::UNO_QUERY); bool isWidthRelative = false; xPropertySet->getPropertyValue("IsWidthRelative") >>= isWidthRelative; diff --git a/sw/source/filter/ww8/docxexport.hxx b/sw/source/filter/ww8/docxexport.hxx index 3852f85f426a..5b906debb0e9 100644 --- a/sw/source/filter/ww8/docxexport.hxx +++ b/sw/source/filter/ww8/docxexport.hxx @@ -113,11 +113,16 @@ class DocxExport : public MSWordExportBase DocxSettingsData m_aSettings; + /// Pointer to the Frame of a floating table it is nested in + const ww8::Frame *m_pFloatingTableFrame = nullptr; + public: DocxExportFilter& GetFilter() { return *m_pFilter; }; const DocxExportFilter& GetFilter() const { return *m_pFilter; }; + const ww8::Frame* GetFloatingTableFrame() { return m_pFloatingTableFrame; } + /// Access to the attribute output class. virtual AttributeOutputBase& AttrOutput() const override; @@ -287,6 +292,8 @@ public: void SetFS(::sax_fastparser::FSHelperPtr const & mpFS); + void SetFloatingTableFrame(const ww8::Frame* pF) { m_pFloatingTableFrame = pF; } + private: DocxExport( const DocxExport& ) = delete; |