summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--offapi/com/sun/star/text/ContentControl.idl6
-rw-r--r--oox/source/token/tokens.txt1
-rw-r--r--schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng5
-rw-r--r--sw/inc/formatcontentcontrol.hxx7
-rw-r--r--sw/inc/unoprnms.hxx1
-rw-r--r--sw/qa/core/unocore/unocore.cxx2
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport17.cxx2
-rw-r--r--sw/source/core/txtnode/attrcontentcontrol.cxx2
-rw-r--r--sw/source/core/unocore/unocontentcontrol.cxx29
-rw-r--r--sw/source/core/unocore/unomap1.cxx1
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx16
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.hxx2
-rw-r--r--writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx4
-rw-r--r--writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docxbin5381 -> 5391 bytes
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx15
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx5
-rw-r--r--writerfilter/source/dmapper/SdtHelper.cxx5
-rw-r--r--writerfilter/source/dmapper/SdtHelper.hxx6
-rw-r--r--writerfilter/source/ooxml/model.xml4
-rw-r--r--xmloff/qa/unit/data/content-control-alias.fodt2
-rw-r--r--xmloff/qa/unit/text.cxx5
-rw-r--r--xmloff/source/text/txtparae.cxx8
-rw-r--r--xmloff/source/text/xmlcontentcontrolcontext.cxx14
-rw-r--r--xmloff/source/text/xmlcontentcontrolcontext.hxx1
24 files changed, 142 insertions, 1 deletions
diff --git a/offapi/com/sun/star/text/ContentControl.idl b/offapi/com/sun/star/text/ContentControl.idl
index 59894741de2b..ce741d9b2926 100644
--- a/offapi/com/sun/star/text/ContentControl.idl
+++ b/offapi/com/sun/star/text/ContentControl.idl
@@ -128,6 +128,12 @@ service ContentControl
*/
[optional, property] long Id;
+ /** Describes the order in which keyboard navigation moves between controls
+
+ @since LibreOffice 7.6
+ */
+ [optional, property] unsigned long TabIndex;
+
/** Describes whether the control itself and/or its data can be modified or deleted by the user.
@since LibreOffice 7.6
diff --git a/oox/source/token/tokens.txt b/oox/source/token/tokens.txt
index 8ed5687983b6..b66321243320 100644
--- a/oox/source/token/tokens.txt
+++ b/oox/source/token/tokens.txt
@@ -5123,6 +5123,7 @@ tOff
tR
tab
tabColor
+tabIndex
tabLst
tabRatio
tabSelected
diff --git a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
index 613ded76689c..ea1083bb1fbc 100644
--- a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
+++ b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
@@ -3009,6 +3009,11 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.
</rng:attribute>
</rng:optional>
<rng:optional>
+ <rng:attribute name="loext:tab-index">
+ <rng:ref name="nonNegativeInteger"/>
+ </rng:attribute>
+ </rng:optional>
+ <rng:optional>
<rng:attribute name="loext:lock">
<rng:ref name="string"/>
</rng:attribute>
diff --git a/sw/inc/formatcontentcontrol.hxx b/sw/inc/formatcontentcontrol.hxx
index e561fa6e23fb..77e6addbca09 100644
--- a/sw/inc/formatcontentcontrol.hxx
+++ b/sw/inc/formatcontentcontrol.hxx
@@ -179,6 +179,9 @@ class SW_DLLPUBLIC SwContentControl : public sw::BroadcastingModify
/// The id: just remembered.
sal_Int32 m_nId = 0;
+ /// The tabIndex: just remembered.
+ sal_uInt32 m_nTabIndex = 0;
+
/// The control and content locks: mostly just remembered.
OUString m_aLock;
@@ -362,6 +365,10 @@ public:
sal_Int32 GetId() const { return m_nId; }
+ void SetTabIndex(sal_uInt32 nTabIndex) { m_nTabIndex = nTabIndex; }
+
+ sal_uInt32 GetTabIndex() const { return m_nTabIndex; }
+
// At the design level, define how the control should be locked. No effect at implementation lvl
void SetLock(bool bLockContent, bool bLockControl);
void SetLock(const OUString& rLock) { m_aLock = rLock; }
diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx
index 2e7158fac97e..ff1cc28303be 100644
--- a/sw/inc/unoprnms.hxx
+++ b/sw/inc/unoprnms.hxx
@@ -917,6 +917,7 @@ inline constexpr OUStringLiteral UNO_NAME_COLOR = u"Color";
inline constexpr OUStringLiteral UNO_NAME_ALIAS = u"Alias";
inline constexpr OUStringLiteral UNO_NAME_TAG = u"Tag";
inline constexpr OUStringLiteral UNO_NAME_ID = u"Id";
+inline constexpr OUStringLiteral UNO_NAME_TAB_INDEX = u"TabIndex";
inline constexpr OUStringLiteral UNO_NAME_LOCK = u"Lock";
inline constexpr OUStringLiteral UNO_NAME_DATE_STRING = u"DateString";
#endif
diff --git a/sw/qa/core/unocore/unocore.cxx b/sw/qa/core/unocore/unocore.cxx
index 985353db3e80..98d8092a7a9d 100644
--- a/sw/qa/core/unocore/unocore.cxx
+++ b/sw/qa/core/unocore/unocore.cxx
@@ -633,6 +633,7 @@ CPPUNIT_TEST_FIXTURE(SwCoreUnocoreTest, testContentControlDate)
xContentControlProps->setPropertyValue("Color", uno::Any(OUString("008000")));
xContentControlProps->setPropertyValue("Alias", uno::Any(OUString("myalias")));
xContentControlProps->setPropertyValue("Tag", uno::Any(OUString("mytag")));
+ xContentControlProps->setPropertyValue("TabIndex", uno::Any(sal_uInt32(1)));
xContentControlProps->setPropertyValue("Lock", uno::Any(OUString("sdtContentLocked")));
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
@@ -659,6 +660,7 @@ CPPUNIT_TEST_FIXTURE(SwCoreUnocoreTest, testContentControlDate)
CPPUNIT_ASSERT_EQUAL(OUString("008000"), pContentControl->GetColor());
CPPUNIT_ASSERT_EQUAL(OUString("myalias"), pContentControl->GetAlias());
CPPUNIT_ASSERT_EQUAL(OUString("mytag"), pContentControl->GetTag());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(1), pContentControl->GetTabIndex());
CPPUNIT_ASSERT_EQUAL(OUString("sdtContentLocked"), pContentControl->GetLock());
}
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
index 7a9a14c1cb1a..1ddaeeeb8a8a 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
@@ -423,6 +423,7 @@ CPPUNIT_TEST_FIXTURE(Test, testDateContentControlExport)
xContentControlProps->setPropertyValue("Color", uno::Any(OUString("008000")));
xContentControlProps->setPropertyValue("Alias", uno::Any(OUString("myalias")));
xContentControlProps->setPropertyValue("Tag", uno::Any(OUString("mytag")));
+ xContentControlProps->setPropertyValue("TabIndex", uno::Any(sal_uInt32(2)));
xContentControlProps->setPropertyValue("Lock", uno::Any(OUString("sdtLocked")));
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
@@ -447,6 +448,7 @@ CPPUNIT_TEST_FIXTURE(Test, testDateContentControlExport)
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w15:color", "val", "008000");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:alias", "val", "myalias");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:tag", "val", "mytag");
+ assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:tabIndex", "val", "2");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:lock", "val", "sdtLocked");
}
diff --git a/sw/source/core/txtnode/attrcontentcontrol.cxx b/sw/source/core/txtnode/attrcontentcontrol.cxx
index ffbe23589f99..d5e104f7790b 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -562,6 +562,8 @@ void SwContentControl::dumpAsXml(xmlTextWriterPtr pWriter) const
(void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("tag"), BAD_CAST(m_aTag.toUtf8().getStr()));
(void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("id"),
BAD_CAST(OString::number(m_nId).getStr()));
+ (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("tab-index"),
+ BAD_CAST(OString::number(m_nTabIndex).getStr()));
(void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("lock"),
BAD_CAST(m_aLock.toUtf8().getStr()));
diff --git a/sw/source/core/unocore/unocontentcontrol.cxx b/sw/source/core/unocore/unocontentcontrol.cxx
index 8b6c4e798f2c..5cce5c804c49 100644
--- a/sw/source/core/unocore/unocontentcontrol.cxx
+++ b/sw/source/core/unocore/unocontentcontrol.cxx
@@ -179,6 +179,7 @@ public:
OUString m_aAlias;
OUString m_aTag;
sal_Int32 m_nId;
+ sal_uInt32 m_nTabIndex;
OUString m_aLock;
Impl(SwXContentControl& rThis, SwDoc& rDoc, SwContentControl* pContentControl,
@@ -198,6 +199,7 @@ public:
, m_bComboBox(false)
, m_bDropDown(false)
, m_nId(0)
+ , m_nTabIndex(0)
{
if (m_pContentControl)
{
@@ -494,6 +496,7 @@ void SwXContentControl::AttachImpl(const uno::Reference<text::XTextRange>& xText
pContentControl->SetAlias(m_pImpl->m_aAlias);
pContentControl->SetTag(m_pImpl->m_aTag);
pContentControl->SetId(m_pImpl->m_nId);
+ pContentControl->SetTabIndex(m_pImpl->m_nTabIndex);
pContentControl->SetLock(m_pImpl->m_aLock);
SwFormatContentControl aContentControl(pContentControl, nWhich);
@@ -985,6 +988,21 @@ void SAL_CALL SwXContentControl::setPropertyValue(const OUString& rPropertyName,
}
}
}
+ else if (rPropertyName == UNO_NAME_TAB_INDEX)
+ {
+ sal_uInt32 nValue = 0;
+ if (rValue >>= nValue)
+ {
+ if (m_pImpl->m_bIsDescriptor)
+ {
+ m_pImpl->m_nTabIndex = nValue;
+ }
+ else
+ {
+ m_pImpl->m_pContentControl->SetTabIndex(nValue);
+ }
+ }
+ }
else if (rPropertyName == UNO_NAME_LOCK)
{
OUString aValue;
@@ -1262,6 +1280,17 @@ uno::Any SAL_CALL SwXContentControl::getPropertyValue(const OUString& rPropertyN
aRet <<= m_pImpl->m_pContentControl->GetId();
}
}
+ else if (rPropertyName == UNO_NAME_TAB_INDEX)
+ {
+ if (m_pImpl->m_bIsDescriptor)
+ {
+ aRet <<= m_pImpl->m_nTabIndex;
+ }
+ else
+ {
+ aRet <<= m_pImpl->m_pContentControl->GetTabIndex();
+ }
+ }
else if (rPropertyName == UNO_NAME_LOCK)
{
if (m_pImpl->m_bIsDescriptor)
diff --git a/sw/source/core/unocore/unomap1.cxx b/sw/source/core/unocore/unomap1.cxx
index 437f293a9f78..fef42a508942 100644
--- a/sw/source/core/unocore/unomap1.cxx
+++ b/sw/source/core/unocore/unomap1.cxx
@@ -1013,6 +1013,7 @@ o3tl::span<const SfxItemPropertyMapEntry> SwUnoPropertyMapProvider::GetContentCo
{ UNO_NAME_ALIAS, 0, cppu::UnoType<OUString>::get(), PROPERTY_NONE, 0 },
{ UNO_NAME_TAG, 0, cppu::UnoType<OUString>::get(), PROPERTY_NONE, 0 },
{ UNO_NAME_ID, 0, cppu::UnoType<sal_Int32>::get(), PROPERTY_NONE, 0 },
+ { UNO_NAME_TAB_INDEX, 0, cppu::UnoType<sal_uInt32>::get(), PROPERTY_NONE, 0 },
{ UNO_NAME_LOCK, 0, cppu::UnoType<OUString>::get(), PROPERTY_NONE, 0 },
{ UNO_NAME_DATE_STRING, 0, cppu::UnoType<OUString>::get(), PropertyAttribute::READONLY, 0 },
};
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 11bf0e1f9b82..03bdb9e361ba 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -624,6 +624,7 @@ void SdtBlockHelper::DeleteAndResetTheLists()
if (!m_aColor.isEmpty())
m_aColor.clear();
m_bShowingPlaceHolder = false;
+ m_nTabIndex = 0;
m_bHasId = false;
}
@@ -727,6 +728,10 @@ void SdtBlockHelper::WriteExtraParams(const ::sax_fastparser::FSHelperPtr& pSeri
if (!m_aTag.isEmpty())
pSerializer->singleElementNS(XML_w, XML_tag, FSNS(XML_w, XML_val), m_aTag);
+ if (m_nTabIndex)
+ pSerializer->singleElementNS(XML_w, XML_tabIndex, FSNS(XML_w, XML_val),
+ OString::number(m_nTabIndex));
+
if (!m_aLock.isEmpty())
pSerializer->singleElementNS(XML_w, XML_lock, FSNS(XML_w, XML_val), m_aLock);
}
@@ -843,6 +848,11 @@ void SdtBlockHelper::GetSdtParamsFromGrabBag(const uno::Sequence<beans::Property
if (!(aPropertyValue.Value >>= m_aTag))
SAL_WARN("sw.ww8", "DocxAttributeOutput::GrabBag: unexpected sdt tag value");
}
+ else if (aPropertyValue.Name == "ooxml:CT_SdtPr_tabIndex" && !m_nTabIndex)
+ {
+ if (!(aPropertyValue.Value >>= m_nTabIndex))
+ SAL_WARN("sw.ww8", "DocxAttributeOutput::GrabBag: unexpected sdt tabIndex value");
+ }
else if (aPropertyValue.Name == "ooxml:CT_SdtPr_lock" && m_aLock.isEmpty())
{
if (!(aPropertyValue.Value >>= m_aLock))
@@ -2408,6 +2418,12 @@ void DocxAttributeOutput::WriteContentControlStart()
OString::number(m_pContentControl->GetId()));
}
+ if (m_pContentControl->GetTabIndex())
+ {
+ m_pSerializer->singleElementNS(XML_w, XML_tabIndex, FSNS(XML_w, XML_val),
+ OString::number(m_pContentControl->GetTabIndex()));
+ }
+
if (!m_pContentControl->GetLock().isEmpty())
{
m_pSerializer->singleElementNS(XML_w, XML_lock, FSNS(XML_w, XML_val),
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 055d277c7827..c4be90cd5140 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -131,6 +131,7 @@ public:
: m_bHasId(false)
, m_bStartedSdt(false)
, m_bShowingPlaceHolder(false)
+ , m_nTabIndex(0)
, m_nSdtPrToken(0)
{}
@@ -145,6 +146,7 @@ public:
bool m_bShowingPlaceHolder;
OUString m_aAlias;
OUString m_aTag;
+ sal_Int32 m_nTabIndex;
OUString m_aLock;
sal_Int32 m_nSdtPrToken;
diff --git a/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx b/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx
index 8f9ea8ca5ddb..7b27ff66d08c 100644
--- a/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx
+++ b/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx
@@ -71,6 +71,10 @@ CPPUNIT_TEST_FIXTURE(Test, testSdtRunRichText)
xContentControlProps->getPropertyValue("Tag") >>= aTag;
// This was empty.
CPPUNIT_ASSERT_EQUAL(OUString("mytag"), aTag);
+ sal_uInt32 nTabIndex = 0;
+ xContentControlProps->getPropertyValue("TabIndex") >>= nTabIndex;
+ // This was 0
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(5), nTabIndex);
OUString aLock;
xContentControlProps->getPropertyValue("Lock") >>= aLock;
// This was empty.
diff --git a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx
index aabc745bcf0e..ca980abb0356 100644
--- a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx
+++ b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx
Binary files differ
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index a0b06009b6c6..c77c9f2a0a93 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2848,6 +2848,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
case NS_ooxml::LN_CT_SdtPr_showingPlcHdr:
case NS_ooxml::LN_CT_SdtPr_color:
case NS_ooxml::LN_CT_SdtPr_tag:
+ case NS_ooxml::LN_CT_SdtPr_tabIndex:
case NS_ooxml::LN_CT_SdtPr_lock:
{
if (!m_pImpl->GetSdtStarts().empty())
@@ -2886,6 +2887,12 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
break;
}
+ if (nSprmId == NS_ooxml::LN_CT_SdtPr_tabIndex)
+ {
+ m_pImpl->m_pSdtHelper->SetTabIndex(nIntValue);
+ break;
+ }
+
if (nSprmId == NS_ooxml::LN_CT_SdtPr_lock)
{
m_pImpl->m_pSdtHelper->SetLock(sStringValue);
@@ -2939,6 +2946,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
case NS_ooxml::LN_CT_SdtPr_id: sName = "ooxml:CT_SdtPr_id"; break;
case NS_ooxml::LN_CT_SdtPr_alias: sName = "ooxml:CT_SdtPr_alias"; break;
case NS_ooxml::LN_CT_SdtPr_tag: sName = "ooxml:CT_SdtPr_tag"; break;
+ case NS_ooxml::LN_CT_SdtPr_tabIndex: sName = "ooxml:CT_SdtPr_tabIndex"; break;
case NS_ooxml::LN_CT_SdtPr_lock: sName = "ooxml:CT_SdtPr_lock"; break;
case NS_ooxml::LN_CT_SdtPlaceholder_docPart: sName = "ooxml:CT_SdtPlaceholder_docPart"; break;
case NS_ooxml::LN_CT_SdtPr_showingPlcHdr: sName = "ooxml:CT_SdtPr_showingPlcHdr"; break;
@@ -2977,6 +2985,13 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
aValue.Value <<= bool(nIntValue);
m_pImpl->m_pSdtHelper->appendToInteropGrabBag(aValue);
}
+ else if (nSprmId == NS_ooxml::LN_CT_SdtPr_tabIndex)
+ {
+ beans::PropertyValue aValue;
+ aValue.Name = sName;
+ aValue.Value <<= nIntValue;
+ m_pImpl->m_pSdtHelper->appendToInteropGrabBag(aValue);
+ }
else
m_pImpl->m_pSdtHelper->appendToInteropGrabBag(getInteropGrabBag());
m_pImpl->m_pSdtHelper->setOutsideAParagraph(m_pImpl->IsOutsideAParagraph());
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 3f3906570c61..0cc56b14d4f2 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -957,6 +957,11 @@ void DomainMapper_Impl::PopSdt()
xContentControlProps->setPropertyValue("Id", uno::Any(m_pSdtHelper->GetId()));
}
+ if (m_pSdtHelper->GetTabIndex())
+ {
+ xContentControlProps->setPropertyValue("TabIndex", uno::Any(m_pSdtHelper->GetTabIndex()));
+ }
+
if (!m_pSdtHelper->GetLock().isEmpty())
{
xContentControlProps->setPropertyValue("Lock", uno::Any(m_pSdtHelper->GetLock()));
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx
index 81b03df774cd..2eece1c06df6 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -521,6 +521,7 @@ void SdtHelper::clear()
m_aAlias.clear();
m_aTag.clear();
m_nId = 0;
+ m_nTabIndex = 0;
m_aLock.clear();
}
@@ -547,6 +548,10 @@ void SdtHelper::SetId(sal_Int32 nId) { m_nId = nId; }
sal_Int32 SdtHelper::GetId() const { return m_nId; }
+void SdtHelper::SetTabIndex(sal_uInt32 nTabIndex) { m_nTabIndex = nTabIndex; }
+
+sal_uInt32 SdtHelper::GetTabIndex() const { return m_nTabIndex; }
+
void SdtHelper::SetLock(const OUString& rLock) { m_aLock = rLock; }
const OUString& SdtHelper::GetLock() const { return m_aLock; }
diff --git a/writerfilter/source/dmapper/SdtHelper.hxx b/writerfilter/source/dmapper/SdtHelper.hxx
index dbe0b2659e7a..35bedde509c0 100644
--- a/writerfilter/source/dmapper/SdtHelper.hxx
+++ b/writerfilter/source/dmapper/SdtHelper.hxx
@@ -135,6 +135,9 @@ class SdtHelper final : public virtual SvRefBase
/// <w:sdtPr>'s <w:id w:val="...">.
sal_Int32 m_nId = 0;
+ /// <w:sdtPr>'s <w:tabIndex w:val="...">.
+ sal_uInt32 m_nTabIndex = 0;
+
/// <w:sdtPr>'s <w:lock w:val="...">.
OUString m_aLock;
@@ -226,6 +229,9 @@ public:
void SetId(sal_Int32 nId);
sal_Int32 GetId() const;
+ void SetTabIndex(sal_uInt32 nTabIndex);
+ sal_uInt32 GetTabIndex() const;
+
void SetLock(const OUString& rLock);
const OUString& GetLock() const;
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index 4f2446aa5272..11a434d3d7ee 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -13998,6 +13998,9 @@
<element name="id">
<ref name="CT_DecimalNumber"/>
</element>
+ <element name="tabIndex">
+ <ref name="CT_DecimalNumber"/>
+ </element>
<element name="tag">
<ref name="CT_String"/>
</element>
@@ -18298,6 +18301,7 @@
<element name="dataBinding" tokenid="ooxml:CT_SdtPr_dataBinding"/>
<element name="temporary" tokenid="ooxml:CT_SdtPr_temporary"/>
<element name="id" tokenid="ooxml:CT_SdtPr_id"/>
+ <element name="tabIndex" tokenid="ooxml:CT_SdtPr_tabIndex"/>
<element name="tag" tokenid="ooxml:CT_SdtPr_tag"/>
<element name="equation" tokenid="ooxml:CT_SdtPr_equation"/>
<element name="comboBox" tokenid="ooxml:CT_SdtPr_comboBox"/>
diff --git a/xmloff/qa/unit/data/content-control-alias.fodt b/xmloff/qa/unit/data/content-control-alias.fodt
index 8f541bef42cc..48fdc7b9436c 100644
--- a/xmloff/qa/unit/data/content-control-alias.fodt
+++ b/xmloff/qa/unit/data/content-control-alias.fodt
@@ -2,7 +2,7 @@
<office:document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
<office:body>
<office:text>
- <text:p><loext:content-control loext:alias="my alias" loext:tag="my tag" loext:lock="sdtContentLocked">test</loext:content-control></text:p>
+ <text:p><loext:content-control loext:alias="my alias" loext:tag="my tag" loext:tab-index="4" loext:lock="sdtContentLocked">test</loext:content-control></text:p>
</office:text>
</office:body>
</office:document>
diff --git a/xmloff/qa/unit/text.cxx b/xmloff/qa/unit/text.cxx
index 2187e3d2a89d..250c9d945028 100644
--- a/xmloff/qa/unit/text.cxx
+++ b/xmloff/qa/unit/text.cxx
@@ -781,6 +781,7 @@ CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testAliasContentControlExport)
uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
xContentControlProps->setPropertyValue("Alias", uno::Any(OUString("my alias")));
xContentControlProps->setPropertyValue("Tag", uno::Any(OUString("my tag")));
+ xContentControlProps->setPropertyValue("TabIndex", uno::Any(sal_uInt32(3)));
xContentControlProps->setPropertyValue("Lock", uno::Any(OUString("unlocked")));
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
@@ -795,6 +796,7 @@ CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testAliasContentControlExport)
// i.e. alias was lost on export.
assertXPath(pXmlDoc, "//loext:content-control", "alias", "my alias");
assertXPath(pXmlDoc, "//loext:content-control", "tag", "my tag");
+ assertXPath(pXmlDoc, "//loext:content-control", "tab-index", "3");
assertXPath(pXmlDoc, "//loext:content-control", "lock", "unlocked");
}
@@ -855,6 +857,9 @@ CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testAliasContentControlImport)
OUString aTag;
xContentControlProps->getPropertyValue("Tag") >>= aTag;
CPPUNIT_ASSERT_EQUAL(OUString("my tag"), aTag);
+ sal_uInt32 nTabIndex;
+ xContentControlProps->getPropertyValue("TabIndex") >>= nTabIndex;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(4), nTabIndex);
OUString aLock;
xContentControlProps->getPropertyValue("Lock") >>= aLock;
CPPUNIT_ASSERT_EQUAL(OUString("sdtContentLocked"), aLock);
diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx
index b2117dfdc726..4ee5f3fd8a90 100644
--- a/xmloff/source/text/txtparae.cxx
+++ b/xmloff/source/text/txtparae.cxx
@@ -4067,6 +4067,14 @@ void XMLTextParagraphExport::ExportContentControl(
GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_TAG, aTag);
}
+ sal_uInt32 nTabIndex;
+ xPropertySet->getPropertyValue("TabIndex") >>= nTabIndex;
+ if (nTabIndex)
+ {
+ GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_TAB_INDEX,
+ OUString::number(nTabIndex));
+ }
+
OUString aLock;
xPropertySet->getPropertyValue("Lock") >>= aLock;
if (!aLock.isEmpty())
diff --git a/xmloff/source/text/xmlcontentcontrolcontext.cxx b/xmloff/source/text/xmlcontentcontrolcontext.cxx
index 83c1621b057e..caf1af04b8d7 100644
--- a/xmloff/source/text/xmlcontentcontrolcontext.cxx
+++ b/xmloff/source/text/xmlcontentcontrolcontext.cxx
@@ -49,6 +49,7 @@ void XMLContentControlContext::startFastElement(
for (auto& rIter : sax_fastparser::castToFastAttributeList(xAttrList))
{
bool bTmp = false;
+ sal_Int32 nTmp = 0;
switch (rIter.getToken())
{
@@ -151,6 +152,14 @@ void XMLContentControlContext::startFastElement(
m_aTag = rIter.toString();
break;
}
+ case XML_ELEMENT(LO_EXT, XML_TAB_INDEX):
+ {
+ if (sax::Converter::convertNumber(nTmp, rIter.toView()))
+ {
+ m_nTabIndex = nTmp;
+ }
+ break;
+ }
case XML_ELEMENT(LO_EXT, XML_LOCK):
{
m_aLock = rIter.toString();
@@ -267,6 +276,11 @@ void XMLContentControlContext::endFastElement(sal_Int32)
xPropertySet->setPropertyValue("Tag", uno::Any(m_aTag));
}
+ if (m_nTabIndex)
+ {
+ xPropertySet->setPropertyValue("TabIndex", uno::Any(m_nTabIndex));
+ }
+
if (!m_aLock.isEmpty())
{
xPropertySet->setPropertyValue("Lock", uno::Any(m_aLock));
diff --git a/xmloff/source/text/xmlcontentcontrolcontext.hxx b/xmloff/source/text/xmlcontentcontrolcontext.hxx
index f0b1eea0b010..44abe71d6a08 100644
--- a/xmloff/source/text/xmlcontentcontrolcontext.hxx
+++ b/xmloff/source/text/xmlcontentcontrolcontext.hxx
@@ -53,6 +53,7 @@ class XMLContentControlContext : public SvXMLImportContext
bool m_bDropDown = false;
OUString m_aAlias;
OUString m_aTag;
+ sal_uInt32 m_nTabIndex = 0;
OUString m_aLock;
public: