tdf#146617: iterators may be invalidated during handler call

... when the handler decides to remove itself from listeners.

Change-Id: I1d5fe802f50d284bf70d747edaff0a19852c5a7d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128054
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
(cherry picked from commit e9dce4e8cbea04d6c6636a45f5a172e986714409)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128074
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
diff --git a/sc/source/ui/unoobj/viewuno.cxx b/sc/source/ui/unoobj/viewuno.cxx
index 0992594..a287359 100644
--- a/sc/source/ui/unoobj/viewuno.cxx
+++ b/sc/source/ui/unoobj/viewuno.cxx
@@ -544,16 +544,16 @@ void ScTabViewObj::SheetChanged( bool bSameTabButMoved )
        uno::Reference< uno::XInterface > xSource(xView, uno::UNO_QUERY);
        aEvent.Source = xSource;
        aEvent.ActiveSheet = new ScTableSheetObj(pDocSh, rViewData.GetTabNo());
        for (auto it = aActivationListeners.begin(); it != aActivationListeners.end(); )
        // Listener's handler may remove it from the listeners list
        for (size_t i = aActivationListeners.size(); i > 0; --i)
        {
            try
            {
                (*it)->activeSpreadsheetChanged( aEvent );
                ++it;
                aActivationListeners[i - 1]->activeSpreadsheetChanged( aEvent );
            }
            catch( uno::Exception& )
            {
                it = aActivationListeners.erase( it);
                aActivationListeners.erase(aActivationListeners.begin() + (i - 1));
            }
        }
    }
@@ -1149,17 +1149,17 @@ bool ScTabViewObj::MousePressed( const awt::MouseEvent& e )
        aMouseEvent.Target = xTarget;
        aMouseEvent.Modifiers = e.Modifiers;

        for (auto it = aMouseClickHandlers.begin(); it != aMouseClickHandlers.end(); )
        // Listener's handler may remove it from the listeners list
        for (size_t i = aMouseClickHandlers.size(); i > 0; --i)
        {
            try
            {
                if (!(*it)->mousePressed( aMouseEvent ))
                if (!aMouseClickHandlers[i - 1]->mousePressed(aMouseEvent))
                    bReturn = true;
                ++it;
            }
            catch ( uno::Exception& )
            {
                it = aMouseClickHandlers.erase(it);
                aMouseClickHandlers.erase(aMouseClickHandlers.begin() + (i - 1));
            }
        }
    }
@@ -1256,17 +1256,17 @@ bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e )
            aMouseEvent.Target = xTarget;
            aMouseEvent.Modifiers = e.Modifiers;

            for (auto it = aMouseClickHandlers.begin(); it != aMouseClickHandlers.end(); )
            // Listener's handler may remove it from the listeners list
            for (size_t i = aMouseClickHandlers.size(); i > 0; --i)
            {
                try
                {
                    if (!(*it)->mouseReleased( aMouseEvent ))
                    if (!aMouseClickHandlers[i - 1]->mouseReleased( aMouseEvent ))
                        bReturn = true;
                    ++it;
                }
                catch ( uno::Exception& )
                {
                    it = aMouseClickHandlers.erase(it);
                    aMouseClickHandlers.erase(aMouseClickHandlers.begin() + (i - 1));
                }
            }
        }