[Libreoffice-commits] core.git: sfx2/source

Tomaž Vajngerl (via logerrit) logerrit at kemper.freedesktop.org
Fri Feb 12 05:36:46 UTC 2021


 sfx2/source/devtools/ObjectInspectorTreeHandler.cxx |   92 +++++++++++++++++++-
 1 file changed, 90 insertions(+), 2 deletions(-)

New commits:
commit b0d9e36d31d5bfa6c5797f5285bf1bf74777c5ed
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Wed Feb 10 18:12:38 2021 +0900
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Fri Feb 12 06:36:09 2021 +0100

    devtools: handle sequences/arrays in object inspector
    
    Change-Id: Ic1d7eb056a7bbf1d88f02dcb92a4798c93ab5036
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110741
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx b/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx
index b536c4a084f4..87e92573fe36 100644
--- a/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx
+++ b/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx
@@ -26,6 +26,7 @@
 #include <com/sun/star/reflection/theCoreReflection.hpp>
 #include <com/sun/star/reflection/XIdlReflection.hpp>
 #include <com/sun/star/reflection/XIdlMethod.hpp>
+#include <com/sun/star/reflection/XIdlArray.hpp>
 
 #include <com/sun/star/script/XInvocation.hpp>
 #include <com/sun/star/script/Invocation.hpp>
@@ -230,6 +231,16 @@ public:
     {
     }
 
+    bool shouldShowExpander() override
+    {
+        if (maAny.hasValue())
+        {
+            auto xInterface = uno::Reference<uno::XInterface>(maAny, uno::UNO_QUERY);
+            return xInterface.is();
+        }
+        return false;
+    }
+
     OUString getObjectName() override { return msName; }
 
     void fillChildren(std::unique_ptr<weld::TreeView>& /*rTree*/,
@@ -286,8 +297,6 @@ public:
     {
     }
 
-    bool shouldShowExpander() override { return true; }
-
     void fillChildren(std::unique_ptr<weld::TreeView>& pTree,
                       weld::TreeIter const& rParent) override;
 };
@@ -300,6 +309,8 @@ public:
         : GenericPropertiesNode("Properties", xObject, uno::Any(), xContext)
     {
     }
+
+    bool shouldShowExpander() override { return true; }
 };
 
 class InterfacesNode : public ObjectInspectorNamedNode
@@ -358,9 +369,78 @@ public:
     }
 };
 
+class SequenceNode : public ObjectInspectorNodeInterface
+{
+private:
+    OUString maString;
+    uno::Any maAny;
+    uno::Reference<uno::XComponentContext> mxContext;
+
+public:
+    SequenceNode(OUString const& rString, uno::Any const& rAny,
+                 uno::Reference<uno::XComponentContext> const& xContext)
+        : maString(rString)
+        , maAny(rAny)
+        , mxContext(xContext)
+    {
+    }
+
+    bool shouldShowExpander() override { return true; }
+
+    OUString getObjectName() override { return maString; }
+
+    void fillChildren(std::unique_ptr<weld::TreeView>& pTree,
+                      weld::TreeIter const& rParent) override
+    {
+        auto xReflection = reflection::theCoreReflection::get(mxContext);
+        uno::Reference<reflection::XIdlClass> xClass
+            = xReflection->forName(maAny.getValueType().getTypeName());
+        uno::Reference<reflection::XIdlArray> xIdlArray = xClass->getArray();
+
+        int nLength = xIdlArray->getLen(maAny);
+
+        for (int i = 0; i < nLength; i++)
+        {
+            uno::Any aCurrentAny = xIdlArray->get(maAny, i);
+            uno::Reference<uno::XInterface> xCurrent;
+            if (aCurrentAny.hasValue())
+            {
+                auto xInterface = uno::Reference<uno::XInterface>(aCurrentAny, uno::UNO_QUERY);
+                if (xInterface.is())
+                    xCurrent = xInterface;
+            }
+
+            lclAppendNodeToParent(
+                pTree, rParent,
+                new GenericPropertiesNode(OUString::number(i), xCurrent, aCurrentAny, mxContext));
+        }
+    }
+
+    std::vector<std::pair<sal_Int32, OUString>> getColumnValues() override
+    {
+        auto xReflection = reflection::theCoreReflection::get(mxContext);
+        uno::Reference<reflection::XIdlClass> xClass
+            = xReflection->forName(maAny.getValueType().getTypeName());
+        uno::Reference<reflection::XIdlArray> xIdlArray = xClass->getArray();
+
+        int nLength = xIdlArray->getLen(maAny);
+
+        OUString aValue = "0 to " + OUString::number(nLength - 1);
+        OUString aType = getAnyType(maAny, mxContext);
+
+        return {
+            { 1, aValue },
+            { 2, aType },
+        };
+    }
+};
+
 void GenericPropertiesNode::fillChildren(std::unique_ptr<weld::TreeView>& pTree,
                                          weld::TreeIter const& rParent)
 {
+    if (!mxObject.is())
+        return;
+
     uno::Reference<beans::XIntrospection> xIntrospection = beans::theIntrospection::get(mxContext);
     auto xIntrospectionAccess = xIntrospection->inspect(uno::makeAny(mxObject));
     auto xInvocationFactory = css::script::Invocation::create(mxContext);
@@ -398,12 +478,19 @@ void GenericPropertiesNode::fillChildren(std::unique_ptr<weld::TreeView>& pTree,
             }
         }
 
+        uno::TypeClass eTypeClass = aAny.getValueType().getTypeClass();
+
         if (bComplex)
         {
             lclAppendNodeToParent(
                 pTree, rParent,
                 new GenericPropertiesNode(xProperty.Name, xCurrent, aAny, mxContext));
         }
+        else if (eTypeClass == uno::TypeClass_SEQUENCE)
+        {
+            lclAppendNodeToParent(pTree, rParent,
+                                  new SequenceNode(xProperty.Name, aAny, mxContext));
+        }
         else
         {
             lclAppendNodeToParent(
@@ -412,6 +499,7 @@ void GenericPropertiesNode::fillChildren(std::unique_ptr<weld::TreeView>& pTree,
         }
     }
 }
+
 } // end anonymous namespace
 
 ObjectInspectorTreeHandler::ObjectInspectorTreeHandler(


More information about the Libreoffice-commits mailing list