[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