diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2022-04-05 14:40:53 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2022-04-05 17:16:45 +0200 |
commit | 7c5ca44c48b05ba73defd48057a82db7dc833e0c (patch) | |
tree | ab929795306c5e05bd3e94834e0a67808d607be8 /cui | |
parent | abaa11329822d659581d7860a82308409189f0f5 (diff) |
Expert Configuration: Allow modifying nil values
The Expert Configuration's approach of classifying configuration properties
based on their dynamic css::uno::Any types is hopelessly naive and broken, but
lets add a little hack to at least allow setting a non-nil value for a nillable
property of non-any type that was nil.
(This change was motivated by the comment at
<https://gerrit.libreoffice.org/c/core/+/132495/1..2/officecfg/registry/schema/org/openoffice/Office/Common.xcs#b2394>
"allow to override the generator/producer string in output documents": "The
default value is needed because otherwise the advanced settings editor in
Tools->Configure->Advanced claims the type is 'void' and doesn't allow editing
it."
Change-Id: Ia8eef454919b05bda23e56639e93c765ba3a8b13
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132575
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'cui')
-rw-r--r-- | cui/source/options/optaboutconfig.cxx | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/cui/source/options/optaboutconfig.cxx b/cui/source/options/optaboutconfig.cxx index 728134a55575..226839d20c98 100644 --- a/cui/source/options/optaboutconfig.cxx +++ b/cui/source/options/optaboutconfig.cxx @@ -15,12 +15,18 @@ #include <com/sun/star/configuration/theDefaultProvider.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/beans/NamedValue.hpp> +#include <com/sun/star/beans/UnknownPropertyException.hpp> +#include <com/sun/star/beans/XPropertySetInfo.hpp> #include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/container/XNameReplace.hpp> #include <com/sun/star/container/XHierarchicalName.hpp> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/Type.hxx> +#include <com/sun/star/uno/TypeClass.hpp> #include <com/sun/star/util/XChangesBatch.hpp> #include <com/sun/star/util/SearchFlags.hpp> #include <com/sun/star/util/SearchAlgorithms2.hpp> +#include <cppu/unotype.hxx> #include <rtl/ustrbuf.hxx> #include <unotools/textsearch.hxx> #include <vcl/event.hxx> @@ -582,6 +588,39 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, weld::Button&, void ) OUString sPropertyType = m_xPrefBox->get_text(*m_xScratchIter, 2); OUString sPropertyValue = m_xPrefBox->get_text(*m_xScratchIter, 3); + // If the configuration property has a nil value, determine its static type: + if (sPropertyType == "void") + { + css::uno::Reference<css::beans::XPropertySetInfo> info( + CuiAboutConfigTabPage::getConfigAccess(pUserData->sPropertyPath, false), + css::uno::UNO_QUERY_THROW); + css::uno::Type t; + try { + t = info->getPropertyByName(sPropertyName).Type; + } catch (css::beans::UnknownPropertyException &) { + TOOLS_WARN_EXCEPTION("cui.options", pUserData->sPropertyPath << " " << sPropertyName); + } + // If the configuration property is of type any (or an UnknownPropertyException was caught + // above), stick to "void" for now (ideally, properties of type any would allow setting + // values of arbitrary type, regardless of their current value, in this dialog anyway): + if (t != cppu::UnoType<void>::get()) { + sPropertyType = t.getTypeName(); + switch (t.getTypeClass()) { + case css::uno::TypeClass_BOOLEAN: + sPropertyValue = "false"; + break; + case css::uno::TypeClass_SHORT: + case css::uno::TypeClass_LONG: + case css::uno::TypeClass_HYPER: + case css::uno::TypeClass_DOUBLE: + sPropertyValue = "0"; + break; + default: + break; + } + } + } + auto pProperty = std::make_shared<Prop_Impl>( pUserData->sPropertyPath, sPropertyName, Any( sPropertyValue ) ); bool bSaveChanges = false; @@ -741,6 +780,7 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, weld::Button&, void ) AddToModifiedVector( pProperty ); //update listbox value. + m_xPrefBox->set_text(*m_xScratchIter, sPropertyType, 2); m_xPrefBox->set_text(*m_xScratchIter, sDialogValue, 3); //update m_prefBoxEntries auto it = std::find_if(m_prefBoxEntries.begin(), m_prefBoxEntries.end(), |