summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2019-07-04 21:37:14 +0200
committerMiklos Vajna <vmiklos@collabora.com>2019-07-05 09:04:03 +0200
commitbffe6a496fb1c69499770d96fefd7a3609712676 (patch)
tree32d4e6b4d7fdc4a514c18ff960413b3b500ee674
parent623ad884051ad4ea17ba7baa77076c49000e49fa (diff)
sw btlr writing mode: handle import from VML
Instead of the character-level rotation added in commit 8738ded7bb1bb6262fe1038e310b5110407f4cfa (fdo#69636 VML import: handle mso-layout-flow-alt shape prop for sw frames, 2013-09-26) which does not work for multiple paragraphs. Change-Id: Ibe9a85d7f880846edfd1f4594c03b0617d83a965 Reviewed-on: https://gerrit.libreoffice.org/75104 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r--oox/source/vml/vmlshape.cxx29
-rw-r--r--sw/qa/extras/ooxmlimport/data/btlr-frame-vml.docxbin0 -> 22765 bytes
-rw-r--r--sw/qa/extras/ooxmlimport/ooxmlimport2.cxx11
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx3
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx13
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx1
6 files changed, 17 insertions, 40 deletions
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index a7529493e401..eca5399bf72c 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -728,33 +728,14 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes
PropertySet( xShape ).setAnyProperty( PROP_BottomBorderDistance, makeAny( sal_Int32( getTextBox()->borderDistanceBottom )));
}
- if (getTextBox()->maLayoutFlow == "vertical" && maTypeModel.maLayoutFlowAlt.isEmpty())
+ if (getTextBox()->maLayoutFlow == "vertical")
{
- PropertySet(xShape).setAnyProperty(PROP_WritingMode,
- uno::makeAny(text::WritingMode2::TB_RL));
- }
-
- if (!maTypeModel.maLayoutFlowAlt.isEmpty())
- {
- // Can't handle this property here, as the frame is not attached yet: pass it to writerfilter.
- uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
- uno::Sequence<beans::PropertyValue> aGrabBag;
- xPropertySet->getPropertyValue("FrameInteropGrabBag") >>= aGrabBag;
- beans::PropertyValue aPair;
- aPair.Name = "mso-layout-flow-alt";
- aPair.Value <<= maTypeModel.maLayoutFlowAlt;
- if (aGrabBag.hasElements())
- {
- sal_Int32 nLength = aGrabBag.getLength();
- aGrabBag.realloc(nLength + 1);
- aGrabBag[nLength] = aPair;
- }
- else
+ sal_Int16 nWritingMode = text::WritingMode2::TB_RL;
+ if (maTypeModel.maLayoutFlowAlt == "bottom-to-top")
{
- aGrabBag.realloc(1);
- aGrabBag[0] = aPair;
+ nWritingMode = text::WritingMode2::BT_LR;
}
- xPropertySet->setPropertyValue("FrameInteropGrabBag", uno::makeAny(aGrabBag));
+ PropertySet(xShape).setAnyProperty(PROP_WritingMode, uno::makeAny(nWritingMode));
}
}
else
diff --git a/sw/qa/extras/ooxmlimport/data/btlr-frame-vml.docx b/sw/qa/extras/ooxmlimport/data/btlr-frame-vml.docx
new file mode 100644
index 000000000000..a93703c75526
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/btlr-frame-vml.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
index b447c3f7273f..65750d5952f9 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
@@ -233,6 +233,17 @@ DECLARE_OOXMLIMPORT_TEST(testTdf112443, "tdf112443.docx")
// and as result only one page should be generated.
DECLARE_OOXMLIMPORT_TEST(testTdf113182, "tdf113182.docx") { CPPUNIT_ASSERT_EQUAL(1, getPages()); }
+DECLARE_OOXMLIMPORT_TEST(testBtlrFrameVml, "btlr-frame-vml.docx")
+{
+ uno::Reference<beans::XPropertySet> xTextFrame(getShape(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xTextFrame.is());
+
+ auto nActual = getProperty<sal_Int16>(xTextFrame, "WritingMode");
+ // Without the accompanying fix in place, this test would have failed with 'Expected: 5; Actual:
+ // 4', i.e. writing direction was inherited from page, instead of explicit btlr.
+ CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, nActual);
+}
+
DECLARE_OOXMLIMPORT_TEST(testTdf124398, "tdf124398.docx")
{
uno::Reference<container::XIndexAccess> xGroup(getShape(1), uno::UNO_QUERY);
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 54e4a7bdd7a1..1b24e0624dc8 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3052,9 +3052,6 @@ void DomainMapper::PopListProperties()
void DomainMapper::lcl_startCharacterGroup()
{
m_pImpl->PushProperties(CONTEXT_CHARACTER);
- if (m_pImpl->m_bFrameBtLr)
- // No support for this in core, work around by char rotation, as we do so for table cells already.
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_ROTATION, uno::makeAny(sal_Int16(900)));
if (m_pImpl->isSdtEndDeferred())
{
// Fields have an empty character group before the real one, so don't
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 21d6e65d1af3..28b4fb20183d 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -250,7 +250,6 @@ DomainMapper_Impl::DomainMapper_Impl(
m_bIgnoreNextPara(false),
m_bCheckFirstFootnoteTab(false),
m_bIgnoreNextTab(false),
- m_bFrameBtLr(false),
m_bIsSplitPara(false),
m_vTextFramesForChaining(),
m_bParaHadField(false),
@@ -2354,15 +2353,9 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
uno::Reference<beans::XPropertySet> xShapePropertySet(xShape, uno::UNO_QUERY);
uno::Sequence<beans::PropertyValue> aGrabBag;
xShapePropertySet->getPropertyValue("FrameInteropGrabBag") >>= aGrabBag;
- bool checkBtLrStatus = false;
for (const auto& rProp : aGrabBag)
{
- if (rProp.Name == "mso-layout-flow-alt")
- {
- m_bFrameBtLr = rProp.Value.get<OUString>() == "bottom-to-top";
- checkBtLrStatus = true;
- }
if (rProp.Name == "VML-Z-ORDER")
{
GraphicZOrderHelper* pZOrderHelper = m_rDMapper.graphicZOrderHelper();
@@ -2373,10 +2366,7 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
xShapePropertySet->setPropertyValue(getPropertyName( PROP_OPAQUE ), uno::makeAny( zOrder >= 0 ) );
checkZOrderStatus = true;
}
- if(checkBtLrStatus && checkZOrderStatus)
- break;
-
- if ( rProp.Name == "TxbxHasLink" )
+ else if ( rProp.Name == "TxbxHasLink" )
{
//Chaining of textboxes will happen in ~DomainMapper_Impl
//i.e when all the textboxes are read and all its attributes
@@ -2534,7 +2524,6 @@ void DomainMapper_Impl::PopShapeContext()
m_aAnchoredStack.pop();
}
- m_bFrameBtLr = false;
}
bool DomainMapper_Impl::IsSdtEndBefore()
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 793631530d66..09b35a360008 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -953,7 +953,6 @@ public:
/// If the next tab should be ignored, used for footnotes.
bool m_bCheckFirstFootnoteTab;
bool m_bIgnoreNextTab;
- bool m_bFrameBtLr; ///< Bottom to top, left to right text frame direction is requested for the current text frame.
/// Pending floating tables: they may be converted to text frames at the section end.
std::vector<FloatingTableInfo> m_aPendingFloatingTables;