summaryrefslogtreecommitdiff
path: root/cui
diff options
context:
space:
mode:
authorJim Raykowski <raykowj@gmail.com>2021-01-24 22:17:49 -0900
committerJim Raykowski <raykowj@gmail.com>2021-03-02 22:49:03 +0100
commit5480d9237af1cf25ac464bf49ba364a757fcf6f5 (patch)
treec082c6e96279c10ed6c4243f6bb590a6b29612b7 /cui
parent9ccbf716ba16effb356c97c992d2cd738c44f767 (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.cxx48
-rw-r--r--cui/source/inc/hlmarkwn.hxx2
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;