xref: /AOO41X/main/sc/source/core/data/documen5.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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