tdf#155376 weakly cache ScAccessibleCell

the macOS accessibility framework repeatedly queries and enumerates
all of the visible cells.
Every time this happens we create a new set of ScAccessibleCell,
which then live until the application shuts down, which then
causes a very slow shutdown.

So I fix the problem by caching the ScAccessibleCell so we return
the same one for a given cell position.

Of course, this begs the question of why the ScAccessibleCell
objects are not dying when we create new ones, which means we have
some kind of leak or lifecycle problem somewhere, but anyhow,
this is a fairly simple and comprehensive fix.

Change-Id: Id2765236ac4524f490a51b56268fb8038612fd43
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152932
Tested-by: Jenkins
Reviewed-by: Patrick Luby <plubius@neooffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
(cherry picked from commit f22cb3dfab413a2917cd810b8e1b8f644a016327)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153025
diff --git a/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx b/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx
index 38e9fb7..03b92c3 100644
--- a/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx
+++ b/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx
@@ -913,7 +913,9 @@ rtl::Reference<ScAccessibleCell> ScAccessibleSpreadsheet::GetAccessibleCellAt(sa
            return m_pAccFormulaCell;
        }
        else
        {
            return ScAccessibleCell::create(this, mpViewShell, aCellAddress, GetAccessibleIndexFormula(nRow, nColumn), meSplitPos, mpAccDoc);
        }
    }
    else
    {
@@ -924,7 +926,17 @@ rtl::Reference<ScAccessibleCell> ScAccessibleSpreadsheet::GetAccessibleCellAt(sa
            return mpAccCell;
        }
        else
            return ScAccessibleCell::create(this, mpViewShell, aCellAddress, getAccessibleIndex(nRow, nColumn), meSplitPos, mpAccDoc);
        {
            rtl::Reference<ScAccessibleCell> xCell;
            auto it = m_mapCells.find(aCellAddress);
            if (it != m_mapCells.end())
                xCell = it->second.get();
            if (xCell)
                return xCell;
            xCell = ScAccessibleCell::create(this, mpViewShell, aCellAddress, getAccessibleIndex(nRow, nColumn), meSplitPos, mpAccDoc);
            m_mapCells.insert(std::make_pair(aCellAddress, xCell));
            return xCell;
        }
    }
}

diff --git a/sc/source/ui/inc/AccessibleSpreadsheet.hxx b/sc/source/ui/inc/AccessibleSpreadsheet.hxx
index 78e7359..cfe604c 100644
--- a/sc/source/ui/inc/AccessibleSpreadsheet.hxx
+++ b/sc/source/ui/inc/AccessibleSpreadsheet.hxx
@@ -22,6 +22,7 @@
#include <sal/config.h>

#include <rtl/ref.hxx>
#include <unotools/weakref.hxx>

#include "AccessibleTableBase.hxx"
#include "viewdata.hxx"
@@ -267,6 +268,8 @@ private:
    OUString      m_strCurCellValue;
    ScRangeList   m_LastMarkedRanges;
    OUString      m_strOldTabName;
    std::map<ScAddress, unotools::WeakReference< ScAccessibleCell > >
                 m_mapCells;
};

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/osx/a11ytablewrapper.mm b/vcl/osx/a11ytablewrapper.mm
index 6f8775f..1c15531 100644
--- a/vcl/osx/a11ytablewrapper.mm
+++ b/vcl/osx/a11ytablewrapper.mm
@@ -19,7 +19,7 @@


#include <osx/a11yfactory.h>

#include <sal/log.hxx>
#include "a11ytablewrapper.h"

using namespace ::com::sun::star::accessibility;
@@ -79,6 +79,7 @@ using namespace ::com::sun::star::uno;
                    sal_Int32 columnTopLeft = accessibleTable -> getAccessibleColumn ( idxTopLeft );
                    sal_Int32 rowBottomRight = accessibleTable -> getAccessibleRow ( idxBottomRight );
                    sal_Int32 columnBottomRight = accessibleTable -> getAccessibleColumn ( idxBottomRight );
                    SAL_WARN("vcl", "creating " << ((rowBottomRight - rowTopLeft) * (columnBottomRight - columnTopLeft)) << " cells");
                    // create an array containing the visible cells
                    for ( sal_Int32 rowCount = rowTopLeft; rowCount <= rowBottomRight; rowCount++ )
                    {