summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-02-14 16:19:50 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-02-14 16:50:19 +0100
commita6278bc3a9a7de6de5802fc4cbceb739bc0720d6 (patch)
tree977ddf160e0c4faac1ccf2056ce2c4e9576d3778
parent1e3e7b077f708aefd2e866eca85abc822ae4cd02 (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.hxx3
-rw-r--r--include/oox/drawingml/textparagraph.hxx3
-rw-r--r--include/oox/drawingml/textrun.hxx3
-rw-r--r--oox/source/drawingml/textbody.cxx5
-rw-r--r--oox/source/drawingml/textfield.cxx3
-rw-r--r--oox/source/drawingml/textparagraph.cxx4
-rw-r--r--oox/source/drawingml/textrun.cxx6
-rwxr-xr-xsw/qa/extras/ooxmlimport/data/dml-charheight-default.docxbin0 -> 15770 bytes
-rw-r--r--sw/qa/extras/ooxmlimport/ooxmlimport.cxx8
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
new file mode 100755
index 000000000000..0f22a87f0e29
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/dml-charheight-default.docx
Binary files differ
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.