sc/source/filter/excel/xestream.cxx      |    6 -
 sc/source/ui/docshell/datastream.cxx     |   12 ++
 sc/source/ui/docshell/externalrefmgr.cxx |    6 +
 sc/source/ui/miscdlgs/redcom.cxx         |   10 +-
 sc/source/ui/namedlg/namepast.cxx        |    5 -
 sc/source/ui/undo/undoblk3.cxx           |    3 
 sc/source/ui/unoobj/docuno.cxx           |  132 ++++++++++++++++---------------
 7 files changed, 100 insertions(+), 74 deletions(-)

New commits:
commit 97e93861dd5ed52d742355f043e9cd628c1bc8f8
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Mon Dec 19 12:05:48 2022 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Mon Dec 19 17:37:07 2022 +0000

    sc: check ScDocShell::GetViewData()
    
    ScDocShell: :GetViewData() can return nullptr
    Change-Id: I39bb2dce1ab233f39b0ec687ed71089b35537f9c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144467
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sc/source/filter/excel/xestream.cxx 
b/sc/source/filter/excel/xestream.cxx
index 33e6fa2a8838..75c241493b07 100644
--- a/sc/source/filter/excel/xestream.cxx
+++ b/sc/source/filter/excel/xestream.cxx
@@ -1049,15 +1049,15 @@ bool XclExpXmlStream::exportDocument()
     aRoot.GetOldRoot().pER = &aRoot;
     aRoot.GetOldRoot().eDateiTyp = Biff8;
     // Get the viewsettings before processing
-    if( ScDocShell::GetViewData() )
-        ScDocShell::GetViewData()->WriteExtOptions( mpRoot->GetExtDocOptions() 
);
+    if (ScViewData* pViewData = ScDocShell::GetViewData())
+        pViewData->WriteExtOptions( mpRoot->GetExtDocOptions() );
     else
     {
         // Try to get ScViewData through the current ScDocShell
         ScTabViewShell* pTabViewShell = pShell->GetBestViewShell( false );
         if ( pTabViewShell )
         {
-            ScViewData* pViewData = &pTabViewShell->GetViewData();
+            pViewData = &pTabViewShell->GetViewData();
             pViewData->WriteExtOptions( mpRoot->GetExtDocOptions() );
         }
     }
diff --git a/sc/source/ui/docshell/datastream.cxx 
b/sc/source/ui/docshell/datastream.cxx
index 3003b3cdac2b..4bcbbaf9978c 100644
--- a/sc/source/ui/docshell/datastream.cxx
+++ b/sc/source/ui/docshell/datastream.cxx
@@ -237,8 +237,12 @@ DataStream::Cell::Cell( const Cell& r ) : 
mbValue(r.mbValue)
 
 void DataStream::MakeToolbarVisible()
 {
+    ScViewData* pViewData = ScDocShell::GetViewData();
+    if (!pViewData)
+        return;
+
     css::uno::Reference< css::frame::XFrame > xFrame =
-        
ScDocShell::GetViewData()->GetViewShell()->GetViewFrame()->GetFrame().GetFrameInterface();
+        
pViewData->GetViewShell()->GetViewFrame()->GetFrame().GetFrameInterface();
     if (!xFrame.is())
         return;
 
@@ -523,7 +527,11 @@ bool DataStream::ImportData()
         // We no longer support this mode. To be deleted later.
         return false;
 
-    if (ScDocShell::GetViewData()->GetViewShell()->NeedsRepaint())
+    ScViewData* pViewData = ScDocShell::GetViewData();
+    if (!pViewData)
+        return false;
+
+    if (pViewData->GetViewShell()->NeedsRepaint())
         return mbRunning;
 
     Text2Doc();
diff --git a/sc/source/ui/docshell/externalrefmgr.cxx 
b/sc/source/ui/docshell/externalrefmgr.cxx
index 057cb3e2ae35..933cc1ad5b11 100644
--- a/sc/source/ui/docshell/externalrefmgr.cxx
+++ b/sc/source/ui/docshell/externalrefmgr.cxx
@@ -1482,7 +1482,11 @@ void ScExternalRefLink::Closed()
     else
     {
         // The source document has changed.
-        ScDocShell* pDocShell = ScDocShell::GetViewData()->GetDocShell();
+        ScViewData* pViewData = ScDocShell::GetViewData();
+        if (!pViewData)
+            return ERROR_GENERAL;
+
+        ScDocShell* pDocShell = pViewData->GetDocShell();
         ScDocShellModificator aMod(*pDocShell);
         pMgr->switchSrcFile(mnFileId, aFile, aFilter);
         aMod.SetDocumentModified();
diff --git a/sc/source/ui/miscdlgs/redcom.cxx b/sc/source/ui/miscdlgs/redcom.cxx
index f81da032b481..ef04bd57e1ff 100644
--- a/sc/source/ui/miscdlgs/redcom.cxx
+++ b/sc/source/ui/miscdlgs/redcom.cxx
@@ -137,10 +137,12 @@ void ScRedComDialog::SelectCell()
 
     if(rRange.IsValid(pDocShell->GetDocument()))
     {
-        ScViewData* pViewData=ScDocShell::GetViewData();
-        ScRange aRef=rRange.MakeRange(pDocShell->GetDocument());
-        ScTabView* pTabView=pViewData->GetView();
-        pTabView->MarkRange(aRef);
+        if (ScViewData* pViewData = ScDocShell::GetViewData())
+        {
+            ScRange aRef = rRange.MakeRange(pDocShell->GetDocument());
+            ScTabView* pTabView = pViewData->GetView();
+            pTabView->MarkRange(aRef);
+        }
     }
 }
 
diff --git a/sc/source/ui/namedlg/namepast.cxx 
b/sc/source/ui/namedlg/namepast.cxx
index 491ebe7f79f0..1d144f3fdf5c 100644
--- a/sc/source/ui/namedlg/namepast.cxx
+++ b/sc/source/ui/namedlg/namepast.cxx
@@ -43,8 +43,9 @@ ScNamePasteDlg::ScNamePasteDlg(weld::Window* pParent, 
ScDocShell* pShell)
         m_RangeMap.insert(std::make_pair(aTemp, *pName));
     }
 
-    ScViewData* pViewData = ScDocShell::GetViewData();
-    ScAddress aPos(pViewData->GetCurX(), pViewData->GetCurY(), 
pViewData->GetTabNo());
+    ScAddress aPos;
+    if (ScViewData* pViewData = ScDocShell::GetViewData())
+        aPos = ScAddress(pViewData->GetCurX(), pViewData->GetCurY(), 
pViewData->GetTabNo());
 
     std::unique_ptr<weld::TreeView> 
xTreeView(m_xBuilder->weld_tree_view("ctrl"));
     xTreeView->set_size_request(xTreeView->get_approximate_digit_width() * 75,
diff --git a/sc/source/ui/undo/undoblk3.cxx b/sc/source/ui/undo/undoblk3.cxx
index 8e6978659331..f614e0ff0b4a 100644
--- a/sc/source/ui/undo/undoblk3.cxx
+++ b/sc/source/ui/undo/undoblk3.cxx
@@ -1241,7 +1241,8 @@ void ScUndoConversion::DoChange( ScDocument* pRefDoc, 
const ScAddress& rCursorPo
 
         // Reset the spell checking results to re-check on paint, otherwise
         // we show the previous spelling markers (or lack thereof on 
misspellings).
-        ScDocShell::GetViewData()->GetActiveWin()->ResetAutoSpell();
+        if (ScViewData* pViewData = ScDocShell::GetViewData())
+            pViewData->GetActiveWin()->ResetAutoSpell();
         pDocShell->PostPaintGridAll();
     }
     else
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 9072d2824ce4..c9f8aa64204e 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -568,19 +568,18 @@ void ScModelObj::paintTile( VirtualDevice& rDevice,
 void ScModelObj::setPart( int nPart, bool /*bAllowChangeFocus*/ )
 {
     ScViewData* pViewData = ScDocShell::GetViewData();
-    ScTabView* pTabView = nullptr;
+    if (!pViewData)
+        return;
 
-    if (pViewData)
-        pTabView = pViewData->GetView();
+    ScTabView* pTabView = pViewData->GetView();
+    if (!pTabView)
+        return;
 
-    if (pTabView)
-    {
-        if (SdrView* pDrawView = pViewData->GetViewShell()->GetScDrawView())
-            pDrawView->SetNegativeX(comphelper::LibreOfficeKit::isActive() &&
-                pViewData->GetDocument().IsLayoutRTL(nPart));
+    if (SdrView* pDrawView = pViewData->GetViewShell()->GetScDrawView())
+        pDrawView->SetNegativeX(comphelper::LibreOfficeKit::isActive() &&
+            pViewData->GetDocument().IsLayoutRTL(nPart));
 
-        pTabView->SelectTabPage(nPart + 1);
-    }
+    pTabView->SelectTabPage(nPart + 1);
 }
 
 int ScModelObj::getParts()
@@ -600,6 +599,7 @@ OUString ScModelObj::getPartInfo( int nPart )
     ScViewData* pViewData = ScDocShell::GetViewData();
     if (!pViewData)
         return OUString();
+
     const bool bIsVisible = pViewData->GetDocument().IsVisible(nPart);
     //FIXME: Implement IsSelected().
     const bool bIsSelected = false; 
//pViewData->GetDocument()->IsSelected(nPart);
@@ -617,20 +617,22 @@ OUString ScModelObj::getPartInfo( int nPart )
 
 OUString ScModelObj::getPartName( int nPart )
 {
-    OUString sTabName;
     ScViewData* pViewData = ScDocShell::GetViewData();
     if (!pViewData)
         return OUString();
+
+    OUString sTabName;
     pViewData->GetDocument().GetName(nPart, sTabName);
     return sTabName;
 }
 
 OUString ScModelObj::getPartHash( int nPart )
 {
-    sal_Int64 nHashCode;
     ScViewData* pViewData = ScDocShell::GetViewData();
     if (!pViewData)
         return OUString();
+
+    sal_Int64 nHashCode;
     return (pViewData->GetDocument().GetHashCode(nPart, nHashCode) ? 
OUString::number(nHashCode) : OUString());
 }
 
@@ -789,7 +791,11 @@ void ScModelObj::postMouseEvent(int nType, int nX, int nY, 
int nCount, int nButt
 void ScModelObj::setTextSelection(int nType, int nX, int nY)
 {
     SolarMutexGuard aGuard;
+
     ScViewData* pViewData = ScDocShell::GetViewData();
+    if (!pViewData)
+        return;
+
     ScTabViewShell* pViewShell = pViewData->GetViewShell();
 
     LokChartHelper aChartHelper(pViewShell);
@@ -871,22 +877,24 @@ uno::Reference<datatransfer::XTransferable> 
ScModelObj::getSelection()
     SolarMutexGuard aGuard;
 
     TransferableDataHelper aDataHelper;
-    ScViewData* pViewData = ScDocShell::GetViewData();
     uno::Reference<datatransfer::XTransferable> xTransferable;
 
-    if ( ScEditShell * pShell = dynamic_cast<ScEditShell*>( 
pViewData->GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ) )
-        xTransferable = pShell->GetEditView()->GetTransferable();
-    else if ( nullptr != dynamic_cast<ScDrawTextObjectBar*>( 
pViewData->GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ))
+    if (ScViewData* pViewData = ScDocShell::GetViewData())
     {
-        ScDrawView* pView = pViewData->GetScDrawView();
-        OutlinerView* pOutView = pView->GetTextEditOutlinerView();
-        if (pOutView)
-            xTransferable = pOutView->GetEditView().GetTransferable();
+        if ( ScEditShell * pShell = dynamic_cast<ScEditShell*>( 
pViewData->GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ) )
+            xTransferable = pShell->GetEditView()->GetTransferable();
+        else if ( nullptr != dynamic_cast<ScDrawTextObjectBar*>( 
pViewData->GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ))
+        {
+            ScDrawView* pView = pViewData->GetScDrawView();
+            OutlinerView* pOutView = pView->GetTextEditOutlinerView();
+            if (pOutView)
+                xTransferable = pOutView->GetEditView().GetTransferable();
+        }
+        else if ( ScDrawShell * pDrawShell = dynamic_cast<ScDrawShell*>( 
pViewData->GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ) )
+            xTransferable = pDrawShell->GetDrawView()->CopyToTransferable();
+        else
+            xTransferable = pViewData->GetViewShell()->CopyToTransferable();
     }
-    else if ( ScDrawShell * pDrawShell = dynamic_cast<ScDrawShell*>( 
pViewData->GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ) )
-        xTransferable = pDrawShell->GetDrawView()->CopyToTransferable();
-    else
-        xTransferable = pViewData->GetViewShell()->CopyToTransferable();
 
     if (!xTransferable.is())
         xTransferable.set( aDataHelper.GetTransferable() );
@@ -948,6 +956,9 @@ void ScModelObj::resetSelection()
     SolarMutexGuard aGuard;
 
     ScViewData* pViewData = ScDocShell::GetViewData();
+    if (!pViewData)
+        return;
+
     ScTabViewShell* pViewShell = pViewData->GetViewShell();
 
     // deselect the shapes & texts
@@ -1005,7 +1016,6 @@ static void lcl_sendLOKDocumentBackground(const 
ScViewData* pViewData)
 void ScModelObj::setClientZoom(int nTilePixelWidth_, int nTilePixelHeight_, 
int nTileTwipWidth_, int nTileTwipHeight_)
 {
     ScViewData* pViewData = ScDocShell::GetViewData();
-
     if (!pViewData)
         return;
 
@@ -1037,7 +1047,6 @@ void ScModelObj::setClientZoom(int nTilePixelWidth_, int 
nTilePixelHeight_, int
 void ScModelObj::getRowColumnHeaders(const tools::Rectangle& rRectangle, 
tools::JsonWriter& rJsonWriter)
 {
     ScViewData* pViewData = ScDocShell::GetViewData();
-
     if (!pViewData)
         return;
 
@@ -1052,7 +1061,6 @@ OString ScModelObj::getSheetGeometryData(bool bColumns, 
bool bRows, bool bSizes,
                                          bool bFiltered, bool bGroups)
 {
     ScViewData* pViewData = ScDocShell::GetViewData();
-
     if (!pViewData)
         return "";
 
@@ -1068,7 +1076,6 @@ void ScModelObj::getCellCursor(tools::JsonWriter& 
rJsonWriter)
     SolarMutexGuard aGuard;
 
     ScViewData* pViewData = ScDocShell::GetViewData();
-
     if (!pViewData)
         return;
 
@@ -1128,7 +1135,6 @@ void ScModelObj::setClientVisibleArea(const 
tools::Rectangle& rRectangle)
 void ScModelObj::setOutlineState(bool bColumn, int nLevel, int nIndex, bool 
bHidden)
 {
     ScViewData* pViewData = ScDocShell::GetViewData();
-
     if (!pViewData)
         return;
 
@@ -1159,23 +1165,25 @@ void ScModelObj::getPostIts(tools::JsonWriter& 
rJsonWriter)
         rJsonWriter.put("text", aNote.mpNote->GetText());
 
         // Calculating the cell cursor position
-        ScViewData* pViewData = ScDocShell::GetViewData();
-        ScGridWindow* pGridWindow = pViewData->GetActiveWin();
-        if (pGridWindow)
+        if (ScViewData* pViewData = ScDocShell::GetViewData())
         {
-            SCCOL nX = aNote.maPos.Col();
-            SCROW nY = aNote.maPos.Row();
-            Point aScrPos = pViewData->GetScrPos(nX, nY, 
pViewData->GetActivePart(), true);
-            tools::Long nSizeXPix;
-            tools::Long nSizeYPix;
-            pViewData->GetMergeSizePixel(nX, nY, nSizeXPix, nSizeYPix);
-
-            double fPPTX = pViewData->GetPPTX();
-            double fPPTY = pViewData->GetPPTY();
-            tools::Rectangle aRect(Point(aScrPos.getX() / fPPTX, 
aScrPos.getY() / fPPTY),
-                            Size(nSizeXPix / fPPTX, nSizeYPix / fPPTY));
-
-            rJsonWriter.put("cellPos", aRect.toString());
+            ScGridWindow* pGridWindow = pViewData->GetActiveWin();
+            if (pGridWindow)
+            {
+                SCCOL nX = aNote.maPos.Col();
+                SCROW nY = aNote.maPos.Row();
+                Point aScrPos = pViewData->GetScrPos(nX, nY, 
pViewData->GetActivePart(), true);
+                tools::Long nSizeXPix;
+                tools::Long nSizeYPix;
+                pViewData->GetMergeSizePixel(nX, nY, nSizeXPix, nSizeYPix);
+
+                double fPPTX = pViewData->GetPPTX();
+                double fPPTY = pViewData->GetPPTY();
+                tools::Rectangle aRect(Point(aScrPos.getX() / fPPTX, 
aScrPos.getY() / fPPTY),
+                                Size(nSizeXPix / fPPTX, nSizeYPix / fPPTY));
+
+                rJsonWriter.put("cellPos", aRect.toString());
+            }
         }
     }
 }
@@ -1198,23 +1206,25 @@ void ScModelObj::getPostItsPos(tools::JsonWriter& 
rJsonWriter)
         rJsonWriter.put("tab", aNote.maPos.Tab());
 
         // Calculating the cell cursor position
-        ScViewData* pViewData = ScDocShell::GetViewData();
-        ScGridWindow* pGridWindow = pViewData->GetActiveWin();
-        if (pGridWindow)
+        if (ScViewData* pViewData = ScDocShell::GetViewData())
         {
-            SCCOL nX = aNote.maPos.Col();
-            SCROW nY = aNote.maPos.Row();
-            Point aScrPos = pViewData->GetScrPos(nX, nY, 
pViewData->GetActivePart(), true);
-            tools::Long nSizeXPix;
-            tools::Long nSizeYPix;
-            pViewData->GetMergeSizePixel(nX, nY, nSizeXPix, nSizeYPix);
-
-            double fPPTX = pViewData->GetPPTX();
-            double fPPTY = pViewData->GetPPTY();
-            tools::Rectangle aRect(Point(aScrPos.getX() / fPPTX, 
aScrPos.getY() / fPPTY),
-                            Size(nSizeXPix / fPPTX, nSizeYPix / fPPTY));
-
-            rJsonWriter.put("cellPos", aRect.toString());
+            ScGridWindow* pGridWindow = pViewData->GetActiveWin();
+            if (pGridWindow)
+            {
+                SCCOL nX = aNote.maPos.Col();
+                SCROW nY = aNote.maPos.Row();
+                Point aScrPos = pViewData->GetScrPos(nX, nY, 
pViewData->GetActivePart(), true);
+                tools::Long nSizeXPix;
+                tools::Long nSizeYPix;
+                pViewData->GetMergeSizePixel(nX, nY, nSizeXPix, nSizeYPix);
+
+                double fPPTX = pViewData->GetPPTX();
+                double fPPTY = pViewData->GetPPTY();
+                tools::Rectangle aRect(Point(aScrPos.getX() / fPPTX, 
aScrPos.getY() / fPPTY),
+                                Size(nSizeXPix / fPPTX, nSizeYPix / fPPTY));
+
+                rJsonWriter.put("cellPos", aRect.toString());
+            }
         }
     }
 }

Reply via email to