parent
7bb413f0db
commit
1c79122ff6
@ -0,0 +1,203 @@
|
||||
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
|
||||
|
Loading…
Reference in new issue