include/svx/devtools/DevelopmentToolDockingWindow.hxx |   18 -
 svx/source/devtools/DevelopmentToolDockingWindow.cxx  |  199 +++++++++++-------
 2 files changed, 138 insertions(+), 79 deletions(-)

New commits:
commit 059c9172d99f69a95fea7834623f72d04e2f0618
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Thu Jan 14 23:34:24 2021 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Sat Jan 16 09:10:13 2021 +0100

    devtools: change to on-expand filling of the doc. model tree-view
    
    Instead of traversing the document model at once and filling the
    tree-view, only fill the root element names first, and fill the
    children on expand.
    For example first add "Paragraphs" root node, and when the user
    expands that node, fill the child nodes of the tree with actual
    paragraphs.
    
    Change-Id: Ifa71603a4fa1b69d2b1b590f0d0493e22092deb6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109375
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/include/svx/devtools/DevelopmentToolDockingWindow.hxx 
b/include/svx/devtools/DevelopmentToolDockingWindow.hxx
index 19d286093cd3..159efae16425 100644
--- a/include/svx/devtools/DevelopmentToolDockingWindow.hxx
+++ b/include/svx/devtools/DevelopmentToolDockingWindow.hxx
@@ -32,8 +32,19 @@ private:
 
     std::unordered_map<OUString, css::uno::Reference<css::uno::XInterface>> 
maUnoObjectMap;
 
+    DECL_LINK(ModelTreeViewExpanding, const weld::TreeIter&, bool);
+
     DECL_LINK(LeftSideSelected, weld::TreeView&, void);
 
+    void inspectDocument();
+
+    void clearChildren(weld::TreeIter const& rParent);
+
+    void fillSheets(weld::TreeIter const& rParent);
+    void fillPages(weld::TreeIter const& rParent);
+    void fillSlides(weld::TreeIter const& rParent);
+    void fillParagraphs(weld::TreeIter const& rParent);
+
 public:
     DevelopmentToolDockingWindow(SfxBindings* pBindings, SfxChildWindow* 
pChildWindow,
                                  vcl::Window* pParent);
@@ -44,13 +55,6 @@ public:
 
     virtual void ToggleFloatingMode() override;
 
-    void inspectDocument();
-
-    void inspectSpreadsheet();
-    void inspectPresentation();
-    void inspectDrawing();
-    void inspectText();
-
     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 69bf4682da77..f62d3b6eab25 100644
--- a/svx/source/devtools/DevelopmentToolDockingWindow.cxx
+++ b/svx/source/devtools/DevelopmentToolDockingWindow.cxx
@@ -95,6 +95,11 @@ private:
     SelectionChangeHandler& operator=(const SelectionChangeHandler&) = delete;
 };
 
+void lclAppend(std::unique_ptr<weld::TreeView>& rTree, OUString const& rString)
+{
+    rTree->insert(nullptr, -1, &rString, nullptr, nullptr, nullptr, true, 
nullptr);
+}
+
 } // end anonymous namespace
 
 DevelopmentToolDockingWindow::DevelopmentToolDockingWindow(SfxBindings* 
pInputBindings,
@@ -107,6 +112,8 @@ 
DevelopmentToolDockingWindow::DevelopmentToolDockingWindow(SfxBindings* pInputBi
     , mpLeftSideTreeView(m_xBuilder->weld_tree_view("leftside_treeview_id"))
 {
     mpLeftSideTreeView->connect_changed(LINK(this, 
DevelopmentToolDockingWindow, LeftSideSelected));
+    mpLeftSideTreeView->connect_expanding(
+        LINK(this, DevelopmentToolDockingWindow, ModelTreeViewExpanding));
 
     auto* pViewFrame = pInputBindings->GetDispatcher()->GetFrame();
 
@@ -126,24 +133,66 @@ 
DevelopmentToolDockingWindow::DevelopmentToolDockingWindow(SfxBindings* pInputBi
     }
 }
 
+void DevelopmentToolDockingWindow::clearChildren(weld::TreeIter const& rParent)
+{
+    bool bChild = false;
+    do
+    {
+        bChild = mpLeftSideTreeView->iter_has_child(rParent);
+        if (bChild)
+        {
+            std::unique_ptr<weld::TreeIter> pChild = 
mpLeftSideTreeView->make_iterator(&rParent);
+            bChild = mpLeftSideTreeView->iter_children(*pChild);
+            if (bChild)
+            {
+                mpLeftSideTreeView->remove(*pChild);
+            }
+        }
+    } while (bChild);
+}
+
+IMPL_LINK(DevelopmentToolDockingWindow, ModelTreeViewExpanding, weld::TreeIter 
const&, rParent,
+          bool)
+{
+    OUString aText = mpLeftSideTreeView->get_text(rParent);
+    if (aText == "Paragraphs")
+    {
+        clearChildren(rParent);
+        fillParagraphs(rParent);
+    }
+    else if (aText == "Pages")
+    {
+        clearChildren(rParent);
+        fillPages(rParent);
+    }
+    else if (aText == "Slides")
+    {
+        clearChildren(rParent);
+        fillSlides(rParent);
+    }
+    else if (aText == "Sheets")
+    {
+        clearChildren(rParent);
+        fillSheets(rParent);
+    }
+    return true;
+}
+
 IMPL_LINK_NOARG(DevelopmentToolDockingWindow, LeftSideSelected, 
weld::TreeView&, void)
 {
     OUString sID = mpLeftSideTreeView->get_selected_text();
+    if (maUnoObjectMap.find(sID) == maUnoObjectMap.end())
+        return;
     auto& rObject = maUnoObjectMap.at(sID);
     if (rObject.is())
         introspect(rObject);
 }
 
-void DevelopmentToolDockingWindow::inspectSpreadsheet()
+void DevelopmentToolDockingWindow::fillSheets(weld::TreeIter const& rParent)
 {
-    msDocumentType = "Spreadsheet Document";
-
-    std::unique_ptr<weld::TreeIter> pParent = 
mpLeftSideTreeView->make_iterator();
-    mpLeftSideTreeView->insert(nullptr, -1, &msDocumentType, nullptr, nullptr, 
nullptr, false,
-                               pParent.get());
-    maUnoObjectMap.emplace(msDocumentType, mxRoot);
-
     uno::Reference<sheet::XSpreadsheetDocument> xSheetDoc(mxRoot, 
uno::UNO_QUERY);
+    if (!xSheetDoc.is())
+        return;
     uno::Reference<sheet::XSpreadsheets> xSheets = xSheetDoc->getSheets();
     uno::Reference<container::XIndexAccess> xIndex(xSheets, uno::UNO_QUERY);
     for (sal_Int32 i = 0; i < xIndex->getCount(); ++i)
@@ -153,33 +202,28 @@ void DevelopmentToolDockingWindow::inspectSpreadsheet()
         std::unique_ptr<weld::TreeIter> pCurrentSheet = 
mpLeftSideTreeView->make_iterator();
         OUString aSlideString = "Sheet " + OUString::number(i + 1);
         maUnoObjectMap.emplace(aSlideString, xSheet);
-        mpLeftSideTreeView->insert(pParent.get(), -1, &aSlideString, nullptr, 
nullptr, nullptr,
-                                   false, pCurrentSheet.get());
+        mpLeftSideTreeView->insert(&rParent, -1, &aSlideString, nullptr, 
nullptr, nullptr, false,
+                                   pCurrentSheet.get());
     }
 }
 
-void DevelopmentToolDockingWindow::inspectPresentation()
+void DevelopmentToolDockingWindow::fillPages(weld::TreeIter const& rParent)
 {
-    msDocumentType = "Presentation Document";
-
-    std::unique_ptr<weld::TreeIter> pParent = 
mpLeftSideTreeView->make_iterator();
-    mpLeftSideTreeView->insert(nullptr, -1, &msDocumentType, nullptr, nullptr, 
nullptr, false,
-                               pParent.get());
-    maUnoObjectMap.emplace(msDocumentType, mxRoot);
-
-    uno::Reference<drawing::XShape> xRet;
-
     uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxRoot, 
uno::UNO_QUERY);
+    if (!xDrawPagesSupplier.is())
+        return;
     uno::Reference<drawing::XDrawPages> xDrawPages = 
xDrawPagesSupplier->getDrawPages();
     for (sal_Int32 i = 0; i < xDrawPages->getCount(); ++i)
     {
         uno::Reference<drawing::XDrawPage> xPage(xDrawPages->getByIndex(i), 
uno::UNO_QUERY);
+        if (!xPage.is())
+            continue;
 
         std::unique_ptr<weld::TreeIter> pCurrentPage = 
mpLeftSideTreeView->make_iterator();
-        OUString aPageString = "Slide " + OUString::number(i + 1);
+        OUString aPageString = "Page " + OUString::number(i + 1);
         maUnoObjectMap.emplace(aPageString, xPage);
-        mpLeftSideTreeView->insert(pParent.get(), -1, &aPageString, nullptr, 
nullptr, nullptr,
-                                   false, pCurrentPage.get());
+        mpLeftSideTreeView->insert(&rParent, -1, &aPageString, nullptr, 
nullptr, nullptr, false,
+                                   pCurrentPage.get());
 
         for (sal_Int32 j = 0; j < xPage->getCount(); ++j)
         {
@@ -187,7 +231,7 @@ void DevelopmentToolDockingWindow::inspectPresentation()
 
             OUString aShapeName = xShape->getName();
             if (aShapeName.isEmpty())
-                aShapeName = "Shape " + OUString::number(j);
+                aShapeName = "Shape " + OUString::number(j + 1);
 
             std::unique_ptr<weld::TreeIter> pCurrentShape = 
mpLeftSideTreeView->make_iterator();
             mpLeftSideTreeView->insert(pCurrentPage.get(), -1, &aShapeName, 
nullptr, nullptr,
@@ -197,34 +241,31 @@ void DevelopmentToolDockingWindow::inspectPresentation()
     }
 }
 
-void DevelopmentToolDockingWindow::inspectDrawing()
+void DevelopmentToolDockingWindow::fillSlides(weld::TreeIter const& rParent)
 {
-    msDocumentType = "Drawing Document";
-
-    std::unique_ptr<weld::TreeIter> pParent = 
mpLeftSideTreeView->make_iterator();
-    mpLeftSideTreeView->insert(nullptr, -1, &msDocumentType, nullptr, nullptr, 
nullptr, false,
-                               pParent.get());
-    maUnoObjectMap.emplace(msDocumentType, mxRoot);
-
-    uno::Reference<drawing::XShape> xRet;
-
     uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxRoot, 
uno::UNO_QUERY);
+    if (!xDrawPagesSupplier.is())
+        return;
     uno::Reference<drawing::XDrawPages> xDrawPages = 
xDrawPagesSupplier->getDrawPages();
     for (sal_Int32 i = 0; i < xDrawPages->getCount(); ++i)
     {
         uno::Reference<drawing::XDrawPage> xPage(xDrawPages->getByIndex(i), 
uno::UNO_QUERY);
+        if (!xPage.is())
+            continue;
 
         std::unique_ptr<weld::TreeIter> pCurrentPage = 
mpLeftSideTreeView->make_iterator();
-        OUString aPageString = "Page " + OUString::number(i + 1);
-        maUnoObjectMap.emplace(aPageString, xPage);
-        mpLeftSideTreeView->insert(pParent.get(), -1, &aPageString, nullptr, 
nullptr, nullptr,
-                                   false, pCurrentPage.get());
+        OUString aSlideString = "Slide " + OUString::number(i + 1);
+        maUnoObjectMap.emplace(aSlideString, xPage);
+        mpLeftSideTreeView->insert(&rParent, -1, &aSlideString, nullptr, 
nullptr, nullptr, false,
+                                   pCurrentPage.get());
 
         for (sal_Int32 j = 0; j < xPage->getCount(); ++j)
         {
             uno::Reference<container::XNamed> xShape(xPage->getByIndex(j), 
uno::UNO_QUERY);
 
             OUString aShapeName = xShape->getName();
+            if (aShapeName.isEmpty())
+                aShapeName = "Shape " + OUString::number(j + 1);
 
             std::unique_ptr<weld::TreeIter> pCurrentShape = 
mpLeftSideTreeView->make_iterator();
             mpLeftSideTreeView->insert(pCurrentPage.get(), -1, &aShapeName, 
nullptr, nullptr,
@@ -234,41 +275,35 @@ void DevelopmentToolDockingWindow::inspectDrawing()
     }
 }
 
-void DevelopmentToolDockingWindow::inspectText()
+void DevelopmentToolDockingWindow::fillParagraphs(weld::TreeIter const& 
rParent)
 {
-    msDocumentType = "Text Document";
+    uno::Reference<text::XTextDocument> xDocument(mxRoot, uno::UNO_QUERY);
+    if (!xDocument.is())
+        return;
+    uno::Reference<container::XEnumerationAccess> xParagraphEnumAccess(
+        xDocument->getText()->getText(), uno::UNO_QUERY);
+
+    if (!xParagraphEnumAccess.is())
+        return;
 
-    std::unique_ptr<weld::TreeIter> pParent = 
mpLeftSideTreeView->make_iterator();
-    mpLeftSideTreeView->insert(nullptr, -1, &msDocumentType, nullptr, nullptr, 
nullptr, false,
-                               pParent.get());
-    maUnoObjectMap.emplace(msDocumentType, mxRoot);
+    uno::Reference<container::XEnumeration> xParagraphEnum
+        = xParagraphEnumAccess->createEnumeration();
 
-    uno::Reference<text::XTextDocument> xTextDocument(mxRoot, uno::UNO_QUERY);
-    if (xTextDocument.is())
+    if (xParagraphEnum.is())
     {
-        uno::Reference<container::XEnumerationAccess> xParagraphEnumAccess(
-            xTextDocument->getText()->getText(), uno::UNO_QUERY);
-        if (xParagraphEnumAccess.is())
+        sal_Int32 i = 0;
+        std::unique_ptr<weld::TreeIter> pCurrent = 
mpLeftSideTreeView->make_iterator();
+        while (xParagraphEnum->hasMoreElements())
         {
-            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++;
-                }
-            }
+            OUString aString = "Paragraph " + OUString::number(i + 1);
+            mpLeftSideTreeView->insert(&rParent, -1, &aString, nullptr, 
nullptr, nullptr, false,
+                                       pCurrent.get());
+
+            uno::Reference<text::XTextContent> const 
xElem(xParagraphEnum->nextElement(),
+                                                           uno::UNO_QUERY);
+            maUnoObjectMap.emplace(aString, xElem);
+
+            i++;
         }
     }
 }
@@ -279,20 +314,40 @@ void DevelopmentToolDockingWindow::inspectDocument()
 
     if (xDocument->supportsService("com.sun.star.sheet.SpreadsheetDocument"))
     {
-        inspectSpreadsheet();
+        msDocumentType = "Spreadsheet Document";
+
+        mpLeftSideTreeView->append_text(msDocumentType);
+        maUnoObjectMap.emplace(msDocumentType, mxRoot);
+
+        lclAppend(mpLeftSideTreeView, "Sheets");
     }
     else if 
(xDocument->supportsService("com.sun.star.presentation.PresentationDocument"))
     {
-        inspectPresentation();
+        msDocumentType = "Presentation Document";
+
+        mpLeftSideTreeView->append_text(msDocumentType);
+        maUnoObjectMap.emplace(msDocumentType, mxRoot);
+
+        lclAppend(mpLeftSideTreeView, "Slides");
     }
     else if 
(xDocument->supportsService("com.sun.star.drawing.DrawingDocument"))
     {
-        inspectDrawing();
+        msDocumentType = "Drawing Document";
+
+        mpLeftSideTreeView->append_text(msDocumentType);
+        maUnoObjectMap.emplace(msDocumentType, mxRoot);
+
+        lclAppend(mpLeftSideTreeView, "Pages");
     }
     else if (xDocument->supportsService("com.sun.star.text.TextDocument")
              || xDocument->supportsService("com.sun.star.text.WebDocument"))
     {
-        inspectText();
+        msDocumentType = "Text Document";
+
+        mpLeftSideTreeView->append_text(msDocumentType);
+        maUnoObjectMap.emplace(msDocumentType, mxRoot);
+
+        lclAppend(mpLeftSideTreeView, "Paragraphs");
     }
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to