diff options
author | Jim Raykowski <raykowj@gmail.com> | 2020-09-26 21:18:48 -0800 |
---|---|---|
committer | Jim Raykowski <raykowj@gmail.com> | 2020-09-30 05:22:02 +0200 |
commit | f4f0ea6a41e99e12812a791f732694c8e86acb8c (patch) | |
tree | 6b6c6ef257024dc14b49f85893d6eaeb5e8892bb /sw/source/uibase/utlui/content.cxx | |
parent | 28ed472e4e15348cb9a7ee9b43a22b1c92836471 (diff) |
tdf#137013 fix Writer find toolbar ui regressions
introduced by enhancement patch tdf#132366
Change-Id: I951fcd7891c75e7fbf715581c316b4446d967cd9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103499
Tested-by: Jenkins
Reviewed-by: Jim Raykowski <raykowj@gmail.com>
Diffstat (limited to 'sw/source/uibase/utlui/content.cxx')
-rw-r--r-- | sw/source/uibase/utlui/content.cxx | 139 |
1 files changed, 75 insertions, 64 deletions
diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx index 353ee2bad359..422133559c45 100644 --- a/sw/source/uibase/utlui/content.cxx +++ b/sw/source/uibase/utlui/content.cxx @@ -2719,6 +2719,9 @@ void SwContentTree::Notify(SfxBroadcaster & rBC, SfxHint const& rHint) } switch (rHint.GetId()) { + case SfxHintId::SwNavigatorUpdateTracking: + UpdateTracking(); + break; case SfxHintId::SwNavigatorSelectOutlinesWithSelections: { if (m_nRootType == ContentTypeId::OUTLINE) @@ -3115,82 +3118,90 @@ IMPL_LINK_NOARG(SwContentTree, TimerUpdate, Timer *, void) Display(true); } - // 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 - std::unique_ptr<weld::TreeIter> xFirstSelected(m_xTreeView->make_iterator()); - if (!m_xTreeView->get_selected(xFirstSelected.get())) - xFirstSelected.reset(); - if (xFirstSelected && lcl_IsContent(*xFirstSelected, *m_xTreeView) && - reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xFirstSelected).toInt64())->GetParent()->GetType() != ContentTypeId::OUTLINE) - return; - if (xFirstSelected && lcl_IsContentType(*xFirstSelected, *m_xTreeView) && - reinterpret_cast<SwContentType*>(m_xTreeView->get_id(*xFirstSelected).toInt64())->GetType() != ContentTypeId::OUTLINE) - return; - - int nSelectedRows = m_xTreeView->count_selected_rows(); - - // find the outline in the tree and select it - m_xTreeView->all_foreach([this, nSelectedRows, nActPos, &xFirstSelected](weld::TreeIter& rEntry){ - bool bRet = false; - - if (lcl_IsContent(rEntry, *m_xTreeView) && - reinterpret_cast<SwContent*>(m_xTreeView->get_id(rEntry).toInt64())->GetParent()->GetType() == ContentTypeId::OUTLINE) + UpdateTracking(); + } + else if (!pView && State::ACTIVE == m_eState && !m_bIsIdleClear) + { + if(m_pActiveShell) + { + SetActiveShell(nullptr); + } + clear(); + m_bIsIdleClear = true; + } +} + +void SwContentTree::UpdateTracking() +{ + if (State::HIDDEN == m_eState) + return; + + // 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 + std::unique_ptr<weld::TreeIter> xFirstSelected(m_xTreeView->make_iterator()); + if (!m_xTreeView->get_selected(xFirstSelected.get())) + xFirstSelected.reset(); + if (xFirstSelected && lcl_IsContent(*xFirstSelected, *m_xTreeView) && + reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xFirstSelected).toInt64())->GetParent()->GetType() != ContentTypeId::OUTLINE) + return; + if (xFirstSelected && lcl_IsContentType(*xFirstSelected, *m_xTreeView) && + reinterpret_cast<SwContentType*>(m_xTreeView->get_id(*xFirstSelected).toInt64())->GetType() != ContentTypeId::OUTLINE) + return; + + int nSelectedRows = m_xTreeView->count_selected_rows(); + + // find the outline in the tree and select it + m_xTreeView->all_foreach([this, nSelectedRows, nActPos, &xFirstSelected](weld::TreeIter& rEntry){ + bool bRet = false; + + if (lcl_IsContent(rEntry, *m_xTreeView) && + reinterpret_cast<SwContent*>(m_xTreeView->get_id(rEntry).toInt64())->GetParent()->GetType() == ContentTypeId::OUTLINE) + { + // might have been scrolled out of view by the user so leave it that way + if (reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(rEntry).toInt64())->GetOutlinePos() == nActPos) { - // might have been scrolled out of view by the user so leave it that way - if (reinterpret_cast<SwOutlineContent*>(m_xTreeView->get_id(rEntry).toInt64())->GetOutlinePos() == nActPos) + // only select if not already selected or tree has multiple entries selected + if (nSelectedRows != 1 || m_xTreeView->iter_compare(rEntry, *xFirstSelected) != 0) { - // only select if not already selected or tree has multiple entries selected - if (nSelectedRows != 1 || m_xTreeView->iter_compare(rEntry, *xFirstSelected) != 0) + if (m_nOutlineTracking == 2) // focused outline tracking { - if (m_nOutlineTracking == 2) // focused outline tracking + // collapse to children of root node + std::unique_ptr<weld::TreeIter> xChildEntry(m_xTreeView->make_iterator()); + if (m_xTreeView->get_iter_first(*xChildEntry) && m_xTreeView->iter_children(*xChildEntry)) { - // collapse to children of root node - std::unique_ptr<weld::TreeIter> xChildEntry(m_xTreeView->make_iterator()); - if (m_xTreeView->get_iter_first(*xChildEntry) && m_xTreeView->iter_children(*xChildEntry)) + do { - do - { - if (reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xChildEntry).toInt64())->GetParent()->GetType() == ContentTypeId::OUTLINE) - m_xTreeView->collapse_row(*xChildEntry); - else - break; - } - while (m_xTreeView->iter_next(*xChildEntry)); + if (reinterpret_cast<SwContent*>(m_xTreeView->get_id(*xChildEntry).toInt64())->GetParent()->GetType() == ContentTypeId::OUTLINE) + m_xTreeView->collapse_row(*xChildEntry); + else + break; } + while (m_xTreeView->iter_next(*xChildEntry)); } - m_xTreeView->set_cursor(rEntry); // unselect all entries, make pEntry visible, and select - Select(); } - bRet = true; + m_xTreeView->set_cursor(rEntry); // unselect all entries, make pEntry visible, and select + Select(); } + bRet = true; } - else - { - // use of this break assumes outline content type is first in tree - if (lcl_IsContentType(rEntry, *m_xTreeView) && - reinterpret_cast<SwContentType*>(m_xTreeView->get_id(rEntry).toInt64())->GetType() != ContentTypeId::OUTLINE) - bRet = true; - } - - return bRet; - }); - } - else if (!pView && State::ACTIVE == m_eState && !m_bIsIdleClear) - { - if(m_pActiveShell) + } + else { - SetActiveShell(nullptr); + // use of this break assumes outline content type is first in tree + if (lcl_IsContentType(rEntry, *m_xTreeView) && + reinterpret_cast<SwContentType*>(m_xTreeView->get_id(rEntry).toInt64())->GetType() != ContentTypeId::OUTLINE) + bRet = true; } - clear(); - m_bIsIdleClear = true; - } + + return bRet; + }); } void SwContentTree::SelectOutlinesWithSelection() |