tdf#131067 Only outline track if an outline entry is selected
This patch ignores outline tracking when other than Headings/outline
content is navigated to from the Navigator.
Change-Id: I3ecbe508b5d641e8f9bd8fe2e70d8ae23f0bf879
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89928
Tested-by: Jenkins
Reviewed-by: Jim Raykowski <raykowj@gmail.com>
diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx
index 250b588..bce33ac 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -2793,50 +2793,54 @@ IMPL_LINK_NOARG(SwContentTree, TimerUpdate, Timer *, void)
// track document outline position at cursor
if (m_nOutlineTracking == 3) // no outline tracking
return;
const SwOutlineNodes::size_type nActPos = GetWrtShell()->GetOutlinePos(MAXLEVEL); // find out where the cursor is
if (nActPos == SwOutlineNodes::npos)
return;
// only track if selection is already an outline
SvTreeListEntry* pFirstSelected = FirstSelected();
if (pFirstSelected && lcl_IsContent(pFirstSelected) &&
static_cast<SwContent*>(pFirstSelected->GetUserData())->GetParent()->GetType() != ContentTypeId::OUTLINE)
return;
if (pFirstSelected && lcl_IsContentType(pFirstSelected) &&
static_cast<SwContentType*>(pFirstSelected->GetUserData())->GetType() != ContentTypeId::OUTLINE)
return;
// find the outline in the tree and select it
for (SvTreeListEntry* pEntry = First(); pEntry; pEntry = Next(pEntry))
{
// cursor is not in an outline position so clear any selections in the tree list
if (FirstSelected())
SelectAll(false);
}
else
{
SvTreeListEntry* pFirstSelected = FirstSelected();
for (SvTreeListEntry* pEntry = First(); pEntry; pEntry = Next(pEntry))
if (lcl_IsContent(pEntry) &&
static_cast<SwContent*>(pEntry->GetUserData())->GetParent()->GetType() == ContentTypeId::OUTLINE)
{
if (lcl_IsContent(pEntry) &&
static_cast<SwContent*>(pEntry->GetUserData())->GetParent()->GetType() == ContentTypeId::OUTLINE)
// might have been scrolled out of view by the user so leave it that way
if (static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos() == nActPos)
{
// might have been scrolled out of view by the user so leave it that way
if (static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos() == nActPos)
// only select if not already selected or tree has multiple entries selected
if (pEntry != pFirstSelected || GetSelectionCount() > 1)
{
// only select if not already selected or tree has multiple entries selected
if (pEntry != pFirstSelected || GetSelectionCount() > 1)
if (m_nOutlineTracking == 2) // focused outline tracking
{
if (m_nOutlineTracking == 2) // focused outline tracking
// collapse to children of root node
for (SvTreeListEntry* pChildEntry = FirstChild(First()); pChildEntry; pChildEntry = Next(pChildEntry))
{
// collapse to children of root node
for (SvTreeListEntry* pChildEntry = FirstChild(First()); pChildEntry; pChildEntry = Next(pChildEntry))
{
if (static_cast<SwContent*>(pChildEntry->GetUserData())->GetParent()->GetType() == ContentTypeId::OUTLINE)
Collapse(pChildEntry);
else
break;
}
if (static_cast<SwContent*>(pChildEntry->GetUserData())->GetParent()->GetType() == ContentTypeId::OUTLINE)
Collapse(pChildEntry);
else
break;
}
SetCurEntry(pEntry); // unselect all entries, make pEntry visible, and select
}
break;
SetCurEntry(pEntry); // unselect all entries, make pEntry visible, and select
}
break;
}
else
{
// use of this break assumes outline content type is first in tree
if (lcl_IsContentType(pEntry) &&
static_cast<SwContentType*>(pEntry->GetUserData())->GetType() != ContentTypeId::OUTLINE)
break;
}
}
else
{
// use of this break assumes outline content type is first in tree
if (lcl_IsContentType(pEntry) &&
static_cast<SwContentType*>(pEntry->GetUserData())->GetType() != ContentTypeId::OUTLINE)
break;
}
}
}