sfx2/source/devtools/ObjectInspectorTreeHandler.cxx | 81 ++++++++++++++++++++ 1 file changed, 81 insertions(+)
New commits: commit d8cfa8473c9b163747eb9172832fdbcbf886bde8 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Thu Feb 11 16:50:19 2021 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Fri Feb 12 11:21:03 2021 +0100 devtools: handle structs in object inspector Change-Id: I76dd2486c67f7098ae16f5f4f40cebf35573092e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110796 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx b/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx index 65ba40428d7b..8dbc389d2103 100644 --- a/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx +++ b/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx @@ -406,6 +406,21 @@ public: } }; +class StructNode : public BasicValueNode +{ +public: + StructNode(OUString const& rName, uno::Any const& rAny, + uno::Reference<uno::XComponentContext> const& xContext) + : BasicValueNode(rName, rAny, xContext) + { + } + + bool shouldShowExpander() override { return true; } + + void fillChildren(std::unique_ptr<weld::TreeView>& pTree, + weld::TreeIter const& rParent) override; +}; + class SequenceNode : public BasicValueNode { public: @@ -453,6 +468,14 @@ public: } break; + case uno::TypeClass_STRUCT: + { + lclAppendNodeToParent( + pTree, rParent, + new StructNode(OUString::number(i), aCurrentAny, mxContext)); + } + break; + default: { lclAppendNodeToParent( @@ -536,6 +559,13 @@ void GenericPropertiesNode::fillChildren(std::unique_ptr<weld::TreeView>& pTree, } break; + case uno::TypeClass_STRUCT: + { + lclAppendNodeToParent(pTree, rParent, + new StructNode(xProperty.Name, aCurrentAny, mxContext)); + } + break; + default: { lclAppendNodeToParent(pTree, rParent, @@ -546,6 +576,57 @@ void GenericPropertiesNode::fillChildren(std::unique_ptr<weld::TreeView>& pTree, } } +void StructNode::fillChildren(std::unique_ptr<weld::TreeView>& pTree, weld::TreeIter const& rParent) +{ + auto xReflection = reflection::theCoreReflection::get(mxContext); + uno::Reference<reflection::XIdlClass> xClass + = xReflection->forName(maAny.getValueType().getTypeName()); + + const auto xFields = xClass->getFields(); + + for (auto const& xField : xFields) + { + OUString aFieldName = xField->getName(); + uno::Any aFieldValue = xField->get(maAny); + + switch (aFieldValue.getValueType().getTypeClass()) + { + case uno::TypeClass_INTERFACE: + { + auto xInterface = uno::Reference<uno::XInterface>(aFieldValue, uno::UNO_QUERY); + if (xInterface.is()) + { + lclAppendNodeToParent( + pTree, rParent, + new GenericPropertiesNode(aFieldName, aFieldValue, mxContext)); + } + } + break; + + case uno::TypeClass_SEQUENCE: + { + lclAppendNodeToParent(pTree, rParent, + new SequenceNode(aFieldName, aFieldValue, mxContext)); + } + break; + + case uno::TypeClass_STRUCT: + { + lclAppendNodeToParent(pTree, rParent, + new StructNode(aFieldName, aFieldValue, mxContext)); + } + break; + + default: + { + lclAppendNodeToParent(pTree, rParent, + new BasicValueNode(aFieldName, aFieldValue, mxContext)); + } + break; + } + } +} + } // end anonymous namespace ObjectInspectorTreeHandler::ObjectInspectorTreeHandler( _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits