diff options
-rw-r--r-- | include/xmloff/xmltoken.hxx | 1 | ||||
-rw-r--r-- | schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng | 11 | ||||
-rw-r--r-- | sw/qa/extras/odfexport/data/btlr-cell.odt | bin | 0 -> 9174 bytes | |||
-rw-r--r-- | sw/qa/extras/odfexport/odfexport.cxx | 20 | ||||
-rw-r--r-- | sw/source/filter/xml/xmlexpit.cxx | 44 | ||||
-rw-r--r-- | sw/source/filter/xml/xmlimpit.cxx | 29 | ||||
-rw-r--r-- | sw/source/filter/xml/xmlitemm.cxx | 1 | ||||
-rw-r--r-- | xmloff/source/core/xmltoken.cxx | 1 | ||||
-rw-r--r-- | xmloff/source/token/tokens.txt | 1 |
9 files changed, 91 insertions, 17 deletions
diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx index 01467992f3d2..69ef7e889455 100644 --- a/include/xmloff/xmltoken.hxx +++ b/include/xmloff/xmltoken.hxx @@ -2183,6 +2183,7 @@ namespace xmloff { namespace token { XML_RL_TB, XML_TB_LR, + XML_BT_LR, XML_LR, XML_RL, XML_TB, diff --git a/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng b/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng index d59314e99771..956ccc2f02e4 100644 --- a/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng +++ b/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng @@ -2323,6 +2323,17 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1. </rng:optional> </rng:define> + <!-- TODO no proposal --> + <rng:define name="common-writing-mode-attlist" combine="interleave"> + <rng:optional> + <rng:attribute name="loext:writing-mode"> + <rng:choice> + <rng:value>bt-lr</rng:value> + </rng:choice> + </rng:attribute> + </rng:optional> + </rng:define> + <!-- just a test-case for user-defined attributes, move along, nothing to see here... --> <rng:define name="style-table-cell-properties-attlist" combine="interleave"> <rng:optional> diff --git a/sw/qa/extras/odfexport/data/btlr-cell.odt b/sw/qa/extras/odfexport/data/btlr-cell.odt Binary files differnew file mode 100644 index 000000000000..c010fa9f51b6 --- /dev/null +++ b/sw/qa/extras/odfexport/data/btlr-cell.odt 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 }; diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx index dc546397523c..1daa8897649d 100644 --- a/xmloff/source/core/xmltoken.cxx +++ b/xmloff/source/core/xmltoken.cxx @@ -2187,6 +2187,7 @@ namespace xmloff { namespace token { TOKEN( "rl-tb", XML_RL_TB ), TOKEN( "tb-lr", XML_TB_LR ), + TOKEN( "bt-lr", XML_BT_LR ), TOKEN( "lr", XML_LR ), TOKEN( "rl", XML_RL ), TOKEN( "tb", XML_TB ), diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt index baef6b3a31a1..ce472bc62c7a 100644 --- a/xmloff/source/token/tokens.txt +++ b/xmloff/source/token/tokens.txt @@ -2089,6 +2089,7 @@ stock-gain-marker stock-range-line rl-tb tb-lr +bt-lr lr rl tb |