tdf#88713 Fix navigating navigator reminders
Change-Id: I65be92eda086af2f98da723828ff965047e87227
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86256
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx
index e5c879b..d6524a5 100644
--- a/sw/source/core/crsr/bookmrk.cxx
+++ b/sw/source/core/crsr/bookmrk.cxx
@@ -336,9 +336,8 @@ namespace sw { namespace mark
}
}
// TODO: everything else uses MarkBase::GenerateNewName ?
NavigatorReminder::NavigatorReminder(const SwPaM& rPaM)
: MarkBase(rPaM, "__NavigatorReminder__")
: MarkBase(rPaM, MarkBase::GenerateNewName("__NavigatorReminder__"))
{ }
UnoMark::UnoMark(const SwPaM& aPaM)
diff --git a/sw/source/uibase/shells/textsh1.cxx b/sw/source/uibase/shells/textsh1.cxx
index 2b063ce..08097fa 100644
--- a/sw/source/uibase/shells/textsh1.cxx
+++ b/sw/source/uibase/shells/textsh1.cxx
@@ -686,8 +686,6 @@ void SwTextShell::Execute(SfxRequest &rReq)
}
case FN_SET_REMINDER:
{
static sal_uInt16 m_nAutoMarkIdx = 0;
// collect and sort navigator reminder names
IDocumentMarkAccess* const pMarkAccess = rWrtSh.getIDocumentMarkAccess();
std::vector< OUString > vNavMarkNames;
@@ -700,17 +698,13 @@ void SwTextShell::Execute(SfxRequest &rReq)
}
std::sort(vNavMarkNames.begin(), vNavMarkNames.end());
// we are maxed out and delete one
// nAutoMarkIdx rotates through the available MarkNames
// we are maxed out so delete the first one
// this assumes that IDocumentMarkAccess generates Names in ascending order
if(vNavMarkNames.size() == MAX_MARKS)
pMarkAccess->deleteMark(pMarkAccess->findMark(vNavMarkNames[m_nAutoMarkIdx]));
pMarkAccess->deleteMark(pMarkAccess->findMark(vNavMarkNames[0]));
rWrtSh.SetBookmark(vcl::KeyCode(), OUString(), IDocumentMarkAccess::MarkType::NAVIGATOR_REMINDER);
SwView::SetActMark( m_nAutoMarkIdx );
if(++m_nAutoMarkIdx == MAX_MARKS)
m_nAutoMarkIdx = 0;
SwView::SetActMark(vNavMarkNames.size() < MAX_MARKS ? vNavMarkNames.size() : MAX_MARKS-1);
break;
}
diff --git a/sw/source/uibase/uiview/viewmdi.cxx b/sw/source/uibase/uiview/viewmdi.cxx
index 4fd706e..1b66014 100644
--- a/sw/source/uibase/uiview/viewmdi.cxx
+++ b/sw/source/uibase/uiview/viewmdi.cxx
@@ -469,26 +469,27 @@ IMPL_LINK( SwView, MoveNavigationHdl, void*, p, void )
rSh.MoveCursor();
rSh.EnterStdMode();
// collect navigator reminders
// collect and sort navigator reminder names
IDocumentMarkAccess* const pMarkAccess = rSh.getIDocumentMarkAccess();
std::vector< const ::sw::mark::IMark* > vNavMarks;
for( IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getAllMarksBegin();
std::vector< OUString > vNavMarkNames;
for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getAllMarksBegin();
ppMark != pMarkAccess->getAllMarksEnd();
++ppMark)
{
if( IDocumentMarkAccess::GetType(**ppMark) == IDocumentMarkAccess::MarkType::NAVIGATOR_REMINDER )
vNavMarks.push_back(*ppMark);
vNavMarkNames.push_back((*ppMark)->GetName());
}
std::sort(vNavMarkNames.begin(), vNavMarkNames.end());
// move
if(!vNavMarks.empty())
if(!vNavMarkNames.empty())
{
SvxSearchDialogWrapper::SetSearchLabel( SearchLabel::Empty );
if(bNext)
{
m_nActMark++;
if (m_nActMark >= MAX_MARKS || m_nActMark >= static_cast<sal_Int32>(vNavMarks.size()))
if (m_nActMark >= MAX_MARKS || m_nActMark >= static_cast<sal_Int32>(vNavMarkNames.size()))
{
m_nActMark = 0;
SvxSearchDialogWrapper::SetSearchLabel( SearchLabel::EndWrapped );
@@ -497,13 +498,13 @@ IMPL_LINK( SwView, MoveNavigationHdl, void*, p, void )
else
{
m_nActMark--;
if (m_nActMark < 0 || m_nActMark >= static_cast<sal_Int32>(vNavMarks.size()))
if (m_nActMark < 0 || m_nActMark >= static_cast<sal_Int32>(vNavMarkNames.size()))
{
m_nActMark = vNavMarks.size()-1;
m_nActMark = vNavMarkNames.size()-1;
SvxSearchDialogWrapper::SetSearchLabel( SearchLabel::StartWrapped );
}
}
rSh.GotoMark(vNavMarks[m_nActMark]);
rSh.GotoMark(vNavMarkNames[m_nActMark]);
}
else
SvxSearchDialogWrapper::SetSearchLabel( SearchLabel::NavElementNotFound );