From 267c6f2ac71f92999e969232431ba04678e7437e Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 07:54:39 +0200 Subject: Adding upstream version 4:24.2.0. Signed-off-by: Daniel Baumann --- sc/source/ui/unoobj/ChartTools.cxx | 174 +++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 sc/source/ui/unoobj/ChartTools.cxx (limited to 'sc/source/ui/unoobj/ChartTools.cxx') diff --git a/sc/source/ui/unoobj/ChartTools.cxx b/sc/source/ui/unoobj/ChartTools.cxx new file mode 100644 index 0000000000..e9fdc996a3 --- /dev/null +++ b/sc/source/ui/unoobj/ChartTools.cxx @@ -0,0 +1,174 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace css; + +namespace sc::tools { + +namespace { + +uno::Reference +getPivotTableDataProvider(const SdrOle2Obj* pOleObject) +{ + uno::Reference xPivotTableDataProvider; + + const uno::Reference& xObject = pOleObject->GetObjRef(); + if (xObject.is()) + { + uno::Reference xChartDoc(xObject->getComponent(), uno::UNO_QUERY); + if (xChartDoc.is()) + { + xPivotTableDataProvider.set(uno::Reference( + xChartDoc->getDataProvider(), uno::UNO_QUERY)); + } + } + return xPivotTableDataProvider; +} + +OUString getAssociatedPivotTableName(const SdrOle2Obj* pOleObject) +{ + OUString aPivotTableName; + uno::Reference xPivotTableDataProvider; + xPivotTableDataProvider.set(getPivotTableDataProvider(pOleObject)); + if (xPivotTableDataProvider.is()) + aPivotTableName = xPivotTableDataProvider->getPivotTableName(); + return aPivotTableName; +} + +} // end anonymous namespace + +ChartIterator::ChartIterator(ScDocShell* pDocShell, SCTAB nTab, ChartSourceType eChartSourceType) + : m_eChartSourceType(eChartSourceType) +{ + if (!pDocShell) + return; + ScDocument& rDoc = pDocShell->GetDocument(); + ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer(); + if (!pDrawLayer) + return; + SdrPage* pPage = pDrawLayer->GetPage(sal_uInt16(nTab)); + if (!pPage) + return; + m_oIterator.emplace(pPage, SdrIterMode::DeepNoGroups); +} + +SdrOle2Obj* ChartIterator::next() +{ + if (!m_oIterator) + return nullptr; + + SdrObject* pObject = m_oIterator->Next(); + while (pObject) + { + if (pObject->GetObjIdentifier() == SdrObjKind::OLE2 && ScDocument::IsChart(pObject)) + { + SdrOle2Obj* pOleObject = static_cast(pObject); + + uno::Reference xPivotTableDataProvider; + xPivotTableDataProvider.set(getPivotTableDataProvider(pOleObject)); + + if (xPivotTableDataProvider.is() && m_eChartSourceType == ChartSourceType::PIVOT_TABLE) + return pOleObject; + else if (!xPivotTableDataProvider.is() && m_eChartSourceType == ChartSourceType::CELL_RANGE) + return pOleObject; + } + pObject = m_oIterator->Next(); + } + return nullptr; +} + +SdrOle2Obj* findChartsByName(ScDocShell* pDocShell, SCTAB nTab, std::u16string_view rName, ChartSourceType eChartSourceType) +{ + if (!pDocShell) + return nullptr; + + ChartIterator aIterator(pDocShell, nTab, eChartSourceType); + + SdrOle2Obj* pObject = aIterator.next(); + while (pObject) + { + uno::Reference xObject = pObject->GetObjRef(); + if (xObject.is()) + { + OUString aObjectName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName(xObject); + if (aObjectName == rName) + return pObject; + } + pObject = aIterator.next(); + } + return nullptr; +} + +SdrOle2Obj* getChartByIndex(ScDocShell* pDocShell, SCTAB nTab, ::tools::Long nIndex, ChartSourceType eChartSourceType) +{ + if (!pDocShell) + return nullptr; + + ChartIterator aIterator(pDocShell, nTab, eChartSourceType); + + SdrOle2Obj* pObject = aIterator.next(); + ::tools::Long i = 0; + while (pObject) + { + if (i == nIndex) + { + return pObject; + } + + i++; + pObject = aIterator.next(); + } + return nullptr; +} + +std::vector getAllPivotChartsConnectedTo(std::u16string_view sPivotTableName, ScDocShell* pDocShell) +{ + std::vector aObjects; + + ScDocument& rDocument = pDocShell->GetDocument(); + ScDrawLayer* pModel = rDocument.GetDrawLayer(); + if (!pModel) + return aObjects; + + sal_uInt16 nPageCount = pModel->GetPageCount(); + for (sal_uInt16 nPageNo = 0; nPageNo < nPageCount; nPageNo++) + { + SdrPage* pPage = pModel->GetPage(nPageNo); + if (!pPage) + continue; + + sc::tools::ChartIterator aIterator(pDocShell, nPageNo, ChartSourceType::PIVOT_TABLE); + SdrOle2Obj* pObject = aIterator.next(); + while (pObject) + { + if (sPivotTableName == getAssociatedPivotTableName(pObject)) + { + aObjects.push_back(pObject); + } + pObject = aIterator.next(); + } + } + return aObjects; +} + +} // end sc::tools + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3