summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2019-02-13 14:01:57 +0100
committerMiklos Vajna <vmiklos@collabora.com>2019-02-13 15:17:34 +0100
commit8af98ac8bf0ac8795999ecbf061d3c094f7c3be4 (patch)
treedc93f5888dcdce57d780f538493668d74452a89b /sw
parentb6de43a14a768e261d2233df57cf5fa46480d991 (diff)
sw btlr writing mode: implement ODF filter
An easy way would be to just extend aXML_WritingDirection_Enum, but then we would write the new attribute value to a non-extension namespace. So special case the new attribute value during both import and export (and only for table cells as a start). Change-Id: I431bf99693c4a3452e91f241bd2f0fcfc72c68fd Reviewed-on: https://gerrit.libreoffice.org/67770 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'sw')
-rw-r--r--sw/qa/extras/odfexport/data/btlr-cell.odtbin0 -> 9174 bytes
-rw-r--r--sw/qa/extras/odfexport/odfexport.cxx20
-rw-r--r--sw/source/filter/xml/xmlexpit.cxx44
-rw-r--r--sw/source/filter/xml/xmlimpit.cxx29
-rw-r--r--sw/source/filter/xml/xmlitemm.cxx1
5 files changed, 77 insertions, 17 deletions
diff --git a/sw/qa/extras/odfexport/data/btlr-cell.odt b/sw/qa/extras/odfexport/data/btlr-cell.odt
new file mode 100644
index 000000000000..c010fa9f51b6
--- /dev/null
+++ b/sw/qa/extras/odfexport/data/btlr-cell.odt
Binary files differ
diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx
index 337c64270a04..8ac8f1c81edd 100644
--- a/sw/qa/extras/odfexport/odfexport.cxx
+++ b/sw/qa/extras/odfexport/odfexport.cxx
@@ -32,6 +32,7 @@
#include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
#include <com/sun/star/text/XTextEmbeddedObjectsSupplier.hpp>
#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/text/WritingMode2.hpp>
#include <comphelper/storagehelper.hxx>
#include <comphelper/fileformat.h>
#include <comphelper/propertysequence.hxx>
@@ -1391,6 +1392,25 @@ DECLARE_ODFEXPORT_TEST(testWhitespace, "whitespace.odt")
CPPUNIT_ASSERT(!xPortions->hasMoreElements());
}
+DECLARE_ODFEXPORT_TEST(testBtlrCell, "btlr-cell.odt")
+{
+ // Without the accompanying fix in place, this test would have failed, as
+ // the btlr text direction in the A1 cell was lost on ODF import and
+ // export.
+ uno::Reference<text::XTextTablesSupplier> xSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xTables = xSupplier->getTextTables();
+ uno::Reference<text::XTextTable> xTable(xTables->getByName("Table1"), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xA1(xTable->getCellByName("A1"), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, getProperty<sal_Int16>(xA1, "WritingMode"));
+
+ uno::Reference<beans::XPropertySet> xB1(xTable->getCellByName("B1"), uno::UNO_QUERY);
+ auto nActual = getProperty<sal_Int16>(xB1, "WritingMode");
+ CPPUNIT_ASSERT(nActual == text::WritingMode2::LR_TB || nActual == text::WritingMode2::CONTEXT);
+
+ uno::Reference<beans::XPropertySet> xC1(xTable->getCellByName("C1"), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL, getProperty<sal_Int16>(xC1, "WritingMode"));
+}
+
DECLARE_ODFEXPORT_TEST(testFdo86963, "fdo86963.odt")
{
// Export of this document failed with beans::UnknownPropertyException.
diff --git a/sw/source/filter/xml/xmlexpit.cxx b/sw/source/filter/xml/xmlexpit.cxx
index 989602e666b6..8b09189ba403 100644
--- a/sw/source/filter/xml/xmlexpit.cxx
+++ b/sw/source/filter/xml/xmlexpit.cxx
@@ -46,6 +46,7 @@
#include <editeng/formatbreakitem.hxx>
#include <editeng/keepitem.hxx>
#include <editeng/brushitem.hxx>
+#include <editeng/frmdiritem.hxx>
#include <fmtpdsc.hxx>
#include <fmtornt.hxx>
#include <fmtfsize.hxx>
@@ -197,16 +198,41 @@ void SvXMLExportItemMapper::exportXML( const SvXMLExport& rExport,
}
else if( 0 == (rEntry.nMemberId & MID_SW_FLAG_ELEMENT_ITEM_EXPORT) )
{
- OUString aValue;
- if( QueryXMLValue(rItem, aValue,
- static_cast< sal_uInt16 >(
- rEntry.nMemberId & MID_SW_FLAG_MASK ),
- rUnitConverter ) )
+ bool bDone = false;
+ switch (rItem.Which())
{
- const OUString sName(
- rNamespaceMap.GetQNameByKey( rEntry.nNameSpace,
- GetXMLToken(rEntry.eLocalName)));
- rAttrList.AddAttribute( sName, aValue );
+ case RES_FRAMEDIR:
+ {
+ // Write bt-lr to the extension namespace, handle other values
+ // below.
+ auto pDirection = static_cast<const SvxFrameDirectionItem*>(&rItem);
+ if (rEntry.nNameSpace == XML_NAMESPACE_LO_EXT
+ && pDirection->GetValue() == SvxFrameDirection::Vertical_LR_BT)
+ {
+ const OUString sName(rNamespaceMap.GetQNameByKey(
+ XML_NAMESPACE_LO_EXT, GetXMLToken(XML_WRITING_MODE)));
+ rAttrList.AddAttribute(sName, GetXMLToken(XML_BT_LR));
+ }
+ if (rEntry.nNameSpace == XML_NAMESPACE_LO_EXT
+ || pDirection->GetValue() == SvxFrameDirection::Vertical_LR_BT)
+ bDone = true;
+ break;
+ }
+ }
+
+ if (!bDone)
+ {
+ OUString aValue;
+ if( QueryXMLValue(rItem, aValue,
+ static_cast< sal_uInt16 >(
+ rEntry.nMemberId & MID_SW_FLAG_MASK ),
+ rUnitConverter ) )
+ {
+ const OUString sName(
+ rNamespaceMap.GetQNameByKey( rEntry.nNameSpace,
+ GetXMLToken(rEntry.eLocalName)));
+ rAttrList.AddAttribute( sName, aValue );
+ }
}
}
}
diff --git a/sw/source/filter/xml/xmlimpit.cxx b/sw/source/filter/xml/xmlimpit.cxx
index 1e921ac9dce6..0ba10f9cfd25 100644
--- a/sw/source/filter/xml/xmlimpit.cxx
+++ b/sw/source/filter/xml/xmlimpit.cxx
@@ -42,6 +42,7 @@
#include <editeng/formatbreakitem.hxx>
#include <editeng/keepitem.hxx>
#include <editeng/brushitem.hxx>
+#include <editeng/frmdir.hxx>
#include <fmtpdsc.hxx>
#include <fmtornt.hxx>
#include <fmtfsize.hxx>
@@ -52,6 +53,7 @@
#include <xmloff/xmlprhdl.hxx>
#include "xmlithlp.hxx"
#include <com/sun/star/uno/Any.hxx>
+#include <sal/log.hxx>
using ::editeng::SvxBorderLine;
using namespace ::com::sun::star;
@@ -905,14 +907,25 @@ bool SvXMLImportItemMapper::PutXMLValue(
case RES_FRAMEDIR:
{
- std::unique_ptr<XMLPropertyHandler> pWritingModeHandler =
- XMLPropertyHandlerFactory::CreatePropertyHandler(
- XML_TYPE_TEXT_WRITING_MODE_WITH_DEFAULT );
- Any aAny;
- bOk = pWritingModeHandler->importXML( rValue, aAny,
- rUnitConverter );
- if( bOk )
- bOk = rItem.PutValue( aAny, 0 );
+ if (IsXMLToken(rValue, XML_BT_LR))
+ {
+ // Read bt-lr from the extension namespace, handle other values
+ // below.
+ Any aAny;
+ aAny <<= static_cast<sal_uInt16>(SvxFrameDirection::Vertical_LR_BT);
+ bOk = rItem.PutValue(aAny, 0);
+ }
+ else
+ {
+ std::unique_ptr<XMLPropertyHandler> pWritingModeHandler =
+ XMLPropertyHandlerFactory::CreatePropertyHandler(
+ XML_TYPE_TEXT_WRITING_MODE_WITH_DEFAULT );
+ Any aAny;
+ bOk = pWritingModeHandler->importXML( rValue, aAny,
+ rUnitConverter );
+ if( bOk )
+ bOk = rItem.PutValue( aAny, 0 );
+ }
}
break;
diff --git a/sw/source/filter/xml/xmlitemm.cxx b/sw/source/filter/xml/xmlitemm.cxx
index 417e0a5d96c1..0757bdd57604 100644
--- a/sw/source/filter/xml/xmlitemm.cxx
+++ b/sw/source/filter/xml/xmlitemm.cxx
@@ -282,6 +282,7 @@ SvXMLItemMapEntry const aXMLTableCellItemMap[] =
// RES_FRAMEDIR
MAP_ENTRY( STYLE, WRITING_MODE, RES_FRAMEDIR, 0 ),
+ MAP_ENTRY( LO_EXT, WRITING_MODE, RES_FRAMEDIR, 0 ),
M_END
};