From eb3789bd35e9dc62e92008467bfaa0650cd8d6be Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Thu, 25 Feb 2021 20:58:42 +0900 Subject: devtools: object inspector toolbar and object stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change adds a toolbar to the object inspector with buttons for inspect (which just links to the same action added to the context menu) and back. Back uses the newly added object stack to return to the previously inspected object. Only the objects which we used the "inspect" command in the object inspector tree are added to the object stack. Change-Id: Icb5b6e841200d6e0e41e260092a195fc84729d0f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111532 Tested-by: Tomaž Vajngerl Reviewed-by: Tomaž Vajngerl --- .../devtools/DevelopmentToolDockingWindow.cxx | 4 +- .../source/devtools/ObjectInspectorTreeHandler.cxx | 152 +++++++++++++++++---- sfx2/uiconfig/ui/developmenttool.ui | 123 ++++++++++++----- 3 files changed, 218 insertions(+), 61 deletions(-) (limited to 'sfx2') diff --git a/sfx2/source/devtools/DevelopmentToolDockingWindow.cxx b/sfx2/source/devtools/DevelopmentToolDockingWindow.cxx index 6bd92f17256d..d7d02198d331 100644 --- a/sfx2/source/devtools/DevelopmentToolDockingWindow.cxx +++ b/sfx2/source/devtools/DevelopmentToolDockingWindow.cxx @@ -34,11 +34,12 @@ DevelopmentToolDockingWindow::DevelopmentToolDockingWindow(SfxBindings* pInputBi , mpMethodsTreeView(m_xBuilder->weld_tree_view("methods_treeview_id")) , mpDocumentModelTreeView(m_xBuilder->weld_tree_view("leftside_treeview_id")) , mpSelectionToggle(m_xBuilder->weld_toggle_button("selection_toggle")) + , mpObjectInspectorToolbar(m_xBuilder->weld_toolbar("object_inspector_toolbar")) , maDocumentModelTreeHandler( mpDocumentModelTreeView, pInputBindings->GetDispatcher()->GetFrame()->GetObjectShell()->GetBaseModel()) , maObjectInspectorTreeHandler(mpInterfacesTreeView, mpServicesTreeView, mpPropertiesTreeView, - mpMethodsTreeView, mpClassNameLabel) + mpMethodsTreeView, mpClassNameLabel, mpObjectInspectorToolbar) { mpDocumentModelTreeView->connect_changed( LINK(this, DevelopmentToolDockingWindow, DocumentModelTreeViewSelectionHandler)); @@ -116,6 +117,7 @@ void DevelopmentToolDockingWindow::dispose() mpMethodsTreeView.reset(); mpSelectionToggle.reset(); mpDocumentModelTreeView.reset(); + mpObjectInspectorToolbar.reset(); SfxDockingWindow::dispose(); } diff --git a/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx b/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx index 54cebc87c2a4..c100ed5fff31 100644 --- a/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx +++ b/sfx2/source/devtools/ObjectInspectorTreeHandler.cxx @@ -593,6 +593,34 @@ ObjectInspectorNodeInterface* BasicValueNode::createNodeObjectForAny(OUString co return new BasicValueNode(rName, rAny, mxContext); } +ObjectInspectorNodeInterface* getSelectedNode(weld::TreeView const& rTreeView) +{ + OUString sID = rTreeView.get_selected_id(); + if (sID.isEmpty()) + return nullptr; + + if (auto* pNode = reinterpret_cast(sID.toInt64())) + return pNode; + + return nullptr; +} + +uno::Reference getSelectedXInterface(weld::TreeView const& rTreeView) +{ + uno::Reference xInterface; + + if (auto* pNode = getSelectedNode(rTreeView)) + { + if (auto* pBasicValueNode = dynamic_cast(pNode)) + { + uno::Any aAny = pBasicValueNode->getAny(); + xInterface.set(aAny, uno::UNO_QUERY); + } + } + + return xInterface; +} + } // end anonymous namespace ObjectInspectorTreeHandler::ObjectInspectorTreeHandler( @@ -600,12 +628,14 @@ ObjectInspectorTreeHandler::ObjectInspectorTreeHandler( std::unique_ptr& pServicesTreeView, std::unique_ptr& pPropertiesTreeView, std::unique_ptr& pMethodsTreeView, - std::unique_ptr& pClassNameLabel) + std::unique_ptr& pClassNameLabel, + std::unique_ptr& pObjectInspectorToolbar) : mpInterfacesTreeView(pInterfacesTreeView) , mpServicesTreeView(pServicesTreeView) , mpPropertiesTreeView(pPropertiesTreeView) , mpMethodsTreeView(pMethodsTreeView) , mpClassNameLabel(pClassNameLabel) + , mpObjectInspectorToolbar(pObjectInspectorToolbar) { mpInterfacesTreeView->connect_expanding( LINK(this, ObjectInspectorTreeHandler, ExpandingHandlerInterfaces)); @@ -618,6 +648,16 @@ ObjectInspectorTreeHandler::ObjectInspectorTreeHandler( mpPropertiesTreeView->connect_popup_menu( LINK(this, ObjectInspectorTreeHandler, PopupMenuHandler)); + + mpInterfacesTreeView->connect_changed(LINK(this, ObjectInspectorTreeHandler, SelectionChanged)); + mpServicesTreeView->connect_changed(LINK(this, ObjectInspectorTreeHandler, SelectionChanged)); + mpPropertiesTreeView->connect_changed(LINK(this, ObjectInspectorTreeHandler, SelectionChanged)); + mpMethodsTreeView->connect_changed(LINK(this, ObjectInspectorTreeHandler, SelectionChanged)); + + mpObjectInspectorToolbar->connect_clicked( + LINK(this, ObjectInspectorTreeHandler, ToolbarButtonClicked)); + mpObjectInspectorToolbar->set_item_sensitive("inspect", false); + mpObjectInspectorToolbar->set_item_sensitive("back", false); } void ObjectInspectorTreeHandler::handleExpanding(std::unique_ptr& pTreeView, @@ -659,41 +699,69 @@ IMPL_LINK(ObjectInspectorTreeHandler, ExpandingHandlerMethods, weld::TreeIter co return true; } +IMPL_LINK(ObjectInspectorTreeHandler, SelectionChanged, weld::TreeView&, rTreeView, void) +{ + bool bHaveNodeWithObject = false; + + if (mpPropertiesTreeView.get() == &rTreeView) + { + auto* pNode = getSelectedNode(rTreeView); + if (auto* pBasicValueNode = dynamic_cast(pNode)) + { + uno::Any aAny = pBasicValueNode->getAny(); + uno::Reference xInterface(aAny, uno::UNO_QUERY); + bHaveNodeWithObject = xInterface.is(); + } + } + + mpObjectInspectorToolbar->set_item_sensitive("inspect", bHaveNodeWithObject); +} + IMPL_LINK(ObjectInspectorTreeHandler, PopupMenuHandler, const CommandEvent&, rCommandEvent, bool) { if (rCommandEvent.GetCommand() != CommandEventId::ContextMenu) return false; - uno::Any aAny; - OUString sID = mpPropertiesTreeView->get_selected_id(); - if (sID.isEmpty()) - return false; + auto xInterface = getSelectedXInterface(*mpPropertiesTreeView); + if (xInterface.is()) + { + std::unique_ptr xBuilder( + Application::CreateBuilder(mpPropertiesTreeView.get(), "sfx/ui/devtoolsmenu.ui")); + std::unique_ptr xMenu(xBuilder->weld_menu("inspect_menu")); - auto* pNode = reinterpret_cast(sID.toInt64()); - if (pNode) + OString sCommand( + xMenu->popup_at_rect(mpPropertiesTreeView.get(), + tools::Rectangle(rCommandEvent.GetMousePosPixel(), Size(1, 1)))); + + if (sCommand == "inspect") + { + addToStack(uno::Any(xInterface)); + inspectObject(xInterface); + } + } + return true; +} + +IMPL_LINK(ObjectInspectorTreeHandler, ToolbarButtonClicked, const OString&, rSelectionId, void) +{ + if (rSelectionId == "inspect") { - auto* pBasicValueNode = dynamic_cast(pNode); - if (pBasicValueNode) + auto xInterface = getSelectedXInterface(*mpPropertiesTreeView); + if (xInterface.is()) + { + addToStack(uno::Any(xInterface)); + inspectObject(xInterface); + } + } + else if (rSelectionId == "back") + { + uno::Any aAny = popFromStack(); + if (aAny.hasValue()) { - aAny = pBasicValueNode->getAny(); uno::Reference xInterface(aAny, uno::UNO_QUERY); - if (xInterface.is()) - { - std::unique_ptr xBuilder(Application::CreateBuilder( - mpPropertiesTreeView.get(), "sfx/ui/devtoolsmenu.ui")); - std::unique_ptr xMenu(xBuilder->weld_menu("inspect_menu")); - - OString sCommand(xMenu->popup_at_rect( - mpPropertiesTreeView.get(), - tools::Rectangle(rCommandEvent.GetMousePosPixel(), Size(1, 1)))); - if (sCommand == "inspect") - { - introspect(xInterface); - } - } + inspectObject(xInterface); } } - return true; } void ObjectInspectorTreeHandler::clearObjectInspectorChildren( @@ -784,7 +852,32 @@ void ObjectInspectorTreeHandler::appendMethods(uno::Reference c } } -void ObjectInspectorTreeHandler::introspect(uno::Reference const& xInterface) +void ObjectInspectorTreeHandler::updateBackButtonState() +{ + mpObjectInspectorToolbar->set_item_sensitive("back", maInspectionStack.size() > 1); +} + +void ObjectInspectorTreeHandler::clearStack() +{ + maInspectionStack.clear(); + updateBackButtonState(); +} + +void ObjectInspectorTreeHandler::addToStack(css::uno::Any const& rAny) +{ + maInspectionStack.push_back(rAny); + updateBackButtonState(); +} + +css::uno::Any ObjectInspectorTreeHandler::popFromStack() +{ + maInspectionStack.pop_back(); + uno::Any aAny = maInspectionStack.back(); + updateBackButtonState(); + return aAny; +} + +void ObjectInspectorTreeHandler::inspectObject(uno::Reference const& xInterface) { if (!xInterface.is()) return; @@ -820,6 +913,13 @@ void ObjectInspectorTreeHandler::introspect(uno::Reference cons mpMethodsTreeView->thaw(); } +void ObjectInspectorTreeHandler::introspect(uno::Reference const& xInterface) +{ + clearStack(); + addToStack(uno::Any(xInterface)); + inspectObject(xInterface); +} + void ObjectInspectorTreeHandler::dispose() { clearAll(mpInterfacesTreeView); diff --git a/sfx2/uiconfig/ui/developmenttool.ui b/sfx2/uiconfig/ui/developmenttool.ui index 3eeb94859885..a234169405e8 100644 --- a/sfx2/uiconfig/ui/developmenttool.ui +++ b/sfx2/uiconfig/ui/developmenttool.ui @@ -134,7 +134,7 @@ - + True False @@ -144,38 +144,6 @@ 6 True True - - - True - False - False - False - Class name: - - - - - - 0 - 0 - - - - - class_name_id - True - False - True - True - - - - - - 1 - 0 - - True @@ -443,7 +411,94 @@ 0 1 - 2 + + + + + True + False + + + True + False + icons + + + True + False + Back + Back + True + cmd/lc_prevrecord.png + + + False + True + + + + + True + False + Inspect + Inspect + True + cmd/lc_recsearch.png + + + False + True + + + + + False + True + 0 + + + + + True + False + False + False + 6 + 6 + Class name: + + + + + + False + True + 1 + + + + + class_name_id + True + False + True + True + 0 + 0.5 + + + + + + False + True + 2 + + + + + 0 + 0 -- cgit