From 135bdf4ef1a5d256f00bebf1b734ae44544d757c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Fri, 14 Mar 2014 20:28:10 +0000
Subject: [PATCH] Related: rhbz#1076264 intermittent a11y crash in calc

http://retrace.fedoraproject.org/faf/reports/338291/

this crash refuses to be captured alive. But seeing as
we sometimes check mpViewShell against NULL and sometimes check
GetViewData against NULL its worth making those checks everytime
for consistency

see also...

rhbz#923993 rhbz#896711 rhbz#602273 rhbz#577595 lp#811057 lp#760665

(cherry picked from commit fae1e19af05e664364c55d4f686aaab860fd538d)

Conflicts:
	sc/source/ui/Accessibility/AccessibleDocument.cxx

Change-Id: I5553848018f500b63ade60bcfc756a736b27c64f
---
 sc/source/ui/Accessibility/AccessibleDocument.cxx | 70 ++++++++++++++---------
 1 file changed, 43 insertions(+), 27 deletions(-)

diff --git a/sc/source/ui/Accessibility/AccessibleDocument.cxx b/sc/source/ui/Accessibility/AccessibleDocument.cxx
index 6d3b7f8..14ac8fe 100644
--- a/sc/source/ui/Accessibility/AccessibleDocument.cxx
+++ b/sc/source/ui/Accessibility/AccessibleDocument.cxx
@@ -337,13 +337,14 @@ ScChildrenShapes::ScChildrenShapes(ScAccessibleDocument* pAccessibleDocument, Sc
     }
     if (pViewShell)
     {
-        SfxBroadcaster* pDrawBC = pViewShell->GetViewData()->GetDocument()->GetDrawBroadcaster();
+        ScViewData *pViewData = pViewShell->GetViewData();
+        SfxBroadcaster* pDrawBC = pViewData ? pViewData->GetDocument()->GetDrawBroadcaster() : NULL;
         if (pDrawBC)
         {
             StartListening(*pDrawBC);
 
-            maShapeTreeInfo.SetModelBroadcaster( new ScDrawModelBroadcaster(pViewShell->GetViewData()->GetDocument()->GetDrawLayer()) );
-            maShapeTreeInfo.SetSdrView(pViewShell->GetViewData()->GetScDrawView());
+            maShapeTreeInfo.SetModelBroadcaster( new ScDrawModelBroadcaster(pViewData->GetDocument()->GetDrawLayer()) );
+            maShapeTreeInfo.SetSdrView(pViewData->GetScDrawView());
             maShapeTreeInfo.SetController(NULL);
             maShapeTreeInfo.SetWindow(pViewShell->GetWindowByPos(meSplitPos));
             maShapeTreeInfo.SetViewForwarder(mpAccessibleDocument);
@@ -356,7 +357,8 @@ ScChildrenShapes::~ScChildrenShapes()
     std::for_each(maZOrderedShapes.begin(), maZOrderedShapes.end(), Destroy());
     if (mpViewShell)
     {
-        SfxBroadcaster* pDrawBC = mpViewShell->GetViewData()->GetDocument()->GetDrawBroadcaster();
+        ScViewData *pViewData = mpViewShell->GetViewData();
+        SfxBroadcaster* pDrawBC = pViewData ? pViewData->GetDocument()->GetDrawBroadcaster() : NULL;
         if (pDrawBC)
             EndListening(*pDrawBC);
     }
@@ -366,13 +368,14 @@ void ScChildrenShapes::SetDrawBroadcaster()
 {
     if (mpViewShell)
     {
-        SfxBroadcaster* pDrawBC = mpViewShell->GetViewData()->GetDocument()->GetDrawBroadcaster();
+        ScViewData *pViewData = mpViewShell->GetViewData();
+        SfxBroadcaster* pDrawBC = pViewData ? pViewData->GetDocument()->GetDrawBroadcaster() : NULL;
         if (pDrawBC)
         {
             StartListening(*pDrawBC, sal_True);
 
-            maShapeTreeInfo.SetModelBroadcaster( new ScDrawModelBroadcaster(mpViewShell->GetViewData()->GetDocument()->GetDrawLayer()) );
-            maShapeTreeInfo.SetSdrView(mpViewShell->GetViewData()->GetScDrawView());
+            maShapeTreeInfo.SetModelBroadcaster( new ScDrawModelBroadcaster(pViewData->GetDocument()->GetDrawLayer()) );
+            maShapeTreeInfo.SetSdrView(pViewData->GetScDrawView());
             maShapeTreeInfo.SetController(NULL);
             maShapeTreeInfo.SetWindow(mpViewShell->GetWindowByPos(meSplitPos));
             maShapeTreeInfo.SetViewForwarder(mpAccessibleDocument);
@@ -827,7 +830,8 @@ SdrPage* ScChildrenShapes::GetDrawPage() const
     SdrPage* pDrawPage = NULL;
     if (mpViewShell)
     {
-        ScDocument* pDoc = mpViewShell->GetViewData()->GetDocument();
+        ScViewData *pViewData = mpViewShell->GetViewData();
+        ScDocument* pDoc = pViewData ? pViewData->GetDocument() : NULL;
         if (pDoc && pDoc->GetDrawLayer())
         {
             ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
@@ -1239,9 +1243,10 @@ ScAccessibleDocument::ScAccessibleDocument(
                     AddChild( pChildWin->GetAccessible(), false );
             }
         }
-        if (pViewShell->GetViewData()->HasEditView( eSplitPos ))
+        ScViewData *pViewData = pViewShell->GetViewData();
+        if (pViewData && pViewData->HasEditView(eSplitPos))
         {
-            uno::Reference<XAccessible> xAcc = new ScAccessibleEditObject(this, pViewShell->GetViewData()->GetEditView(eSplitPos),
+            uno::Reference<XAccessible> xAcc = new ScAccessibleEditObject(this, pViewData->GetEditView(eSplitPos),
                 pViewShell->GetWindowByPos(eSplitPos), GetCurrentCellName(), GetCurrentCellDescription(),
                 ScAccessibleEditObject::CellInEditMode);
             AddChild(xAcc, false);
@@ -1382,9 +1387,10 @@ void ScAccessibleDocument::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
         }
         else if ((rRef.GetId() == SC_HINT_ACC_ENTEREDITMODE)) // this event comes only on creating edit field of a cell
         {
-            if (mpViewShell && mpViewShell->GetViewData()->HasEditView(meSplitPos))
+            ScViewData *pViewData = mpViewShell ? mpViewShell->GetViewData() : NULL;
+            if (pViewData && pViewData->HasEditView(meSplitPos))
             {
-                mpTempAccEdit = new ScAccessibleEditObject(this, mpViewShell->GetViewData()->GetEditView(meSplitPos),
+                mpTempAccEdit = new ScAccessibleEditObject(this, pViewData->GetEditView(meSplitPos),
                     mpViewShell->GetWindowByPos(meSplitPos), GetCurrentCellName(),
                     OUString(ScResId(STR_ACC_EDITLINE_DESCR)), ScAccessibleEditObject::CellInEditMode);
                 uno::Reference<XAccessible> xAcc = mpTempAccEdit;
@@ -1639,7 +1645,7 @@ void SAL_CALL
     SolarMutexGuard aGuard;
     IsObjectValid();
 
-    if (mpChildrenShapes)
+    if (mpChildrenShapes && mpViewShell)
     {
         sal_Int32 nCount(mpChildrenShapes->GetCount()); //all shapes and the table
         if (mxTempAcc.is())
@@ -1782,7 +1788,7 @@ void SAL_CALL
     SolarMutexGuard aGuard;
     IsObjectValid();
 
-    if (mpChildrenShapes)
+    if (mpChildrenShapes && mpViewShell)
     {
         sal_Int32 nCount(mpChildrenShapes->GetCount()); //all shapes and the table
         if (mxTempAcc.is())
@@ -1861,14 +1867,21 @@ Rectangle ScAccessibleDocument::GetVisibleArea_Impl() const
 {
     Rectangle aVisRect(GetBoundingBox());
 
-    Point aPoint(mpViewShell->GetViewData()->GetPixPos(meSplitPos)); // returns a negative Point
-    aPoint.setX(-aPoint.getX());
-    aPoint.setY(-aPoint.getY());
-    aVisRect.SetPos(aPoint);
+    if (mpViewShell)
+    {
+        ScViewData *pViewData = mpViewShell->GetViewData();
+        if (pViewData)
+        {
+            Point aPoint(pViewData->GetPixPos(meSplitPos)); // returns a negative Point
+            aPoint.setX(-aPoint.getX());
+            aPoint.setY(-aPoint.getY());
+            aVisRect.SetPos(aPoint);
+        }
 
-    ScGridWindow* pWin = static_cast<ScGridWindow*>(mpViewShell->GetWindowByPos(meSplitPos));
-    if (pWin)
-        aVisRect = pWin->PixelToLogic(aVisRect, pWin->GetDrawMapMode());
+        ScGridWindow* pWin = static_cast<ScGridWindow*>(mpViewShell->GetWindowByPos(meSplitPos));
+        if (pWin)
+            aVisRect = pWin->PixelToLogic(aVisRect, pWin->GetDrawMapMode());
+    }
 
     return aVisRect;
 }
@@ -1989,8 +2002,9 @@ Rectangle ScAccessibleDocument::GetBoundingBox() const
 SCTAB ScAccessibleDocument::getVisibleTable() const
 {
     SCTAB nVisibleTable(0);
-    if (mpViewShell && mpViewShell->GetViewData())
-        nVisibleTable = mpViewShell->GetViewData()->GetTabNo();
+    ScViewData *pViewData = mpViewShell ? mpViewShell->GetViewData() : NULL;
+    if (pViewData)
+        nVisibleTable = pViewData->GetTabNo();
     return nVisibleTable;
 }
 
@@ -2020,11 +2034,12 @@ void ScAccessibleDocument::FreeAccessibleSpreadsheet()
 sal_Bool ScAccessibleDocument::IsTableSelected() const
 {
     sal_Bool bResult (false);
-    if(mpViewShell)
+    ScViewData *pViewData = mpViewShell ? mpViewShell->GetViewData() : NULL;
+    if(pViewData)
     {
         SCTAB nTab(getVisibleTable());
         //#103800#; use a copy of MarkData
-        ScMarkData aMarkData(mpViewShell->GetViewData()->GetMarkData());
+        ScMarkData aMarkData(pViewData->GetMarkData());
         aMarkData.MarkToMulti();
         if (aMarkData.IsAllMarked(ScRange(ScAddress(0, 0, nTab),ScAddress(MAXCOL, MAXROW, nTab))))
             bResult = sal_True;
@@ -2084,10 +2099,11 @@ void ScAccessibleDocument::RemoveChild(const uno::Reference<XAccessible>& xAcc,
 OUString ScAccessibleDocument::GetCurrentCellName() const
 {
     OUString sName(SC_RESSTR(STR_ACC_CELL_NAME));
-    if (mpViewShell)
+    ScViewData *pViewData = mpViewShell ? mpViewShell->GetViewData() : NULL;
+    if (pViewData)
     {
         // Document not needed, because only the cell address, but not the tablename is needed
-        OUString sAddress(mpViewShell->GetViewData()->GetCurPos().Format(SCA_VALID, NULL));
+        OUString sAddress(pViewData->GetCurPos().Format(SCA_VALID, NULL));
         sName = sName.replaceFirst("%1", sAddress);
     }
     return sName;
-- 
1.8.5.3