diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2015-07-31 17:34:56 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2015-07-31 17:38:40 +0200 |
commit | 8b0109f28e48c8ba3fc2d77467351ec2c7b87629 (patch) | |
tree | b2bbbcd19c0218ad466548c9f890ed9890c34487 /chart2 | |
parent | 161f7533ac177c25516ec206233936bd6982e3df (diff) |
avoid crash when chart model is disposed
Change-Id: I70c3a06e2aa9112cd5a47b7d8839c4bd701cfc1e
Diffstat (limited to 'chart2')
12 files changed, 78 insertions, 22 deletions
diff --git a/chart2/source/controller/sidebar/ChartAreaPanel.cxx b/chart2/source/controller/sidebar/ChartAreaPanel.cxx index 233371a47c82..3230e7c32534 100644 --- a/chart2/source/controller/sidebar/ChartAreaPanel.cxx +++ b/chart2/source/controller/sidebar/ChartAreaPanel.cxx @@ -236,7 +236,8 @@ ChartAreaPanel::ChartAreaPanel(vcl::Window* pParent, mxModel(pController->getModel()), mxListener(new ChartSidebarModifyListener(this)), mxSelectionListener(new ChartSidebarSelectionListener(this)), - mbUpdate(true) + mbUpdate(true), + mbModelValid(true) { std::vector<ObjectType> aAcceptedTypes { OBJECTTYPE_PAGE, OBJECTTYPE_DIAGRAM, OBJECTTYPE_DATA_SERIES, OBJECTTYPE_TITLE, OBJECTTYPE_LEGEND}; mxSelectionListener->setAcceptedTypes(aAcceptedTypes); @@ -366,7 +367,7 @@ void ChartAreaPanel::setFillStyleAndBitmap(const XFillStyleItem* pStyleItem, void ChartAreaPanel::updateData() { - if (!mbUpdate) + if (!mbUpdate || !mbModelValid) return; css::uno::Reference<css::beans::XPropertySet> xPropSet = getPropSet(mxModel); @@ -423,6 +424,7 @@ void ChartAreaPanel::updateData() void ChartAreaPanel::modelInvalid() { + mbModelValid = false; } void ChartAreaPanel::selectionChanged(bool bCorrectType) @@ -438,10 +440,14 @@ void ChartAreaPanel::SelectionInvalid() void ChartAreaPanel::updateModel( css::uno::Reference<css::frame::XModel> xModel) { - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->removeModifyListener(mxListener); + if (mbModelValid) + { + css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->removeModifyListener(mxListener); + } mxModel = xModel; + mbModelValid = true; css::uno::Reference<css::util::XModifyBroadcaster> xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW); xBroadcasterNew->addModifyListener(mxListener); diff --git a/chart2/source/controller/sidebar/ChartAreaPanel.hxx b/chart2/source/controller/sidebar/ChartAreaPanel.hxx index 2d2920e27ff9..48df2ace78c7 100644 --- a/chart2/source/controller/sidebar/ChartAreaPanel.hxx +++ b/chart2/source/controller/sidebar/ChartAreaPanel.hxx @@ -91,6 +91,7 @@ private: void Initialize(); bool mbUpdate; + bool mbModelValid; }; } } // end of namespace svx::sidebar diff --git a/chart2/source/controller/sidebar/ChartAxisPanel.cxx b/chart2/source/controller/sidebar/ChartAxisPanel.cxx index fa6100ef6de6..3866b98e4d42 100644 --- a/chart2/source/controller/sidebar/ChartAxisPanel.cxx +++ b/chart2/source/controller/sidebar/ChartAxisPanel.cxx @@ -191,7 +191,8 @@ ChartAxisPanel::ChartAxisPanel( mxFrame(rxFrame), mxModel(pController->getModel()), mxModifyListener(new ChartSidebarModifyListener(this)), - mxSelectionListener(new ChartSidebarSelectionListener(this, OBJECTTYPE_AXIS)) + mxSelectionListener(new ChartSidebarSelectionListener(this, OBJECTTYPE_AXIS)), + mbModelValid(true) { get(mpCBShowLabel, "checkbutton_show_label"); get(mpCBReverse, "checkbutton_reverse"); @@ -246,6 +247,9 @@ void ChartAxisPanel::Initialize() void ChartAxisPanel::updateData() { + if (!mbModelValid) + return; + OUString aCID = getCID(mxModel); SolarMutexGuard aGuard; @@ -291,15 +295,20 @@ void ChartAxisPanel::NotifyItemUpdate( void ChartAxisPanel::modelInvalid() { + mbModelValid = false; } void ChartAxisPanel::updateModel( css::uno::Reference<css::frame::XModel> xModel) { - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->removeModifyListener(mxModifyListener); + if (mbModelValid) + { + css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->removeModifyListener(mxModifyListener); + } mxModel = xModel; + mbModelValid = true; css::uno::Reference<css::util::XModifyBroadcaster> xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW); xBroadcasterNew->addModifyListener(mxModifyListener); diff --git a/chart2/source/controller/sidebar/ChartAxisPanel.hxx b/chart2/source/controller/sidebar/ChartAxisPanel.hxx index e6d878bed6a5..b38a32f05211 100644 --- a/chart2/source/controller/sidebar/ChartAxisPanel.hxx +++ b/chart2/source/controller/sidebar/ChartAxisPanel.hxx @@ -88,6 +88,8 @@ private: css::uno::Reference<css::util::XModifyListener> mxModifyListener; css::uno::Reference<css::view::XSelectionChangeListener> mxSelectionListener; + bool mbModelValid; + void Initialize(); DECL_LINK(CheckBoxHdl, CheckBox*); diff --git a/chart2/source/controller/sidebar/ChartElementsPanel.cxx b/chart2/source/controller/sidebar/ChartElementsPanel.cxx index 08d1fea6f367..2545e49c4b47 100644 --- a/chart2/source/controller/sidebar/ChartElementsPanel.cxx +++ b/chart2/source/controller/sidebar/ChartElementsPanel.cxx @@ -289,7 +289,8 @@ ChartElementsPanel::ChartElementsPanel( mxFrame(rxFrame), maContext(), mxModel(pController->getModel()), - mxListener(new ChartSidebarModifyListener(this)) + mxListener(new ChartSidebarModifyListener(this)), + mbModelValid(true) { get(mpCBTitle, "checkbutton_title"); get(mpCBSubtitle, "checkbutton_subtitle"); @@ -379,6 +380,9 @@ void ChartElementsPanel::Initialize() void ChartElementsPanel::updateData() { + if (!mbModelValid) + return; + Reference< chart2::XDiagram > xDiagram(ChartModelHelper::findDiagram(mxModel)); sal_Int32 nDimension = DiagramHelper::getDimension(xDiagram); SolarMutexGuard aGuard; @@ -452,16 +456,20 @@ void ChartElementsPanel::NotifyItemUpdate( void ChartElementsPanel::modelInvalid() { - + mbModelValid = false; } void ChartElementsPanel::updateModel( css::uno::Reference<css::frame::XModel> xModel) { - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->removeModifyListener(mxListener); + if (mbModelValid) + { + css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->removeModifyListener(mxListener); + } mxModel = xModel; + mbModelValid = true; css::uno::Reference<css::util::XModifyBroadcaster> xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW); xBroadcasterNew->addModifyListener(mxListener); diff --git a/chart2/source/controller/sidebar/ChartElementsPanel.hxx b/chart2/source/controller/sidebar/ChartElementsPanel.hxx index 47265fba4add..50ceb72088ba 100644 --- a/chart2/source/controller/sidebar/ChartElementsPanel.hxx +++ b/chart2/source/controller/sidebar/ChartElementsPanel.hxx @@ -104,6 +104,8 @@ private: css::uno::Reference<css::frame::XModel> mxModel; css::uno::Reference<css::util::XModifyListener> mxListener; + bool mbModelValid; + void Initialize(); DECL_LINK(CheckBoxHdl, CheckBox*); diff --git a/chart2/source/controller/sidebar/ChartErrorBarPanel.cxx b/chart2/source/controller/sidebar/ChartErrorBarPanel.cxx index 3163f956e142..c319943bed44 100644 --- a/chart2/source/controller/sidebar/ChartErrorBarPanel.cxx +++ b/chart2/source/controller/sidebar/ChartErrorBarPanel.cxx @@ -244,7 +244,8 @@ ChartErrorBarPanel::ChartErrorBarPanel( : PanelLayout(pParent, "ChartErrorBarPanel", "modules/schart/ui/sidebarerrorbar.ui", rxFrame), mxFrame(rxFrame), mxModel(pController->getModel()), - mxListener(new ChartSidebarModifyListener(this)) + mxListener(new ChartSidebarModifyListener(this)), + mbModelValid(true) { get(mpRBPosAndNeg, "radiobutton_positive_negative"); @@ -302,6 +303,9 @@ void ChartErrorBarPanel::Initialize() void ChartErrorBarPanel::updateData() { + if (!mbModelValid) + return; + OUString aCID = getCID(mxModel); bool bPos = showPositiveError(mxModel, aCID); bool bNeg = showNegativeError(mxModel, aCID); @@ -379,15 +383,20 @@ void ChartErrorBarPanel::NotifyItemUpdate( void ChartErrorBarPanel::modelInvalid() { + mbModelValid = false; } void ChartErrorBarPanel::updateModel( css::uno::Reference<css::frame::XModel> xModel) { - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->removeModifyListener(mxListener); + if (mbModelValid) + { + css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->removeModifyListener(mxListener); + } mxModel = xModel; + mbModelValid = true; css::uno::Reference<css::util::XModifyBroadcaster> xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW); xBroadcasterNew->addModifyListener(mxListener); diff --git a/chart2/source/controller/sidebar/ChartErrorBarPanel.hxx b/chart2/source/controller/sidebar/ChartErrorBarPanel.hxx index e9c102b4d5e0..bdfd9548af1f 100644 --- a/chart2/source/controller/sidebar/ChartErrorBarPanel.hxx +++ b/chart2/source/controller/sidebar/ChartErrorBarPanel.hxx @@ -84,6 +84,8 @@ private: css::uno::Reference<css::frame::XModel> mxModel; css::uno::Reference<css::util::XModifyListener> mxListener; + bool mbModelValid; + void Initialize(); DECL_LINK(RadioBtnHdl, void*); diff --git a/chart2/source/controller/sidebar/ChartLinePanel.cxx b/chart2/source/controller/sidebar/ChartLinePanel.cxx index eead55d38a35..d025c5ebdd75 100644 --- a/chart2/source/controller/sidebar/ChartLinePanel.cxx +++ b/chart2/source/controller/sidebar/ChartLinePanel.cxx @@ -121,7 +121,8 @@ ChartLinePanel::ChartLinePanel(vcl::Window* pParent, mxModel(pController->getModel()), mxListener(new ChartSidebarModifyListener(this)), mxSelectionListener(new ChartSidebarSelectionListener(this)), - mbUpdate(true) + mbUpdate(true), + mbModelValid(true) { std::vector<ObjectType> aAcceptedTypes { OBJECTTYPE_PAGE, OBJECTTYPE_DIAGRAM, OBJECTTYPE_DATA_SERIES, OBJECTTYPE_TITLE, OBJECTTYPE_LEGEND}; mxSelectionListener->setAcceptedTypes(aAcceptedTypes); @@ -160,7 +161,7 @@ void ChartLinePanel::Initialize() void ChartLinePanel::updateData() { - if (!mbUpdate) + if (!mbUpdate || !mbModelValid) return; css::uno::Reference<css::beans::XPropertySet> xPropSet = getPropSet(mxModel); @@ -188,6 +189,7 @@ void ChartLinePanel::updateData() void ChartLinePanel::modelInvalid() { + mbModelValid = false; } void ChartLinePanel::selectionChanged(bool bCorrectType) @@ -203,10 +205,14 @@ void ChartLinePanel::SelectionInvalid() void ChartLinePanel::updateModel( css::uno::Reference<css::frame::XModel> xModel) { - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->removeModifyListener(mxListener); + if (mbModelValid) + { + css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->removeModifyListener(mxListener); + } mxModel = xModel; + mbModelValid = true; css::uno::Reference<css::util::XModifyBroadcaster> xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW); xBroadcasterNew->addModifyListener(mxListener); diff --git a/chart2/source/controller/sidebar/ChartLinePanel.hxx b/chart2/source/controller/sidebar/ChartLinePanel.hxx index a2b2ea5b881f..1b614b09d501 100644 --- a/chart2/source/controller/sidebar/ChartLinePanel.hxx +++ b/chart2/source/controller/sidebar/ChartLinePanel.hxx @@ -95,6 +95,7 @@ private: void Initialize(); bool mbUpdate; + bool mbModelValid; }; } } // end of namespace svx::sidebar diff --git a/chart2/source/controller/sidebar/ChartSeriesPanel.cxx b/chart2/source/controller/sidebar/ChartSeriesPanel.cxx index 85336ff5cb59..763262009086 100644 --- a/chart2/source/controller/sidebar/ChartSeriesPanel.cxx +++ b/chart2/source/controller/sidebar/ChartSeriesPanel.cxx @@ -292,7 +292,8 @@ ChartSeriesPanel::ChartSeriesPanel( mxFrame(rxFrame), mxModel(pController->getModel()), mxListener(new ChartSidebarModifyListener(this)), - mxSelectionListener(new ChartSidebarSelectionListener(this, OBJECTTYPE_DATA_SERIES)) + mxSelectionListener(new ChartSidebarSelectionListener(this, OBJECTTYPE_DATA_SERIES)), + mbModelValid(true) { get(mpCBLabel, "checkbutton_label"); get(mpCBTrendline, "checkbutton_trendline"); @@ -366,6 +367,9 @@ void ChartSeriesPanel::Initialize() void ChartSeriesPanel::updateData() { + if (!mbModelValid) + return; + OUString aCID = getCID(mxModel); SolarMutexGuard aGuard; bool bLabelVisible = isDataLabelVisible(mxModel, aCID); @@ -422,16 +426,20 @@ void ChartSeriesPanel::NotifyItemUpdate( void ChartSeriesPanel::modelInvalid() { - + mbModelValid = false; } void ChartSeriesPanel::updateModel( css::uno::Reference<css::frame::XModel> xModel) { - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->removeModifyListener(mxListener); + if (mbModelValid) + { + css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->removeModifyListener(mxListener); + } mxModel = xModel; + mbModelValid = true; css::uno::Reference<css::util::XModifyBroadcaster> xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW); xBroadcasterNew->addModifyListener(mxListener); diff --git a/chart2/source/controller/sidebar/ChartSeriesPanel.hxx b/chart2/source/controller/sidebar/ChartSeriesPanel.hxx index d125c2faa351..be580cbf0c8b 100644 --- a/chart2/source/controller/sidebar/ChartSeriesPanel.hxx +++ b/chart2/source/controller/sidebar/ChartSeriesPanel.hxx @@ -104,6 +104,8 @@ private: css::uno::Reference<css::util::XModifyListener> mxListener; css::uno::Reference<css::view::XSelectionChangeListener> mxSelectionListener; + bool mbModelValid; + void Initialize(); DECL_LINK(CheckBoxHdl, CheckBox*); |