configmgr/source/access.cxx                          |   13 
 configmgr/source/access.hxx                          |    3 
 configmgr/source/node.hxx                            |    4 
 configmgr/source/xcsparser.cxx                       |    2 
 configmgr/source/xcsparser.hxx                       |    1 
 cui/source/options/optaboutconfig.cxx                |  350 +++++++++----------
 offapi/com/sun/star/configuration/XDocumentation.idl |   12 
 7 files changed, 204 insertions(+), 181 deletions(-)

New commits:
commit 700ac29771ccec2d66934f66b45a33a48a5ac3f1
Author:     Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
AuthorDate: Mon Oct 16 11:19:19 2023 +0200
Commit:     Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
CommitDate: Thu Nov 9 15:37:16 2023 +0100

    Use proper type in expert config dialog
    
    In preparation for proper editing support for the different types.
    
    Change-Id: I7044ff100c9bfcca5fa8894ff4525a1aac692796
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158028
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>

diff --git a/configmgr/source/access.cxx b/configmgr/source/access.cxx
index f2b0931b0beb..6ef23a40597b 100644
--- a/configmgr/source/access.cxx
+++ b/configmgr/source/access.cxx
@@ -455,6 +455,19 @@ OUString Access::getDescriptionByHierarchicalName(OUString 
const & aName)
     return child->getNode()->getDescription();
 }
 
+OUString Access::getTypeByHierarchicalName(OUString const & aName)
+{
+    assert(thisIs(IS_ANY));
+    osl::MutexGuard g(*lock_);
+    checkLocalizedPropertyAccess();
+    rtl::Reference< ChildAccess > child(getSubChild(aName));
+    if (!child.is()) {
+        throw css::container::NoSuchElementException(
+            aName, getXWeak());
+    }
+    return child->getNode()->getType();
+}
+
 sal_Bool Access::hasByHierarchicalName(OUString const & aName)
 {
     assert(thisIs(IS_ANY));
diff --git a/configmgr/source/access.hxx b/configmgr/source/access.hxx
index 4efa910b68c5..19276e6aca06 100644
--- a/configmgr/source/access.hxx
+++ b/configmgr/source/access.hxx
@@ -165,6 +165,9 @@ public:
     virtual OUString SAL_CALL getDescriptionByHierarchicalName(
         OUString const & aName) override;
 
+    virtual OUString SAL_CALL getTypeByHierarchicalName(
+        OUString const & aName) override;
+
     virtual sal_Bool SAL_CALL hasByHierarchicalName(OUString const & aName) 
override;
 
     virtual void SAL_CALL replaceByHierarchicalName(
diff --git a/configmgr/source/node.hxx b/configmgr/source/node.hxx
index cce8e3d4abb3..7961d090a4c0 100644
--- a/configmgr/source/node.hxx
+++ b/configmgr/source/node.hxx
@@ -56,6 +56,9 @@ public:
     void setDescription(OUString const& description) { description_ = 
description; };
     OUString getDescription() { return description_; }
 
+    void setType(OUString const& type) { type_ = type; };
+    OUString getType() { return type_; }
+
     rtl::Reference< Node > getMember(OUString const & name);
 
 protected:
@@ -67,6 +70,7 @@ private:
     int layer_;
     int finalized_;
     OUString description_;
+    OUString type_;
 };
 
 }
diff --git a/configmgr/source/xcsparser.cxx b/configmgr/source/xcsparser.cxx
index 4f9cf2ee2ddb..020cdeaabd82 100644
--- a/configmgr/source/xcsparser.cxx
+++ b/configmgr/source/xcsparser.cxx
@@ -313,6 +313,7 @@ void XcsParser::endElement(xmlreader::XmlReader const & 
reader) {
             while (desc.indexOf("  ") != -1)
                 desc = desc.replaceAll("  ", " ");
             top.node->setDescription(desc);
+            top.node->setType(typeName_);
             if (elements_.empty()) {
                 switch (state_) {
                 case STATE_TEMPLATES:
@@ -488,6 +489,7 @@ void XcsParser::handleProp(xmlreader::XmlReader & reader) {
         } else if (attrNsId == ParseManager::NAMESPACE_OOR &&
                    attrLn == "type")
         {
+            typeName_ = reader.getAttributeValue(true).convertFromUtf8();
             valueParser_.type_ = xmldata::parseType(
                 reader, reader.getAttributeValue(true));
         } else if (attrNsId == ParseManager::NAMESPACE_OOR &&
diff --git a/configmgr/source/xcsparser.hxx b/configmgr/source/xcsparser.hxx
index aedcccde1147..7d0e6ca44a0a 100644
--- a/configmgr/source/xcsparser.hxx
+++ b/configmgr/source/xcsparser.hxx
@@ -96,6 +96,7 @@ private:
     ElementStack elements_;
     bool bIsParsingInfo_;
     OUStringBuffer description_;
+    OUString typeName_;
 };
 
 }
diff --git a/cui/source/options/optaboutconfig.cxx 
b/cui/source/options/optaboutconfig.cxx
index 74bf672a3cf1..791856ef2ae5 100644
--- a/cui/source/options/optaboutconfig.cxx
+++ b/cui/source/options/optaboutconfig.cxx
@@ -357,180 +357,220 @@ void CuiAboutConfigTabPage::FillItems(const Reference< 
XNameAccess >& xNameAcces
                 ::comphelper::getProcessComponentContext(), "*");
             beans::Property aProperty;
             bool bReadOnly = false;
+            OUString sFullPath(sPath + "/" + sPropertyName);
             try
             {
-                aProperty = 
m_xReadWriteAccess->getPropertyByHierarchicalName(sPath + "/"
-                                                                              
+ sPropertyName);
-                bReadOnly = (aProperty.Attributes & 
beans::PropertyAttribute::READONLY) != 0;
-            }
+                aProperty = 
m_xReadWriteAccess->getPropertyByHierarchicalName(sFullPath);
+                bReadOnly = (aProperty.Attributes & 
beans::PropertyAttribute::READONLY) != 0;            }
             catch (css::beans::UnknownPropertyException)
             {
-                SAL_WARN("cui.options", "unknown property: " << sPath + "/" + 
sPropertyName);
+                SAL_WARN("cui.options", "unknown property: " << sFullPath);
             }
 
             OUString sTooltip;
+            OUString sType;
+            OUString sDynamicType = aNode.getValueTypeName();
             try
             {
-                Reference<configuration::XDocumentation> xObjProp(xNameAccess, 
UNO_QUERY_THROW);
-                sTooltip = xObjProp->getDescriptionByHierarchicalName(sPath + 
"/" + sPropertyName);
+                Reference<configuration::XDocumentation> 
xDocumentation(xNameAccess, UNO_QUERY_THROW);
+                sTooltip = 
xDocumentation->getDescriptionByHierarchicalName(sPath + "/" + sPropertyName);
+                sType = xDocumentation->getTypeByHierarchicalName(sFullPath);
             }
             catch (css::container::NoSuchElementException)
             {
             }
 
-            OUString sType = aNode.getValueTypeName();
             OUStringBuffer sValue;
 
+            // Fall back to dynamic type when this is empty
+            if (sType.isEmpty())
+            {
+                if (sDynamicType == "boolean")
+                    sType = "xs:boolean";
+                else if (sDynamicType == "short")
+                    sType = "xs:short";
+                else if (sDynamicType == "long")
+                    sType = "xs:int";
+                else if (sDynamicType == "hyper")
+                    sType = "xs:long";
+                else if (sDynamicType == "double")
+                    sType = "xs:double";
+                else if (sDynamicType == "string")
+                    sType = "xs:string";
+                else if (sDynamicType == "[]byte")
+                    sType = "xs:hexBinary";
+                else if (sDynamicType == "[]boolean")
+                    sType = "oor:boolean-list";
+                else if (sDynamicType == "[]short")
+                    sType = "oor:short-list";
+                else if (sDynamicType == "[]long")
+                    sType = "oor:int-list";
+                else if (sDynamicType == "[]hyper")
+                    sType = "oor:long-list";
+                else if (sDynamicType == "[]double")
+                    sType = "oor:double-list";
+                else if (sDynamicType == "[]string")
+                    sType = "oor:string-list";
+                else if (sDynamicType == "[][]byte")
+                    sType = "oor:hexBinary-list";
+            }
+
             if (it != m_modifiedPrefBoxEntries.end())
                 sValue = it->sValue;
             else
             {
-                switch( aNode.getValueType().getTypeClass() )
+                if (aNode.getValueType().getTypeClass() == 
css::uno::TypeClass_VOID)
+                {
+                    // Skip, no value set
+                }
+                else if (sType == "xs:boolean")
+                {
+                    sValue = OUString::boolean(aNode.get<bool>());
+                    sType = "boolean";
+                }
+                else if (sType == "xs:short")
+                {
+                    sValue = OUString::number(aNode.get<sal_Int16>());
+                    sType = "short";
+                }
+                else if (sType == "xs:int" )
+                {
+                    sValue = OUString::number(aNode.get<sal_Int32>());
+                    sType = "int";
+                }
+                else if (sType == "xs:long")
+                {
+                    sValue = OUString::number(aNode.get<sal_Int64>());
+                    sType = "long";
+                }
+                else if (sType == "xs:double" )
+                {
+                    sValue = OUString::number(aNode.get<double>());
+                    sType = "double";
+                }
+                else if (sType == "xs:string")
                 {
-                case css::uno::TypeClass_VOID:
-                    break;
-
-                case css::uno::TypeClass_BOOLEAN:
-                    sValue = OUString::boolean( aNode.get<bool>() );
-                    break;
-
-                case css::uno::TypeClass_SHORT:
-                case css::uno::TypeClass_LONG:
-                case css::uno::TypeClass_HYPER:
-                    sValue = OUString::number( aNode.get<sal_Int64>() );
-                    break;
-
-                case css::uno::TypeClass_DOUBLE:
-                    sValue = OUString::number( aNode.get<double>() );
-                    break;
-
-                case css::uno::TypeClass_STRING:
                     sValue = aNode.get<OUString>();
-                    break;
-
-                case css::uno::TypeClass_SEQUENCE:
-                    if( sType == "[]boolean" )
+                    sType = "string";
+                }
+                else if (sType == "xs:hexBinary")
+                {
+                    const uno::Sequence<sal_Int8> seq = 
aNode.get<uno::Sequence<sal_Int8>>();
+                    for (sal_Int8 j : seq)
                     {
-                        uno::Sequence<sal_Bool> seq = aNode.get< 
uno::Sequence<sal_Bool> >();
-                        for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                        OUString s = 
OUString::number(static_cast<sal_uInt8>(j), 16);
+                        if (s.getLength() == 1)
                         {
-                            if( j != 0 )
-                            {
-                                sValue.append(",");
-                            }
-                            sValue.append(OUString::boolean( seq[j] ));
+                            sValue.append("0");
                         }
+                        sValue.append(s.toAsciiUpperCase());
                     }
-                    else if( sType == "[]byte" )
+                    sType = "hexBinary";
+                }
+                else if (sType == "oor:boolean-list" )
+                {
+                    uno::Sequence<sal_Bool> seq = 
aNode.get<uno::Sequence<sal_Bool>>();
+                    for (sal_Int32 j = 0; j != seq.getLength(); ++j)
                     {
-                        const uno::Sequence<sal_Int8> seq = aNode.get< 
uno::Sequence<sal_Int8> >();
-                        for( sal_Int8 j : seq )
+                        if (j != 0)
                         {
-                            OUString s = OUString::number(
-                                static_cast<sal_uInt8>(j), 16 );
-                            if( s.getLength() == 1 )
-                            {
-                                sValue.append("0");
-                            }
-                            sValue.append(s.toAsciiUpperCase());
+                            sValue.append(",");
                         }
+                        sValue.append(OUString::boolean(seq[j]));
                     }
-                    else if( sType == "[][]byte" )
+                    sType = "boolean-list";
+                }
+                else if (sType == "oor:short-list" )
+                {
+                    uno::Sequence<sal_Int16> seq = 
aNode.get<uno::Sequence<sal_Int16>>();
+                    for (sal_Int32 j = 0; j != seq.getLength(); ++j)
                     {
-                        const uno::Sequence< uno::Sequence<sal_Int8> > seq = 
aNode.get< uno::Sequence< uno::Sequence<sal_Int8> > >();
-                        for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                        if (j != 0)
                         {
-                            if( j != 0 )
-                            {
-                                sValue.append(",");
-                            }
-                            for( sal_Int8 k : seq[j] )
-                            {
-                                OUString s = OUString::number(
-                                    static_cast<sal_uInt8>(k), 16 );
-                                if( s.getLength() == 1 )
-                                {
-                                    sValue.append("0");
-                                }
-                                sValue.append(s.toAsciiUpperCase());
-                            }
+                            sValue.append(",");
                         }
+                        sValue.append(static_cast<sal_Int32>(seq[j]));
                     }
-                    else if( sType == "[]short" )
+                    sType = "short-list";
+                }
+                else if (sType == "oor:int-list")
+                {
+                    uno::Sequence<sal_Int32> seq = 
aNode.get<uno::Sequence<sal_Int32>>();
+                    for (sal_Int32 j = 0; j != seq.getLength(); ++j)
                     {
-                        uno::Sequence<sal_Int16> seq = aNode.get< 
uno::Sequence<sal_Int16> >();
-                        for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                        if (j != 0)
                         {
-                            if( j != 0 )
-                            {
-                                sValue.append(",");
-                            }
-                            sValue.append( static_cast<sal_Int32>(seq[j]) );
+                            sValue.append(",");
                         }
+                        sValue.append(seq[j]);
                     }
-                    else if( sType == "[]long" )
+                    sType = "int-list";
+                }
+                else if (sType == "oor:long-list")
+                {
+                    uno::Sequence<sal_Int64> seq = 
aNode.get<uno::Sequence<sal_Int64>>();
+                    for (sal_Int32 j = 0; j != seq.getLength(); ++j)
                     {
-                        uno::Sequence<sal_Int32> seq = aNode.get< 
uno::Sequence<sal_Int32> >();
-                        for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                        if (j != 0)
                         {
-                            if( j != 0 )
-                            {
-                                sValue.append(",");
-                            }
-                            sValue.append( seq[j] );
+                            sValue.append(",");
                         }
+                        sValue.append(seq[j]);
                     }
-                    else if( sType == "[]hyper" )
+                    sType = "long-list";
+                }
+                else if (sType == "oor:double-list")
+                {
+                    uno::Sequence<double> seq = 
aNode.get<uno::Sequence<double>>();
+                    for (sal_Int32 j = 0; j != seq.getLength(); ++j)
                     {
-                        uno::Sequence<sal_Int64> seq = aNode.get< 
uno::Sequence<sal_Int64> >();
-                        for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                        if (j != 0)
                         {
-                            if( j != 0 )
-                            {
-                                sValue.append(",");
-                            }
-                            sValue.append( seq[j] );
+                            sValue.append(",");
                         }
+                        sValue.append(seq[j]);
                     }
-                    else if( sType == "[]double" )
+                    sType = "double-list";
+                }
+                else if (sType == "oor:string-list")
+                {
+                    uno::Sequence<OUString> seq = 
aNode.get<uno::Sequence<OUString>>();
+                    for (sal_Int32 j = 0; j != seq.getLength(); ++j)
                     {
-                        uno::Sequence<double> seq = aNode.get< 
uno::Sequence<double> >();
-                        for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                        if (j != 0)
                         {
-                            if( j != 0 )
-                            {
-                                sValue.append(",");
-                            }
-                            sValue.append( seq[j] );
+                            sValue.append(",");
                         }
+                        sValue.append(seq[j]);
                     }
-                    else if( sType == "[]string" )
+                    sType = "string-list";
+                }
+                else if (sType == "oor:hexBinary-list" )
+                {
+                    const uno::Sequence<uno::Sequence<sal_Int8>> seq
+                        = aNode.get<uno::Sequence<uno::Sequence<sal_Int8>>>();
+                    for (sal_Int32 j = 0; j != seq.getLength(); ++j)
                     {
-                        uno::Sequence<OUString> seq = aNode.get< 
uno::Sequence<OUString> >();
-                        for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                        if (j != 0)
+                        {
+                            sValue.append(",");
+                        }
+                        for (sal_Int8 k : seq[j])
                         {
-                            if( j != 0 )
+                            OUString s = 
OUString::number(static_cast<sal_uInt8>(k), 16);
+                            if (s.getLength() == 1)
                             {
-                                sValue.append(",");
+                                sValue.append("0");
                             }
-                            sValue.append(seq[j]);
+                            sValue.append(s.toAsciiUpperCase());
                         }
                     }
-                    else
-                    {
-                        SAL_WARN(
-                            "cui.options",
-                            "path \"" << sPath << "\" member " << item
-                                << " of unsupported type " << sType);
-                    }
-                    break;
-
-                default:
-                    SAL_WARN(
-                        "cui.options",
-                        "path \"" << sPath << "\" member " << item
-                            << " of unsupported type " << sType);
-                    break;
+                    sType = "hexBinary-list";
+                }
+                else
+                {
+                    SAL_WARN("cui.options", "path \"" << sPath << "\" member " 
<< item
+                                                      << " of unsupported type 
" << sType);
                 }
             }
 
@@ -651,39 +691,6 @@ 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;
 
@@ -708,10 +715,6 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, 
weld::Button&, void )
         bOpenDialog = false;
         bSaveChanges = true;
     }
-    else if ( sPropertyType == "void" )
-    {
-        bOpenDialog = false;
-    }
     else
     {
         sDialogValue = sPropertyValue;
@@ -726,9 +729,9 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, 
weld::Button&, void )
             int limit=0;
             if( sPropertyType == "short" )
                 limit = SHORT_LEN_LIMIT;
-            else if( sPropertyType == "long" )
+            else if( sPropertyType == "int" )
                 limit = LONG_LEN_LIMIT;
-            else if( sPropertyType == "hyper" )
+            else if( sPropertyType == "long" )
                 limit = HYPER_LEN_LIMIT;
 
             CuiAboutConfigValueDialog aValueDialog(m_xDialog.get(), 
sDialogValue, limit);
@@ -748,18 +751,18 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, 
weld::Button&, void )
                     nShort = static_cast<sal_Int16>(nNumb);
                     pProperty->Value <<= nShort;
                 }
-                else if( sPropertyType == "long" )
+                else if( sPropertyType == "int" )
                 {
                     sal_Int32 nLong = sNewValue.toInt32();
                     if( nLong==0 && sNewValue.getLength()!=1)
-                        throw uno::Exception("out of range long", nullptr);
+                        throw uno::Exception("out of range int", nullptr);
                     pProperty->Value <<= nLong;
                 }
-                else if( sPropertyType == "hyper")
+                else if( sPropertyType == "long")
                 {
                     sal_Int64 nHyper = sNewValue.toInt64();
                     if( nHyper==0 && sNewValue.getLength()!=1)
-                        throw uno::Exception("out of range hyper", nullptr);
+                        throw uno::Exception("out of range long", nullptr);
                     pProperty->Value <<= nHyper;
                 }
                 else if( sPropertyType == "double")
@@ -769,18 +772,11 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, 
weld::Button&, void )
                         throw uno::Exception("out of range double", nullptr);
                     pProperty->Value <<= nDoub;
                 }
-                else if( sPropertyType == "float")
-                {
-                    float nFloat = sNewValue.toFloat();
-                    if( nFloat ==0 && sNewValue.getLength()!=1)
-                        throw uno::Exception("out of range float", nullptr);
-                    pProperty->Value <<= nFloat;
-                }
                 else if( sPropertyType == "string" )
                 {
                     pProperty->Value <<= sNewValue;
                 }
-                else if( sPropertyType == "[]short" )
+                else if( sPropertyType == "short-list" )
                 {
                     //create string sequence from comma separated string
                     //uno::Sequence< OUString > seqStr;
@@ -794,7 +790,7 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, 
weld::Button&, void )
                                    { return 
static_cast<sal_Int16>(str.toInt32()); });
                     pProperty->Value <<= seqShort;
                 }
-                else if( sPropertyType == "[]long" )
+                else if( sPropertyType == "int-list" )
                 {
                     std::vector< OUString > seqStrLong = 
commaStringToSequence( sNewValue );
 
@@ -803,7 +799,7 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, 
weld::Button&, void )
                         [](const auto& str) { return str.toInt32(); });
                     pProperty->Value <<= seqLong;
                 }
-                else if( sPropertyType == "[]hyper" )
+                else if( sPropertyType == "long-list" )
                 {
                     std::vector< OUString > seqStrHyper = 
commaStringToSequence( sNewValue );
                     uno::Sequence< sal_Int64 > seqHyper( seqStrHyper.size() );
@@ -811,7 +807,7 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, 
weld::Button&, void )
                         [](const auto& str) { return str.toInt64(); });
                     pProperty->Value <<= seqHyper;
                 }
-                else if( sPropertyType == "[]double" )
+                else if( sPropertyType == "double-list" )
                 {
                     std::vector< OUString > seqStrDoub = 
commaStringToSequence( sNewValue );
                     uno::Sequence< double > seqDoub( seqStrDoub.size() );
@@ -819,15 +815,7 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, 
weld::Button&, void )
                         [](const auto& str) { return str.toDouble(); });
                     pProperty->Value <<= seqDoub;
                 }
-                else if( sPropertyType == "[]float" )
-                {
-                    std::vector< OUString > seqStrFloat = 
commaStringToSequence( sNewValue );
-                    uno::Sequence< sal_Int16 > seqFloat( seqStrFloat.size() );
-                    std::transform(seqStrFloat.begin(), seqStrFloat.end(), 
seqFloat.getArray(),
-                        [](const auto& str) { return str.toFloat(); });
-                    pProperty->Value <<= seqFloat;
-                }
-                else if( sPropertyType == "[]string" )
+                else if( sPropertyType == "string-list" )
                 {
                     pProperty->Value <<= comphelper::containerToSequence( 
commaStringToSequence( sNewValue ));
                 }
diff --git a/offapi/com/sun/star/configuration/XDocumentation.idl 
b/offapi/com/sun/star/configuration/XDocumentation.idl
index 3bf3c638b141..2ed430a72854 100644
--- a/offapi/com/sun/star/configuration/XDocumentation.idl
+++ b/offapi/com/sun/star/configuration/XDocumentation.idl
@@ -27,6 +27,18 @@ interface XDocumentation {
      */
     string getDescriptionByHierarchicalName( [in] string aName )
             raises( com::sun::star::container::NoSuchElementException );
+
+    /** @returns
+            the type for the requested object
+
+        @param aName
+            the hierarchical name of the object.
+
+        @throws NoSuchElementException
+            if an element under aName does not exist.
+     */
+    string getTypeByHierarchicalName( [in] string aName )
+            raises( com::sun::star::container::NoSuchElementException );
 };
 
 }; }; }; };

Reply via email to