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 );