tdf#153859 sw: crash fix for setting chart with deleted data table

Opening Data Ranges dialog window of a chart with
deleted data table crashed Writer immediately.

Follow-up to commit 5b9855acc7fa6d1e4a5f53ff0bc47e1dd4729827
"tdf#132714 sw: fix crash at table row deletion associated
to a chart".

Change-Id: I96e901db75d40ae234f58827a957204bca13aa92
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147893
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
(cherry picked from commit e706698353a7187f46ddbf0faf1f6f7772753df6)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147904
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/chart2/source/controller/dialogs/DialogModel.cxx b/chart2/source/controller/dialogs/DialogModel.cxx
index 564343c..d6d1fbd 100644
--- a/chart2/source/controller/dialogs/DialogModel.cxx
+++ b/chart2/source/controller/dialogs/DialogModel.cxx
@@ -631,13 +631,20 @@ void DialogModel::setCategories( const Reference< chart2::data::XLabeledDataSequ

OUString DialogModel::getCategoriesRange() const
{
    uno::Reference< chart2::data::XLabeledDataSequence > xLSeq( getCategories());
    OUString aRange;
    if( xLSeq.is())
    try
    {
        Reference< data::XDataSequence > xSeq( xLSeq->getValues());
        if( xSeq.is())
            aRange = xSeq->getSourceRangeRepresentation();
        uno::Reference< chart2::data::XLabeledDataSequence > xLSeq( getCategories());
        if( xLSeq.is())
        {
            Reference< data::XDataSequence > xSeq( xLSeq->getValues());
            if( xSeq.is())
                aRange = xSeq->getSourceRangeRepresentation();
        }
    }
    catch (const lang::DisposedException&)
    {
        TOOLS_WARN_EXCEPTION( "chart2", "unexpected exception caught" );
    }
    return aRange;
}
diff --git a/sw/qa/uitest/writer_tests7/tdf132714.py b/sw/qa/uitest/writer_tests7/tdf132714.py
index 7ccedbe..cad8ff2 100644
--- a/sw/qa/uitest/writer_tests7/tdf132714.py
+++ b/sw/qa/uitest/writer_tests7/tdf132714.py
@@ -66,4 +66,32 @@ class tdf132714(UITestCase):
            # Without the fix in place, this test would have crashed here
            xToolkitRobot.mouseMove(xMouseEvent)

    def test_data_ranges(self):
        with self.ui_test.load_file(get_url_for_data_file("tdf132714.odt")) as document:

            # delete second row (first data row) in the associated text table of the chart
            self.xUITest.executeCommand(".uno:GoDown")
            self.xUITest.executeCommand(".uno:GoDown")
            # Without the fix in place, at this point crash occurs.
            self.xUITest.executeCommand(".uno:DeleteTable")

            # select embedded chart
            self.assertEqual(1, document.EmbeddedObjects.Count)
            document.CurrentController.select(document.getEmbeddedObjects().getByIndex(0))
            self.assertEqual("SwXTextEmbeddedObject", document.CurrentSelection.getImplementationName())

            xChartMainTop = self.xUITest.getTopFocusWindow()
            xWriterEdit = xChartMainTop.getChild("writer_edit")
            # edit object by pressing Enter
            xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE":"RETURN"}))

            # open DataRanges dialog window
            xChartMain = xChartMainTop.getChild("chart_window")
            xSeriesObj =  xChartMain.getChild("CID/Page=")

            # Without the fix in place, this test would have crashed here
            with self.ui_test.execute_dialog_through_action(xSeriesObj, "COMMAND", mkPropertyValues({"COMMAND": "DataRanges"})) as xDialog:
                pass


# vim: set shiftwidth=4 softtabstop=4 expandtab: