summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2021-01-08 20:09:01 +0900
committerTomaž Vajngerl <quikee@gmail.com>2021-01-13 11:59:29 +0100
commite4a454f8a6e757739145689a445a9516f794b972 (patch)
tree596285c73f785dd8efc4c5a57af6240fc16ea89b /svx
parent9bbf7a1a1029f780e569b5e8df79e86ba5b8c88e (diff)
devtools: Add left-side tree of the document model
This adds the graoundwork for displaying the DOM of the current document as a left-side tree and implements filling in the paragraphs for Writer. The content of the DOM tree is of course a WIP. Change-Id: I99c75b0c46d9a6a4ca398c46de0af759d459b7f7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108976 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'svx')
-rw-r--r--svx/source/devtools/DevelopmentToolDockingWindow.cxx87
-rw-r--r--svx/uiconfig/ui/developmenttool.ui213
2 files changed, 230 insertions, 70 deletions
diff --git a/svx/source/devtools/DevelopmentToolDockingWindow.cxx b/svx/source/devtools/DevelopmentToolDockingWindow.cxx
index b1f66a3037e5..ac97e9134b17 100644
--- a/svx/source/devtools/DevelopmentToolDockingWindow.cxx
+++ b/svx/source/devtools/DevelopmentToolDockingWindow.cxx
@@ -22,6 +22,8 @@
#include <com/sun/star/beans/MethodConcept.hpp>
#include <com/sun/star/reflection/XIdlMethod.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/text/XTextDocument.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
#include <comphelper/processfactory.hxx>
@@ -41,6 +43,8 @@
#include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
+
using namespace css;
namespace
@@ -107,23 +111,104 @@ DevelopmentToolDockingWindow::DevelopmentToolDockingWindow(SfxBindings* pInputBi
"svx/ui/developmenttool.ui")
, mpClassNameLabel(m_xBuilder->weld_label("class_name_value_id"))
, mpClassListBox(m_xBuilder->weld_tree_view("class_listbox_id"))
+ , mpLeftSideTreeView(m_xBuilder->weld_tree_view("leftside_treeview_id"))
{
+ mpLeftSideTreeView->connect_changed(LINK(this, DevelopmentToolDockingWindow, LeftSideSelected));
+
auto* pViewFrame = pInputBindings->GetDispatcher()->GetFrame();
uno::Reference<frame::XController> xController = pViewFrame->GetFrame().GetController();
+ mxRoot = pInputBindings->GetDispatcher()->GetFrame()->GetObjectShell()->GetBaseModel();
+
+ introspect(mxRoot);
+ inspectDocument();
+
uno::Reference<view::XSelectionSupplier> xSupplier(xController, uno::UNO_QUERY);
if (xSupplier.is())
{
uno::Reference<view::XSelectionChangeListener> xChangeListener(
new SelectionChangeHandler(xController, this));
xSupplier->addSelectionChangeListener(xChangeListener);
- introspect(pInputBindings->GetDispatcher()->GetFrame()->GetObjectShell()->GetBaseModel());
+ }
+}
+
+IMPL_LINK_NOARG(DevelopmentToolDockingWindow, LeftSideSelected, weld::TreeView&, void)
+{
+ OUString sID = mpLeftSideTreeView->get_selected_text();
+ auto& rObject = maUnoObjectMap.at(sID);
+ if (rObject.is())
+ introspect(rObject);
+}
+
+void DevelopmentToolDockingWindow::inspectDocument()
+{
+ uno::Reference<lang::XServiceInfo> xDocument(mxRoot, uno::UNO_QUERY_THROW);
+
+ if (xDocument->supportsService("com.sun.star.sheet.SpreadsheetDocument"))
+ {
+ msDocumentType = "Spreadsheet Document";
+ }
+ else if (xDocument->supportsService("com.sun.star.presentation.PresentationDocument"))
+ {
+ msDocumentType = "Presentation Document";
+ }
+ else if (xDocument->supportsService("com.sun.star.drawing.DrawingDocument"))
+ {
+ msDocumentType = "Drawing Document";
+ }
+ else if (xDocument->supportsService("com.sun.star.text.TextDocument")
+ || xDocument->supportsService("com.sun.star.text.WebDocument"))
+ {
+ msDocumentType = "Text Document";
+
+ std::unique_ptr<weld::TreeIter> pParent = mpLeftSideTreeView->make_iterator();
+ mpLeftSideTreeView->insert(nullptr, -1, &msDocumentType, nullptr, nullptr, nullptr, false,
+ pParent.get());
+ maUnoObjectMap.emplace(msDocumentType, xDocument);
+
+ uno::Reference<text::XTextDocument> xTextDocument(xDocument, uno::UNO_QUERY);
+ if (xTextDocument.is())
+ {
+ uno::Reference<container::XEnumerationAccess> xParagraphEnumAccess(
+ xTextDocument->getText()->getText(), uno::UNO_QUERY);
+ if (xParagraphEnumAccess.is())
+ {
+ uno::Reference<container::XEnumeration> xParagraphEnum
+ = xParagraphEnumAccess->createEnumeration();
+ if (xParagraphEnum.is())
+ {
+ sal_Int32 i = 0;
+ std::unique_ptr<weld::TreeIter> pCurrent = mpLeftSideTreeView->make_iterator();
+ while (xParagraphEnum->hasMoreElements())
+ {
+ OUString aString = "Paragraph " + OUString::number(i + 1);
+ mpLeftSideTreeView->insert(pParent.get(), -1, &aString, nullptr, nullptr,
+ nullptr, false, pCurrent.get());
+
+ uno::Reference<text::XTextContent> const xElem(
+ xParagraphEnum->nextElement(), uno::UNO_QUERY);
+ maUnoObjectMap.emplace(aString, xElem);
+
+ i++;
+ }
+ }
+ }
+ }
}
}
DevelopmentToolDockingWindow::~DevelopmentToolDockingWindow() { disposeOnce(); }
+void DevelopmentToolDockingWindow::dispose()
+{
+ mpClassNameLabel.reset();
+ mpClassListBox.reset();
+ mpLeftSideTreeView.reset();
+
+ SfxDockingWindow::dispose();
+}
+
void DevelopmentToolDockingWindow::ToggleFloatingMode()
{
SfxDockingWindow::ToggleFloatingMode();
diff --git a/svx/uiconfig/ui/developmenttool.ui b/svx/uiconfig/ui/developmenttool.ui
index 0a7670f4b94e..926afba3e666 100644
--- a/svx/uiconfig/ui/developmenttool.ui
+++ b/svx/uiconfig/ui/developmenttool.ui
@@ -4,108 +4,183 @@
<requires lib="gtk+" version="3.20"/>
<object class="GtkTreeStore" id="liststore">
<columns>
- <!-- column-name text1 -->
+ <!-- column-name class_column -->
<column type="gchararray"/>
- <!-- column-name text2 -->
+ </columns>
+ </object>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name element_column -->
<column type="gchararray"/>
</columns>
</object>
- <!-- n-columns=2 n-rows=2 -->
+ <!-- n-columns=1 n-rows=1 -->
<object class="GtkGrid" id="DevelopmentTool">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">baseline</property>
- <property name="row-spacing">6</property>
- <property name="column-spacing">6</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="GtkScrolledWindow">
+ <object class="GtkPaned">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
- <property name="shadow-type">in</property>
+ <property name="position">800</property>
+ <property name="wide-handle">True</property>
<child>
- <object class="GtkTreeView" id="class_listbox_id">
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
<property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-top">6</property>
+ <property name="margin-bottom">6</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
- <property name="model">liststore</property>
- <property name="search-column">0</property>
- <property name="enable-tree-lines">True</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection"/>
- </child>
<child>
- <object class="GtkTreeViewColumn" id="treeviewcolumn1">
- <property name="resizable">True</property>
- <property name="title" translatable="yes" context="developmenttool|class">Class</property>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow-type">in</property>
<child>
- <object class="GtkCellRendererText" id="cellrenderertext1">
- <property name="ellipsize">end</property>
+ <object class="GtkTreeView" id="leftside_treeview_id">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="search-column">0</property>
+ <property name="enable-tree-lines">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treecolumn">
+ <property name="resizable">True</property>
+ <property name="title" translatable="yes" context="developmenttool|leftside_elementcolumn">Element</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
</object>
- <attributes>
- <attribute name="sensitive">5</attribute>
- <attribute name="text">0</attribute>
- <attribute name="weight">3</attribute>
- </attributes>
</child>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
</child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=2 n-rows=2 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-top">6</property>
+ <property name="margin-bottom">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
<child>
- <object class="GtkTreeViewColumn" id="treeviewcolumn2">
- <property name="resizable">True</property>
- <property name="title" translatable="yes" context="developmenttool|value">X</property>
+ <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="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow-type">in</property>
<child>
- <object class="GtkCellRendererText" id="cellrenderertext2"/>
- <attributes>
- <attribute name="sensitive">6</attribute>
- <attribute name="text">1</attribute>
- <attribute name="weight">4</attribute>
- </attributes>
+ <object class="GtkTreeView" id="class_listbox_id">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore</property>
+ <property name="search-column">0</property>
+ <property name="enable-tree-lines">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <property name="resizable">True</property>
+ <property name="title" translatable="yes" context="developmenttool|class">Class</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1">
+ <property name="ellipsize">end</property>
+ </object>
+ <attributes>
+ <attribute name="sensitive">5</attribute>
+ <attribute name="text">0</attribute>
+ <attribute name="weight">3</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
</child>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ <property name="width">2</property>
+ </packing>
</child>
</object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">True</property>
+ </packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
- <property name="top-attach">1</property>
- <property name="width">2</property>
+ <property name="top-attach">0</property>
</packing>
</child>
</object>