[Libreoffice-commits] core.git: include/svx svx/source svx/uiconfig
Tomaž Vajngerl (via logerrit)
logerrit at kemper.freedesktop.org
Wed Jan 13 11:00:25 UTC 2021
include/svx/devtools/DevelopmentToolDockingWindow.hxx | 14 +
svx/source/devtools/DevelopmentToolDockingWindow.cxx | 87 +++++++
svx/uiconfig/ui/developmenttool.ui | 213 ++++++++++++------
3 files changed, 244 insertions(+), 70 deletions(-)
New commits:
commit e4a454f8a6e757739145689a445a9516f794b972
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Fri Jan 8 20:09:01 2021 +0900
Commit: Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Wed Jan 13 11:59:29 2021 +0100
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 at gmail.com>
diff --git a/include/svx/devtools/DevelopmentToolDockingWindow.hxx b/include/svx/devtools/DevelopmentToolDockingWindow.hxx
index a7c39480cf64..656f51a0fa13 100644
--- a/include/svx/devtools/DevelopmentToolDockingWindow.hxx
+++ b/include/svx/devtools/DevelopmentToolDockingWindow.hxx
@@ -18,6 +18,8 @@
#include <com/sun/star/uno/XInterface.hpp>
#include <com/sun/star/uno/Reference.hxx>
+#include <unordered_map>
+
class SAL_WARN_UNUSED SVX_DLLPUBLIC DevelopmentToolChildWindow final : public SfxChildWindow
{
SFX_DECL_CHILDWINDOW_WITHID(DevelopmentToolChildWindow);
@@ -31,6 +33,14 @@ class SAL_WARN_UNUSED SVX_DLLPUBLIC DevelopmentToolDockingWindow final : public
private:
std::unique_ptr<weld::Label> mpClassNameLabel;
std::unique_ptr<weld::TreeView> mpClassListBox;
+ std::unique_ptr<weld::TreeView> mpLeftSideTreeView;
+
+ css::uno::Reference<css::uno::XInterface> mxRoot;
+ OUString msDocumentType;
+
+ std::unordered_map<OUString, css::uno::Reference<css::uno::XInterface>> maUnoObjectMap;
+
+ DECL_LINK(LeftSideSelected, weld::TreeView&, void);
public:
DevelopmentToolDockingWindow(SfxBindings* pBindings, SfxChildWindow* pChildWindow,
@@ -38,8 +48,12 @@ public:
virtual ~DevelopmentToolDockingWindow() override;
+ virtual void dispose() override;
+
virtual void ToggleFloatingMode() override;
+ void inspectDocument();
+
void introspect(css::uno::Reference<css::uno::XInterface> const& xInterface);
};
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>
More information about the Libreoffice-commits
mailing list