summaryrefslogtreecommitdiff
path: root/chart2/source
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2015-07-31 17:34:56 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2015-07-31 17:38:40 +0200
commit8b0109f28e48c8ba3fc2d77467351ec2c7b87629 (patch)
treeb2bbbcd19c0218ad466548c9f890ed9890c34487 /chart2/source
parent161f7533ac177c25516ec206233936bd6982e3df (diff)
avoid crash when chart model is disposed
Change-Id: I70c3a06e2aa9112cd5a47b7d8839c4bd701cfc1e
Diffstat (limited to 'chart2/source')
-rw-r--r--chart2/source/controller/sidebar/ChartAreaPanel.cxx14
-rw-r--r--chart2/source/controller/sidebar/ChartAreaPanel.hxx1
-rw-r--r--chart2/source/controller/sidebar/ChartAxisPanel.cxx15
-rw-r--r--chart2/source/controller/sidebar/ChartAxisPanel.hxx2
-rw-r--r--chart2/source/controller/sidebar/ChartElementsPanel.cxx16
-rw-r--r--chart2/source/controller/sidebar/ChartElementsPanel.hxx2
-rw-r--r--chart2/source/controller/sidebar/ChartErrorBarPanel.cxx15
-rw-r--r--chart2/source/controller/sidebar/ChartErrorBarPanel.hxx2
-rw-r--r--chart2/source/controller/sidebar/ChartLinePanel.cxx14
-rw-r--r--chart2/source/controller/sidebar/ChartLinePanel.hxx1
-rw-r--r--chart2/source/controller/sidebar/ChartSeriesPanel.cxx16
-rw-r--r--chart2/source/controller/sidebar/ChartSeriesPanel.hxx2
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*);