1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*b3f79822SAndrew Rist * distributed with this work for additional information
6*b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist * KIND, either express or implied. See the License for the
17*b3f79822SAndrew Rist * specific language governing permissions and limitations
18*b3f79822SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*b3f79822SAndrew Rist *************************************************************/
21*b3f79822SAndrew Rist
22*b3f79822SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp>
28cdf0e10cSrcweir #include <com/sun/star/chart/ChartDataRowSource.hpp>
29cdf0e10cSrcweir #include <com/sun/star/chart2/XChartDocument.hpp>
30cdf0e10cSrcweir #include <com/sun/star/chart2/data/XDataProvider.hpp>
31cdf0e10cSrcweir #include <com/sun/star/chart2/data/XDataReceiver.hpp>
32cdf0e10cSrcweir #include <com/sun/star/embed/EmbedStates.hpp>
33cdf0e10cSrcweir #include <com/sun/star/embed/XEmbeddedObject.hpp>
34cdf0e10cSrcweir
35cdf0e10cSrcweir
36cdf0e10cSrcweir #ifdef _MSC_VER
37cdf0e10cSrcweir #pragma optimize("",off)
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir
40cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
41cdf0e10cSrcweir
42cdf0e10cSrcweir #include <sfx2/objsh.hxx>
43cdf0e10cSrcweir #include <svx/svditer.hxx>
44cdf0e10cSrcweir #include <svx/svdoole2.hxx>
45cdf0e10cSrcweir #include <svx/svdpage.hxx>
46cdf0e10cSrcweir
47cdf0e10cSrcweir //REMOVE #ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED
48cdf0e10cSrcweir //REMOVE #define SO2_DECL_SVINPLACEOBJECT_DEFINED
49cdf0e10cSrcweir //REMOVE SO2_DECL_REF(SvInPlaceObject)
50cdf0e10cSrcweir //REMOVE #endif
51cdf0e10cSrcweir
52cdf0e10cSrcweir #include "document.hxx"
53cdf0e10cSrcweir #include "drwlayer.hxx"
54cdf0e10cSrcweir #include "chartarr.hxx"
55cdf0e10cSrcweir #include "chartlis.hxx"
56cdf0e10cSrcweir #include "chartlock.hxx"
57cdf0e10cSrcweir #include "refupdat.hxx"
58cdf0e10cSrcweir #include <tools/globname.hxx>
59cdf0e10cSrcweir #include <sot/exchange.hxx>
60cdf0e10cSrcweir
61cdf0e10cSrcweir #include "miscuno.hxx"
62cdf0e10cSrcweir #include "chart2uno.hxx"
63cdf0e10cSrcweir #include "charthelper.hxx"
64cdf0e10cSrcweir
65cdf0e10cSrcweir using namespace ::com::sun::star;
66cdf0e10cSrcweir
67cdf0e10cSrcweir // -----------------------------------------------------------------------
68cdf0e10cSrcweir
lcl_GetChartParameters(const uno::Reference<chart2::XChartDocument> & xChartDoc,rtl::OUString & rRanges,chart::ChartDataRowSource & rDataRowSource,bool & rHasCategories,bool & rFirstCellAsLabel)69cdf0e10cSrcweir void lcl_GetChartParameters( const uno::Reference< chart2::XChartDocument >& xChartDoc,
70cdf0e10cSrcweir rtl::OUString& rRanges, chart::ChartDataRowSource& rDataRowSource,
71cdf0e10cSrcweir bool& rHasCategories, bool& rFirstCellAsLabel )
72cdf0e10cSrcweir {
73cdf0e10cSrcweir rHasCategories = rFirstCellAsLabel = false; // default if not in sequence
74cdf0e10cSrcweir
75cdf0e10cSrcweir uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
76cdf0e10cSrcweir
77cdf0e10cSrcweir uno::Reference< chart2::data::XDataSource > xDataSource = xReceiver->getUsedData();
78cdf0e10cSrcweir uno::Reference< chart2::data::XDataProvider > xProvider = xChartDoc->getDataProvider();
79cdf0e10cSrcweir
80cdf0e10cSrcweir if ( xProvider.is() )
81cdf0e10cSrcweir {
82cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aArgs( xProvider->detectArguments( xDataSource ) );
83cdf0e10cSrcweir
84cdf0e10cSrcweir const beans::PropertyValue* pPropArray = aArgs.getConstArray();
85cdf0e10cSrcweir long nPropCount = aArgs.getLength();
86cdf0e10cSrcweir for (long i = 0; i < nPropCount; i++)
87cdf0e10cSrcweir {
88cdf0e10cSrcweir const beans::PropertyValue& rProp = pPropArray[i];
89cdf0e10cSrcweir String aPropName(rProp.Name);
90cdf0e10cSrcweir
91cdf0e10cSrcweir if (aPropName.EqualsAscii( "CellRangeRepresentation" ))
92cdf0e10cSrcweir rProp.Value >>= rRanges;
93cdf0e10cSrcweir else if (aPropName.EqualsAscii( "DataRowSource" ))
94cdf0e10cSrcweir rDataRowSource = (chart::ChartDataRowSource)ScUnoHelpFunctions::GetEnumFromAny( rProp.Value );
95cdf0e10cSrcweir else if (aPropName.EqualsAscii( "HasCategories" ))
96cdf0e10cSrcweir rHasCategories = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
97cdf0e10cSrcweir else if (aPropName.EqualsAscii( "FirstCellAsLabel" ))
98cdf0e10cSrcweir rFirstCellAsLabel = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
99cdf0e10cSrcweir }
100cdf0e10cSrcweir }
101cdf0e10cSrcweir }
102cdf0e10cSrcweir
lcl_SetChartParameters(const uno::Reference<chart2::data::XDataReceiver> & xReceiver,const rtl::OUString & rRanges,chart::ChartDataRowSource eDataRowSource,bool bHasCategories,bool bFirstCellAsLabel)103cdf0e10cSrcweir void lcl_SetChartParameters( const uno::Reference< chart2::data::XDataReceiver >& xReceiver,
104cdf0e10cSrcweir const rtl::OUString& rRanges, chart::ChartDataRowSource eDataRowSource,
105cdf0e10cSrcweir bool bHasCategories, bool bFirstCellAsLabel )
106cdf0e10cSrcweir {
107cdf0e10cSrcweir if ( xReceiver.is() )
108cdf0e10cSrcweir {
109cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aArgs( 4 );
110cdf0e10cSrcweir aArgs[0] = beans::PropertyValue(
111cdf0e10cSrcweir ::rtl::OUString::createFromAscii("CellRangeRepresentation"), -1,
112cdf0e10cSrcweir uno::makeAny( rRanges ), beans::PropertyState_DIRECT_VALUE );
113cdf0e10cSrcweir aArgs[1] = beans::PropertyValue(
114cdf0e10cSrcweir ::rtl::OUString::createFromAscii("HasCategories"), -1,
115cdf0e10cSrcweir uno::makeAny( bHasCategories ), beans::PropertyState_DIRECT_VALUE );
116cdf0e10cSrcweir aArgs[2] = beans::PropertyValue(
117cdf0e10cSrcweir ::rtl::OUString::createFromAscii("FirstCellAsLabel"), -1,
118cdf0e10cSrcweir uno::makeAny( bFirstCellAsLabel ), beans::PropertyState_DIRECT_VALUE );
119cdf0e10cSrcweir aArgs[3] = beans::PropertyValue(
120cdf0e10cSrcweir ::rtl::OUString::createFromAscii("DataRowSource"), -1,
121cdf0e10cSrcweir uno::makeAny( eDataRowSource ), beans::PropertyState_DIRECT_VALUE );
122cdf0e10cSrcweir xReceiver->setArguments( aArgs );
123cdf0e10cSrcweir }
124cdf0e10cSrcweir }
125cdf0e10cSrcweir
126cdf0e10cSrcweir // update charts after loading old document
127cdf0e10cSrcweir
UpdateAllCharts()128cdf0e10cSrcweir void ScDocument::UpdateAllCharts()
129cdf0e10cSrcweir {
130cdf0e10cSrcweir if ( !pDrawLayer || !pShell )
131cdf0e10cSrcweir return;
132cdf0e10cSrcweir
133cdf0e10cSrcweir sal_uInt16 nDataCount = pChartCollection->GetCount();
134cdf0e10cSrcweir if ( !nDataCount )
135cdf0e10cSrcweir return ; // nothing to do
136cdf0e10cSrcweir
137cdf0e10cSrcweir sal_uInt16 nPos;
138cdf0e10cSrcweir
139cdf0e10cSrcweir for (SCTAB nTab=0; nTab<=MAXTAB; nTab++)
140cdf0e10cSrcweir {
141cdf0e10cSrcweir if (pTab[nTab])
142cdf0e10cSrcweir {
143cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
144cdf0e10cSrcweir DBG_ASSERT(pPage,"Page ?");
145cdf0e10cSrcweir
146cdf0e10cSrcweir ScRange aRange;
147cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
148cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
149cdf0e10cSrcweir while (pObject)
150cdf0e10cSrcweir {
151cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 )
152cdf0e10cSrcweir {
153cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xIPObj = ((SdrOle2Obj*)pObject)->GetObjRef();
154cdf0e10cSrcweir if ( xIPObj.is() )
155cdf0e10cSrcweir {
156cdf0e10cSrcweir String aIPName = ((SdrOle2Obj*)pObject)->GetPersistName();
157cdf0e10cSrcweir
158cdf0e10cSrcweir for (nPos=0; nPos<nDataCount; nPos++)
159cdf0e10cSrcweir {
160cdf0e10cSrcweir ScChartArray* pChartObj = (*pChartCollection)[nPos];
161cdf0e10cSrcweir if (pChartObj->GetName() == aIPName)
162cdf0e10cSrcweir {
163cdf0e10cSrcweir ScRangeListRef aRanges = pChartObj->GetRangeList();
164cdf0e10cSrcweir String sRangeStr;
165cdf0e10cSrcweir aRanges->Format( sRangeStr, SCR_ABS_3D, this, GetAddressConvention() );
166cdf0e10cSrcweir
167cdf0e10cSrcweir chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
168cdf0e10cSrcweir bool bHasCategories = pChartObj->HasRowHeaders();
169cdf0e10cSrcweir bool bFirstCellAsLabel = pChartObj->HasColHeaders();
170cdf0e10cSrcweir
171cdf0e10cSrcweir // Calc -> DataProvider
172cdf0e10cSrcweir uno::Reference< chart2::data::XDataProvider > xDataProvider =
173cdf0e10cSrcweir new ScChart2DataProvider( this );
174cdf0e10cSrcweir // Chart -> DataReceiver
175cdf0e10cSrcweir uno::Reference< chart2::data::XDataReceiver > xReceiver;
176cdf0e10cSrcweir uno::Reference< embed::XComponentSupplier > xCompSupp( xIPObj, uno::UNO_QUERY );
177cdf0e10cSrcweir if( xCompSupp.is())
178cdf0e10cSrcweir xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY );
179cdf0e10cSrcweir if( xReceiver.is())
180cdf0e10cSrcweir {
181cdf0e10cSrcweir // connect
182cdf0e10cSrcweir xReceiver->attachDataProvider( xDataProvider );
183cdf0e10cSrcweir uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier(
184cdf0e10cSrcweir pShell->GetModel(), uno::UNO_QUERY );
185cdf0e10cSrcweir xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
186cdf0e10cSrcweir
187cdf0e10cSrcweir lcl_SetChartParameters( xReceiver, sRangeStr, eDataRowSource,
188cdf0e10cSrcweir bHasCategories, bFirstCellAsLabel );
189cdf0e10cSrcweir }
190cdf0e10cSrcweir
191cdf0e10cSrcweir ScChartListener* pCL = new ScChartListener(
192cdf0e10cSrcweir aIPName, this, pChartObj->GetRangeList() );
193cdf0e10cSrcweir pChartListenerCollection->Insert( pCL );
194cdf0e10cSrcweir pCL->StartListeningTo();
195cdf0e10cSrcweir }
196cdf0e10cSrcweir }
197cdf0e10cSrcweir }
198cdf0e10cSrcweir }
199cdf0e10cSrcweir pObject = aIter.Next();
200cdf0e10cSrcweir }
201cdf0e10cSrcweir }
202cdf0e10cSrcweir }
203cdf0e10cSrcweir
204cdf0e10cSrcweir pChartCollection->FreeAll();
205cdf0e10cSrcweir }
206cdf0e10cSrcweir
HasChartAtPoint(SCTAB nTab,const Point & rPos,String * pName)207cdf0e10cSrcweir sal_Bool ScDocument::HasChartAtPoint( SCTAB nTab, const Point& rPos, String* pName )
208cdf0e10cSrcweir {
209cdf0e10cSrcweir if (pDrawLayer && pTab[nTab])
210cdf0e10cSrcweir {
211cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
212cdf0e10cSrcweir DBG_ASSERT(pPage,"Page ?");
213cdf0e10cSrcweir
214cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
215cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
216cdf0e10cSrcweir while (pObject)
217cdf0e10cSrcweir {
218cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
219cdf0e10cSrcweir pObject->GetCurrentBoundRect().IsInside(rPos) )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir // auch Chart-Objekte die nicht in der Collection sind
222cdf0e10cSrcweir
223cdf0e10cSrcweir if (IsChart(pObject))
224cdf0e10cSrcweir {
225cdf0e10cSrcweir if (pName)
226cdf0e10cSrcweir *pName = ((SdrOle2Obj*)pObject)->GetPersistName();
227cdf0e10cSrcweir return sal_True;
228cdf0e10cSrcweir }
229cdf0e10cSrcweir }
230cdf0e10cSrcweir pObject = aIter.Next();
231cdf0e10cSrcweir }
232cdf0e10cSrcweir }
233cdf0e10cSrcweir
234cdf0e10cSrcweir if (pName)
235cdf0e10cSrcweir pName->Erase();
236cdf0e10cSrcweir return sal_False; // nix gefunden
237cdf0e10cSrcweir }
238cdf0e10cSrcweir
UpdateChartArea(const String & rChartName,const ScRange & rNewArea,sal_Bool bColHeaders,sal_Bool bRowHeaders,sal_Bool bAdd)239cdf0e10cSrcweir void ScDocument::UpdateChartArea( const String& rChartName,
240cdf0e10cSrcweir const ScRange& rNewArea, sal_Bool bColHeaders, sal_Bool bRowHeaders,
241cdf0e10cSrcweir sal_Bool bAdd )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir ScRangeListRef aRLR( new ScRangeList );
244cdf0e10cSrcweir aRLR->Append( rNewArea );
245cdf0e10cSrcweir UpdateChartArea( rChartName, aRLR, bColHeaders, bRowHeaders, bAdd );
246cdf0e10cSrcweir }
247cdf0e10cSrcweir
GetChartByName(const String & rChartName)248cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > ScDocument::GetChartByName( const String& rChartName )
249cdf0e10cSrcweir {
250cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xReturn;
251cdf0e10cSrcweir
252cdf0e10cSrcweir if (pDrawLayer)
253cdf0e10cSrcweir {
254cdf0e10cSrcweir sal_uInt16 nCount = pDrawLayer->GetPageCount();
255cdf0e10cSrcweir for (sal_uInt16 nTab=0; nTab<nCount; nTab++)
256cdf0e10cSrcweir {
257cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage(nTab);
258cdf0e10cSrcweir DBG_ASSERT(pPage,"Page ?");
259cdf0e10cSrcweir
260cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
261cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
262cdf0e10cSrcweir while (pObject)
263cdf0e10cSrcweir {
264cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
265cdf0e10cSrcweir ((SdrOle2Obj*)pObject)->GetPersistName() == rChartName )
266cdf0e10cSrcweir {
267cdf0e10cSrcweir xReturn.set( ScChartHelper::GetChartFromSdrObject( pObject ) );
268cdf0e10cSrcweir return xReturn;
269cdf0e10cSrcweir }
270cdf0e10cSrcweir pObject = aIter.Next();
271cdf0e10cSrcweir }
272cdf0e10cSrcweir }
273cdf0e10cSrcweir }
274cdf0e10cSrcweir return xReturn;
275cdf0e10cSrcweir }
GetChartRanges(const String & rChartName,::std::vector<ScRangeList> & rRangesVector,ScDocument * pSheetNameDoc)276cdf0e10cSrcweir void ScDocument::GetChartRanges( const String& rChartName, ::std::vector< ScRangeList >& rRangesVector, ScDocument* pSheetNameDoc )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir rRangesVector.clear();
279cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( GetChartByName( rChartName ) );
280cdf0e10cSrcweir if ( xChartDoc.is() )
281cdf0e10cSrcweir {
282cdf0e10cSrcweir uno::Sequence< rtl::OUString > aRangeStrings;
283cdf0e10cSrcweir ScChartHelper::GetChartRanges( xChartDoc, aRangeStrings );
284cdf0e10cSrcweir for( sal_Int32 nN=0; nN<aRangeStrings.getLength(); nN++ )
285cdf0e10cSrcweir {
286cdf0e10cSrcweir ScRangeList aRanges;
287cdf0e10cSrcweir aRanges.Parse( aRangeStrings[nN], pSheetNameDoc, SCA_VALID, pSheetNameDoc->GetAddressConvention() );
288cdf0e10cSrcweir rRangesVector.push_back(aRanges);
289cdf0e10cSrcweir }
290cdf0e10cSrcweir }
291cdf0e10cSrcweir }
292cdf0e10cSrcweir
SetChartRanges(const String & rChartName,const::std::vector<ScRangeList> & rRangesVector)293cdf0e10cSrcweir void ScDocument::SetChartRanges( const String& rChartName, const ::std::vector< ScRangeList >& rRangesVector )
294cdf0e10cSrcweir {
295cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( GetChartByName( rChartName ) );
296cdf0e10cSrcweir if ( xChartDoc.is() )
297cdf0e10cSrcweir {
298cdf0e10cSrcweir sal_Int32 nCount = static_cast<sal_Int32>( rRangesVector.size() );
299cdf0e10cSrcweir uno::Sequence< rtl::OUString > aRangeStrings(nCount);
300cdf0e10cSrcweir for( sal_Int32 nN=0; nN<nCount; nN++ )
301cdf0e10cSrcweir {
302cdf0e10cSrcweir ScRangeList aScRangeList( rRangesVector[nN] );
303cdf0e10cSrcweir String sRangeStr; // This range must be in Calc A1 format.
304cdf0e10cSrcweir aScRangeList.Format( sRangeStr, SCR_ABS_3D, this );
305cdf0e10cSrcweir aRangeStrings[nN]=sRangeStr;
306cdf0e10cSrcweir }
307cdf0e10cSrcweir ScChartHelper::SetChartRanges( xChartDoc, aRangeStrings );
308cdf0e10cSrcweir }
309cdf0e10cSrcweir }
310cdf0e10cSrcweir
GetOldChartParameters(const String & rName,ScRangeList & rRanges,sal_Bool & rColHeaders,sal_Bool & rRowHeaders)311cdf0e10cSrcweir void ScDocument::GetOldChartParameters( const String& rName,
312cdf0e10cSrcweir ScRangeList& rRanges, sal_Bool& rColHeaders, sal_Bool& rRowHeaders )
313cdf0e10cSrcweir {
314cdf0e10cSrcweir // used for undo of changing chart source area
315cdf0e10cSrcweir
316cdf0e10cSrcweir if (!pDrawLayer)
317cdf0e10cSrcweir return;
318cdf0e10cSrcweir
319cdf0e10cSrcweir sal_uInt16 nCount = pDrawLayer->GetPageCount();
320cdf0e10cSrcweir for (sal_uInt16 nTab=0; nTab<nCount; nTab++)
321cdf0e10cSrcweir {
322cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage(nTab);
323cdf0e10cSrcweir DBG_ASSERT(pPage,"Page ?");
324cdf0e10cSrcweir
325cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
326cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
327cdf0e10cSrcweir while (pObject)
328cdf0e10cSrcweir {
329cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
330cdf0e10cSrcweir ((SdrOle2Obj*)pObject)->GetPersistName() == rName )
331cdf0e10cSrcweir {
332cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( ScChartHelper::GetChartFromSdrObject( pObject ) );
333cdf0e10cSrcweir if ( xChartDoc.is() )
334cdf0e10cSrcweir {
335cdf0e10cSrcweir chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
336cdf0e10cSrcweir bool bHasCategories = false;
337cdf0e10cSrcweir bool bFirstCellAsLabel = false;
338cdf0e10cSrcweir rtl::OUString aRangesStr;
339cdf0e10cSrcweir lcl_GetChartParameters( xChartDoc, aRangesStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
340cdf0e10cSrcweir
341cdf0e10cSrcweir rRanges.Parse( aRangesStr, this );
342cdf0e10cSrcweir if ( eDataRowSource == chart::ChartDataRowSource_COLUMNS )
343cdf0e10cSrcweir {
344cdf0e10cSrcweir rRowHeaders = bHasCategories;
345cdf0e10cSrcweir rColHeaders = bFirstCellAsLabel;
346cdf0e10cSrcweir }
347cdf0e10cSrcweir else
348cdf0e10cSrcweir {
349cdf0e10cSrcweir rColHeaders = bHasCategories;
350cdf0e10cSrcweir rRowHeaders = bFirstCellAsLabel;
351cdf0e10cSrcweir }
352cdf0e10cSrcweir }
353cdf0e10cSrcweir return;
354cdf0e10cSrcweir }
355cdf0e10cSrcweir pObject = aIter.Next();
356cdf0e10cSrcweir }
357cdf0e10cSrcweir }
358cdf0e10cSrcweir }
359cdf0e10cSrcweir
UpdateChartArea(const String & rChartName,const ScRangeListRef & rNewList,sal_Bool bColHeaders,sal_Bool bRowHeaders,sal_Bool bAdd)360cdf0e10cSrcweir void ScDocument::UpdateChartArea( const String& rChartName,
361cdf0e10cSrcweir const ScRangeListRef& rNewList, sal_Bool bColHeaders, sal_Bool bRowHeaders,
362cdf0e10cSrcweir sal_Bool bAdd )
363cdf0e10cSrcweir {
364cdf0e10cSrcweir if (!pDrawLayer)
365cdf0e10cSrcweir return;
366cdf0e10cSrcweir
367cdf0e10cSrcweir for (SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++)
368cdf0e10cSrcweir {
369cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
370cdf0e10cSrcweir DBG_ASSERT(pPage,"Page ?");
371cdf0e10cSrcweir
372cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
373cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
374cdf0e10cSrcweir while (pObject)
375cdf0e10cSrcweir {
376cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
377cdf0e10cSrcweir ((SdrOle2Obj*)pObject)->GetPersistName() == rChartName )
378cdf0e10cSrcweir {
379cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( ScChartHelper::GetChartFromSdrObject( pObject ) );
380cdf0e10cSrcweir uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
381cdf0e10cSrcweir if ( xChartDoc.is() && xReceiver.is() )
382cdf0e10cSrcweir {
383cdf0e10cSrcweir ScRangeListRef aNewRanges;
384cdf0e10cSrcweir chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
385cdf0e10cSrcweir bool bHasCategories = false;
386cdf0e10cSrcweir bool bFirstCellAsLabel = false;
387cdf0e10cSrcweir rtl::OUString aRangesStr;
388cdf0e10cSrcweir lcl_GetChartParameters( xChartDoc, aRangesStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
389cdf0e10cSrcweir
390cdf0e10cSrcweir sal_Bool bInternalData = xChartDoc->hasInternalDataProvider();
391cdf0e10cSrcweir
392cdf0e10cSrcweir if ( bAdd && !bInternalData )
393cdf0e10cSrcweir {
394cdf0e10cSrcweir // append to old ranges, keep other settings
395cdf0e10cSrcweir
396cdf0e10cSrcweir aNewRanges = new ScRangeList;
397cdf0e10cSrcweir aNewRanges->Parse( aRangesStr, this );
398cdf0e10cSrcweir
399cdf0e10cSrcweir sal_uLong nAddCount = rNewList->Count();
400cdf0e10cSrcweir for ( sal_uLong nAdd=0; nAdd<nAddCount; nAdd++ )
401cdf0e10cSrcweir aNewRanges->Append( *rNewList->GetObject(nAdd) );
402cdf0e10cSrcweir }
403cdf0e10cSrcweir else
404cdf0e10cSrcweir {
405cdf0e10cSrcweir // directly use new ranges (only eDataRowSource is used from old settings)
406cdf0e10cSrcweir
407cdf0e10cSrcweir if ( eDataRowSource == chart::ChartDataRowSource_COLUMNS )
408cdf0e10cSrcweir {
409cdf0e10cSrcweir bHasCategories = bRowHeaders;
410cdf0e10cSrcweir bFirstCellAsLabel = bColHeaders;
411cdf0e10cSrcweir }
412cdf0e10cSrcweir else
413cdf0e10cSrcweir {
414cdf0e10cSrcweir bHasCategories = bColHeaders;
415cdf0e10cSrcweir bFirstCellAsLabel = bRowHeaders;
416cdf0e10cSrcweir }
417cdf0e10cSrcweir aNewRanges = rNewList;
418cdf0e10cSrcweir }
419cdf0e10cSrcweir
420cdf0e10cSrcweir if ( bInternalData && pShell )
421cdf0e10cSrcweir {
422cdf0e10cSrcweir // Calc -> DataProvider
423cdf0e10cSrcweir uno::Reference< chart2::data::XDataProvider > xDataProvider = new ScChart2DataProvider( this );
424cdf0e10cSrcweir xReceiver->attachDataProvider( xDataProvider );
425cdf0e10cSrcweir uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier(
426cdf0e10cSrcweir pShell->GetModel(), uno::UNO_QUERY );
427cdf0e10cSrcweir xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
428cdf0e10cSrcweir }
429cdf0e10cSrcweir
430cdf0e10cSrcweir String sRangeStr;
431cdf0e10cSrcweir aNewRanges->Format( sRangeStr, SCR_ABS_3D, this, GetAddressConvention() );
432cdf0e10cSrcweir
433cdf0e10cSrcweir lcl_SetChartParameters( xReceiver, sRangeStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
434cdf0e10cSrcweir
435cdf0e10cSrcweir pChartListenerCollection->ChangeListening( rChartName, aNewRanges );
436cdf0e10cSrcweir
437cdf0e10cSrcweir // ((SdrOle2Obj*)pObject)->GetNewReplacement();
438cdf0e10cSrcweir // pObject->ActionChanged();
439cdf0e10cSrcweir
440cdf0e10cSrcweir return; // nicht weitersuchen
441cdf0e10cSrcweir }
442cdf0e10cSrcweir }
443cdf0e10cSrcweir pObject = aIter.Next();
444cdf0e10cSrcweir }
445cdf0e10cSrcweir }
446cdf0e10cSrcweir }
447cdf0e10cSrcweir
UpdateChart(const String & rChartName)448cdf0e10cSrcweir void ScDocument::UpdateChart( const String& rChartName )
449cdf0e10cSrcweir {
450cdf0e10cSrcweir if (!pDrawLayer || bInDtorClear)
451cdf0e10cSrcweir return;
452cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( GetChartByName( rChartName ) );
453cdf0e10cSrcweir if( xChartDoc.is() )
454cdf0e10cSrcweir {
455cdf0e10cSrcweir try
456cdf0e10cSrcweir {
457cdf0e10cSrcweir uno::Reference< util::XModifiable > xModif( xChartDoc, uno::UNO_QUERY_THROW );
458cdf0e10cSrcweir if( apTemporaryChartLock.get() )
459cdf0e10cSrcweir apTemporaryChartLock->AlsoLockThisChart( uno::Reference< frame::XModel >( xModif, uno::UNO_QUERY ) );
460cdf0e10cSrcweir xModif->setModified( sal_True );
461cdf0e10cSrcweir }
462cdf0e10cSrcweir catch ( uno::Exception& )
463cdf0e10cSrcweir {
464cdf0e10cSrcweir }
465cdf0e10cSrcweir }
466cdf0e10cSrcweir
467cdf0e10cSrcweir // After the update, chart keeps track of its own data source ranges,
468cdf0e10cSrcweir // the listener doesn't need to listen anymore, except the chart has
469cdf0e10cSrcweir // an internal data provider.
470cdf0e10cSrcweir if ( !( xChartDoc.is() && xChartDoc->hasInternalDataProvider() ) && pChartListenerCollection )
471cdf0e10cSrcweir {
472cdf0e10cSrcweir pChartListenerCollection->ChangeListening( rChartName, new ScRangeList );
473cdf0e10cSrcweir }
474cdf0e10cSrcweir }
475cdf0e10cSrcweir
RestoreChartListener(const String & rName)476cdf0e10cSrcweir void ScDocument::RestoreChartListener( const String& rName )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir // Read the data ranges from the chart object, and start listening to those ranges again
479cdf0e10cSrcweir // (called when a chart is saved, because then it might be swapped out and stop listening itself).
480cdf0e10cSrcweir
481cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xObject = FindOleObjectByName( rName );
482cdf0e10cSrcweir if ( xObject.is() )
483cdf0e10cSrcweir {
484cdf0e10cSrcweir uno::Reference< util::XCloseable > xComponent = xObject->getComponent();
485cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( xComponent, uno::UNO_QUERY );
486cdf0e10cSrcweir uno::Reference< chart2::data::XDataReceiver > xReceiver( xComponent, uno::UNO_QUERY );
487cdf0e10cSrcweir if ( xChartDoc.is() && xReceiver.is() && !xChartDoc->hasInternalDataProvider())
488cdf0e10cSrcweir {
489cdf0e10cSrcweir uno::Sequence<rtl::OUString> aRepresentations( xReceiver->getUsedRangeRepresentations() );
490cdf0e10cSrcweir ScRangeListRef aRanges = new ScRangeList;
491cdf0e10cSrcweir sal_Int32 nRangeCount = aRepresentations.getLength();
492cdf0e10cSrcweir for ( sal_Int32 i=0; i<nRangeCount; i++ )
493cdf0e10cSrcweir {
494cdf0e10cSrcweir ScRange aRange;
495cdf0e10cSrcweir ScAddress::Details aDetails(GetAddressConvention(), 0, 0);
496cdf0e10cSrcweir if ( aRange.ParseAny( aRepresentations[i], this, aDetails ) & SCA_VALID )
497cdf0e10cSrcweir aRanges->Append( aRange );
498cdf0e10cSrcweir }
499cdf0e10cSrcweir
500cdf0e10cSrcweir pChartListenerCollection->ChangeListening( rName, aRanges );
501cdf0e10cSrcweir }
502cdf0e10cSrcweir }
503cdf0e10cSrcweir }
504cdf0e10cSrcweir
UpdateChartRef(UpdateRefMode eUpdateRefMode,SCCOL nCol1,SCROW nRow1,SCTAB nTab1,SCCOL nCol2,SCROW nRow2,SCTAB nTab2,SCsCOL nDx,SCsROW nDy,SCsTAB nDz)505cdf0e10cSrcweir void ScDocument::UpdateChartRef( UpdateRefMode eUpdateRefMode,
506cdf0e10cSrcweir SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
507cdf0e10cSrcweir SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
508cdf0e10cSrcweir SCsCOL nDx, SCsROW nDy, SCsTAB nDz )
509cdf0e10cSrcweir {
510cdf0e10cSrcweir if (!pDrawLayer)
511cdf0e10cSrcweir return;
512cdf0e10cSrcweir
513cdf0e10cSrcweir sal_uInt16 nChartCount = pChartListenerCollection->GetCount();
514cdf0e10cSrcweir for ( sal_uInt16 nIndex = 0; nIndex < nChartCount; nIndex++ )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir ScChartListener* pChartListener =
517cdf0e10cSrcweir (ScChartListener*) (pChartListenerCollection->At(nIndex));
518cdf0e10cSrcweir ScRangeListRef aRLR( pChartListener->GetRangeList() );
519cdf0e10cSrcweir ScRangeListRef aNewRLR( new ScRangeList );
520cdf0e10cSrcweir sal_Bool bChanged = sal_False;
521cdf0e10cSrcweir sal_Bool bDataChanged = sal_False;
522cdf0e10cSrcweir for ( ScRangePtr pR = aRLR->First(); pR; pR = aRLR->Next() )
523cdf0e10cSrcweir {
524cdf0e10cSrcweir SCCOL theCol1 = pR->aStart.Col();
525cdf0e10cSrcweir SCROW theRow1 = pR->aStart.Row();
526cdf0e10cSrcweir SCTAB theTab1 = pR->aStart.Tab();
527cdf0e10cSrcweir SCCOL theCol2 = pR->aEnd.Col();
528cdf0e10cSrcweir SCROW theRow2 = pR->aEnd.Row();
529cdf0e10cSrcweir SCTAB theTab2 = pR->aEnd.Tab();
530cdf0e10cSrcweir ScRefUpdateRes eRes = ScRefUpdate::Update(
531cdf0e10cSrcweir this, eUpdateRefMode,
532cdf0e10cSrcweir nCol1,nRow1,nTab1, nCol2,nRow2,nTab2,
533cdf0e10cSrcweir nDx,nDy,nDz,
534cdf0e10cSrcweir theCol1,theRow1,theTab1,
535cdf0e10cSrcweir theCol2,theRow2,theTab2 );
536cdf0e10cSrcweir if ( eRes != UR_NOTHING )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir bChanged = sal_True;
539cdf0e10cSrcweir aNewRLR->Append( ScRange(
540cdf0e10cSrcweir theCol1, theRow1, theTab1,
541cdf0e10cSrcweir theCol2, theRow2, theTab2 ));
542cdf0e10cSrcweir if ( eUpdateRefMode == URM_INSDEL
543cdf0e10cSrcweir && !bDataChanged
544cdf0e10cSrcweir && (eRes == UR_INVALID ||
545cdf0e10cSrcweir ((pR->aEnd.Col() - pR->aStart.Col()
546cdf0e10cSrcweir != theCol2 - theCol1)
547cdf0e10cSrcweir || (pR->aEnd.Row() - pR->aStart.Row()
548cdf0e10cSrcweir != theRow2 - theRow1)
549cdf0e10cSrcweir || (pR->aEnd.Tab() - pR->aStart.Tab()
550cdf0e10cSrcweir != theTab2 - theTab1))) )
551cdf0e10cSrcweir {
552cdf0e10cSrcweir bDataChanged = sal_True;
553cdf0e10cSrcweir }
554cdf0e10cSrcweir }
555cdf0e10cSrcweir else
556cdf0e10cSrcweir aNewRLR->Append( *pR );
557cdf0e10cSrcweir }
558cdf0e10cSrcweir if ( bChanged )
559cdf0e10cSrcweir {
560cdf0e10cSrcweir #if 0
561cdf0e10cSrcweir if ( nDz != 0 )
562cdf0e10cSrcweir { // #81844# sheet to be deleted or inserted or moved
563cdf0e10cSrcweir // => no valid sheet names for references right now
564cdf0e10cSrcweir pChartListener->ChangeListening( aNewRLR, bDataChanged );
565cdf0e10cSrcweir pChartListener->ScheduleSeriesRanges();
566cdf0e10cSrcweir }
567cdf0e10cSrcweir else
568cdf0e10cSrcweir #endif
569cdf0e10cSrcweir {
570cdf0e10cSrcweir // SetChartRangeList( pChartListener->GetString(), aNewRLR );
571cdf0e10cSrcweir // pChartListener->ChangeListening( aNewRLR, bDataChanged );
572cdf0e10cSrcweir
573cdf0e10cSrcweir // Force the chart to be loaded now, so it registers itself for UNO events.
574cdf0e10cSrcweir // UNO broadcasts are done after UpdateChartRef, so the chart will get this
575cdf0e10cSrcweir // reference change.
576cdf0e10cSrcweir
577cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xIPObj = FindOleObjectByName( pChartListener->GetString() );
578cdf0e10cSrcweir svt::EmbeddedObjectRef::TryRunningState( xIPObj );
579cdf0e10cSrcweir
580cdf0e10cSrcweir // After the change, chart keeps track of its own data source ranges,
581cdf0e10cSrcweir // the listener doesn't need to listen anymore, except the chart has
582cdf0e10cSrcweir // an internal data provider.
583cdf0e10cSrcweir bool bInternalDataProvider = false;
584cdf0e10cSrcweir if ( xIPObj.is() )
585cdf0e10cSrcweir {
586cdf0e10cSrcweir try
587cdf0e10cSrcweir {
588cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( xIPObj->getComponent(), uno::UNO_QUERY_THROW );
589cdf0e10cSrcweir bInternalDataProvider = xChartDoc->hasInternalDataProvider();
590cdf0e10cSrcweir }
591cdf0e10cSrcweir catch ( uno::Exception& )
592cdf0e10cSrcweir {
593cdf0e10cSrcweir }
594cdf0e10cSrcweir }
595cdf0e10cSrcweir if ( bInternalDataProvider )
596cdf0e10cSrcweir {
597cdf0e10cSrcweir pChartListener->ChangeListening( aNewRLR, bDataChanged );
598cdf0e10cSrcweir }
599cdf0e10cSrcweir else
600cdf0e10cSrcweir {
601cdf0e10cSrcweir pChartListener->ChangeListening( new ScRangeList, bDataChanged );
602cdf0e10cSrcweir }
603cdf0e10cSrcweir }
604cdf0e10cSrcweir }
605cdf0e10cSrcweir }
606cdf0e10cSrcweir }
607cdf0e10cSrcweir
608cdf0e10cSrcweir
SetChartRangeList(const String & rChartName,const ScRangeListRef & rNewRangeListRef)609cdf0e10cSrcweir void ScDocument::SetChartRangeList( const String& rChartName,
610cdf0e10cSrcweir const ScRangeListRef& rNewRangeListRef )
611cdf0e10cSrcweir {
612cdf0e10cSrcweir // called from ChartListener
613cdf0e10cSrcweir
614cdf0e10cSrcweir if (!pDrawLayer)
615cdf0e10cSrcweir return;
616cdf0e10cSrcweir
617cdf0e10cSrcweir for (SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++)
618cdf0e10cSrcweir {
619cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
620cdf0e10cSrcweir DBG_ASSERT(pPage,"Page ?");
621cdf0e10cSrcweir
622cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
623cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
624cdf0e10cSrcweir while (pObject)
625cdf0e10cSrcweir {
626cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
627cdf0e10cSrcweir ((SdrOle2Obj*)pObject)->GetPersistName() == rChartName )
628cdf0e10cSrcweir {
629cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xChartDoc( ScChartHelper::GetChartFromSdrObject( pObject ) );
630cdf0e10cSrcweir uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
631cdf0e10cSrcweir if ( xChartDoc.is() && xReceiver.is() )
632cdf0e10cSrcweir {
633cdf0e10cSrcweir ScRangeListRef aNewRanges;
634cdf0e10cSrcweir chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
635cdf0e10cSrcweir bool bHasCategories = false;
636cdf0e10cSrcweir bool bFirstCellAsLabel = false;
637cdf0e10cSrcweir rtl::OUString aRangesStr;
638cdf0e10cSrcweir lcl_GetChartParameters( xChartDoc, aRangesStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
639cdf0e10cSrcweir
640cdf0e10cSrcweir String sRangeStr;
641cdf0e10cSrcweir rNewRangeListRef->Format( sRangeStr, SCR_ABS_3D, this, GetAddressConvention() );
642cdf0e10cSrcweir
643cdf0e10cSrcweir lcl_SetChartParameters( xReceiver, sRangeStr, eDataRowSource, bHasCategories, bFirstCellAsLabel );
644cdf0e10cSrcweir
645cdf0e10cSrcweir // don't modify pChartListenerCollection here, called from there
646cdf0e10cSrcweir return;
647cdf0e10cSrcweir }
648cdf0e10cSrcweir }
649cdf0e10cSrcweir pObject = aIter.Next();
650cdf0e10cSrcweir }
651cdf0e10cSrcweir }
652cdf0e10cSrcweir }
653cdf0e10cSrcweir
654cdf0e10cSrcweir
HasData(SCCOL nCol,SCROW nRow,SCTAB nTab)655cdf0e10cSrcweir sal_Bool ScDocument::HasData( SCCOL nCol, SCROW nRow, SCTAB nTab )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir if (pTab[nTab])
658cdf0e10cSrcweir return pTab[nTab]->HasData( nCol, nRow );
659cdf0e10cSrcweir else
660cdf0e10cSrcweir return sal_False;
661cdf0e10cSrcweir }
662cdf0e10cSrcweir
663cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject >
FindOleObjectByName(const String & rName)664cdf0e10cSrcweir ScDocument::FindOleObjectByName( const String& rName )
665cdf0e10cSrcweir {
666cdf0e10cSrcweir if (!pDrawLayer)
667cdf0e10cSrcweir return uno::Reference< embed::XEmbeddedObject >();
668cdf0e10cSrcweir
669cdf0e10cSrcweir // die Seiten hier vom Draw-Layer nehmen,
670cdf0e10cSrcweir // weil sie evtl. nicht mit den Tabellen uebereinstimmen
671cdf0e10cSrcweir // (z.B. Redo von Tabelle loeschen, Draw-Redo passiert vor DeleteTab).
672cdf0e10cSrcweir
673cdf0e10cSrcweir sal_uInt16 nCount = pDrawLayer->GetPageCount();
674cdf0e10cSrcweir for (sal_uInt16 nTab=0; nTab<nCount; nTab++)
675cdf0e10cSrcweir {
676cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage(nTab);
677cdf0e10cSrcweir DBG_ASSERT(pPage,"Page ?");
678cdf0e10cSrcweir
679cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
680cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
681cdf0e10cSrcweir while (pObject)
682cdf0e10cSrcweir {
683cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 )
684cdf0e10cSrcweir {
685cdf0e10cSrcweir SdrOle2Obj * pOleObject ( dynamic_cast< SdrOle2Obj * >( pObject ));
686cdf0e10cSrcweir if( pOleObject &&
687cdf0e10cSrcweir pOleObject->GetPersistName() == rName )
688cdf0e10cSrcweir {
689cdf0e10cSrcweir return pOleObject->GetObjRef();
690cdf0e10cSrcweir }
691cdf0e10cSrcweir }
692cdf0e10cSrcweir pObject = aIter.Next();
693cdf0e10cSrcweir }
694cdf0e10cSrcweir }
695cdf0e10cSrcweir
696cdf0e10cSrcweir return uno::Reference< embed::XEmbeddedObject >();
697cdf0e10cSrcweir }
698cdf0e10cSrcweir
lcl_StringInCollection(const ScStrCollection * pColl,const String & rStr)699cdf0e10cSrcweir sal_Bool lcl_StringInCollection( const ScStrCollection* pColl, const String& rStr )
700cdf0e10cSrcweir {
701cdf0e10cSrcweir if ( !pColl )
702cdf0e10cSrcweir return sal_False;
703cdf0e10cSrcweir
704cdf0e10cSrcweir StrData aData( rStr );
705cdf0e10cSrcweir sal_uInt16 nDummy;
706cdf0e10cSrcweir return pColl->Search( &aData, nDummy );
707cdf0e10cSrcweir }
708cdf0e10cSrcweir
UpdateChartListenerCollection()709cdf0e10cSrcweir void ScDocument::UpdateChartListenerCollection()
710cdf0e10cSrcweir {
711cdf0e10cSrcweir bChartListenerCollectionNeedsUpdate = sal_False;
712cdf0e10cSrcweir if (!pDrawLayer)
713cdf0e10cSrcweir return;
714cdf0e10cSrcweir else
715cdf0e10cSrcweir {
716cdf0e10cSrcweir ScRange aRange;
717cdf0e10cSrcweir // Range fuer Suche unwichtig
718cdf0e10cSrcweir ScChartListener aCLSearcher( EMPTY_STRING, this, aRange );
719cdf0e10cSrcweir for (SCTAB nTab=0; nTab<=MAXTAB; nTab++)
720cdf0e10cSrcweir {
721cdf0e10cSrcweir if (pTab[nTab])
722cdf0e10cSrcweir {
723cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
724cdf0e10cSrcweir DBG_ASSERT(pPage,"Page ?");
725cdf0e10cSrcweir
726cdf0e10cSrcweir if (!pPage)
727cdf0e10cSrcweir continue;
728cdf0e10cSrcweir
729cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
730cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
731cdf0e10cSrcweir while (pObject)
732cdf0e10cSrcweir {
733cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 )
734cdf0e10cSrcweir {
735cdf0e10cSrcweir String aObjName = ((SdrOle2Obj*)pObject)->GetPersistName();
736cdf0e10cSrcweir aCLSearcher.SetString( aObjName );
737cdf0e10cSrcweir sal_uInt16 nIndex;
738cdf0e10cSrcweir if ( pChartListenerCollection->Search( &aCLSearcher, nIndex ) )
739cdf0e10cSrcweir {
740cdf0e10cSrcweir ((ScChartListener*) (pChartListenerCollection->
741cdf0e10cSrcweir At( nIndex )))->SetUsed( sal_True );
742cdf0e10cSrcweir }
743cdf0e10cSrcweir else if ( lcl_StringInCollection( pOtherObjects, aObjName ) )
744cdf0e10cSrcweir {
745cdf0e10cSrcweir // non-chart OLE object -> don't touch
746cdf0e10cSrcweir }
747cdf0e10cSrcweir else
748cdf0e10cSrcweir {
749cdf0e10cSrcweir bool bIsChart = false;
750cdf0e10cSrcweir
751cdf0e10cSrcweir uno::Reference< embed::XEmbeddedObject > xIPObj = ((SdrOle2Obj*)pObject)->GetObjRef();
752cdf0e10cSrcweir DBG_ASSERT( xIPObj.is(), "No embedded object is given!");
753cdf0e10cSrcweir uno::Reference< ::com::sun::star::chart2::data::XDataReceiver > xReceiver;
754cdf0e10cSrcweir uno::Reference< embed::XComponentSupplier > xCompSupp( xIPObj, uno::UNO_QUERY );
755cdf0e10cSrcweir if( xCompSupp.is())
756cdf0e10cSrcweir xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY );
757cdf0e10cSrcweir
758cdf0e10cSrcweir // if the object is a chart2::XDataReceiver, we must attach as XDataProvider
759cdf0e10cSrcweir if( xReceiver.is() &&
760cdf0e10cSrcweir !PastingDrawFromOtherDoc())
761cdf0e10cSrcweir {
762cdf0e10cSrcweir // NOTE: this currently does not work as we are
763cdf0e10cSrcweir // unable to set the data. So a chart from the
764cdf0e10cSrcweir // same document is treated like a chart with
765cdf0e10cSrcweir // own data for the time being.
766cdf0e10cSrcweir #if 0
767cdf0e10cSrcweir // data provider
768cdf0e10cSrcweir uno::Reference< chart2::data::XDataProvider > xDataProvider = new
769cdf0e10cSrcweir ScChart2DataProvider( this );
770cdf0e10cSrcweir xReceiver->attachDataProvider( xDataProvider );
771cdf0e10cSrcweir // number formats supplier
772cdf0e10cSrcweir uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( pShell->GetModel(), uno::UNO_QUERY );
773cdf0e10cSrcweir xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
774cdf0e10cSrcweir // data ?
775cdf0e10cSrcweir // how to set?? Defined in XML-file, which is already loaded!!!
776cdf0e10cSrcweir // => we have to do this stuff here, BEFORE the chart is actually loaded
777cdf0e10cSrcweir
778cdf0e10cSrcweir bIsChart = true;
779cdf0e10cSrcweir #endif
780cdf0e10cSrcweir }
781cdf0e10cSrcweir
782cdf0e10cSrcweir if (!bIsChart)
783cdf0e10cSrcweir {
784cdf0e10cSrcweir // put into list of other ole objects, so the object doesn't have to
785cdf0e10cSrcweir // be swapped in the next time UpdateChartListenerCollection is called
786cdf0e10cSrcweir //! remove names when objects are no longer there?
787cdf0e10cSrcweir // (object names aren't used again before reloading the document)
788cdf0e10cSrcweir
789cdf0e10cSrcweir if (!pOtherObjects)
790cdf0e10cSrcweir pOtherObjects = new ScStrCollection;
791cdf0e10cSrcweir pOtherObjects->Insert( new StrData( aObjName ) );
792cdf0e10cSrcweir }
793cdf0e10cSrcweir }
794cdf0e10cSrcweir }
795cdf0e10cSrcweir pObject = aIter.Next();
796cdf0e10cSrcweir }
797cdf0e10cSrcweir }
798cdf0e10cSrcweir }
799cdf0e10cSrcweir // alle nicht auf SetUsed gesetzten loeschen
800cdf0e10cSrcweir pChartListenerCollection->FreeUnused();
801cdf0e10cSrcweir }
802cdf0e10cSrcweir }
803cdf0e10cSrcweir
AddOLEObjectToCollection(const String & rName)804cdf0e10cSrcweir void ScDocument::AddOLEObjectToCollection(const String& rName)
805cdf0e10cSrcweir {
806cdf0e10cSrcweir if (!pOtherObjects)
807cdf0e10cSrcweir pOtherObjects = new ScStrCollection;
808cdf0e10cSrcweir pOtherObjects->Insert( new StrData( rName ) );
809cdf0e10cSrcweir }
810cdf0e10cSrcweir
811cdf0e10cSrcweir
812cdf0e10cSrcweir
813