20 #include <com/sun/star/embed/Aspects.hpp>
21 #include <com/sun/star/embed/XEmbeddedObject.hpp>
22 #include <com/sun/star/awt/Size.hpp>
23 #include <com/sun/star/beans/PropertyAttribute.hpp>
24 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
25 #include <com/sun/star/chart/ChartDataRowSource.hpp>
26 #include <com/sun/star/chart2/XChartDocument.hpp>
27 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
28 #include <com/sun/star/table/CellRangeAddress.hpp>
30 #include <osl/diagnose.h>
54 #define PROP_HANDLE_RELATED_CELLRANGES 1
63 pDocShell->GetDocument().AddUnoObject(*
this);
71 pDocShell->GetDocument().RemoveUnoObject(*
this);
78 if ( rHint.
GetId() == SfxHintId::Dying )
94 SdrPage* pPage = pDrawLayer->
GetPage(static_cast<sal_uInt16>(nTab));
95 OSL_ENSURE(pPage,
"Page not found");
105 if ( nPos == nIndex )
107 uno::Reference < embed::XEmbeddedObject > xObj =
static_cast<SdrOle2Obj*
>(pObject)->GetObjRef();
109 aName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj );
114 pObject = aIter.
Next();
119 if (!aName.isEmpty())
120 return new ScChartObj( pDocShell, nTab, aName );
129 return new ScChartObj( pDocShell, nTab, aName );
131 return new ScChartObj( pDocShell, nTab, aName );
138 const awt::Rectangle& aRect,
139 const uno::Sequence<table::CellRangeAddress>& aRanges,
149 OSL_ENSURE(pPage,
"addChart: no Page");
156 OUString
aName = rName;
158 if ( !aName.isEmpty() && pModel->
GetNamedObject( aName, SdrObjKind::OLE2, nDummy ) )
161 throw uno::RuntimeException();
165 for (
const table::CellRangeAddress& rRange : aRanges)
167 ScRange aRange( static_cast<SCCOL>(rRange.StartColumn), rRange.StartRow, rRange.Sheet,
168 static_cast<SCCOL>(rRange.EndColumn), rRange.EndRow, rRange.Sheet );
173 uno::Reference < embed::XEmbeddedObject > xObj;
181 Point aRectPos( aRect.X, aRect.Y );
183 if ( ( aRectPos.X() < 0 && !bLayoutRTL ) || ( aRectPos.X() > 0 && bLayoutRTL ) )
186 if (aRectPos.Y() < 0)
189 Size aRectSize( aRect.Width, aRect.Height );
190 if (aRectSize.
Width() <= 0)
193 if (aRectSize.
Height() <= 0)
197 sal_Int64 nAspect(embed::Aspects::MSOLE_CONTENT);
202 aSz.Width = aSize.Width();
203 aSz.Height = aSize.Height();
206 uno::Reference< chart2::data::XDataProvider > xDataProvider =
new
209 uno::Reference< chart2::data::XDataReceiver > xReceiver;
211 xReceiver.set( xObj->getComponent(), uno::UNO_QUERY );
219 if( !sRangeStr.isEmpty() )
220 xReceiver->attachDataProvider( xDataProvider );
224 uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( pDocShell->GetModel(), uno::UNO_QUERY );
225 xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
228 uno::Sequence< beans::PropertyValue > aArgs{
229 beans::PropertyValue(
230 "CellRangeRepresentation", -1,
231 uno::Any( sRangeStr ), beans::PropertyState_DIRECT_VALUE ),
232 beans::PropertyValue(
234 uno::Any( bRowHeaders ), beans::PropertyState_DIRECT_VALUE ),
235 beans::PropertyValue(
236 "FirstCellAsLabel", -1,
237 uno::Any( bColumnHeaders ), beans::PropertyState_DIRECT_VALUE ),
238 beans::PropertyValue(
240 uno::Any( chart::ChartDataRowSource_COLUMNS ), beans::PropertyState_DIRECT_VALUE )
242 xReceiver->setArguments( aArgs );
258 xObj->setVisualAreaSize( nAspect, aSz );
265 pModel->
AddUndo( std::make_unique<SdrUndoInsertObj>( *pObj ) );
279 pModel->
AddUndo( std::make_unique<SdrUndoDelObj>( *pObj ) );
306 SdrPage* pPage = pDrawLayer->
GetPage(static_cast<sal_uInt16>(nTab));
307 OSL_ENSURE(pPage,
"Page not found");
316 pObject = aIter.
Next();
327 uno::Reference<table::XTableChart> xChart(GetObjectByIndex_Impl(nIndex));
329 throw lang::IndexOutOfBoundsException();
342 return getCount() != 0;
348 uno::Reference<table::XTableChart> xChart(GetObjectByName_Impl(aName));
350 throw container::NoSuchElementException();
363 uno::Sequence<OUString>
aSeq(nCount);
364 OUString* pAry = aSeq.getArray();
370 SdrPage* pPage = pDrawLayer->
GetPage(static_cast<sal_uInt16>(nTab));
371 OSL_ENSURE(pPage,
"Page not found");
381 uno::Reference < embed::XEmbeddedObject > xObj =
static_cast<SdrOle2Obj*
>(pObject)->GetObjRef();
383 aName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj );
385 OSL_ENSURE(nPos<nCount,
"oops, miscounted?");
386 pAry[nPos++] = aName;
388 pObject = aIter.
Next();
392 OSL_ENSURE(nPos==nCount,
"hey, miscounted?");
404 return aOle2Obj !=
nullptr;
418 cppu::UnoType<uno::Sequence<table::CellRangeAddress>>::
get(),
419 css::uno::Any(uno::Sequence<table::CellRangeAddress>()) );
434 if ( rHint.
GetId() == SfxHintId::Dying )
450 uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
451 uno::Reference< chart2::data::XDataProvider > xProvider = xChartDoc->getDataProvider();
452 if( xReceiver.is() && xProvider.is() )
454 const uno::Sequence< beans::PropertyValue > aArgs( xProvider->detectArguments( xReceiver->getUsedData() ) );
457 chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
458 bool bHasCategories=
false;
459 bool bFirstCellAsLabel=
false;
460 for (
const beans::PropertyValue& rProp : aArgs)
464 if (aPropName ==
"CellRangeRepresentation")
465 rProp.Value >>= aRanges;
466 else if (aPropName ==
"DataRowSource")
468 else if (aPropName ==
"HasCategories")
470 else if (aPropName ==
"FirstCellAsLabel")
474 if( chart::ChartDataRowSource_COLUMNS == eDataRowSource )
476 rColHeaders=bFirstCellAsLabel;
477 rRowHeaders=bHasCategories;
481 rColHeaders=bHasCategories;
482 rRowHeaders=bFirstCellAsLabel;
508 std::make_unique<ScUndoChartData>(
pDocShell,
aChartName, rRanges, bColHeaders, bRowHeaders,
false ) );
527 uno::Sequence< table::CellRangeAddress > aCellRanges;
528 if ( rValue >>= aCellRanges )
531 for ( table::CellRangeAddress
const & aCellRange : std::as_const(aCellRanges) )
572 if (!rRangeList.
is())
576 uno::Sequence<table::CellRangeAddress> aCellRanges(nCount);
577 table::CellRangeAddress* pCellRanges = aCellRanges.getArray();
578 for (
size_t i = 0;
i < nCount; ++
i)
580 ScRange const & rRange = (*rRangeList)[
i];
581 table::CellRangeAddress aCellRange;
583 pCellRanges[
i] = aCellRange;
585 rValue <<= aCellRanges;
597 uno::Sequence< beans::Property > aProps;
599 return new ::cppu::OPropertyArrayHelper( aProps );
612 sal_Bool SAL_CALL ScChartObj::getHasColumnHeaders()
616 bool bColHeaders, bRowHeaders;
617 GetData_Impl( xRanges, bColHeaders, bRowHeaders );
625 bool bOldColHeaders, bOldRowHeaders;
626 GetData_Impl( xRanges, bOldColHeaders, bOldRowHeaders );
627 if ( bOldColHeaders !=
bool(bHasColumnHeaders) )
628 Update_Impl( xRanges, bHasColumnHeaders, bOldRowHeaders );
635 bool bColHeaders, bRowHeaders;
644 bool bOldColHeaders, bOldRowHeaders;
645 GetData_Impl( xRanges, bOldColHeaders, bOldRowHeaders );
646 if ( bOldRowHeaders !=
bool(bHasRowHeaders) )
647 Update_Impl( xRanges, bOldColHeaders, bHasRowHeaders );
654 bool bColHeaders, bRowHeaders;
660 table::CellRangeAddress aRangeAddress;
661 uno::Sequence<table::CellRangeAddress>
aSeq(nCount);
662 table::CellRangeAddress* pAry = aSeq.getArray();
663 for (
size_t i = 0;
i < nCount;
i++)
665 ScRange const & rRange = (*xRanges)[
i];
667 aRangeAddress.Sheet = rRange.
aStart.
Tab();
668 aRangeAddress.StartColumn = rRange.
aStart.
Col();
669 aRangeAddress.StartRow = rRange.
aStart.
Row();
670 aRangeAddress.EndColumn = rRange.
aEnd.
Col();
671 aRangeAddress.EndRow = rRange.
aEnd.
Row();
673 pAry[
i] = aRangeAddress;
678 OSL_FAIL(
"ScChartObj::getRanges: no Ranges");
679 return uno::Sequence<table::CellRangeAddress>();
686 bool bColHeaders, bRowHeaders;
690 for (
const table::CellRangeAddress& rRange : aRanges)
692 ScRange aRange( static_cast<SCCOL>(rRange.StartColumn), rRange.StartRow, rRange.Sheet,
693 static_cast<SCCOL>(rRange.EndColumn), rRange.EndRow, rRange.Sheet );
698 if ( !xOldRanges.
is() || *xOldRanges != *xNewRanges )
699 Update_Impl( xNewRanges, bColHeaders, bRowHeaders );
712 return uno::Reference < lang::XComponent > ( pObject->
GetObjRef()->getComponent(), uno::UNO_QUERY );
728 throw uno::RuntimeException();
virtual ~ScChartObj() override
virtual css::uno::Any SAL_CALL getByIndex(sal_Int32 Index) override
IMPLEMENT_FORWARD_XINTERFACE2(ChildWindowPane, ChildWindowPaneInterfaceBase, Pane)
virtual void SAL_CALL setHasColumnHeaders(sal_Bool bHasColumnHeaders) override
ScRefFlags Parse(std::u16string_view, const ScDocument &, formula::FormulaGrammar::AddressConvention eConv=formula::FormulaGrammar::CONV_OOO, SCTAB nDefaultTab=0, sal_Unicode cDelimiter=0)
static sal_Int32 GetEnumFromAny(const css::uno::Any &aAny)
rtl::Reference< ScChartObj > GetObjectByIndex_Impl(tools::Long nIndex) const
void ChangeListening(const OUString &rName, const ScRangeListRef &rRangeListRef)
css::uno::Reference< css::embed::XEmbeddedObject > const & GetObjRef() const
virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override
void setWidth(tools::Long nWidth)
SAL_WARN_UNUSED_RESULT Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
void describeProperties(css::uno::Sequence< css::beans::Property > &_rProps) const
virtual OUString SAL_CALL getName() override
rtl::Reference< ScChartObj > GetObjectByName_Impl(const OUString &aName) const
bool insert(ScChartListener *pListener)
void Format(OUString &, ScRefFlags nFlags, const ScDocument &, formula::FormulaGrammar::AddressConvention eConv=formula::FormulaGrammar::CONV_OOO, sal_Unicode cDelimiter=0, bool bFullAddressNotation=false) const
virtual ~ScChartsObj() override
SdrObject * GetNamedObject(std::u16string_view rName, SdrObjKind nId, SCTAB &rFoundTab) const
virtual void SAL_CALL setHasRowHeaders(sal_Bool bHasRowHeaders) override
ScRangeListRef GetRangeList() const
virtual sal_Bool SAL_CALL hasElements() override
virtual SdrObjKind GetObjIdentifier() const
virtual void InsertObject(SdrObject *pObj, size_t nPos=SAL_MAX_SIZE)
EmbeddedObjectRef * pObject
virtual void SAL_CALL getFastPropertyValue(css::uno::Any &rValue, sal_Int32 nHandle) const override
css::uno::Reference< css::chart2::XChartDocument > GetChartByName(std::u16string_view rChartName)
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
void UpdateChartArea(const OUString &rChartName, const ScRange &rNewArea, bool bColHeaders, bool bRowHeaders, bool bAdd)
virtual SfxUndoManager * GetUndoManager() override
constexpr tools::Long Width() const
virtual void SAL_CALL addNewByName(const OUString &aName, const css::awt::Rectangle &aRect, const css::uno::Sequence< css::table::CellRangeAddress > &aRanges, sal_Bool bColumnHeaders, sal_Bool bRowHeaders) override
virtual void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const css::uno::Any &rValue) override
void AddUndo(std::unique_ptr< SdrUndoAction > pUndo)
void push_back(const ScRange &rRange)
virtual void SAL_CALL setName(const OUString &aName) override
virtual sal_Bool SAL_CALL getHasRowHeaders() override
ScChartListener * findByName(const OUString &rName)
SC_DLLPUBLIC ScDrawLayer * GetDrawLayer()
ScChartObj(ScDocShell *pDocSh, SCTAB nT, const OUString &rN)
virtual void AddUndoAction(std::unique_ptr< SfxUndoAction > pAction, bool bTryMerg=false)
::cppu::WeakComponentImplHelper< css::table::XTableChart, css::document::XEmbeddedObjectSupplier, css::container::XNamed, css::lang::XServiceInfo > ScChartObj_Base
virtual css::uno::Sequence< css::table::CellRangeAddress > SAL_CALL getRanges() override
void GetData_Impl(ScRangeListRef &rRanges, bool &rColHeaders, bool &rRowHeaders) const
virtual sal_Bool SAL_CALL hasByName(const OUString &aName) override
const SdrPage * GetPage(sal_uInt16 nPgNum) const
sal_uInt32 GetOrdNum() const
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override
void removeByName(const OUString &rName)
css::uno::Type const & get()
#define SC_SIMPLE_SERVICE_INFO(ClassName, ClassNameAscii, ServiceAscii)
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
virtual ::cppu::IPropertyArrayHelper * createArrayHelper() const override
virtual SdrObject * RemoveObject(size_t nObjNum)
#define PROP_HANDLE_RELATED_CELLRANGES
void AddUnoObject(SfxListener &rObject)
virtual css::uno::Any SAL_CALL getByName(const OUString &aName) override
::cppu::IPropertyArrayHelper * getArrayHelper()
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint) override
static MapUnit UnoEmbed2VCLMapUnit(sal_Int32 nUnoEmbedMapUnit)
constexpr tools::Long Height() const
void RemoveUnoObject(SfxListener &rObject)
void Update_Impl(const ScRangeListRef &rRanges, bool bColHeaders, bool bRowHeaders)
SC_DLLPUBLIC ScChartListenerCollection * GetChartListenerCollection() const
Sequence< sal_Int8 > aSeq
const ScDocument & GetDocument() const
virtual void SAL_CALL setRanges(const css::uno::Sequence< css::table::CellRangeAddress > &aRanges) override
void registerPropertyNoMember(const OUString &_rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, const css::uno::Type &_rType, css::uno::Any const &_pInitialValue)
static bool IsChart(const SdrObject *pObject)
SC_DLLPUBLIC bool IsLayoutRTL(SCTAB nTab) const
virtual css::uno::Type SAL_CALL getElementType() override
void setHeight(tools::Long nHeight)
virtual void SAL_CALL removeByName(const OUString &aName) override
static void FillApiRange(css::table::CellRangeAddress &rApiRange, const ScRange &rScRange)
bool IsUndoEnabled() const
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint) override
static bool TryRunningState(const css::uno::Reference< css::embed::XEmbeddedObject > &)
virtual sal_Int32 SAL_CALL getCount() override
static bool GetBoolFromAny(const css::uno::Any &aAny)
static void FillScRange(ScRange &rScRange, const css::table::CellRangeAddress &rApiRange)
virtual ::cppu::IPropertyArrayHelper &SAL_CALL getInfoHelper() override
virtual css::uno::Reference< css::lang::XComponent > SAL_CALL getEmbeddedObject() override