diff options
Diffstat (limited to 'chart2/source/controller/sidebar/ChartSeriesPanel.cxx')
-rw-r--r-- | chart2/source/controller/sidebar/ChartSeriesPanel.cxx | 226 |
1 files changed, 110 insertions, 116 deletions
diff --git a/chart2/source/controller/sidebar/ChartSeriesPanel.cxx b/chart2/source/controller/sidebar/ChartSeriesPanel.cxx index 83a3251925f1..8795e691fbd7 100644 --- a/chart2/source/controller/sidebar/ChartSeriesPanel.cxx +++ b/chart2/source/controller/sidebar/ChartSeriesPanel.cxx @@ -18,23 +18,24 @@ */ #include <com/sun/star/chart/ErrorBarStyle.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/chart/DataLabelPlacement.hpp> -#include <com/sun/star/chart2/XChartDocument.hpp> -#include <com/sun/star/chart2/XDataSeries.hpp> -#include <com/sun/star/chart2/XChartTypeContainer.hpp> -#include <com/sun/star/chart2/XCoordinateSystemContainer.hpp> -#include <com/sun/star/chart2/XRegressionCurveContainer.hpp> -#include <com/sun/star/util/XModifyBroadcaster.hpp> #include <vcl/svapp.hxx> +#include <sal/log.hxx> #include "ChartSeriesPanel.hxx" #include <ChartController.hxx> - +#include <ChartModel.hxx> +#include <ChartType.hxx> +#include <DataSeries.hxx> #include <DataSeriesHelper.hxx> +#include <Diagram.hxx> #include <RegressionCurveHelper.hxx> +#include <RegressionCurveModel.hxx> #include <StatisticsHelper.hxx> +#include <BaseCoordinateSystem.hxx> + +#include <comphelper/processfactory.hxx> using namespace css; using namespace css::uno; @@ -43,29 +44,29 @@ namespace chart::sidebar { namespace { -bool isDataLabelVisible(const css::uno::Reference<css::frame::XModel>& xModel, const OUString& rCID) +bool isDataLabelVisible(const rtl::Reference<::chart::ChartModel>& xModel, std::u16string_view rCID) { - css::uno::Reference< css::chart2::XDataSeries > xSeries = + rtl::Reference< DataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xSeries.is()) return false; - return DataSeriesHelper::hasDataLabelsAtSeries(xSeries); + return xSeries->hasDataLabelsAtSeries(); } -void setDataLabelVisible(const css::uno::Reference<css::frame::XModel>& xModel, const OUString& rCID, bool bVisible) +void setDataLabelVisible(const rtl::Reference<::chart::ChartModel>& xModel, std::u16string_view rCID, bool bVisible) { - css::uno::Reference< css::chart2::XDataSeries > xSeries = + rtl::Reference< DataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xSeries.is()) return; if (bVisible) - DataSeriesHelper::insertDataLabelsToSeriesAndAllPoints(xSeries); + xSeries->insertDataLabelsToSeriesAndAllPoints(); else - DataSeriesHelper::deleteDataLabelsFromSeriesAndAllPoints(xSeries); + xSeries->deleteDataLabelsFromSeriesAndAllPoints(); } struct LabelPlacementMap @@ -83,16 +84,16 @@ LabelPlacementMap const aLabelPlacementMap[] = { { 5, css::chart::DataLabelPlacement::NEAR_ORIGIN } }; -sal_Int32 getDataLabelPlacement(const css::uno::Reference<css::frame::XModel>& xModel, - const OUString& rCID) +sal_Int32 getDataLabelPlacement(const rtl::Reference<::chart::ChartModel>& xModel, + std::u16string_view rCID) { - css::uno::Reference< css::beans::XPropertySet > xSeries( - ObjectIdentifier::getDataSeriesForCID(rCID, xModel), uno::UNO_QUERY ); + rtl::Reference< DataSeries > xSeries = + ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xSeries.is()) return 0; - css::uno::Any aAny = xSeries->getPropertyValue("LabelPlacement"); + css::uno::Any aAny = xSeries->getPropertyValue(u"LabelPlacement"_ustr); if (!aAny.hasValue()) return 0; @@ -108,11 +109,11 @@ sal_Int32 getDataLabelPlacement(const css::uno::Reference<css::frame::XModel>& x return 0; } -void setDataLabelPlacement(const css::uno::Reference<css::frame::XModel>& xModel, - const OUString& rCID, sal_Int32 nPos) +void setDataLabelPlacement(const rtl::Reference<::chart::ChartModel>& xModel, + std::u16string_view rCID, sal_Int32 nPos) { - css::uno::Reference< css::beans::XPropertySet > xSeries( - ObjectIdentifier::getDataSeriesForCID(rCID, xModel), uno::UNO_QUERY ); + rtl::Reference< DataSeries > xSeries = + ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xSeries.is()) return; @@ -127,26 +128,26 @@ void setDataLabelPlacement(const css::uno::Reference<css::frame::XModel>& xModel } } - xSeries->setPropertyValue("LabelPlacement", css::uno::Any(nApi)); + xSeries->setPropertyValue(u"LabelPlacement"_ustr, css::uno::Any(nApi)); } -bool isTrendlineVisible(const css::uno::Reference<css::frame::XModel>& xModel, - const OUString& rCID) +bool isTrendlineVisible(const rtl::Reference<::chart::ChartModel>& xModel, + std::u16string_view rCID) { - css::uno::Reference< css::chart2::XRegressionCurveContainer > xRegressionCurveContainer( - ObjectIdentifier::getDataSeriesForCID(rCID, xModel), uno::UNO_QUERY ); + rtl::Reference< DataSeries > xRegressionCurveContainer = + ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xRegressionCurveContainer.is()) return false; - return xRegressionCurveContainer->getRegressionCurves().hasElements(); + return !xRegressionCurveContainer->getRegressionCurves2().empty(); } -void setTrendlineVisible(const css::uno::Reference<css::frame::XModel>& - xModel, const OUString& rCID, bool bVisible) +void setTrendlineVisible(const rtl::Reference<::chart::ChartModel>& + xModel, std::u16string_view rCID, bool bVisible) { - css::uno::Reference< css::chart2::XRegressionCurveContainer > xRegressionCurveContainer( - ObjectIdentifier::getDataSeriesForCID(rCID, xModel), uno::UNO_QUERY ); + rtl::Reference< DataSeries > xRegressionCurveContainer = + ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xRegressionCurveContainer.is()) return; @@ -163,10 +164,10 @@ void setTrendlineVisible(const css::uno::Reference<css::frame::XModel>& } -bool isErrorBarVisible(const css::uno::Reference<css::frame::XModel>& xModel, - const OUString& rCID, bool bYError) +bool isErrorBarVisible(const rtl::Reference<::chart::ChartModel>& xModel, + std::u16string_view rCID, bool bYError) { - css::uno::Reference< css::chart2::XDataSeries > xSeries = + rtl::Reference< DataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xSeries.is()) @@ -175,10 +176,10 @@ bool isErrorBarVisible(const css::uno::Reference<css::frame::XModel>& xModel, return StatisticsHelper::hasErrorBars(xSeries, bYError); } -void setErrorBarVisible(const css::uno::Reference<css::frame::XModel>& - xModel, const OUString& rCID, bool bYError, bool bVisible) +void setErrorBarVisible(const rtl::Reference<::chart::ChartModel>& + xModel, std::u16string_view rCID, bool bYError, bool bVisible) { - css::uno::Reference< css::chart2::XDataSeries > xSeries = + rtl::Reference< DataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xSeries.is()) @@ -196,53 +197,48 @@ void setErrorBarVisible(const css::uno::Reference<css::frame::XModel>& } } -bool isPrimaryAxis(const css::uno::Reference<css::frame::XModel>& - xModel, const OUString& rCID) +bool isPrimaryAxis(const rtl::Reference<::chart::ChartModel>& + xModel, std::u16string_view rCID) { - css::uno::Reference< css::chart2::XDataSeries > xSeries = + rtl::Reference< DataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xSeries.is()) return true; - return DataSeriesHelper::getAttachedAxisIndex(xSeries) == 0; + return xSeries->getAttachedAxisIndex() == 0; } -void setAttachedAxisType(const css::uno::Reference<css::frame::XModel>& - xModel, const OUString& rCID, bool bPrimary) +void setAttachedAxisType(const rtl::Reference<::chart::ChartModel>& + xModel, std::u16string_view rCID, bool bPrimary) { - css::uno::Reference< css::beans::XPropertySet > xSeries( - ObjectIdentifier::getDataSeriesForCID(rCID, xModel), uno::UNO_QUERY ); + const rtl::Reference<DataSeries> xDataSeries = ObjectIdentifier::getDataSeriesForCID(rCID, xModel); - if (!xSeries.is()) + if (!xDataSeries.is()) return; - sal_Int32 nIndex = bPrimary ? 0 : 1; - xSeries->setPropertyValue("AttachedAxisIndex", css::uno::Any(nIndex)); + rtl::Reference<Diagram> xDiagram = xModel->getFirstChartDiagram(); + xDiagram->attachSeriesToAxis(bPrimary, xDataSeries, comphelper::getProcessComponentContext()); } -css::uno::Reference<css::chart2::XChartType> getChartType( - const css::uno::Reference<css::frame::XModel>& xModel) +rtl::Reference<ChartType> getChartType( + const rtl::Reference<::chart::ChartModel>& xModel) { - css::uno::Reference<css::chart2::XChartDocument> xChartDoc (xModel, css::uno::UNO_QUERY); - css::uno::Reference<css::chart2::XDiagram> xDiagram = xChartDoc->getFirstDiagram(); - css::uno::Reference< css::chart2::XCoordinateSystemContainer > xCooSysContainer( xDiagram, UNO_QUERY_THROW ); - css::uno::Sequence< css::uno::Reference< css::chart2::XCoordinateSystem > > xCooSysSequence( xCooSysContainer->getCoordinateSystems()); - css::uno::Reference< css::chart2::XChartTypeContainer > xChartTypeContainer( xCooSysSequence[0], UNO_QUERY_THROW ); - css::uno::Sequence< css::uno::Reference< css::chart2::XChartType > > xChartTypeSequence( xChartTypeContainer->getChartTypes() ); - return xChartTypeSequence[0]; + rtl::Reference<Diagram> xDiagram = xModel->getFirstChartDiagram(); + const std::vector< rtl::Reference< BaseCoordinateSystem > > xCooSysSequence( xDiagram->getBaseCoordinateSystems()); + return xCooSysSequence[0]->getChartTypes2()[0]; } -OUString getSeriesLabel(const css::uno::Reference<css::frame::XModel>& xModel, const OUString& rCID) +OUString getSeriesLabel(const rtl::Reference<::chart::ChartModel>& xModel, std::u16string_view rCID) { - css::uno::Reference< css::chart2::XDataSeries > xSeries = + rtl::Reference< DataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID(rCID, xModel); if (!xSeries.is()) return OUString(); - css::uno::Reference<css::chart2::XChartType> xChartType = getChartType(xModel); - return DataSeriesHelper::getDataSeriesLabel(xSeries, xChartType->getRoleOfSequenceForSeriesLabel()); + rtl::Reference<ChartType> xChartType = getChartType(xModel); + return xSeries->getLabelForRole(xChartType->getRoleOfSequenceForSeriesLabel()); } OUString getCID(const css::uno::Reference<css::frame::XModel>& xModel) @@ -264,8 +260,10 @@ OUString getCID(const css::uno::Reference<css::frame::XModel>& xModel) #if defined DBG_UTIL && !defined NDEBUG ObjectType eType = ObjectIdentifier::getObjectType(aCID); - assert(eType == OBJECTTYPE_DATA_SERIES || eType == OBJECTTYPE_DATA_POINT - || eType == OBJECTTYPE_DATA_CURVE); + if (eType != OBJECTTYPE_DATA_SERIES && + eType != OBJECTTYPE_DATA_POINT && + eType != OBJECTTYPE_DATA_CURVE) + SAL_WARN("chart2","Selected item is not a chart series"); #endif return aCID; @@ -274,21 +272,20 @@ OUString getCID(const css::uno::Reference<css::frame::XModel>& xModel) } ChartSeriesPanel::ChartSeriesPanel( - vcl::Window* pParent, - const css::uno::Reference<css::frame::XFrame>& rxFrame, + weld::Widget* pParent, ChartController* pController) - : PanelLayout(pParent, "ChartSeriesPanel", "modules/schart/ui/sidebarseries.ui", rxFrame) - , mxCBLabel(m_xBuilder->weld_check_button("checkbutton_label")) - , mxCBTrendline(m_xBuilder->weld_check_button("checkbutton_trendline")) - , mxCBXError(m_xBuilder->weld_check_button("checkbutton_x_error")) - , mxCBYError(m_xBuilder->weld_check_button("checkbutton_y_error")) - , mxRBPrimaryAxis(m_xBuilder->weld_radio_button("radiobutton_primary_axis")) - , mxRBSecondaryAxis(m_xBuilder->weld_radio_button("radiobutton_secondary_axis")) - , mxBoxLabelPlacement(m_xBuilder->weld_widget("datalabel_box")) - , mxLBLabelPlacement(m_xBuilder->weld_combo_box("comboboxtext_label")) - , mxFTSeriesName(m_xBuilder->weld_label("label_series_name")) - , mxFTSeriesTemplate(m_xBuilder->weld_label("label_series_tmpl")) - , mxModel(pController->getModel()) + : PanelLayout(pParent, u"ChartSeriesPanel"_ustr, u"modules/schart/ui/sidebarseries.ui"_ustr) + , mxCBLabel(m_xBuilder->weld_check_button(u"checkbutton_label"_ustr)) + , mxCBTrendline(m_xBuilder->weld_check_button(u"checkbutton_trendline"_ustr)) + , mxCBXError(m_xBuilder->weld_check_button(u"checkbutton_x_error"_ustr)) + , mxCBYError(m_xBuilder->weld_check_button(u"checkbutton_y_error"_ustr)) + , mxRBPrimaryAxis(m_xBuilder->weld_radio_button(u"radiobutton_primary_axis"_ustr)) + , mxRBSecondaryAxis(m_xBuilder->weld_radio_button(u"radiobutton_secondary_axis"_ustr)) + , mxBoxLabelPlacement(m_xBuilder->weld_widget(u"datalabel_box"_ustr)) + , mxLBLabelPlacement(m_xBuilder->weld_combo_box(u"comboboxtext_label"_ustr)) + , mxFTSeriesName(m_xBuilder->weld_label(u"label_series_name"_ustr)) + , mxFTSeriesTemplate(m_xBuilder->weld_label(u"label_series_tmpl"_ustr)) + , mxModel(pController->getChartModel()) , mxListener(new ChartSidebarModifyListener(this)) , mxSelectionListener(new ChartSidebarSelectionListener(this, OBJECTTYPE_DATA_SERIES)) , mbModelValid(true) @@ -298,16 +295,7 @@ ChartSeriesPanel::ChartSeriesPanel( ChartSeriesPanel::~ChartSeriesPanel() { - disposeOnce(); -} - -void ChartSeriesPanel::dispose() -{ - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->removeModifyListener(mxListener); - css::uno::Reference<css::view::XSelectionSupplier> xSelectionSupplier(mxModel->getCurrentController(), css::uno::UNO_QUERY); - if (xSelectionSupplier.is()) - xSelectionSupplier->removeSelectionChangeListener(mxSelectionListener); + doUpdateModel(nullptr); mxCBLabel.reset(); mxCBTrendline.reset(); @@ -322,27 +310,24 @@ void ChartSeriesPanel::dispose() mxFTSeriesName.reset(); mxFTSeriesTemplate.reset(); - - PanelLayout::dispose(); } void ChartSeriesPanel::Initialize() { - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->addModifyListener(mxListener); + mxModel->addModifyListener(mxListener); css::uno::Reference<css::view::XSelectionSupplier> xSelectionSupplier(mxModel->getCurrentController(), css::uno::UNO_QUERY); if (xSelectionSupplier.is()) xSelectionSupplier->addSelectionChangeListener(mxSelectionListener); updateData(); - Link<weld::ToggleButton&,void> aLink = LINK(this, ChartSeriesPanel, CheckBoxHdl); + Link<weld::Toggleable&,void> aLink = LINK(this, ChartSeriesPanel, CheckBoxHdl); mxCBLabel->connect_toggled(aLink); mxCBTrendline->connect_toggled(aLink); mxCBXError->connect_toggled(aLink); mxCBYError->connect_toggled(aLink); - Link<weld::ToggleButton&,void> aLink2 = LINK(this, ChartSeriesPanel, RadioBtnHdl); + Link<weld::Toggleable&,void> aLink2 = LINK(this, ChartSeriesPanel, RadioBtnHdl); mxRBPrimaryAxis->connect_toggled(aLink2); mxRBSecondaryAxis->connect_toggled(aLink2); @@ -355,6 +340,12 @@ void ChartSeriesPanel::updateData() return; OUString aCID = getCID(mxModel); + ObjectType eType = ObjectIdentifier::getObjectType(aCID); + if (eType!=OBJECTTYPE_DATA_SERIES && + eType != OBJECTTYPE_DATA_POINT && + eType != OBJECTTYPE_DATA_CURVE) + return; + SolarMutexGuard aGuard; bool bLabelVisible = isDataLabelVisible(mxModel, aCID); mxCBLabel->set_active(bLabelVisible); @@ -374,23 +365,19 @@ void ChartSeriesPanel::updateData() mxFTSeriesName->set_label(aFrameLabel); } -VclPtr<vcl::Window> ChartSeriesPanel::Create ( - vcl::Window* pParent, - const css::uno::Reference<css::frame::XFrame>& rxFrame, +std::unique_ptr<PanelLayout> ChartSeriesPanel::Create ( + weld::Widget* pParent, ChartController* pController) { if (pParent == nullptr) - throw lang::IllegalArgumentException("no parent Window given to ChartSeriesPanel::Create", nullptr, 0); - if ( ! rxFrame.is()) - throw lang::IllegalArgumentException("no XFrame given to ChartSeriesPanel::Create", nullptr, 1); + throw lang::IllegalArgumentException(u"no parent Window given to ChartSeriesPanel::Create"_ustr, nullptr, 0); - return VclPtr<ChartSeriesPanel>::Create( - pParent, rxFrame, pController); + return std::make_unique<ChartSeriesPanel>(pParent, pController); } -void ChartSeriesPanel::DataChanged( - const DataChangedEvent& ) +void ChartSeriesPanel::DataChanged(const DataChangedEvent& rEvent) { + PanelLayout::DataChanged(rEvent); updateData(); } @@ -412,39 +399,46 @@ void ChartSeriesPanel::modelInvalid() mbModelValid = false; } -void ChartSeriesPanel::updateModel( - css::uno::Reference<css::frame::XModel> xModel) +void ChartSeriesPanel::doUpdateModel(const rtl::Reference<::chart::ChartModel>& xModel) { if (mbModelValid) { - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcaster->removeModifyListener(mxListener); + mxModel->removeModifyListener(mxListener); } css::uno::Reference<css::view::XSelectionSupplier> oldSelectionSupplier( mxModel->getCurrentController(), css::uno::UNO_QUERY); if (oldSelectionSupplier.is()) { - oldSelectionSupplier->removeSelectionChangeListener(mxSelectionListener.get()); + oldSelectionSupplier->removeSelectionChangeListener(mxSelectionListener); } mxModel = xModel; - mbModelValid = true; + mbModelValid = mxModel.is(); - css::uno::Reference<css::util::XModifyBroadcaster> xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW); - xBroadcasterNew->addModifyListener(mxListener); + if (!mbModelValid) + return; + + mxModel->addModifyListener(mxListener); css::uno::Reference<css::view::XSelectionSupplier> xSelectionSupplier(mxModel->getCurrentController(), css::uno::UNO_QUERY); if (xSelectionSupplier.is()) xSelectionSupplier->addSelectionChangeListener(mxSelectionListener); } +void ChartSeriesPanel::updateModel(css::uno::Reference<css::frame::XModel> xModel) +{ + ::chart::ChartModel* pModel = dynamic_cast<::chart::ChartModel*>(xModel.get()); + assert(!xModel || pModel); + doUpdateModel(pModel); +} + void ChartSeriesPanel::selectionChanged(bool bCorrectType) { if (bCorrectType) updateData(); } -IMPL_LINK(ChartSeriesPanel, CheckBoxHdl, weld::ToggleButton&, rCheckBox, void) +IMPL_LINK(ChartSeriesPanel, CheckBoxHdl, weld::Toggleable&, rCheckBox, void) { bool bChecked = rCheckBox.get_active(); OUString aCID = getCID(mxModel); @@ -458,7 +452,7 @@ IMPL_LINK(ChartSeriesPanel, CheckBoxHdl, weld::ToggleButton&, rCheckBox, void) setErrorBarVisible(mxModel, aCID, true, bChecked); } -IMPL_LINK_NOARG(ChartSeriesPanel, RadioBtnHdl, weld::ToggleButton&, void) +IMPL_LINK_NOARG(ChartSeriesPanel, RadioBtnHdl, weld::Toggleable&, void) { OUString aCID = getCID(mxModel); bool bChecked = mxRBPrimaryAxis->get_active(); |