f325b2
From dade1c7a39363610e5f04bf8cd99c9aaf3a33aab Mon Sep 17 00:00:00 2001
f325b2
From: rpmbuild <rpmbuild@fedoraproject.org>
f325b2
Date: Fri, 31 Mar 2017 17:10:46 +0100
f325b2
Subject: [PATCH] Resolves: rhbz#1437537 fix csv a11y
f325b2
f325b2
---
f325b2
 .../ui/Accessibility/AccessibleCsvControl.cxx      | 33 +++++++++++++++++++---
f325b2
 sc/source/ui/inc/AccessibleCsvControl.hxx          |  9 ++++++
f325b2
 3 files changed, 49 insertions(+), 18 deletions(-)
f325b2
 mode change 100644 => 100755 config.sub
f325b2
f325b2
diff --git a/sc/source/ui/Accessibility/AccessibleCsvControl.cxx b/sc/source/ui/Accessibility/AccessibleCsvControl.cxx
f325b2
index bb924f2..4bc75f3 100644
f325b2
--- a/sc/source/ui/Accessibility/AccessibleCsvControl.cxx
f325b2
+++ b/sc/source/ui/Accessibility/AccessibleCsvControl.cxx
f325b2
@@ -865,6 +865,15 @@ ScAccessibleCsvGrid::~ScAccessibleCsvGrid()
f325b2
     implDispose();
f325b2
 }
f325b2
 
f325b2
+void ScAccessibleCsvGrid::disposing()
f325b2
+{
f325b2
+    SolarMutexGuard aGuard;
f325b2
+    for (XAccessibleSet::iterator aI = maAccessibleChildren.begin(); aI != maAccessibleChildren.end(); ++aI)
f325b2
+        aI->second->dispose();
f325b2
+    maAccessibleChildren.clear();
f325b2
+    ScAccessibleCsvControl::disposing();
f325b2
+}
f325b2
+
f325b2
 // XAccessibleComponent -------------------------------------------------------
f325b2
 
f325b2
 Reference< XAccessible > SAL_CALL ScAccessibleCsvGrid::getAccessibleAtPoint( const AwtPoint& rPoint )
f325b2
@@ -882,7 +891,7 @@ Reference< XAccessible > SAL_CALL ScAccessibleCsvGrid::getAccessibleAtPoint( con
f325b2
             lcl_GetApiColumn( rGrid.GetColumnFromX( rPoint.X ) ) : 0;
f325b2
         sal_Int32 nRow = (rPoint.Y >= rGrid.GetHdrHeight()) ?
f325b2
             (rGrid.GetLineFromY( rPoint.Y ) - rGrid.GetFirstVisLine() + 1) : 0;
f325b2
-        xRet = implCreateCellObj( nRow, nColumn );
f325b2
+        xRet = getAccessibleCell(nRow, nColumn);
f325b2
     }
f325b2
     return xRet;
f325b2
 }
f325b2
@@ -912,13 +921,30 @@ sal_Int32 SAL_CALL ScAccessibleCsvGrid::getAccessibleChildCount() throw( Runtime
f325b2
     return implGetCellCount();
f325b2
 }
f325b2
 
f325b2
+Reference<XAccessible> ScAccessibleCsvGrid::getAccessibleCell(sal_Int32 nRow, sal_Int32 nColumn)
f325b2
+{
f325b2
+    sal_Int32 nIndex = implGetIndex(nRow, nColumn);
f325b2
+
f325b2
+    XAccessibleSet::iterator aI = maAccessibleChildren.lower_bound(nIndex);
f325b2
+    if (aI != maAccessibleChildren.end() && !(maAccessibleChildren.key_comp()(nIndex, aI->first)))
f325b2
+    {
f325b2
+        // key already exists
f325b2
+        return Reference<XAccessible>(aI->second.get());
f325b2
+    }
f325b2
+    // key does not exist
f325b2
+    rtl::Reference<ScAccessibleCsvControl> xNew = implCreateCellObj(nRow, nColumn);
f325b2
+    maAccessibleChildren.insert(aI, XAccessibleSet::value_type(nIndex, xNew));
f325b2
+    return Reference<XAccessible>(xNew.get());
f325b2
+}
f325b2
+
f325b2
 Reference< XAccessible > SAL_CALL ScAccessibleCsvGrid::getAccessibleChild( sal_Int32 nIndex )
f325b2
         throw( IndexOutOfBoundsException, RuntimeException, std::exception )
f325b2
 {
f325b2
     SolarMutexGuard aGuard;
f325b2
     ensureAlive();
f325b2
     ensureValidIndex( nIndex );
f325b2
-    return implCreateCellObj( implGetRow( nIndex ), implGetColumn( nIndex ) );
f325b2
+
f325b2
+    return getAccessibleCell(implGetRow(nIndex), implGetColumn(nIndex));
f325b2
 }
f325b2
 
f325b2
 Reference< XAccessibleRelationSet > SAL_CALL ScAccessibleCsvGrid::getAccessibleRelationSet()
f325b2
@@ -1066,7 +1092,7 @@ Reference< XAccessible > SAL_CALL ScAccessibleCsvGrid::getAccessibleCellAt( sal_
f325b2
     SolarMutexGuard aGuard;
f325b2
     ensureAlive();
f325b2
     ensureValidPosition( nRow, nColumn );
f325b2
-    return implCreateCellObj( nRow, nColumn );
f325b2
+    return getAccessibleCell(nRow, nColumn);
f325b2
 }
f325b2
 
f325b2
 Reference< XAccessible > SAL_CALL ScAccessibleCsvGrid::getAccessibleCaption()
f325b2
@@ -1235,7 +1261,6 @@ Sequence< sal_Int8 > SAL_CALL ScAccessibleCsvGrid::getImplementationId() throw(
f325b2
 void ScAccessibleCsvGrid::SendFocusEvent( bool bFocused )
f325b2
 {
f325b2
     ScAccessibleCsvControl::SendFocusEvent( bFocused );
f325b2
-
f325b2
     AccessibleEventObject aEvent;
f325b2
     aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
f325b2
     aEvent.Source = Reference< XAccessible >( this );
f325b2
diff --git a/sc/source/ui/inc/AccessibleCsvControl.hxx b/sc/source/ui/inc/AccessibleCsvControl.hxx
f325b2
index a181c24..870cb3c 100644
f325b2
--- a/sc/source/ui/inc/AccessibleCsvControl.hxx
f325b2
+++ b/sc/source/ui/inc/AccessibleCsvControl.hxx
f325b2
@@ -31,6 +31,7 @@
f325b2
 #include <comphelper/uno3.hxx>
f325b2
 #include <vcl/vclptr.hxx>
f325b2
 #include "AccessibleContextBase.hxx"
f325b2
+#include <map>
f325b2
 
f325b2
 class ScCsvControl;
f325b2
 namespace utl { class AccessibleStateSetHelper; }
f325b2
@@ -304,10 +305,16 @@ class ScAccessibleCsvGrid : public ScAccessibleCsvControl, public ScAccessibleCs
f325b2
 protected:
f325b2
     typedef ::com::sun::star::uno::Reference<
f325b2
         ::com::sun::star::accessibility::XAccessibleTable > XAccessibleTableRef;
f325b2
+    typedef std::map< sal_Int32, rtl::Reference<ScAccessibleCsvControl> > XAccessibleSet;
f325b2
+
f325b2
+private:
f325b2
+    XAccessibleSet maAccessibleChildren;
f325b2
 
f325b2
 public:
f325b2
     explicit                    ScAccessibleCsvGrid( ScCsvGrid& rGrid );
f325b2
     virtual                     ~ScAccessibleCsvGrid();
f325b2
+    using ScAccessibleContextBase::disposing;
f325b2
+    virtual void SAL_CALL       disposing() override;
f325b2
 
f325b2
     // XAccessibleComponent ---------------------------------------------------
f325b2
 
f325b2
@@ -531,6 +538,8 @@ private:
f325b2
     OUString implGetCellText( sal_Int32 nRow, sal_Int32 nColumn ) const;
f325b2
     /** Creates a new accessible object of the specified cell. Indexes must be valid. */
f325b2
     ScAccessibleCsvControl* implCreateCellObj( sal_Int32 nRow, sal_Int32 nColumn ) const;
f325b2
+
f325b2
+    css::uno::Reference<css::accessibility::XAccessible> getAccessibleCell(sal_Int32 nRow, sal_Int32 nColumn);
f325b2
 };
f325b2
 
f325b2
 /** Accessible class representing a cell of the CSV grid control. */
f325b2
-- 
f325b2
1.8.3.1
f325b2