diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-02-14 16:19:50 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-02-14 16:50:19 +0100 |
commit | a6278bc3a9a7de6de5802fc4cbceb739bc0720d6 (patch) | |
tree | 977ddf160e0c4faac1ccf2056ce2c4e9576d3778 | |
parent | 1e3e7b077f708aefd2e866eca85abc822ae4cd02 (diff) |
drawingML import: fix inheritance of character height
The problem was that in case a shape had multiple (e.g. two) paragraphs,
and in case the first paragraph had an explicit character height, but
not the second, then the cursor carried over the explicit character
height to the second paragraph, but it shouldn't, as that leads to
incorrect character height in the second paragraph.
Fix this by remembering the default character height and using that in
case nothing is set explicitly.
Change-Id: I66e06d5cf192739fb254f7280c74617171d9ee6a
-rw-r--r-- | include/oox/drawingml/textfield.hxx | 3 | ||||
-rw-r--r-- | include/oox/drawingml/textparagraph.hxx | 3 | ||||
-rw-r--r-- | include/oox/drawingml/textrun.hxx | 3 | ||||
-rw-r--r-- | oox/source/drawingml/textbody.cxx | 5 | ||||
-rw-r--r-- | oox/source/drawingml/textfield.cxx | 3 | ||||
-rw-r--r-- | oox/source/drawingml/textparagraph.cxx | 4 | ||||
-rw-r--r-- | oox/source/drawingml/textrun.cxx | 6 | ||||
-rwxr-xr-x | sw/qa/extras/ooxmlimport/data/dml-charheight-default.docx | bin | 0 -> 15770 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 8 |
9 files changed, 27 insertions, 8 deletions
diff --git a/include/oox/drawingml/textfield.hxx b/include/oox/drawingml/textfield.hxx index e191c7dcafdb..4a2791836438 100644 --- a/include/oox/drawingml/textfield.hxx +++ b/include/oox/drawingml/textfield.hxx @@ -45,7 +45,8 @@ public: const ::oox::core::XmlFilterBase& rFilterBase, const ::com::sun::star::uno::Reference < ::com::sun::star::text::XText > & xText, const ::com::sun::star::uno::Reference < ::com::sun::star::text::XTextCursor > &xAt, - const TextCharacterProperties& rTextCharacterStyle ) const; + const TextCharacterProperties& rTextCharacterStyle, + float nDefaultCharHeight) const; private: TextParagraphProperties maTextParagraphProperties; diff --git a/include/oox/drawingml/textparagraph.hxx b/include/oox/drawingml/textparagraph.hxx index add0cef0ba4e..f100458ab07c 100644 --- a/include/oox/drawingml/textparagraph.hxx +++ b/include/oox/drawingml/textparagraph.hxx @@ -54,7 +54,8 @@ public: const ::com::sun::star::uno::Reference < ::com::sun::star::text::XTextCursor > &xAt, const TextCharacterProperties& rTextStyleProperties, const TextListStyle& rTextListStyle, - bool bFirst = false ) const; + bool bFirst = false, + float nDefaultCharHeight = 0) const; private: TextParagraphProperties maProperties; diff --git a/include/oox/drawingml/textrun.hxx b/include/oox/drawingml/textrun.hxx index 9c925f030ef5..5fec1a316db5 100644 --- a/include/oox/drawingml/textrun.hxx +++ b/include/oox/drawingml/textrun.hxx @@ -45,7 +45,8 @@ public: const ::oox::core::XmlFilterBase& rFilterBase, const ::com::sun::star::uno::Reference < ::com::sun::star::text::XText >& xText, const ::com::sun::star::uno::Reference < ::com::sun::star::text::XTextCursor >& xAt, - const TextCharacterProperties& rTextCharacterStyle ) const; + const TextCharacterProperties& rTextCharacterStyle, + float nDefaultCharHeight) const; private: OUString msText; diff --git a/oox/source/drawingml/textbody.cxx b/oox/source/drawingml/textbody.cxx index 3df764339779..c90e4826e6e0 100644 --- a/oox/source/drawingml/textbody.cxx +++ b/oox/source/drawingml/textbody.cxx @@ -20,6 +20,7 @@ #include "oox/drawingml/textbody.hxx" #include <com/sun/star/text/XText.hpp> #include <com/sun/star/text/XTextCursor.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> #include "oox/drawingml/textparagraph.hxx" using namespace ::com::sun::star::uno; @@ -63,8 +64,10 @@ void TextBody::insertAt( aCombinedTextStyle.apply( *pMasterTextListStylePtr ); aCombinedTextStyle.apply( maTextListStyle ); + Reference<css::beans::XPropertySet> xPropertySet(xAt, UNO_QUERY); + float nCharHeight = xPropertySet->getPropertyValue("CharHeight").get<float>(); for( TextParagraphVector::const_iterator aBeg = maParagraphs.begin(), aIt = aBeg, aEnd = maParagraphs.end(); aIt != aEnd; ++aIt ) - (*aIt)->insertAt( rFilterBase, xText, xAt, rTextStyleProperties, aCombinedTextStyle, aIt == aBeg ); + (*aIt)->insertAt( rFilterBase, xText, xAt, rTextStyleProperties, aCombinedTextStyle, aIt == aBeg, nCharHeight ); } bool TextBody::isEmpty() diff --git a/oox/source/drawingml/textfield.cxx b/oox/source/drawingml/textfield.cxx index 76d909b036ef..6006fea11309 100644 --- a/oox/source/drawingml/textfield.cxx +++ b/oox/source/drawingml/textfield.cxx @@ -132,7 +132,8 @@ sal_Int32 TextField::insertAt( const ::oox::core::XmlFilterBase& rFilterBase, const Reference < XText > & xText, const Reference < XTextCursor > &xAt, - const TextCharacterProperties& rTextCharacterStyle ) const + const TextCharacterProperties& rTextCharacterStyle, + float /*nDefaultCharHeight*/) const { sal_Int32 nCharHeight = 0; try diff --git a/oox/source/drawingml/textparagraph.cxx b/oox/source/drawingml/textparagraph.cxx index 7bb719a1adf4..70108470df06 100644 --- a/oox/source/drawingml/textparagraph.cxx +++ b/oox/source/drawingml/textparagraph.cxx @@ -47,7 +47,7 @@ void TextParagraph::insertAt( const Reference < XText > &xText, const Reference < XTextCursor > &xAt, const TextCharacterProperties& rTextStyleProperties, - const TextListStyle& rTextListStyle, bool bFirst) const + const TextListStyle& rTextListStyle, bool bFirst, float nDefaultCharHeight) const { try { sal_Int32 nParagraphSize = 0; @@ -95,7 +95,7 @@ void TextParagraph::insertAt( // This is currently applied to only empty runs if( !nLen && ( ( aIt + 1 ) == aEnd ) ) (*aIt)->getTextCharacterProperties().assignUsed( maEndProperties ); - nCharHeight = std::max< sal_Int32 >( nCharHeight, (*aIt)->insertAt( rFilterBase, xText, xAt, aTextCharacterStyle ) ); + nCharHeight = std::max< sal_Int32 >( nCharHeight, (*aIt)->insertAt( rFilterBase, xText, xAt, aTextCharacterStyle, nDefaultCharHeight ) ); nParagraphSize += nLen; } } diff --git a/oox/source/drawingml/textrun.cxx b/oox/source/drawingml/textrun.cxx index c4648c205d8d..1128918fd2aa 100644 --- a/oox/source/drawingml/textrun.cxx +++ b/oox/source/drawingml/textrun.cxx @@ -50,7 +50,8 @@ sal_Int32 TextRun::insertAt( const ::oox::core::XmlFilterBase& rFilterBase, const Reference < XText > & xText, const Reference < XTextCursor > &xAt, - const TextCharacterProperties& rTextCharacterStyle ) const + const TextCharacterProperties& rTextCharacterStyle, + float nDefaultCharHeight) const { sal_Int32 nCharHeight = 0; try { @@ -61,6 +62,9 @@ sal_Int32 TextRun::insertAt( aTextCharacterProps.assignUsed( maTextCharacterProperties ); if ( aTextCharacterProps.moHeight.has() ) nCharHeight = aTextCharacterProps.moHeight.get(); + else + // UNO API has the character height as float, DML has it as int, but in hundreds. + aTextCharacterProps.moHeight = static_cast<sal_Int32>(nDefaultCharHeight * 100); aTextCharacterProps.pushToPropSet( aPropSet, rFilterBase ); if( maTextCharacterProperties.maHyperlinkPropertyMap.empty() ) diff --git a/sw/qa/extras/ooxmlimport/data/dml-charheight-default.docx b/sw/qa/extras/ooxmlimport/data/dml-charheight-default.docx Binary files differnew file mode 100755 index 000000000000..0f22a87f0e29 --- /dev/null +++ b/sw/qa/extras/ooxmlimport/data/dml-charheight-default.docx diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 3b3a227c63d2..f1e7abd9e744 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -1756,6 +1756,14 @@ DECLARE_OOXMLIMPORT_TEST(testDMLGroupshapeSdt, "dml-groupshape-sdt.docx") CPPUNIT_ASSERT_EQUAL(OUString("sdt and sdtContent inside groupshape"), uno::Reference<text::XTextRange>(xGroupShape->getByIndex(1), uno::UNO_QUERY)->getString()); } +DECLARE_OOXMLIMPORT_TEST(testDmlCharheightDefault, "dml-charheight-default.docx") +{ + uno::Reference<container::XIndexAccess> xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference<text::XTextRange> xShape(xGroup->getByIndex(0), uno::UNO_QUERY); + // This was 16: the first run of the second para incorrectly inherited the char height of the first para. + CPPUNIT_ASSERT_EQUAL(11.f, getProperty<float>(getRun(getParagraphOfText(2, xShape->getText()), 1), "CharHeight")); +} + DECLARE_OOXMLIMPORT_TEST(testGroupshapeRelsize, "groupshape-relsize.docx") { // This was 43760, i.e. the height of the groupshape was larger than the page height, which is obviously incorrect. |