summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
Diffstat (limited to 'sfx2')
-rw-r--r--sfx2/source/devtools/DevelopmentToolDockingWindow.cxx4
-rw-r--r--sfx2/source/devtools/ObjectInspectorTreeHandler.cxx152
-rw-r--r--sfx2/uiconfig/ui/developmenttool.ui123
3 files changed, 218 insertions, 61 deletions
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<ObjectInspectorNodeInterface*>(sID.toInt64()))
+ return pNode;
+
+ return nullptr;
+}
+
+uno::Reference<uno::XInterface> getSelectedXInterface(weld::TreeView const& rTreeView)
+{
+ uno::Reference<uno::XInterface> xInterface;
+
+ if (auto* pNode = getSelectedNode(rTreeView))
+ {
+ if (auto* pBasicValueNode = dynamic_cast<BasicValueNode*>(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<weld::TreeView>& pServicesTreeView,
std::unique_ptr<weld::TreeView>& pPropertiesTreeView,
std::unique_ptr<weld::TreeView>& pMethodsTreeView,
- std::unique_ptr<weld::Label>& pClassNameLabel)
+ std::unique_ptr<weld::Label>& pClassNameLabel,
+ std::unique_ptr<weld::Toolbar>& 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<weld::TreeView>& 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<BasicValueNode*>(pNode))
+ {
+ uno::Any aAny = pBasicValueNode->getAny();
+ uno::Reference<uno::XInterface> 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<weld::Builder> xBuilder(
+ Application::CreateBuilder(mpPropertiesTreeView.get(), "sfx/ui/devtoolsmenu.ui"));
+ std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("inspect_menu"));
- auto* pNode = reinterpret_cast<ObjectInspectorNodeInterface*>(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<BasicValueNode*>(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<uno::XInterface> xInterface(aAny, uno::UNO_QUERY);
- if (xInterface.is())
- {
- std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(
- mpPropertiesTreeView.get(), "sfx/ui/devtoolsmenu.ui"));
- std::unique_ptr<weld::Menu> 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<uno::XInterface> c
}
}
-void ObjectInspectorTreeHandler::introspect(uno::Reference<uno::XInterface> 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<uno::XInterface> const& xInterface)
{
if (!xInterface.is())
return;
@@ -820,6 +913,13 @@ void ObjectInspectorTreeHandler::introspect(uno::Reference<uno::XInterface> cons
mpMethodsTreeView->thaw();
}
+void ObjectInspectorTreeHandler::introspect(uno::Reference<uno::XInterface> 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 @@
</packing>
</child>
<child>
- <!-- n-columns=2 n-rows=2 -->
+ <!-- n-columns=1 n-rows=2 -->
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
@@ -145,38 +145,6 @@
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child>
- <object class="GtkLabel" id="class_name_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">False</property>
- <property name="vexpand">False</property>
- <property name="label" translatable="yes" context="developmenttool|classname">Class name:</property>
- <accessibility>
- <relation type="label-for" target="class_name_value_id"/>
- </accessibility>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="class_name_value_id">
- <property name="name">class_name_id</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
- <property name="selectable">True</property>
- <accessibility>
- <relation type="labelled-by" target="class_name_label"/>
- </accessibility>
- </object>
- <packing>
- <property name="left-attach">1</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
<object class="GtkNotebook">
<property name="visible">True</property>
<property name="can-focus">True</property>
@@ -443,7 +411,94 @@
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
- <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkToolbar" id="object_inspector_toolbar">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="toolbar-style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="back">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes" context="developmenttool|back">Back</property>
+ <property name="label" translatable="yes" context="developmenttool|back">Back</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">cmd/lc_prevrecord.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="inspect">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes" context="developmenttool|inspect">Inspect</property>
+ <property name="label" translatable="yes" context="developmenttool|inspect">Inspect</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">cmd/lc_recsearch.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="class_name_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">False</property>
+ <property name="vexpand">False</property>
+ <property name="xpad">6</property>
+ <property name="ypad">6</property>
+ <property name="label" translatable="yes" context="developmenttool|classname">Class name:</property>
+ <accessibility>
+ <relation type="label-for" target="class_name_value_id"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="class_name_value_id">
+ <property name="name">class_name_id</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <accessibility>
+ <relation type="labelled-by" target="class_name_label"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
</packing>
</child>
</object>