diff options
author | Jim Raykowski <raykowj@gmail.com> | 2021-01-24 22:17:49 -0900 |
---|---|---|
committer | Jim Raykowski <raykowj@gmail.com> | 2021-03-02 22:49:03 +0100 |
commit | 5480d9237af1cf25ac464bf49ba364a757fcf6f5 (patch) | |
tree | c082c6e96279c10ed6c4243f6bb590a6b29612b7 /cui | |
parent | 9ccbf716ba16effb356c97c992d2cd738c44f767 (diff) |
tdf#114567 tdf#138934 Hyperlink-Target in Doc Headings expand/collapse
Provides parent child expand/collapse for Headings in the Hyperlink-
Target in Document dialog target treeview
Change-Id: I8cc57b4cbf3830cec76d64a0ef587e199c39e360
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109930
Tested-by: Jenkins
Reviewed-by: Jim Raykowski <raykowj@gmail.com>
Diffstat (limited to 'cui')
-rw-r--r-- | cui/source/dialogs/hlmarkwn.cxx | 48 | ||||
-rw-r--r-- | cui/source/inc/hlmarkwn.hxx | 2 |
2 files changed, 47 insertions, 3 deletions
diff --git a/cui/source/dialogs/hlmarkwn.cxx b/cui/source/dialogs/hlmarkwn.cxx index 8996c0e6790c..cdc1039cab18 100644 --- a/cui/source/dialogs/hlmarkwn.cxx +++ b/cui/source/dialogs/hlmarkwn.cxx @@ -283,6 +283,9 @@ bool SvxHlinkDlgMarkWnd::RefreshFromDoc(const OUString& aURL) // Fill Tree-Control int SvxHlinkDlgMarkWnd::FillTree( const uno::Reference< container::XNameAccess >& xLinks, const weld::TreeIter* pParentEntry ) { + // used to create the Headings outline parent children tree view relation + std::stack<std::pair<std::unique_ptr<weld::TreeIter>, const sal_Int32>> aHeadingsParentEntryStack; + int nEntries=0; const uno::Sequence< OUString > aNames( xLinks->getElementNames() ); const sal_Int32 nLinks = aNames.getLength(); @@ -331,7 +334,50 @@ int SvxHlinkDlgMarkWnd::FillTree( const uno::Reference< container::XNameAccess > OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pData))); std::unique_ptr<weld::TreeIter> xEntry(mxLbTree->make_iterator()); - mxLbTree->insert(pParentEntry, -1, &aStrDisplayname, &sId, nullptr, nullptr, false, xEntry.get()); + if (pParentEntry) + { + OUString sContentType = mxLbTree->get_text(*pParentEntry); + if (sContentType == "Headings") + { + if (aHeadingsParentEntryStack.empty()) + aHeadingsParentEntryStack.push( + std::pair(mxLbTree->make_iterator(pParentEntry), -1)); + + // get the headings name to display + aAny = xTarget->getPropertyValue("ActualOutlineName"); + OUString sActualOutlineName; + aAny >>= sActualOutlineName; + + // get the headings outline level + aAny = xTarget->getPropertyValue("OutlineLevel"); + sal_Int32 nOutlineLevel; + aAny >>= nOutlineLevel; + + // pop until the top of stack entry has an outline level less than + // the to be inserted heading outline level + while (nOutlineLevel <= aHeadingsParentEntryStack.top().second) + aHeadingsParentEntryStack.pop(); + + mxLbTree->insert(aHeadingsParentEntryStack.top().first.get(), -1, + &sActualOutlineName, &sId, nullptr, nullptr, false, + xEntry.get()); + + // push if the inserted entry is a child + if (nOutlineLevel > aHeadingsParentEntryStack.top().second) + aHeadingsParentEntryStack.push( + std::pair(std::move(xEntry), nOutlineLevel)); + } + else + { + mxLbTree->insert(pParentEntry, -1, &aStrDisplayname, &sId, nullptr, + nullptr, false, xEntry.get()); + } + } + else + { + mxLbTree->insert(pParentEntry, -1, &aStrDisplayname, &sId, nullptr, nullptr, + false, xEntry.get()); + } try { diff --git a/cui/source/inc/hlmarkwn.hxx b/cui/source/inc/hlmarkwn.hxx index 9552bc10097c..d88dddab208d 100644 --- a/cui/source/inc/hlmarkwn.hxx +++ b/cui/source/inc/hlmarkwn.hxx @@ -30,8 +30,6 @@ class SvxHyperlinkTabPageBase; class SvxHlinkDlgMarkWnd : public weld::GenericDialogController { private: - friend class SvxHlmarkTreeLBox; - SvxHyperlinkTabPageBase* mpParent; sal_uInt16 mnError; |