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

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/67770Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
üst b6de43a1
......@@ -2183,6 +2183,7 @@ namespace xmloff { namespace token {
XML_RL_TB,
XML_TB_LR,
XML_BT_LR,
XML_LR,
XML_RL,
XML_TB,
......
......@@ -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>
......
......@@ -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.
......
......@@ -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 );
}
}
}
}
......
......@@ -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;
......
......@@ -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
};
......
......@@ -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 ),
......
......@@ -2089,6 +2089,7 @@ stock-gain-marker
stock-range-line
rl-tb
tb-lr
bt-lr
lr
rl
tb
......
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