xref: /AOO41X/main/sc/source/ui/unoobj/chartuno.cxx (revision 7d1ce60b947f1ffb0e85bce1104d25cd58764da3)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_sc.hxx"
24cdf0e10cSrcweir 
25cdf0e10cSrcweir #include <com/sun/star/embed/Aspects.hpp>
26cdf0e10cSrcweir #include <com/sun/star/awt/Size.hpp>
27cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
28cdf0e10cSrcweir #include <com/sun/star/chart2/data/XDataReceiver.hpp>
29cdf0e10cSrcweir #include <com/sun/star/chart/ChartDataRowSource.hpp>
30cdf0e10cSrcweir #include <com/sun/star/chart2/XChartDocument.hpp>
31cdf0e10cSrcweir #include <com/sun/star/embed/Aspects.hpp>
32cdf0e10cSrcweir #include <com/sun/star/table/CellRangeAddress.hpp>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <svx/svditer.hxx>
35cdf0e10cSrcweir #include <svx/svdoole2.hxx>
36cdf0e10cSrcweir #include <svx/svdpage.hxx>
37cdf0e10cSrcweir #include <svx/svdundo.hxx>
38cdf0e10cSrcweir #include <sfx2/app.hxx>
39cdf0e10cSrcweir #include <unotools/moduleoptions.hxx>
40cdf0e10cSrcweir #include <sot/clsids.hxx>
41cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #include "chartuno.hxx"
44cdf0e10cSrcweir #include "miscuno.hxx"
45cdf0e10cSrcweir #include "docsh.hxx"
46cdf0e10cSrcweir #include "drwlayer.hxx"
47cdf0e10cSrcweir #include "undodat.hxx"
48cdf0e10cSrcweir #include "chartarr.hxx"
49cdf0e10cSrcweir #include "chartlis.hxx"
50cdf0e10cSrcweir #include "unoguard.hxx"
51cdf0e10cSrcweir #include "chart2uno.hxx"
52cdf0e10cSrcweir #include "convuno.hxx"
53cdf0e10cSrcweir 
54cdf0e10cSrcweir using namespace com::sun::star;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir #define PROP_HANDLE_RELATED_CELLRANGES  1
57cdf0e10cSrcweir 
58cdf0e10cSrcweir //------------------------------------------------------------------------
59cdf0e10cSrcweir 
60cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScChartObj, "ScChartObj", "com.sun.star.table.TableChart" )
61cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScChartsObj, "ScChartsObj", "com.sun.star.table.TableCharts" )
62cdf0e10cSrcweir 
63cdf0e10cSrcweir //------------------------------------------------------------------------
64cdf0e10cSrcweir 
65cdf0e10cSrcweir SdrOle2Obj* lcl_FindChartObj( ScDocShell* pDocShell, SCTAB nTab, const String& rName )
66cdf0e10cSrcweir {
67cdf0e10cSrcweir 	if (pDocShell)
68cdf0e10cSrcweir 	{
69cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
70cdf0e10cSrcweir 		ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
71cdf0e10cSrcweir 		if (pDrawLayer)
72cdf0e10cSrcweir 		{
73cdf0e10cSrcweir 			SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
74cdf0e10cSrcweir 			DBG_ASSERT(pPage, "Page nicht gefunden");
75cdf0e10cSrcweir 			if (pPage)
76cdf0e10cSrcweir 			{
77cdf0e10cSrcweir 				SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
78cdf0e10cSrcweir 				SdrObject* pObject = aIter.Next();
79cdf0e10cSrcweir 				while (pObject)
80cdf0e10cSrcweir 				{
81cdf0e10cSrcweir 					if ( pObject->GetObjIdentifier() == OBJ_OLE2 && pDoc->IsChart(pObject) )
82cdf0e10cSrcweir 					{
83cdf0e10cSrcweir                         uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)pObject)->GetObjRef();
84cdf0e10cSrcweir                         if ( xObj.is() )
85cdf0e10cSrcweir 						{
86cdf0e10cSrcweir                             String aObjName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj );
87cdf0e10cSrcweir                             if ( aObjName == rName )
88cdf0e10cSrcweir                                 return (SdrOle2Obj*)pObject;
89cdf0e10cSrcweir 						}
90cdf0e10cSrcweir 					}
91cdf0e10cSrcweir 					pObject = aIter.Next();
92cdf0e10cSrcweir 				}
93cdf0e10cSrcweir 			}
94cdf0e10cSrcweir 		}
95cdf0e10cSrcweir 	}
96cdf0e10cSrcweir 	return NULL;
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir //------------------------------------------------------------------------
100cdf0e10cSrcweir 
101cdf0e10cSrcweir ScChartsObj::ScChartsObj(ScDocShell* pDocSh, SCTAB nT) :
102cdf0e10cSrcweir 	pDocShell( pDocSh ),
103cdf0e10cSrcweir 	nTab( nT )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir 	pDocShell->GetDocument()->AddUnoObject(*this);
106cdf0e10cSrcweir }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir ScChartsObj::~ScChartsObj()
109cdf0e10cSrcweir {
110cdf0e10cSrcweir 	if (pDocShell)
111cdf0e10cSrcweir 		pDocShell->GetDocument()->RemoveUnoObject(*this);
112cdf0e10cSrcweir }
113cdf0e10cSrcweir 
114cdf0e10cSrcweir void ScChartsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
115cdf0e10cSrcweir {
116cdf0e10cSrcweir 	//!	Referenz-Update
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 	if ( rHint.ISA( SfxSimpleHint ) &&
119cdf0e10cSrcweir 			((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
120cdf0e10cSrcweir 	{
121cdf0e10cSrcweir 		pDocShell = NULL;		// ungueltig geworden
122cdf0e10cSrcweir 	}
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
125cdf0e10cSrcweir ScChartObj* ScChartsObj::GetObjectByIndex_Impl(long nIndex) const
126cdf0e10cSrcweir {
127cdf0e10cSrcweir 	String aName;
128cdf0e10cSrcweir 	if ( pDocShell )
129cdf0e10cSrcweir 	{
130cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
131cdf0e10cSrcweir 		ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
132cdf0e10cSrcweir 		if (pDrawLayer)
133cdf0e10cSrcweir 		{
134cdf0e10cSrcweir 			SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
135cdf0e10cSrcweir 			DBG_ASSERT(pPage, "Page nicht gefunden");
136cdf0e10cSrcweir 			if (pPage)
137cdf0e10cSrcweir 			{
138cdf0e10cSrcweir 				long nPos = 0;
139cdf0e10cSrcweir 				SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
140cdf0e10cSrcweir 				SdrObject* pObject = aIter.Next();
141cdf0e10cSrcweir 				while (pObject)
142cdf0e10cSrcweir 				{
143cdf0e10cSrcweir 					if ( pObject->GetObjIdentifier() == OBJ_OLE2 && pDoc->IsChart(pObject) )
144cdf0e10cSrcweir 					{
145cdf0e10cSrcweir 						if ( nPos == nIndex )
146cdf0e10cSrcweir 						{
147cdf0e10cSrcweir                             uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)pObject)->GetObjRef();
148cdf0e10cSrcweir                             if ( xObj.is() )
149cdf0e10cSrcweir                                 aName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj );
150cdf0e10cSrcweir 							break;	// nicht weitersuchen
151cdf0e10cSrcweir 						}
152cdf0e10cSrcweir 						++nPos;
153cdf0e10cSrcweir 					}
154cdf0e10cSrcweir 					pObject = aIter.Next();
155cdf0e10cSrcweir 				}
156cdf0e10cSrcweir 			}
157cdf0e10cSrcweir 		}
158cdf0e10cSrcweir 	}
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 	if (aName.Len())
161cdf0e10cSrcweir 		return new ScChartObj( pDocShell, nTab, aName );
162cdf0e10cSrcweir 	return NULL;
163cdf0e10cSrcweir }
164cdf0e10cSrcweir 
165cdf0e10cSrcweir ScChartObj* ScChartsObj::GetObjectByName_Impl(const rtl::OUString& aName) const
166cdf0e10cSrcweir {
167cdf0e10cSrcweir 	String aNameString(aName);
168cdf0e10cSrcweir 	if ( lcl_FindChartObj( pDocShell, nTab, aNameString ) )
169cdf0e10cSrcweir 		return new ScChartObj( pDocShell, nTab, aNameString );
170cdf0e10cSrcweir 	return NULL;
171cdf0e10cSrcweir }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir // XTableCharts
174cdf0e10cSrcweir 
175cdf0e10cSrcweir void SAL_CALL ScChartsObj::addNewByName( const rtl::OUString& aName,
176cdf0e10cSrcweir 										const awt::Rectangle& aRect,
177cdf0e10cSrcweir 										const uno::Sequence<table::CellRangeAddress>& aRanges,
178cdf0e10cSrcweir 										sal_Bool bColumnHeaders, sal_Bool bRowHeaders )
179cdf0e10cSrcweir 									throw(::com::sun::star::uno::RuntimeException)
180cdf0e10cSrcweir {
181cdf0e10cSrcweir 	ScUnoGuard aGuard;
182cdf0e10cSrcweir 	if (!pDocShell)
183cdf0e10cSrcweir 		return;
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 	ScDocument* pDoc = pDocShell->GetDocument();
186cdf0e10cSrcweir 	ScDrawLayer* pModel = pDocShell->MakeDrawLayer();
187cdf0e10cSrcweir 	SdrPage* pPage = pModel->GetPage(static_cast<sal_uInt16>(nTab));
188cdf0e10cSrcweir 	DBG_ASSERT(pPage,"addChart: keine Page");
189cdf0e10cSrcweir 	if (!pPage || !pDoc)
190cdf0e10cSrcweir 		return;
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 	//	chart can't be inserted if any ole object with that name exists on any table
193cdf0e10cSrcweir 	//	(empty string: generate valid name)
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 	String aNameString(aName);
196cdf0e10cSrcweir 	SCTAB nDummy;
197cdf0e10cSrcweir 	if ( aNameString.Len() && pModel->GetNamedObject( aNameString, OBJ_OLE2, nDummy ) )
198cdf0e10cSrcweir 	{
199cdf0e10cSrcweir 		//	object exists - only RuntimeException is specified
200cdf0e10cSrcweir 		throw uno::RuntimeException();
201cdf0e10cSrcweir 	}
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 	ScRangeList* pList = new ScRangeList;
204cdf0e10cSrcweir 	sal_uInt16 nRangeCount = (sal_uInt16)aRanges.getLength();
205cdf0e10cSrcweir 	if (nRangeCount)
206cdf0e10cSrcweir 	{
207cdf0e10cSrcweir 		const table::CellRangeAddress* pAry = aRanges.getConstArray();
208cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nRangeCount; i++)
209cdf0e10cSrcweir 		{
210cdf0e10cSrcweir 			ScRange aRange( static_cast<SCCOL>(pAry[i].StartColumn), pAry[i].StartRow, pAry[i].Sheet,
211cdf0e10cSrcweir 							static_cast<SCCOL>(pAry[i].EndColumn),   pAry[i].EndRow,   pAry[i].Sheet );
212cdf0e10cSrcweir 			pList->Append( aRange );
213cdf0e10cSrcweir 		}
214cdf0e10cSrcweir 	}
215cdf0e10cSrcweir 	ScRangeListRef xNewRanges( pList );
216cdf0e10cSrcweir 
217cdf0e10cSrcweir     uno::Reference < embed::XEmbeddedObject > xObj;
218cdf0e10cSrcweir     ::rtl::OUString aTmp( aNameString );
219cdf0e10cSrcweir 	if ( SvtModuleOptions().IsChart() )
220cdf0e10cSrcweir         xObj = pDocShell->GetEmbeddedObjectContainer().CreateEmbeddedObject( SvGlobalName( SO3_SCH_CLASSID ).GetByteSequence(), aTmp );
221cdf0e10cSrcweir     if ( xObj.is() )
222cdf0e10cSrcweir 	{
223cdf0e10cSrcweir             String aObjName = aTmp;       // wirklich eingefuegter Name...
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 			//	Rechteck anpassen
226cdf0e10cSrcweir 			//!	Fehler/Exception, wenn leer/ungueltig ???
227cdf0e10cSrcweir 			Point aRectPos( aRect.X, aRect.Y );
228cdf0e10cSrcweir             bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
229cdf0e10cSrcweir             if ( ( aRectPos.X() < 0 && !bLayoutRTL ) || ( aRectPos.X() > 0 && bLayoutRTL ) ) aRectPos.X() = 0;
230cdf0e10cSrcweir 			if (aRectPos.Y() < 0) aRectPos.Y() = 0;
231cdf0e10cSrcweir 			Size aRectSize( aRect.Width, aRect.Height );
232cdf0e10cSrcweir 			if (aRectSize.Width() <= 0) aRectSize.Width() = 5000;	// Default-Groesse
233cdf0e10cSrcweir 			if (aRectSize.Height() <= 0) aRectSize.Height() = 5000;
234cdf0e10cSrcweir 			Rectangle aInsRect( aRectPos, aRectSize );
235cdf0e10cSrcweir 
236cdf0e10cSrcweir             sal_Int64 nAspect(embed::Aspects::MSOLE_CONTENT);
237cdf0e10cSrcweir             MapUnit aMapUnit(VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) ));
238cdf0e10cSrcweir 			Size aSize(aInsRect.GetSize());
239cdf0e10cSrcweir             aSize = Window::LogicToLogic( aSize, MapMode( MAP_100TH_MM ), MapMode( aMapUnit ) );
240cdf0e10cSrcweir             awt::Size aSz;
241cdf0e10cSrcweir             aSz.Width = aSize.Width();
242cdf0e10cSrcweir             aSz.Height = aSize.Height();
243cdf0e10cSrcweir 
244cdf0e10cSrcweir             // Calc -> DataProvider
245cdf0e10cSrcweir             uno::Reference< chart2::data::XDataProvider > xDataProvider = new
246cdf0e10cSrcweir                 ScChart2DataProvider( pDoc );
247cdf0e10cSrcweir             // Chart -> DataReceiver
248cdf0e10cSrcweir             uno::Reference< chart2::data::XDataReceiver > xReceiver;
249cdf0e10cSrcweir             uno::Reference< embed::XComponentSupplier > xCompSupp( xObj, uno::UNO_QUERY );
250cdf0e10cSrcweir             if( xCompSupp.is())
251cdf0e10cSrcweir                 xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY );
252cdf0e10cSrcweir             if( xReceiver.is())
253cdf0e10cSrcweir             {
254cdf0e10cSrcweir                 String sRangeStr;
255cdf0e10cSrcweir                 xNewRanges->Format(sRangeStr, SCR_ABS_3D, pDoc);
256cdf0e10cSrcweir 
257cdf0e10cSrcweir                 // connect
258cdf0e10cSrcweir                 if( sRangeStr.Len() )
259cdf0e10cSrcweir                     xReceiver->attachDataProvider( xDataProvider );
260cdf0e10cSrcweir                 else
261cdf0e10cSrcweir                     sRangeStr = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( "all" ) );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir                 uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( pDocShell->GetModel(), uno::UNO_QUERY );
264cdf0e10cSrcweir                 xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
265cdf0e10cSrcweir 
266cdf0e10cSrcweir                 // set arguments
267cdf0e10cSrcweir                 uno::Sequence< beans::PropertyValue > aArgs( 4 );
268cdf0e10cSrcweir                 aArgs[0] = beans::PropertyValue(
269cdf0e10cSrcweir                     ::rtl::OUString::createFromAscii("CellRangeRepresentation"), -1,
270cdf0e10cSrcweir                     uno::makeAny( ::rtl::OUString( sRangeStr )), beans::PropertyState_DIRECT_VALUE );
271cdf0e10cSrcweir                 aArgs[1] = beans::PropertyValue(
272cdf0e10cSrcweir                     ::rtl::OUString::createFromAscii("HasCategories"), -1,
273cdf0e10cSrcweir                     uno::makeAny( bRowHeaders ), beans::PropertyState_DIRECT_VALUE );
274cdf0e10cSrcweir                 aArgs[2] = beans::PropertyValue(
275cdf0e10cSrcweir                     ::rtl::OUString::createFromAscii("FirstCellAsLabel"), -1,
276cdf0e10cSrcweir                     uno::makeAny( bColumnHeaders ), beans::PropertyState_DIRECT_VALUE );
277cdf0e10cSrcweir                 aArgs[3] = beans::PropertyValue(
278cdf0e10cSrcweir                     ::rtl::OUString::createFromAscii("DataRowSource"), -1,
279cdf0e10cSrcweir                     uno::makeAny( chart::ChartDataRowSource_COLUMNS ), beans::PropertyState_DIRECT_VALUE );
280cdf0e10cSrcweir                 xReceiver->setArguments( aArgs );
281cdf0e10cSrcweir             }
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 			ScChartListener* pChartListener =
284cdf0e10cSrcweir 				new ScChartListener( aObjName, pDoc, xNewRanges );
285cdf0e10cSrcweir 			pDoc->GetChartListenerCollection()->Insert( pChartListener );
286cdf0e10cSrcweir 			pChartListener->StartListeningTo();
287cdf0e10cSrcweir 
288cdf0e10cSrcweir             SdrOle2Obj* pObj = new SdrOle2Obj( ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ), aObjName, aInsRect );
289cdf0e10cSrcweir 
290cdf0e10cSrcweir             // set VisArea
291cdf0e10cSrcweir             if( xObj.is())
292cdf0e10cSrcweir                 xObj->setVisualAreaSize( nAspect, aSz );
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 			pPage->InsertObject( pObj );
295cdf0e10cSrcweir             pModel->AddUndo( new SdrUndoNewObj( *pObj ) );
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 			// Dies veranlaesst Chart zum sofortigen Update
298cdf0e10cSrcweir 			//SvData aEmpty;
299cdf0e10cSrcweir 			//aIPObj->SendDataChanged( aEmpty );
300cdf0e10cSrcweir 	}
301cdf0e10cSrcweir }
302cdf0e10cSrcweir 
303cdf0e10cSrcweir void SAL_CALL ScChartsObj::removeByName( const rtl::OUString& aName )
304cdf0e10cSrcweir 											throw(uno::RuntimeException)
305cdf0e10cSrcweir {
306cdf0e10cSrcweir 	ScUnoGuard aGuard;
307cdf0e10cSrcweir 	String aNameString(aName);
308cdf0e10cSrcweir 	SdrOle2Obj* pObj = lcl_FindChartObj( pDocShell, nTab, aNameString );
309cdf0e10cSrcweir 	if (pObj)
310cdf0e10cSrcweir 	{
311cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
312cdf0e10cSrcweir 		ScDrawLayer* pModel = pDoc->GetDrawLayer();		// ist nicht 0
313cdf0e10cSrcweir 		SdrPage* pPage = pModel->GetPage(static_cast<sal_uInt16>(nTab));    // ist nicht 0
314cdf0e10cSrcweir 
315cdf0e10cSrcweir         pModel->AddUndo( new SdrUndoDelObj( *pObj ) );
316cdf0e10cSrcweir 		pPage->RemoveObject( pObj->GetOrdNum() );
317cdf0e10cSrcweir 
318cdf0e10cSrcweir 		//!	Notify etc.???
319cdf0e10cSrcweir 	}
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
322cdf0e10cSrcweir // XEnumerationAccess
323cdf0e10cSrcweir 
324cdf0e10cSrcweir uno::Reference<container::XEnumeration> SAL_CALL ScChartsObj::createEnumeration()
325cdf0e10cSrcweir 													throw(uno::RuntimeException)
326cdf0e10cSrcweir {
327cdf0e10cSrcweir 	ScUnoGuard aGuard;
328cdf0e10cSrcweir     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.table.TableChartsEnumeration")));
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
331cdf0e10cSrcweir // XIndexAccess
332cdf0e10cSrcweir 
333cdf0e10cSrcweir sal_Int32 SAL_CALL ScChartsObj::getCount() throw(uno::RuntimeException)
334cdf0e10cSrcweir {
335cdf0e10cSrcweir 	ScUnoGuard aGuard;
336cdf0e10cSrcweir 	sal_Int32 nCount = 0;
337cdf0e10cSrcweir 	if ( pDocShell )
338cdf0e10cSrcweir 	{
339cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
340cdf0e10cSrcweir 		ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
341cdf0e10cSrcweir 		if (pDrawLayer)
342cdf0e10cSrcweir 		{
343cdf0e10cSrcweir 			SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
344cdf0e10cSrcweir 			DBG_ASSERT(pPage, "Page nicht gefunden");
345cdf0e10cSrcweir 			if (pPage)
346cdf0e10cSrcweir 			{
347cdf0e10cSrcweir 				SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
348cdf0e10cSrcweir 				SdrObject* pObject = aIter.Next();
349cdf0e10cSrcweir 				while (pObject)
350cdf0e10cSrcweir 				{
351cdf0e10cSrcweir 					if ( pObject->GetObjIdentifier() == OBJ_OLE2 && pDoc->IsChart(pObject) )
352cdf0e10cSrcweir 						++nCount;
353cdf0e10cSrcweir 					pObject = aIter.Next();
354cdf0e10cSrcweir 				}
355cdf0e10cSrcweir 			}
356cdf0e10cSrcweir 		}
357cdf0e10cSrcweir 	}
358cdf0e10cSrcweir 	return nCount;
359cdf0e10cSrcweir }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir uno::Any SAL_CALL ScChartsObj::getByIndex( sal_Int32 nIndex )
362cdf0e10cSrcweir 							throw(lang::IndexOutOfBoundsException,
363cdf0e10cSrcweir 									lang::WrappedTargetException, uno::RuntimeException)
364cdf0e10cSrcweir {
365cdf0e10cSrcweir 	ScUnoGuard aGuard;
366cdf0e10cSrcweir 	uno::Reference<table::XTableChart> xChart(GetObjectByIndex_Impl(nIndex));
367cdf0e10cSrcweir 	if (xChart.is())
368cdf0e10cSrcweir         return uno::makeAny(xChart);
369cdf0e10cSrcweir 	else
370cdf0e10cSrcweir 		throw lang::IndexOutOfBoundsException();
371cdf0e10cSrcweir //    return uno::Any();
372cdf0e10cSrcweir }
373cdf0e10cSrcweir 
374cdf0e10cSrcweir uno::Type SAL_CALL ScChartsObj::getElementType() throw(uno::RuntimeException)
375cdf0e10cSrcweir {
376cdf0e10cSrcweir 	ScUnoGuard aGuard;
377cdf0e10cSrcweir 	return getCppuType((uno::Reference<table::XTableChart>*)0);
378cdf0e10cSrcweir }
379cdf0e10cSrcweir 
380cdf0e10cSrcweir sal_Bool SAL_CALL ScChartsObj::hasElements() throw(uno::RuntimeException)
381cdf0e10cSrcweir {
382cdf0e10cSrcweir 	ScUnoGuard aGuard;
383cdf0e10cSrcweir 	return getCount() != 0;
384cdf0e10cSrcweir }
385cdf0e10cSrcweir 
386cdf0e10cSrcweir uno::Any SAL_CALL ScChartsObj::getByName( const rtl::OUString& aName )
387cdf0e10cSrcweir 			throw(container::NoSuchElementException,
388cdf0e10cSrcweir 					lang::WrappedTargetException, uno::RuntimeException)
389cdf0e10cSrcweir {
390cdf0e10cSrcweir 	ScUnoGuard aGuard;
391cdf0e10cSrcweir 	uno::Reference<table::XTableChart> xChart(GetObjectByName_Impl(aName));
392cdf0e10cSrcweir 	if (xChart.is())
393cdf0e10cSrcweir         return uno::makeAny(xChart);
394cdf0e10cSrcweir 	else
395cdf0e10cSrcweir 		throw container::NoSuchElementException();
396cdf0e10cSrcweir //    return uno::Any();
397cdf0e10cSrcweir }
398cdf0e10cSrcweir 
399cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL ScChartsObj::getElementNames() throw(uno::RuntimeException)
400cdf0e10cSrcweir {
401cdf0e10cSrcweir 	ScUnoGuard aGuard;
402cdf0e10cSrcweir 	if (pDocShell)
403cdf0e10cSrcweir 	{
404cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
405cdf0e10cSrcweir 
406cdf0e10cSrcweir 		long nCount = getCount();
407cdf0e10cSrcweir 		uno::Sequence<rtl::OUString> aSeq(nCount);
408cdf0e10cSrcweir 		rtl::OUString* pAry = aSeq.getArray();
409cdf0e10cSrcweir 
410cdf0e10cSrcweir 		long nPos = 0;
411cdf0e10cSrcweir 		ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
412cdf0e10cSrcweir 		if (pDrawLayer)
413cdf0e10cSrcweir 		{
414cdf0e10cSrcweir 			SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
415cdf0e10cSrcweir 			DBG_ASSERT(pPage, "Page nicht gefunden");
416cdf0e10cSrcweir 			if (pPage)
417cdf0e10cSrcweir 			{
418cdf0e10cSrcweir 				SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
419cdf0e10cSrcweir 				SdrObject* pObject = aIter.Next();
420cdf0e10cSrcweir 				while (pObject)
421cdf0e10cSrcweir 				{
422cdf0e10cSrcweir 					if ( pObject->GetObjIdentifier() == OBJ_OLE2 && pDoc->IsChart(pObject) )
423cdf0e10cSrcweir 					{
424cdf0e10cSrcweir 						String aName;
425cdf0e10cSrcweir                         uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)pObject)->GetObjRef();
426cdf0e10cSrcweir                         if ( xObj.is() )
427cdf0e10cSrcweir                             aName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj );
428cdf0e10cSrcweir 
429cdf0e10cSrcweir 						DBG_ASSERT(nPos<nCount, "huch, verzaehlt?");
430cdf0e10cSrcweir 						pAry[nPos++] = aName;
431cdf0e10cSrcweir 					}
432cdf0e10cSrcweir 					pObject = aIter.Next();
433cdf0e10cSrcweir 				}
434cdf0e10cSrcweir 			}
435cdf0e10cSrcweir 		}
436cdf0e10cSrcweir 		DBG_ASSERT(nPos==nCount, "nanu, verzaehlt?");
437cdf0e10cSrcweir 
438cdf0e10cSrcweir 		return aSeq;
439cdf0e10cSrcweir 	}
440cdf0e10cSrcweir 	return uno::Sequence<rtl::OUString>(0);
441cdf0e10cSrcweir }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir sal_Bool SAL_CALL ScChartsObj::hasByName( const rtl::OUString& aName )
444cdf0e10cSrcweir 										throw(uno::RuntimeException)
445cdf0e10cSrcweir {
446cdf0e10cSrcweir 	ScUnoGuard aGuard;
447cdf0e10cSrcweir 	String aNameString(aName);
448cdf0e10cSrcweir 	return ( lcl_FindChartObj( pDocShell, nTab, aNameString ) != NULL );
449cdf0e10cSrcweir }
450cdf0e10cSrcweir 
451cdf0e10cSrcweir //------------------------------------------------------------------------
452cdf0e10cSrcweir 
453cdf0e10cSrcweir ScChartObj::ScChartObj(ScDocShell* pDocSh, SCTAB nT, const String& rN)
454cdf0e10cSrcweir     :ScChartObj_Base( m_aMutex )
455cdf0e10cSrcweir     ,ScChartObj_PBase( ScChartObj_Base::rBHelper )
456cdf0e10cSrcweir 	,pDocShell( pDocSh )
457cdf0e10cSrcweir 	,nTab( nT )
458cdf0e10cSrcweir 	,aChartName( rN )
459cdf0e10cSrcweir {
460cdf0e10cSrcweir     pDocShell->GetDocument()->AddUnoObject(*this);
461*7d1ce60bSWang Lei     SdrOle2Obj* pObject = lcl_FindChartObj( pDocShell, nTab, aChartName );
462*7d1ce60bSWang Lei     if ( pObject && svt::EmbeddedObjectRef::TryRunningState( pObject->GetObjRef() ) )
463*7d1ce60bSWang Lei         aObjectName = pObject->GetName();   // #i121178#: keep the OLE object's name
464cdf0e10cSrcweir     uno::Sequence< table::CellRangeAddress > aInitialPropValue;
465cdf0e10cSrcweir     registerPropertyNoMember( ::rtl::OUString::createFromAscii( "RelatedCellRanges" ),
466cdf0e10cSrcweir         PROP_HANDLE_RELATED_CELLRANGES, beans::PropertyAttribute::MAYBEVOID,
467cdf0e10cSrcweir         ::getCppuType( &aInitialPropValue ), &aInitialPropValue );
468cdf0e10cSrcweir }
469cdf0e10cSrcweir 
470cdf0e10cSrcweir ScChartObj::~ScChartObj()
471cdf0e10cSrcweir {
472cdf0e10cSrcweir 	if (pDocShell)
473cdf0e10cSrcweir 		pDocShell->GetDocument()->RemoveUnoObject(*this);
474cdf0e10cSrcweir }
475cdf0e10cSrcweir 
476cdf0e10cSrcweir void ScChartObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir 	//!	Referenz-Update
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 	if ( rHint.ISA( SfxSimpleHint ) &&
481cdf0e10cSrcweir 			((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
482cdf0e10cSrcweir 	{
483cdf0e10cSrcweir 		pDocShell = NULL;		// ungueltig geworden
484cdf0e10cSrcweir 	}
485cdf0e10cSrcweir }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir void ScChartObj::GetData_Impl( ScRangeListRef& rRanges, bool& rColHeaders, bool& rRowHeaders ) const
488cdf0e10cSrcweir {
489cdf0e10cSrcweir 	bool bFound = false;
490cdf0e10cSrcweir     ScDocument* pDoc = (pDocShell? pDocShell->GetDocument(): 0);
491cdf0e10cSrcweir 
492cdf0e10cSrcweir     if( pDoc )
493cdf0e10cSrcweir     {
494cdf0e10cSrcweir         uno::Reference< chart2::XChartDocument > xChartDoc( pDoc->GetChartByName( aChartName ) );
495cdf0e10cSrcweir         if( xChartDoc.is() )
496cdf0e10cSrcweir         {
497cdf0e10cSrcweir             uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY );
498cdf0e10cSrcweir             uno::Reference< chart2::data::XDataProvider > xProvider = xChartDoc->getDataProvider();
499cdf0e10cSrcweir             if( xReceiver.is() && xProvider.is() )
500cdf0e10cSrcweir             {
501cdf0e10cSrcweir                 uno::Sequence< beans::PropertyValue > aArgs( xProvider->detectArguments( xReceiver->getUsedData() ) );
502cdf0e10cSrcweir 
503cdf0e10cSrcweir                 rtl::OUString aRanges;
504cdf0e10cSrcweir                 chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS;
505cdf0e10cSrcweir                 bool bHasCategories=false;
506cdf0e10cSrcweir                 bool bFirstCellAsLabel=false;
507cdf0e10cSrcweir                 const beans::PropertyValue* pPropArray = aArgs.getConstArray();
508cdf0e10cSrcweir                 long nPropCount = aArgs.getLength();
509cdf0e10cSrcweir                 for (long i = 0; i < nPropCount; i++)
510cdf0e10cSrcweir                 {
511cdf0e10cSrcweir                     const beans::PropertyValue& rProp = pPropArray[i];
512cdf0e10cSrcweir                     String aPropName(rProp.Name);
513cdf0e10cSrcweir 
514cdf0e10cSrcweir                     if (aPropName.EqualsAscii( "CellRangeRepresentation" ))
515cdf0e10cSrcweir                         rProp.Value >>= aRanges;
516cdf0e10cSrcweir                     else if (aPropName.EqualsAscii( "DataRowSource" ))
517cdf0e10cSrcweir                         eDataRowSource = (chart::ChartDataRowSource)ScUnoHelpFunctions::GetEnumFromAny( rProp.Value );
518cdf0e10cSrcweir                     else if (aPropName.EqualsAscii( "HasCategories" ))
519cdf0e10cSrcweir                         bHasCategories = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
520cdf0e10cSrcweir                     else if (aPropName.EqualsAscii( "FirstCellAsLabel" ))
521cdf0e10cSrcweir                         bFirstCellAsLabel = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
522cdf0e10cSrcweir                 }
523cdf0e10cSrcweir 
524cdf0e10cSrcweir                 if( chart::ChartDataRowSource_COLUMNS == eDataRowSource )
525cdf0e10cSrcweir                 {
526cdf0e10cSrcweir                     rColHeaders=bFirstCellAsLabel;
527cdf0e10cSrcweir                     rRowHeaders=bHasCategories;
528cdf0e10cSrcweir                 }
529cdf0e10cSrcweir                 else
530cdf0e10cSrcweir                 {
531cdf0e10cSrcweir                     rColHeaders=bHasCategories;
532cdf0e10cSrcweir                     rRowHeaders=bFirstCellAsLabel;
533cdf0e10cSrcweir                 }
534cdf0e10cSrcweir                 rRanges->Parse( aRanges, pDoc);
535cdf0e10cSrcweir             }
536cdf0e10cSrcweir             bFound = true;
537cdf0e10cSrcweir         }
538cdf0e10cSrcweir  	}
539cdf0e10cSrcweir 	if( !bFound )
540cdf0e10cSrcweir 	{
541cdf0e10cSrcweir 		rRanges = 0;
542cdf0e10cSrcweir 		rColHeaders = false;
543cdf0e10cSrcweir 		rRowHeaders = false;
544cdf0e10cSrcweir 	}
545cdf0e10cSrcweir }
546cdf0e10cSrcweir 
547cdf0e10cSrcweir void ScChartObj::Update_Impl( const ScRangeListRef& rRanges, bool bColHeaders, bool bRowHeaders )
548cdf0e10cSrcweir {
549cdf0e10cSrcweir 	if (pDocShell)
550cdf0e10cSrcweir 	{
551cdf0e10cSrcweir 		ScDocument* pDoc = pDocShell->GetDocument();
552cdf0e10cSrcweir 		sal_Bool bUndo(pDoc->IsUndoEnabled());
553cdf0e10cSrcweir 
554cdf0e10cSrcweir 		if (bUndo)
555cdf0e10cSrcweir 		{
556cdf0e10cSrcweir 			pDocShell->GetUndoManager()->AddUndoAction(
557cdf0e10cSrcweir 				new ScUndoChartData( pDocShell, aChartName, rRanges, bColHeaders, bRowHeaders, sal_False ) );
558cdf0e10cSrcweir 		}
559cdf0e10cSrcweir 		pDoc->UpdateChartArea( aChartName, rRanges, bColHeaders, bRowHeaders, sal_False );
560cdf0e10cSrcweir 	}
561cdf0e10cSrcweir }
562cdf0e10cSrcweir 
563cdf0e10cSrcweir // ::comphelper::OPropertySetHelper
564cdf0e10cSrcweir 
565cdf0e10cSrcweir ::cppu::IPropertyArrayHelper& ScChartObj::getInfoHelper()
566cdf0e10cSrcweir {
567cdf0e10cSrcweir     return *ScChartObj_PABase::getArrayHelper();
568cdf0e10cSrcweir }
569cdf0e10cSrcweir 
570cdf0e10cSrcweir void ScChartObj::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const uno::Any& rValue ) throw (uno::Exception)
571cdf0e10cSrcweir {
572cdf0e10cSrcweir     switch ( nHandle )
573cdf0e10cSrcweir 	{
574cdf0e10cSrcweir         case PROP_HANDLE_RELATED_CELLRANGES:
575cdf0e10cSrcweir             {
576cdf0e10cSrcweir                 uno::Sequence< table::CellRangeAddress > aCellRanges;
577cdf0e10cSrcweir                 if ( rValue >>= aCellRanges )
578cdf0e10cSrcweir                 {
579cdf0e10cSrcweir                     ScRangeListRef rRangeList = new ScRangeList();
580cdf0e10cSrcweir                     const table::CellRangeAddress* pCellRanges = aCellRanges.getArray();
581cdf0e10cSrcweir                     sal_Int32 nCount = aCellRanges.getLength();
582cdf0e10cSrcweir                     for ( sal_Int32 i = 0; i < nCount; ++i )
583cdf0e10cSrcweir                     {
584cdf0e10cSrcweir                         table::CellRangeAddress aCellRange = pCellRanges[ i ];
585cdf0e10cSrcweir                         ScRange aRange;
586cdf0e10cSrcweir                         ScUnoConversion::FillScRange( aRange, aCellRange );
587cdf0e10cSrcweir                         rRangeList->Append( aRange );
588cdf0e10cSrcweir                     }
589cdf0e10cSrcweir                     ScDocument* pDoc = ( pDocShell ? pDocShell->GetDocument() : NULL );
590cdf0e10cSrcweir                     ScChartListenerCollection* pCollection = ( pDoc ? pDoc->GetChartListenerCollection() : NULL );
591cdf0e10cSrcweir                     if ( pCollection )
592cdf0e10cSrcweir                     {
593cdf0e10cSrcweir                         pCollection->ChangeListening( aChartName, rRangeList );
594cdf0e10cSrcweir                     }
595cdf0e10cSrcweir                 }
596cdf0e10cSrcweir             }
597cdf0e10cSrcweir             break;
598cdf0e10cSrcweir         default:
599cdf0e10cSrcweir             {
600cdf0e10cSrcweir             }
601cdf0e10cSrcweir             break;
602cdf0e10cSrcweir     }
603cdf0e10cSrcweir }
604cdf0e10cSrcweir 
605cdf0e10cSrcweir void ScChartObj::getFastPropertyValue( uno::Any& rValue, sal_Int32 nHandle ) const
606cdf0e10cSrcweir {
607cdf0e10cSrcweir     switch ( nHandle )
608cdf0e10cSrcweir 	{
609cdf0e10cSrcweir         case PROP_HANDLE_RELATED_CELLRANGES:
610cdf0e10cSrcweir             {
611cdf0e10cSrcweir                 ScDocument* pDoc = ( pDocShell ? pDocShell->GetDocument() : NULL );
612cdf0e10cSrcweir                 if ( pDoc )
613cdf0e10cSrcweir                 {
614cdf0e10cSrcweir                     ScRange aEmptyRange;
615cdf0e10cSrcweir                     sal_uInt16 nIndex = 0;
616cdf0e10cSrcweir                     ScChartListener aSearcher( aChartName, pDoc, aEmptyRange );
617cdf0e10cSrcweir                     ScChartListenerCollection* pCollection = pDoc->GetChartListenerCollection();
618cdf0e10cSrcweir                     if ( pCollection && pCollection->Search( &aSearcher, nIndex ) )
619cdf0e10cSrcweir                     {
620cdf0e10cSrcweir                         ScChartListener* pListener = static_cast< ScChartListener* >( pCollection->At( nIndex ) );
621cdf0e10cSrcweir                         if ( pListener )
622cdf0e10cSrcweir                         {
623cdf0e10cSrcweir                             const ScRangeListRef& rRangeList = pListener->GetRangeList();
624cdf0e10cSrcweir                             if ( rRangeList.Is() )
625cdf0e10cSrcweir                             {
626cdf0e10cSrcweir                                 sal_uLong nCount = rRangeList->Count();
627cdf0e10cSrcweir                                 uno::Sequence< table::CellRangeAddress > aCellRanges( nCount );
628cdf0e10cSrcweir                                 table::CellRangeAddress* pCellRanges = aCellRanges.getArray();
629cdf0e10cSrcweir                                 for ( sal_uInt16 i = 0; i < nCount; ++i )
630cdf0e10cSrcweir                                 {
631cdf0e10cSrcweir                                     ScRange aRange( *rRangeList->GetObject( i ) );
632cdf0e10cSrcweir                                     table::CellRangeAddress aCellRange;
633cdf0e10cSrcweir                                     ScUnoConversion::FillApiRange( aCellRange, aRange );
634cdf0e10cSrcweir                                     pCellRanges[ i ] = aCellRange;
635cdf0e10cSrcweir                                 }
636cdf0e10cSrcweir                                 rValue <<= aCellRanges;
637cdf0e10cSrcweir                             }
638cdf0e10cSrcweir                         }
639cdf0e10cSrcweir                     }
640cdf0e10cSrcweir                 }
641cdf0e10cSrcweir             }
642cdf0e10cSrcweir             break;
643cdf0e10cSrcweir         default:
644cdf0e10cSrcweir             {
645cdf0e10cSrcweir             }
646cdf0e10cSrcweir             break;
647cdf0e10cSrcweir     }
648cdf0e10cSrcweir }
649cdf0e10cSrcweir 
650cdf0e10cSrcweir // ::comphelper::OPropertyArrayUsageHelper
651cdf0e10cSrcweir 
652cdf0e10cSrcweir ::cppu::IPropertyArrayHelper* ScChartObj::createArrayHelper() const
653cdf0e10cSrcweir {
654cdf0e10cSrcweir     uno::Sequence< beans::Property > aProps;
655cdf0e10cSrcweir     describeProperties( aProps );
656cdf0e10cSrcweir     return new ::cppu::OPropertyArrayHelper( aProps );
657cdf0e10cSrcweir }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir // XInterface
660cdf0e10cSrcweir 
661cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( ScChartObj, ScChartObj_Base, ScChartObj_PBase )
662cdf0e10cSrcweir 
663cdf0e10cSrcweir // XTypeProvider
664cdf0e10cSrcweir 
665cdf0e10cSrcweir IMPLEMENT_FORWARD_XTYPEPROVIDER2( ScChartObj, ScChartObj_Base, ScChartObj_PBase )
666cdf0e10cSrcweir 
667cdf0e10cSrcweir // XComponent
668cdf0e10cSrcweir 
669cdf0e10cSrcweir void ScChartObj::disposing()
670cdf0e10cSrcweir {
671cdf0e10cSrcweir     ScChartObj_Base::disposing();
672cdf0e10cSrcweir }
673cdf0e10cSrcweir 
674cdf0e10cSrcweir // XTableChart
675cdf0e10cSrcweir 
676cdf0e10cSrcweir sal_Bool SAL_CALL ScChartObj::getHasColumnHeaders() throw(uno::RuntimeException)
677cdf0e10cSrcweir {
678cdf0e10cSrcweir 	ScUnoGuard aGuard;
679cdf0e10cSrcweir 	ScRangeListRef xRanges = new ScRangeList;
680cdf0e10cSrcweir 	bool bColHeaders, bRowHeaders;
681cdf0e10cSrcweir 	GetData_Impl( xRanges, bColHeaders, bRowHeaders );
682cdf0e10cSrcweir 	return bColHeaders;
683cdf0e10cSrcweir }
684cdf0e10cSrcweir 
685cdf0e10cSrcweir void SAL_CALL ScChartObj::setHasColumnHeaders( sal_Bool bHasColumnHeaders )
686cdf0e10cSrcweir 												throw(uno::RuntimeException)
687cdf0e10cSrcweir {
688cdf0e10cSrcweir 	ScUnoGuard aGuard;
689cdf0e10cSrcweir 	ScRangeListRef xRanges = new ScRangeList;
690cdf0e10cSrcweir 	bool bOldColHeaders, bOldRowHeaders;
691cdf0e10cSrcweir 	GetData_Impl( xRanges, bOldColHeaders, bOldRowHeaders );
692cdf0e10cSrcweir 	if ( bOldColHeaders != (bHasColumnHeaders != sal_False) )
693cdf0e10cSrcweir 		Update_Impl( xRanges, bHasColumnHeaders, bOldRowHeaders );
694cdf0e10cSrcweir }
695cdf0e10cSrcweir 
696cdf0e10cSrcweir sal_Bool SAL_CALL ScChartObj::getHasRowHeaders() throw(uno::RuntimeException)
697cdf0e10cSrcweir {
698cdf0e10cSrcweir 	ScUnoGuard aGuard;
699cdf0e10cSrcweir 	ScRangeListRef xRanges = new ScRangeList;
700cdf0e10cSrcweir 	bool bColHeaders, bRowHeaders;
701cdf0e10cSrcweir 	GetData_Impl( xRanges, bColHeaders, bRowHeaders );
702cdf0e10cSrcweir 	return bRowHeaders;
703cdf0e10cSrcweir }
704cdf0e10cSrcweir 
705cdf0e10cSrcweir void SAL_CALL ScChartObj::setHasRowHeaders( sal_Bool bHasRowHeaders )
706cdf0e10cSrcweir 												throw(uno::RuntimeException)
707cdf0e10cSrcweir {
708cdf0e10cSrcweir 	ScUnoGuard aGuard;
709cdf0e10cSrcweir 	ScRangeListRef xRanges = new ScRangeList;
710cdf0e10cSrcweir 	bool bOldColHeaders, bOldRowHeaders;
711cdf0e10cSrcweir 	GetData_Impl( xRanges, bOldColHeaders, bOldRowHeaders );
712cdf0e10cSrcweir 	if ( bOldRowHeaders != (bHasRowHeaders != sal_False) )
713cdf0e10cSrcweir 		Update_Impl( xRanges, bOldColHeaders, bHasRowHeaders );
714cdf0e10cSrcweir }
715cdf0e10cSrcweir 
716cdf0e10cSrcweir uno::Sequence<table::CellRangeAddress> SAL_CALL ScChartObj::getRanges() throw(uno::RuntimeException)
717cdf0e10cSrcweir {
718cdf0e10cSrcweir 	ScUnoGuard aGuard;
719cdf0e10cSrcweir 	ScRangeListRef xRanges = new ScRangeList;
720cdf0e10cSrcweir 	bool bColHeaders, bRowHeaders;
721cdf0e10cSrcweir 	GetData_Impl( xRanges, bColHeaders, bRowHeaders );
722cdf0e10cSrcweir 	if ( xRanges.Is() )
723cdf0e10cSrcweir 	{
724cdf0e10cSrcweir 		sal_uLong nCount = xRanges->Count();
725cdf0e10cSrcweir 
726cdf0e10cSrcweir 		table::CellRangeAddress aRangeAddress;
727cdf0e10cSrcweir 		uno::Sequence<table::CellRangeAddress> aSeq(nCount);
728cdf0e10cSrcweir 		table::CellRangeAddress* pAry = aSeq.getArray();
729cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nCount; i++)
730cdf0e10cSrcweir 		{
731cdf0e10cSrcweir 			ScRange aRange(*xRanges->GetObject(i));
732cdf0e10cSrcweir 
733cdf0e10cSrcweir 			aRangeAddress.Sheet		  = aRange.aStart.Tab();
734cdf0e10cSrcweir 			aRangeAddress.StartColumn = aRange.aStart.Col();
735cdf0e10cSrcweir 			aRangeAddress.StartRow	  = aRange.aStart.Row();
736cdf0e10cSrcweir 			aRangeAddress.EndColumn	  = aRange.aEnd.Col();
737cdf0e10cSrcweir 			aRangeAddress.EndRow	  = aRange.aEnd.Row();
738cdf0e10cSrcweir 
739cdf0e10cSrcweir 			pAry[i] = aRangeAddress;
740cdf0e10cSrcweir 		}
741cdf0e10cSrcweir 		return aSeq;
742cdf0e10cSrcweir 	}
743cdf0e10cSrcweir 
744cdf0e10cSrcweir 	DBG_ERROR("ScChartObj::getRanges: keine Ranges");
745cdf0e10cSrcweir 	return uno::Sequence<table::CellRangeAddress>();
746cdf0e10cSrcweir }
747cdf0e10cSrcweir 
748cdf0e10cSrcweir void SAL_CALL ScChartObj::setRanges( const uno::Sequence<table::CellRangeAddress>& aRanges )
749cdf0e10cSrcweir 												throw(uno::RuntimeException)
750cdf0e10cSrcweir {
751cdf0e10cSrcweir 	ScUnoGuard aGuard;
752cdf0e10cSrcweir 	ScRangeListRef xOldRanges = new ScRangeList;
753cdf0e10cSrcweir 	bool bColHeaders, bRowHeaders;
754cdf0e10cSrcweir 	GetData_Impl( xOldRanges, bColHeaders, bRowHeaders );
755cdf0e10cSrcweir 
756cdf0e10cSrcweir 	ScRangeList* pList = new ScRangeList;
757cdf0e10cSrcweir 	sal_uInt16 nRangeCount = (sal_uInt16)aRanges.getLength();
758cdf0e10cSrcweir 	if (nRangeCount)
759cdf0e10cSrcweir 	{
760cdf0e10cSrcweir 		const table::CellRangeAddress* pAry = aRanges.getConstArray();
761cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nRangeCount; i++)
762cdf0e10cSrcweir 		{
763cdf0e10cSrcweir 			ScRange aRange( static_cast<SCCOL>(pAry[i].StartColumn), pAry[i].StartRow, pAry[i].Sheet,
764cdf0e10cSrcweir 							static_cast<SCCOL>(pAry[i].EndColumn),   pAry[i].EndRow,   pAry[i].Sheet );
765cdf0e10cSrcweir 			pList->Append( aRange );
766cdf0e10cSrcweir 		}
767cdf0e10cSrcweir 	}
768cdf0e10cSrcweir 	ScRangeListRef xNewRanges( pList );
769cdf0e10cSrcweir 
770cdf0e10cSrcweir 	if ( !xOldRanges.Is() || *xOldRanges != *xNewRanges )
771cdf0e10cSrcweir 		Update_Impl( xNewRanges, bColHeaders, bRowHeaders );
772cdf0e10cSrcweir }
773cdf0e10cSrcweir 
774cdf0e10cSrcweir // XEmbeddedObjectSupplier
775cdf0e10cSrcweir 
776cdf0e10cSrcweir uno::Reference<lang::XComponent> SAL_CALL ScChartObj::getEmbeddedObject() throw(uno::RuntimeException)
777cdf0e10cSrcweir {
778cdf0e10cSrcweir 	ScUnoGuard aGuard;
779cdf0e10cSrcweir 	SdrOle2Obj* pObject = lcl_FindChartObj( pDocShell, nTab, aChartName );
780cdf0e10cSrcweir     if ( pObject && svt::EmbeddedObjectRef::TryRunningState( pObject->GetObjRef() ) )
781cdf0e10cSrcweir 	{
782cdf0e10cSrcweir         //TODO/LATER: is it OK that something is returned for *all* objects, not only own objects?
783cdf0e10cSrcweir         return uno::Reference < lang::XComponent > ( pObject->GetObjRef()->getComponent(), uno::UNO_QUERY );
784cdf0e10cSrcweir 	}
785cdf0e10cSrcweir 
786cdf0e10cSrcweir 	return NULL;
787cdf0e10cSrcweir }
788cdf0e10cSrcweir 
789cdf0e10cSrcweir // XNamed
790cdf0e10cSrcweir 
791cdf0e10cSrcweir rtl::OUString SAL_CALL ScChartObj::getName() throw(uno::RuntimeException)
792cdf0e10cSrcweir {
793cdf0e10cSrcweir 	ScUnoGuard aGuard;
794cdf0e10cSrcweir 	return aChartName;
795cdf0e10cSrcweir }
796cdf0e10cSrcweir 
797cdf0e10cSrcweir void SAL_CALL ScChartObj::setName( const rtl::OUString& /* aName */ ) throw(uno::RuntimeException)
798cdf0e10cSrcweir {
799cdf0e10cSrcweir 	ScUnoGuard aGuard;
800cdf0e10cSrcweir 	throw uno::RuntimeException();		// name cannot be changed
801cdf0e10cSrcweir }
802cdf0e10cSrcweir 
803*7d1ce60bSWang Lei // XNamedEx
804*7d1ce60bSWang Lei 
805*7d1ce60bSWang Lei rtl::OUString SAL_CALL ScChartObj::getDisplayName() throw(uno::RuntimeException)
806*7d1ce60bSWang Lei {
807*7d1ce60bSWang Lei 	ScUnoGuard aGuard;
808*7d1ce60bSWang Lei 	return aObjectName;
809*7d1ce60bSWang Lei }
810*7d1ce60bSWang Lei 
811*7d1ce60bSWang Lei void SAL_CALL ScChartObj::setDisplayName( const rtl::OUString& aName ) throw(uno::RuntimeException)
812*7d1ce60bSWang Lei {
813*7d1ce60bSWang Lei 	ScUnoGuard aGuard;
814*7d1ce60bSWang Lei 	aObjectName = aName;
815*7d1ce60bSWang Lei }
816*7d1ce60bSWang Lei 
817cdf0e10cSrcweir // XPropertySet
818cdf0e10cSrcweir 
819cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > ScChartObj::getPropertySetInfo() throw (uno::RuntimeException)
820cdf0e10cSrcweir {
821cdf0e10cSrcweir     return createPropertySetInfo( getInfoHelper() ) ;
822cdf0e10cSrcweir }
823cdf0e10cSrcweir 
824cdf0e10cSrcweir //------------------------------------------------------------------------
825cdf0e10cSrcweir 
826cdf0e10cSrcweir 
827cdf0e10cSrcweir 
828