You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
9.3 KiB
204 lines
9.3 KiB
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
|
|
|