Kaydet (Commit) a6278bc3 authored tarafından Miklos Vajna's avatar Miklos Vajna

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
üst 1e3e7b07
......@@ -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;
......
......@@ -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;
......
......@@ -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;
......
......@@ -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()
......
......@@ -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
......
......@@ -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;
}
}
......
......@@ -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() )
......
......@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment