diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2021-01-14 23:34:24 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2021-01-16 09:10:13 +0100 |
commit | 059c9172d99f69a95fea7834623f72d04e2f0618 (patch) | |
tree | 70573b3f15232dc1a9c53964dfd054781594cb43 /svx | |
parent | a93d26fb1eaa185f5eec774f85a76deedd0205e6 (diff) |
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 <quikee@gmail.com>
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/devtools/DevelopmentToolDockingWindow.cxx | 199 |
1 files changed, 127 insertions, 72 deletions
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"); } } |