20 #include <charthelper.hxx>
21 #include <document.hxx>
33 #include <com/sun/star/chart2/XChartDocument.hpp>
34 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
35 #include <com/sun/star/embed/XEmbeddedObject.hpp>
36 #include <com/sun/star/util/XModifiable.hpp>
39 using ::com::sun::star::uno::Reference;
44 sal_uInt16 lcl_DoUpdateCharts(
ScDocument& rDoc )
50 sal_uInt16 nFound = 0;
53 for (sal_uInt16 nPageNo=0; nPageNo<nPageCount; nPageNo++)
56 OSL_ENSURE(pPage,
"Page ?");
68 pObject = aIter.Next();
78 bool bChanged =
false;
80 for (
size_t i=0, nCount = rRanges.
size();
i <
nCount;
i++ )
91 rRange.
aStart.
SetTab( nTabCount > 0 ? ( nTabCount - 1 ) : 0 );
94 if ( rRange.
aEnd.
Tab() >= nTabCount )
96 rRange.
aEnd.
SetTab( nTabCount > 0 ? ( nTabCount - 1 ) : 0 );
110 return lcl_DoUpdateCharts( rDoc );
119 SdrPage* pDestPage = pDrawLayer->
GetPage(static_cast<sal_uInt16>(nDestTab));
129 OUString aChartName =
static_cast<SdrOle2Obj*
>(pObject)->GetPersistName();
131 Reference< chart2::XChartDocument > xChartDoc( rDestDoc.
GetChartByName( aChartName ) );
132 Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
133 if( xChartDoc.is() && xReceiver.is() && !xChartDoc->hasInternalDataProvider() )
135 ::std::vector< ScRangeList > aRangesVector;
140 lcl_AdjustRanges( rScRangeList, nSrcTab, nDestTab, rDestDoc.
GetTableCount() );
145 pObject = aIter.
Next();
155 SdrPage* pDestPage = pDrawLayer->
GetPage(static_cast<sal_uInt16>(nDestTab));
165 OUString aChartName =
static_cast<SdrOle2Obj*
>(pObject)->GetPersistName();
166 Reference< chart2::XChartDocument > xChartDoc( rDestDoc.
GetChartByName( aChartName ) );
167 Reference< util::XModifiable > xModif(xChartDoc, uno::UNO_QUERY_THROW);
168 xModif->setModified(
true);
170 pObject = aIter.
Next();
176 uno::Reference< chart2::XChartDocument > xReturn;
181 uno::Reference< embed::XEmbeddedObject > xIPObj =
static_cast<const SdrOle2Obj*
>(pObject)->GetObjRef();
185 uno::Reference< util::XCloseable > xComponent = xIPObj->getComponent();
186 xReturn.set( uno::Reference< chart2::XChartDocument >( xComponent, uno::UNO_QUERY ) );
194 std::vector< OUString >& rRanges )
197 uno::Reference< chart2::data::XDataSource > xDataSource( xChartDoc, uno::UNO_QUERY );
198 if( !xDataSource.is() )
201 const uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aLabeledDataSequences( xDataSource->getDataSequences() );
202 rRanges.reserve(2*aLabeledDataSequences.getLength());
203 for(
const uno::Reference<chart2::data::XLabeledDataSequence>& xLabeledSequence : aLabeledDataSequences)
205 if(!xLabeledSequence.is())
207 uno::Reference< chart2::data::XDataSequence > xLabel( xLabeledSequence->getLabel());
208 uno::Reference< chart2::data::XDataSequence > xValues( xLabeledSequence->getValues());
211 rRanges.push_back( xLabel->getSourceRangeRepresentation() );
213 rRanges.push_back( xValues->getSourceRangeRepresentation() );
218 const uno::Sequence< OUString >& rRanges )
220 uno::Reference< chart2::data::XDataSource > xDataSource( xChartDoc, uno::UNO_QUERY );
221 if( !xDataSource.is() )
223 uno::Reference< chart2::data::XDataProvider > xDataProvider = xChartDoc->getDataProvider();
224 if( !xDataProvider.is() )
227 xChartDoc->lockControllers();
231 OUString aPropertyNameRole(
"Role" );
233 uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aLabeledDataSequences( xDataSource->getDataSequences() );
235 for( uno::Reference<chart2::data::XLabeledDataSequence>& xLabeledSequence : aLabeledDataSequences )
237 if( nRange >= rRanges.getLength() )
240 if(!xLabeledSequence.is())
242 uno::Reference< beans::XPropertySet > xLabel( xLabeledSequence->getLabel(), uno::UNO_QUERY );
243 uno::Reference< beans::XPropertySet > xValues( xLabeledSequence->getValues(), uno::UNO_QUERY );
247 uno::Reference< chart2::data::XDataSequence > xNewSeq(
248 xDataProvider->createDataSequenceByRangeRepresentation( rRanges[nRange++] ));
250 uno::Reference< beans::XPropertySet > xNewProps( xNewSeq, uno::UNO_QUERY );
252 xNewProps->setPropertyValue( aPropertyNameRole, xLabel->getPropertyValue( aPropertyNameRole ) );
254 xLabeledSequence->setLabel( xNewSeq );
257 if( nRange >= rRanges.getLength() )
262 uno::Reference< chart2::data::XDataSequence > xNewSeq(
263 xDataProvider->createDataSequenceByRangeRepresentation( rRanges[nRange++] ));
265 uno::Reference< beans::XPropertySet > xNewProps( xNewSeq, uno::UNO_QUERY );
267 xNewProps->setPropertyValue( aPropertyNameRole, xValues->getPropertyValue( aPropertyNameRole ) );
269 xLabeledSequence->setValues( xNewSeq );
273 catch (
const uno::Exception&)
275 TOOLS_WARN_EXCEPTION(
"sc",
"Exception in ScChartHelper::SetChartRanges - invalid range string?");
278 xChartDoc->unlockControllers();
287 if ( !(pSdrOle2Obj && pSdrOle2Obj->
IsChart()) )
290 const uno::Reference< embed::XEmbeddedObject >& xEmbeddedObj = pSdrOle2Obj->
GetObjRef();
291 if ( !xEmbeddedObj.is() )
294 bool bDisableDataTableDialog =
false;
295 sal_Int32 nOldState = xEmbeddedObj->getCurrentState();
297 uno::Reference< beans::XPropertySet > xProps( xEmbeddedObj->getComponent(), uno::UNO_QUERY );
299 ( xProps->getPropertyValue(
"DisableDataTableDialog") >>= bDisableDataTableDialog ) &&
300 bDisableDataTableDialog )
310 if ( rRangeList.
is() )
312 rRangesVector.push_back( *rRangeList );
317 if ( xEmbeddedObj->getCurrentState() != nOldState )
319 xEmbeddedObj->changeState( nOldState );
331 AddRangesIfProtectedChart( rRangesVector, rDocument, pObject );
332 pObject = aIter.
Next();
349 if ( pSdrOle2Obj && pSdrOle2Obj->
IsChart() )
354 pObject = aIter.
Next();
359 const ScRangeListVector& rRangesVector, const ::std::vector< OUString >& rExcludedChartNames,
bool bSameDoc )
361 if ( !(pPage && pModelObj) )
364 size_t nRangeListCount = rRangesVector.size();
365 size_t nRangeList = 0;
373 if ( pSdrOle2Obj && pSdrOle2Obj->
IsChart() )
376 ::std::vector< OUString >::const_iterator aEnd = rExcludedChartNames.end();
377 ::std::vector< OUString >::const_iterator aFound = ::std::find( rExcludedChartNames.begin(), aEnd, aChartName );
378 if ( aFound == aEnd )
380 const uno::Reference< embed::XEmbeddedObject >& xEmbeddedObj = pSdrOle2Obj->
GetObjRef();
381 if ( xEmbeddedObj.is() && ( nRangeList < nRangeListCount ) )
383 bool bDisableDataTableDialog =
false;
385 uno::Reference< beans::XPropertySet > xProps( xEmbeddedObj->getComponent(), uno::UNO_QUERY );
387 ( xProps->getPropertyValue(
"DisableDataTableDialog") >>= bDisableDataTableDialog ) &&
388 bDisableDataTableDialog )
393 if (pCollection && !pCollection->
findByName(aChartName))
395 ScRangeList aRangeList( rRangesVector[ nRangeList++ ] );
398 pCollection->
insert( pChartListener );
404 xProps->setPropertyValue(
"DisableDataTableDialog",
406 xProps->setPropertyValue(
"DisableComplexChartTypes",
418 uno::Sequence< beans::PropertyValue >
aProperties( 1 );
419 aProperties[ 0 ].Name =
"Name";
420 aProperties[ 0 ].Value <<= aChartName;
422 pModelObj->
NotifyChanges(
"insert-chart", aChangeRanges, aProperties );
427 pObject = aIter.
Next();
static void FillProtectedChartRangesVector(ScRangeListVector &rRangesVector, const ScDocument &rDocument, const SdrPage *pPage)
css::uno::Reference< css::embed::XEmbeddedObject > const & GetObjRef() const
static css::uno::Reference< css::chart2::XChartDocument > GetChartFromSdrObject(const SdrObject *pObject)
bool insert(ScChartListener *pListener)
ScRangeListRef GetRangeList() const
SC_DLLPUBLIC ScRange GetRange(SCTAB nTab, const tools::Rectangle &rMMRect, bool bHiddenAsZero=true) const
virtual SdrObjKind GetObjIdentifier() const
virtual const tools::Rectangle & GetSnapRect() const override
EmbeddedObjectRef * pObject
css::uno::Reference< css::chart2::XChartDocument > GetChartByName(std::u16string_view rChartName)
void UpdateChart(const OUString &rName)
static void CreateProtectedChartListenersAndNotify(ScDocument &rDoc, const SdrPage *pPage, ScModelObj *pModelObj, SCTAB nTab, const ScRangeListVector &rRangesVector, const ::std::vector< OUString > &rExcludedChartNames, bool bSameDoc=true)
PropertiesInfo aProperties
SC_DLLPUBLIC SCTAB GetTableCount() const
static void AddRangesIfProtectedChart(ScRangeListVector &rRangesVector, const ScDocument &rDocument, SdrObject *pObject)
static void AdjustRangesOfChartsOnDestinationPage(const ScDocument &rSrcDoc, ScDocument &rDestDoc, const SCTAB nSrcTab, const SCTAB nDestTab)
static void GetChartNames(::std::vector< OUString > &rChartNames, const SdrPage *pPage)
ScChartListener * findByName(const OUString &rName)
SC_DLLPUBLIC ScDrawLayer * GetDrawLayer()
#define TOOLS_WARN_EXCEPTION(area, stream)
static void GetChartRanges(const css::uno::Reference< css::chart2::XChartDocument > &xChartDoc, std::vector< OUString > &rRanges)
const SdrPage * GetPage(sal_uInt16 nPgNum) const
static void UpdateChartsOnDestinationPage(ScDocument &rDestDoc, const SCTAB nDestTab)
::std::vector< ScRangeList > ScRangeListVector
void NotifyChanges(const OUString &rOperation, const ScRangeList &rRanges, const css::uno::Sequence< css::beans::PropertyValue > &rProperties)
Any makeAny(Color const &value)
const OUString & GetPersistName() const
SC_DLLPUBLIC ScChartListenerCollection * GetChartListenerCollection() const
SC_DLLPUBLIC void GetChartRanges(std::u16string_view rChartName, std::vector< ScRangeList > &rRanges, const ScDocument &rSheetNameDoc)
static bool IsChart(const SdrObject *pObject)
static bool TryRunningState(const css::uno::Reference< css::embed::XEmbeddedObject > &)
bool HasChangesListeners() const
void SetChartRanges(std::u16string_view rChartName, const std::vector< ScRangeList > &rRanges)
static void SetChartRanges(const css::uno::Reference< css::chart2::XChartDocument > &xChartDoc, const css::uno::Sequence< OUString > &rRanges)
static sal_uInt16 DoUpdateAllCharts(ScDocument &rDoc)
sal_uInt16 GetPageCount() const