summaryrefslogtreecommitdiff
path: root/writerfilter/source/dmapper/SettingsTable.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/dmapper/SettingsTable.cxx')
-rw-r--r--writerfilter/source/dmapper/SettingsTable.cxx58
1 files changed, 57 insertions, 1 deletions
diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx
index 45dc67b9f43b..d24dae617c01 100644
--- a/writerfilter/source/dmapper/SettingsTable.cxx
+++ b/writerfilter/source/dmapper/SettingsTable.cxx
@@ -26,6 +26,8 @@
#include <rtl/ustring.hxx>
#include <sfx2/zoomitem.hxx>
+#include <com/sun/star/text/XDependentTextField.hpp>
+#include <com/sun/star/text/XTextFieldsSupplier.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/XPropertyState.hpp>
@@ -95,6 +97,7 @@ struct SettingsTable_Impl
bool m_bNoLeading = false;
OUString m_sDecimalSymbol;
OUString m_sListSeparator;
+ std::vector<std::pair<OUString, OUString>> m_aDocVars;
uno::Sequence<beans::PropertyValue> m_pThemeFontLangProps;
@@ -136,7 +139,6 @@ struct SettingsTable_Impl
, m_pThemeFontLangProps(3)
, m_pCurrentCompatSetting(3)
{}
-
};
SettingsTable::SettingsTable(const DomainMapper& rDomainMapper)
@@ -187,6 +189,12 @@ void SettingsTable::lcl_attribute(Id nName, Value & val)
case NS_ooxml::LN_CT_View_val:
m_pImpl->m_nView = nIntValue;
break;
+ case NS_ooxml::LN_CT_DocVar_name:
+ m_pImpl->m_aDocVars.back().first = sStringValue;
+ break;
+ case NS_ooxml::LN_CT_DocVar_val:
+ m_pImpl->m_aDocVars.back().second = sStringValue;
+ break;
case NS_ooxml::LN_CT_CompatSetting_name:
m_pImpl->m_pCurrentCompatSetting.getArray()[0]
= comphelper::makePropertyValue("name", sStringValue);
@@ -342,6 +350,25 @@ void SettingsTable::lcl_sprm(Sprm& rSprm)
}
}
break;
+ case NS_ooxml::LN_CT_Settings_docVars:
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+ if (pProperties)
+ {
+ pProperties->resolve(*this);
+ }
+ }
+ break;
+ case NS_ooxml::LN_CT_DocVar:
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+ if (pProperties)
+ {
+ m_pImpl->m_aDocVars.push_back(std::make_pair(OUString(), OUString()));
+ pProperties->resolve(*this);
+ }
+ }
+ break;
case NS_ooxml::LN_CT_Compat_noColumnBalance:
m_pImpl->m_bNoColumnBalance = nIntValue;
break;
@@ -572,6 +599,35 @@ void SettingsTable::ApplyProperties(uno::Reference<text::XTextDocument> const& x
}
}
+ // Create or overwrite DocVars based on found in settings
+ if (m_pImpl->m_aDocVars.size())
+ {
+ uno::Reference< text::XTextFieldsSupplier > xFieldsSupplier(xDoc, uno::UNO_QUERY_THROW);
+ uno::Reference< container::XNameAccess > xFieldMasterAccess = xFieldsSupplier->getTextFieldMasters();
+ for (const auto& docVar : m_pImpl->m_aDocVars)
+ {
+ uno::Reference< beans::XPropertySet > xMaster;
+ OUString sFieldMasterService("com.sun.star.text.FieldMaster.User." + docVar.first);
+
+ // Find or create Field Master
+ if (xFieldMasterAccess->hasByName(sFieldMasterService))
+ {
+ xMaster.set(xFieldMasterAccess->getByName(sFieldMasterService), uno::UNO_QUERY_THROW);
+ }
+ else
+ {
+ xMaster.set(xTextFactory->createInstance("com.sun.star.text.FieldMaster.User"), uno::UNO_QUERY_THROW);
+ xMaster->setPropertyValue(getPropertyName(PROP_NAME), uno::Any(docVar.first));
+ uno::Reference<text::XDependentTextField> xField(
+ xTextFactory->createInstance("com.sun.star.text.TextField.User"),
+ uno::UNO_QUERY);
+ xField->attachTextFieldMaster(xMaster);
+ }
+
+ xMaster->setPropertyValue(getPropertyName(PROP_CONTENT), uno::Any(docVar.second));
+ }
+ }
+
// Auto hyphenation: turns on hyphenation by default, <w:suppressAutoHyphens/> may still disable it at a paragraph level.
// Situation is similar for RTF_WIDOWCTRL, which turns on widow / orphan control by default.
if (!(m_pImpl->m_bAutoHyphenation || m_pImpl->m_bNoHyphenateCaps || m_pImpl->m_bWidowControl))