sw/qa/extras/rtfimport/data/fdo82076.rtf | 13 +++++++++++++ sw/qa/extras/rtfimport/rtfimport.cxx | 11 +++++++++++ sw/source/filter/ww8/docxexport.cxx | 2 +- writerfilter/source/rtftok/rtfdocumentimpl.cxx | 19 ++++++++++++++++++- writerfilter/source/rtftok/rtfdocumentimpl.hxx | 3 ++- writerfilter/source/rtftok/rtfsdrimport.cxx | 12 +++++++----- 6 files changed, 52 insertions(+), 8 deletions(-)
New commits: commit 8c6d3cd45e2183a19f91e9a30c1fdc699de393f8 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Sun Oct 26 14:42:19 2014 +0100 Avoid boost::optional<bool> Change-Id: Idaacaf80098e59df47183741402c8664ba5ea631 diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx index f15a675..f2081b4 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.cxx +++ b/writerfilter/source/rtftok/rtfsdrimport.cxx @@ -42,6 +42,8 @@ #include <oox/drawingml/shapepropertymap.hxx> #include <oox/helper/propertyset.hxx> +#include <boost/logic/tribool.hpp> + using namespace com::sun::star; namespace writerfilter @@ -147,7 +149,7 @@ void RTFSdrImport::applyProperty(uno::Reference<drawing::XShape> const& xShape, uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY); sal_Int16 nHoriOrient = 0; sal_Int16 nVertOrient = 0; - boost::optional<bool> obFitShapeToText; + boost::logic::tribool obFitShapeToText(boost::logic::indeterminate); bool bFilled = true; if (aKey == "posh") @@ -191,7 +193,7 @@ void RTFSdrImport::applyProperty(uno::Reference<drawing::XShape> const& xShape, } } else if (aKey == "fFitShapeToText") - obFitShapeToText.reset(aValue.toInt32() == 1); + obFitShapeToText = aValue.toInt32() == 1; else if (aKey == "fFilled") bFilled = aValue.toInt32() == 1; else if (aKey == "rotation") @@ -208,10 +210,10 @@ void RTFSdrImport::applyProperty(uno::Reference<drawing::XShape> const& xShape, xPropertySet->setPropertyValue("HoriOrient", uno::makeAny(nHoriOrient)); if (nVertOrient != 0 && xPropertySet.is()) xPropertySet->setPropertyValue("VertOrient", uno::makeAny(nVertOrient)); - if (obFitShapeToText && xPropertySet.is()) + if (!boost::logic::indeterminate(obFitShapeToText) && xPropertySet.is()) { - xPropertySet->setPropertyValue("SizeType", uno::makeAny(*obFitShapeToText ? text::SizeType::MIN : text::SizeType::FIX)); - xPropertySet->setPropertyValue("FrameIsAutomaticHeight", uno::makeAny(*obFitShapeToText)); + xPropertySet->setPropertyValue("SizeType", uno::makeAny(obFitShapeToText ? text::SizeType::MIN : text::SizeType::FIX)); + xPropertySet->setPropertyValue("FrameIsAutomaticHeight", uno::makeAny(static_cast<bool>(obFitShapeToText))); } if (!bFilled && xPropertySet.is()) { commit cc926007e2471b9d7396a9724cae026e27e52ed2 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Sun Oct 26 14:32:37 2014 +0100 Let's have both switchHeaderFooter() calls in DocxExport::WriteHeaderFooter() Change-Id: I051a2a74e0da44b8f13a21e052c35581159402f1 diff --git a/sw/source/filter/ww8/docxexport.cxx b/sw/source/filter/ww8/docxexport.cxx index d15e4d2..67540eb 100644 --- a/sw/source/filter/ww8/docxexport.cxx +++ b/sw/source/filter/ww8/docxexport.cxx @@ -266,7 +266,6 @@ void DocxExport::WriteHeadersFooters( sal_uInt8 nHeadFootFlags, // Turn OFF flag for 'Writing Headers \ Footers' m_pAttrOutput->SetWritingHeaderFooter( false ); - m_pAttrOutput->switchHeaderFooter(false, -1); #if OSL_DEBUG_LEVEL > 1 fprintf( stderr, "DocxExport::WriteHeadersFooters() - nBreakCode introduced, but ignored\n" ); #endif @@ -720,6 +719,7 @@ void DocxExport::WriteHeaderFooter( const SwFmt& rFmt, bool bHeader, const char* m_pAttrOutput->switchHeaderFooter(true, m_nHeadersFootersInSection++); // do the work WriteHeaderFooterText( rFmt, bHeader ); + m_pAttrOutput->switchHeaderFooter(false, -1); m_pAttrOutput->EndParaSdtBlock(); //When the stream changes the cache which is maintained for the graphics in case of alternate content is not cleared. commit 956c3ff3d43e1b181f7c91518edee1c7c4dc2a0a Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Sun Oct 26 12:53:05 2014 +0100 fdo#82076 RTF import: handle footnote in table cell Change-Id: I69def7936c320e93db5d4504922d52346caaf9cf diff --git a/sw/qa/extras/rtfimport/data/fdo82076.rtf b/sw/qa/extras/rtfimport/data/fdo82076.rtf new file mode 100644 index 0000000..20b33e9 --- /dev/null +++ b/sw/qa/extras/rtfimport/data/fdo82076.rtf @@ -0,0 +1,13 @@ +{\rtf1 +\pard\plain +Before +\par +\trowd \cellx4000\cellx8000 +A1\cell +B1 +{\chftn +{\footnote Footnote} +} +\cell\row +\pard After\par +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 6ecd7a3..90ae2ef 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -1996,6 +1996,17 @@ DECLARE_RTFIMPORT_TEST(testFdo82859, "fdo82859.rtf") CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-1), getProperty<sal_Int32>(getShape(1), "BackColor")); } +DECLARE_RTFIMPORT_TEST(testFdo82076, "fdo82076.rtf") +{ + // Footnote position was wrong: should be at the end of the B1 cell. + uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference<text::XTextRange> xCell(xTable->getCellByName("B1"), uno::UNO_QUERY); + // This resulted in container::NoSuchElementException: the footnote was at the start of the A1 cell. + CPPUNIT_ASSERT_EQUAL(OUString("Footnote"), getProperty<OUString>(getRun(getParagraphOfText(1, xCell->getText()), 2), "TextPortionType")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 8dbf3b0..cfba380 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1488,6 +1488,14 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, m_pSdrImport->resolve(boost::get<1>(aTuple)->getShape(), false, RTFSdrImport::SHAPE); else if (boost::get<0>(aTuple) == BUFFER_ENDSHAPE) m_pSdrImport->close(); + else if (boost::get<0>(aTuple) == BUFFER_RESOLVESUBSTREAM) + { + RTFSprms& rAttributes = boost::get<1>(aTuple)->getAttributes(); + sal_Size nPos = rAttributes.find(0)->getInt(); + Id nId = rAttributes.find(1)->getInt(); + OUString aCustomMark = rAttributes.find(2)->getString(); + resolveSubstream(nPos, nId, aCustomMark); + } else assert(false); } @@ -1707,7 +1715,16 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) m_aStates.top().nDestinationState = DESTINATION_FOOTNOTE; if (bCustomMark) Mapper().startCharacterGroup(); - resolveSubstream(m_nGroupStartPos - 1, nId, aCustomMark); + if (!m_aStates.top().pCurrentBuffer) + resolveSubstream(m_nGroupStartPos - 1, nId, aCustomMark); + else + { + RTFSprms aAttributes; + aAttributes.set(Id(0), RTFValue::Pointer_t(new RTFValue(m_nGroupStartPos - 1))); + aAttributes.set(Id(1), RTFValue::Pointer_t(new RTFValue(nId))); + aAttributes.set(Id(2), RTFValue::Pointer_t(new RTFValue(aCustomMark))); + m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_RESOLVESUBSTREAM, RTFValue::Pointer_t(new RTFValue(aAttributes)))); + } if (bCustomMark) { m_aStates.top().aCharacterAttributes.clear(); diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 2f34299..85af01f 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -56,7 +56,8 @@ enum RTFBufferTypes BUFFER_ENDRUN, BUFFER_PAR, BUFFER_STARTSHAPE, - BUFFER_ENDSHAPE + BUFFER_ENDSHAPE, + BUFFER_RESOLVESUBSTREAM }; /// Form field types _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits