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