1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19 #include <RptObject.hxx>
20 #include <algorithm>
21
22 #include <RptDef.hxx>
23 #include <svx/unoshape.hxx>
24 #include <RptModel.hxx>
25 #include <RptObjectListener.hxx>
26 #include <RptPage.hxx>
27
28 #include <strings.hxx>
29 #include <svtools/embedhlp.hxx>
30 #include <com/sun/star/style/XStyle.hpp>
31 #include <com/sun/star/awt/TextAlign.hpp>
32 #include <com/sun/star/beans/XPropertySet.hpp>
33 #include <com/sun/star/embed/XComponentSupplier.hpp>
34 #include <com/sun/star/embed/XEmbeddedObject.hpp>
35 #include <com/sun/star/lang/XServiceInfo.hpp>
36 #include <com/sun/star/report/XFixedLine.hpp>
37 #include <com/sun/star/chart/ChartDataRowSource.hpp>
38 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
39 #include <com/sun/star/chart2/data/XDatabaseDataProvider.hpp>
40 #include <com/sun/star/chart2/XChartDocument.hpp>
41 #include <com/sun/star/style/ParagraphAdjust.hpp>
42 #include <com/sun/star/report/XFormattedField.hpp>
43 #include <cppuhelper/supportsservice.hxx>
44 #include <comphelper/namedvaluecollection.hxx>
45 #include <comphelper/property.hxx>
46 #include <svx/svdundo.hxx>
47 #include <comphelper/diagnose_ex.hxx>
48 #include <PropertyForward.hxx>
49 #include <UndoEnv.hxx>
50 #include <utility>
51
52 namespace rptui
53 {
54
55 using namespace ::com::sun::star;
56 using namespace uno;
57 using namespace beans;
58 using namespace reportdesign;
59 using namespace container;
60 using namespace report;
61
getObjectType(const uno::Reference<report::XReportComponent> & _xComponent)62 SdrObjKind OObjectBase::getObjectType(const uno::Reference< report::XReportComponent>& _xComponent)
63 {
64 uno::Reference< lang::XServiceInfo > xServiceInfo( _xComponent , uno::UNO_QUERY );
65 OSL_ENSURE(xServiceInfo.is(),"Who deletes the XServiceInfo interface!");
66 if ( !xServiceInfo )
67 return SdrObjKind::NONE;
68
69 if ( xServiceInfo->supportsService( SERVICE_FIXEDTEXT ))
70 return SdrObjKind::ReportDesignFixedText;
71 if ( xServiceInfo->supportsService( SERVICE_FIXEDLINE ))
72 {
73 uno::Reference< report::XFixedLine> xFixedLine(_xComponent,uno::UNO_QUERY);
74 return xFixedLine->getOrientation() ? SdrObjKind::ReportDesignHorizontalFixedLine : SdrObjKind::ReportDesignVerticalFixedLine;
75 }
76 if ( xServiceInfo->supportsService( SERVICE_IMAGECONTROL))
77 return SdrObjKind::ReportDesignImageControl;
78 if ( xServiceInfo->supportsService( SERVICE_FORMATTEDFIELD ))
79 return SdrObjKind::ReportDesignFormattedField;
80 if ( xServiceInfo->supportsService(u"com.sun.star.drawing.OLE2Shape"_ustr) )
81 return SdrObjKind::OLE2;
82 if ( xServiceInfo->supportsService( SERVICE_SHAPE ))
83 return SdrObjKind::CustomShape;
84 if ( xServiceInfo->supportsService( SERVICE_REPORTDEFINITION ) )
85 return SdrObjKind::ReportDesignSubReport;
86 return SdrObjKind::OLE2;
87 }
88
createObject(SdrModel & rTargetModel,const uno::Reference<report::XReportComponent> & _xComponent)89 rtl::Reference<SdrObject> OObjectBase::createObject(
90 SdrModel& rTargetModel,
91 const uno::Reference< report::XReportComponent>& _xComponent)
92 {
93 rtl::Reference<SdrObject> pNewObj;
94 SdrObjKind nType = OObjectBase::getObjectType(_xComponent);
95 switch( nType )
96 {
97 case SdrObjKind::ReportDesignFixedText:
98 {
99 rtl::Reference<OUnoObject> pUnoObj = new OUnoObject(
100 rTargetModel,
101 _xComponent,
102 u"com.sun.star.form.component.FixedText"_ustr,
103 SdrObjKind::ReportDesignFixedText);
104 pNewObj = pUnoObj;
105
106 uno::Reference<beans::XPropertySet> xControlModel(pUnoObj->GetUnoControlModel(),uno::UNO_QUERY);
107 if ( xControlModel.is() )
108 xControlModel->setPropertyValue( PROPERTY_MULTILINE,uno::Any(true));
109 }
110 break;
111 case SdrObjKind::ReportDesignImageControl:
112 pNewObj = new OUnoObject(
113 rTargetModel,
114 _xComponent,
115 u"com.sun.star.form.component.DatabaseImageControl"_ustr,
116 SdrObjKind::ReportDesignImageControl);
117 break;
118 case SdrObjKind::ReportDesignFormattedField:
119 pNewObj = new OUnoObject(
120 rTargetModel,
121 _xComponent,
122 u"com.sun.star.form.component.FormattedField"_ustr,
123 SdrObjKind::ReportDesignFormattedField);
124 break;
125 case SdrObjKind::ReportDesignHorizontalFixedLine:
126 case SdrObjKind::ReportDesignVerticalFixedLine:
127 pNewObj = new OUnoObject(
128 rTargetModel,
129 _xComponent,
130 u"com.sun.star.awt.UnoControlFixedLineModel"_ustr,
131 nType);
132 break;
133 case SdrObjKind::CustomShape:
134 pNewObj = OCustomShape::Create(
135 rTargetModel,
136 _xComponent);
137 try
138 {
139 bool bOpaque = false;
140 _xComponent->getPropertyValue(PROPERTY_OPAQUE) >>= bOpaque;
141 pNewObj->NbcSetLayer(bOpaque ? RPT_LAYER_FRONT : RPT_LAYER_BACK);
142 }
143 catch(const uno::Exception&)
144 {
145 DBG_UNHANDLED_EXCEPTION("reportdesign");
146 }
147 break;
148 case SdrObjKind::ReportDesignSubReport:
149 case SdrObjKind::OLE2:
150 pNewObj = OOle2Obj::Create(
151 rTargetModel,
152 _xComponent,
153 nType);
154 break;
155 default:
156 OSL_FAIL("Unknown object id");
157 break;
158 }
159
160 if ( pNewObj )
161 pNewObj->SetDoNotInsertIntoPageAutomatically( true );
162
163 return pNewObj;
164 }
165
166 namespace
167 {
168 class ParaAdjust : public AnyConverter
169 {
170 public:
operator ()(const OUString & _sPropertyName,const css::uno::Any & lhs) const171 virtual css::uno::Any operator() (const OUString& _sPropertyName,const css::uno::Any& lhs) const override
172 {
173 uno::Any aRet;
174 if (_sPropertyName == PROPERTY_PARAADJUST)
175 {
176 sal_Int16 nTextAlign = 0;
177 lhs >>= nTextAlign;
178 style::ParagraphAdjust eAdjust;
179 switch(nTextAlign)
180 {
181 case awt::TextAlign::LEFT:
182 eAdjust = style::ParagraphAdjust_LEFT;
183 break;
184 case awt::TextAlign::CENTER:
185 eAdjust = style::ParagraphAdjust_CENTER;
186 break;
187 case awt::TextAlign::RIGHT:
188 eAdjust = style::ParagraphAdjust_RIGHT;
189 break;
190 default:
191 OSL_FAIL("Illegal text alignment value!");
192 break;
193 }
194 aRet <<= eAdjust;
195 }
196 else
197 {
198 sal_Int16 nTextAlign = 0;
199 sal_Int16 eParagraphAdjust = 0;
200 lhs >>= eParagraphAdjust;
201 switch(static_cast<style::ParagraphAdjust>(eParagraphAdjust))
202 {
203 case style::ParagraphAdjust_LEFT:
204 case style::ParagraphAdjust_BLOCK:
205 nTextAlign = awt::TextAlign::LEFT;
206 break;
207 case style::ParagraphAdjust_CENTER:
208 nTextAlign = awt::TextAlign::CENTER;
209 break;
210 case style::ParagraphAdjust_RIGHT:
211 nTextAlign = awt::TextAlign::RIGHT;
212 break;
213 default:
214 OSL_FAIL("Illegal text alignment value!");
215 break;
216 }
217 aRet <<= nTextAlign;
218 }
219 return aRet;
220 }
221 };
222 }
223
getPropertyNameMap(SdrObjKind _nObjectId)224 const TPropertyNamePair& getPropertyNameMap(SdrObjKind _nObjectId)
225 {
226 switch(_nObjectId)
227 {
228 case SdrObjKind::ReportDesignImageControl:
229 {
230 static TPropertyNamePair s_aNameMap = []()
231 {
232 auto aNoConverter = std::make_shared<AnyConverter>();
233 TPropertyNamePair tmp;
234 tmp.emplace(PROPERTY_CONTROLBACKGROUND,TPropertyConverter(PROPERTY_BACKGROUNDCOLOR,aNoConverter));
235 tmp.emplace(PROPERTY_CONTROLBORDER,TPropertyConverter(PROPERTY_BORDER,aNoConverter));
236 tmp.emplace(PROPERTY_CONTROLBORDERCOLOR,TPropertyConverter(PROPERTY_BORDERCOLOR,aNoConverter));
237 return tmp;
238 }();
239 return s_aNameMap;
240 }
241
242 case SdrObjKind::ReportDesignFixedText:
243 {
244 static TPropertyNamePair s_aNameMap = []()
245 {
246 auto aNoConverter = std::make_shared<AnyConverter>();
247 TPropertyNamePair tmp;
248 tmp.emplace(PROPERTY_CHARCOLOR,TPropertyConverter(PROPERTY_TEXTCOLOR,aNoConverter));
249 tmp.emplace(PROPERTY_CONTROLBACKGROUND,TPropertyConverter(PROPERTY_BACKGROUNDCOLOR,aNoConverter));
250 tmp.emplace(PROPERTY_CHARUNDERLINECOLOR,TPropertyConverter(PROPERTY_TEXTLINECOLOR,aNoConverter));
251 tmp.emplace(PROPERTY_CHARRELIEF,TPropertyConverter(PROPERTY_FONTRELIEF,aNoConverter));
252 tmp.emplace(PROPERTY_CHARFONTHEIGHT,TPropertyConverter(PROPERTY_FONTHEIGHT,aNoConverter));
253 tmp.emplace(PROPERTY_CHARSTRIKEOUT,TPropertyConverter(PROPERTY_FONTSTRIKEOUT,aNoConverter));
254 tmp.emplace(PROPERTY_CONTROLTEXTEMPHASISMARK,TPropertyConverter(PROPERTY_FONTEMPHASISMARK,aNoConverter));
255 tmp.emplace(PROPERTY_CONTROLBORDER,TPropertyConverter(PROPERTY_BORDER,aNoConverter));
256 tmp.emplace(PROPERTY_CONTROLBORDERCOLOR,TPropertyConverter(PROPERTY_BORDERCOLOR,aNoConverter));
257
258 auto aParaAdjust = std::make_shared<ParaAdjust>();
259 tmp.emplace(PROPERTY_PARAADJUST,TPropertyConverter(PROPERTY_ALIGN,aParaAdjust));
260 return tmp;
261 }();
262 return s_aNameMap;
263 }
264 case SdrObjKind::ReportDesignFormattedField:
265 {
266 static TPropertyNamePair s_aNameMap = []()
267 {
268 auto aNoConverter = std::make_shared<AnyConverter>();
269 TPropertyNamePair tmp;
270 tmp.emplace(PROPERTY_CHARCOLOR,TPropertyConverter(PROPERTY_TEXTCOLOR,aNoConverter));
271 tmp.emplace(PROPERTY_CONTROLBACKGROUND,TPropertyConverter(PROPERTY_BACKGROUNDCOLOR,aNoConverter));
272 tmp.emplace(PROPERTY_CHARUNDERLINECOLOR,TPropertyConverter(PROPERTY_TEXTLINECOLOR,aNoConverter));
273 tmp.emplace(PROPERTY_CHARRELIEF,TPropertyConverter(PROPERTY_FONTRELIEF,aNoConverter));
274 tmp.emplace(PROPERTY_CHARFONTHEIGHT,TPropertyConverter(PROPERTY_FONTHEIGHT,aNoConverter));
275 tmp.emplace(PROPERTY_CHARSTRIKEOUT,TPropertyConverter(PROPERTY_FONTSTRIKEOUT,aNoConverter));
276 tmp.emplace(PROPERTY_CONTROLTEXTEMPHASISMARK,TPropertyConverter(PROPERTY_FONTEMPHASISMARK,aNoConverter));
277 tmp.emplace(PROPERTY_CONTROLBORDER,TPropertyConverter(PROPERTY_BORDER,aNoConverter));
278 tmp.emplace(PROPERTY_CONTROLBORDERCOLOR,TPropertyConverter(PROPERTY_BORDERCOLOR,aNoConverter));
279 auto aParaAdjust = std::make_shared<ParaAdjust>();
280 tmp.emplace(PROPERTY_PARAADJUST,TPropertyConverter(PROPERTY_ALIGN,aParaAdjust));
281 return tmp;
282 }();
283 return s_aNameMap;
284 }
285
286 case SdrObjKind::CustomShape:
287 {
288 static TPropertyNamePair s_aNameMap = []()
289 {
290 auto aNoConverter = std::make_shared<AnyConverter>();
291 TPropertyNamePair tmp;
292 tmp.emplace(u"FillColor"_ustr,TPropertyConverter(PROPERTY_CONTROLBACKGROUND,aNoConverter));
293 tmp.emplace(PROPERTY_PARAADJUST,TPropertyConverter(PROPERTY_ALIGN,aNoConverter));
294 return tmp;
295 }();
296 return s_aNameMap;
297 }
298
299 default:
300 break;
301 }
302 static TPropertyNamePair s_aEmptyNameMap;
303 return s_aEmptyNameMap;
304 }
305
306
OObjectBase(const uno::Reference<report::XReportComponent> & _xComponent)307 OObjectBase::OObjectBase(const uno::Reference< report::XReportComponent>& _xComponent)
308 :m_bIsListening(false)
309 {
310 m_xReportComponent = _xComponent;
311 }
312
OObjectBase(OUString _sComponentName)313 OObjectBase::OObjectBase(OUString _sComponentName)
314 :m_sComponentName(std::move(_sComponentName))
315 ,m_bIsListening(false)
316 {
317 assert(!m_sComponentName.isEmpty());
318 }
319
~OObjectBase()320 OObjectBase::~OObjectBase()
321 {
322 m_xMediator.clear();
323 if ( isListening() )
324 EndListening();
325 m_xReportComponent.clear();
326 }
327
getSection() const328 uno::Reference< report::XSection> OObjectBase::getSection() const
329 {
330 uno::Reference< report::XSection> xSection;
331 OReportPage* pPage = dynamic_cast<OReportPage*>(GetImplPage());
332 if ( pPage )
333 xSection = pPage->getSection();
334 return xSection;
335 }
336
337
getAwtComponent()338 uno::Reference< beans::XPropertySet> OObjectBase::getAwtComponent()
339 {
340 return uno::Reference< beans::XPropertySet>();
341 }
342
StartListening()343 void OObjectBase::StartListening()
344 {
345 OSL_ENSURE(!isListening(), "OUnoObject::StartListening: already listening!");
346
347 if ( !isListening() && m_xReportComponent.is() )
348 {
349 m_bIsListening = true;
350
351 if ( !m_xPropertyChangeListener.is() )
352 {
353 m_xPropertyChangeListener = new OObjectListener( this );
354 // register listener to all properties
355 m_xReportComponent->addPropertyChangeListener( OUString() , m_xPropertyChangeListener );
356 }
357 }
358 }
359
EndListening()360 void OObjectBase::EndListening()
361 {
362 OSL_ENSURE(!m_xReportComponent.is() || isListening(), "OUnoObject::EndListening: not listening currently!");
363
364 if ( isListening() && m_xReportComponent.is() )
365 {
366 // XPropertyChangeListener
367 if ( m_xPropertyChangeListener.is() )
368 {
369 // remove listener
370 try
371 {
372 m_xReportComponent->removePropertyChangeListener( OUString() , m_xPropertyChangeListener );
373 }
374 catch(const uno::Exception &)
375 {
376 TOOLS_WARN_EXCEPTION( "package", "OObjectBase::EndListening");
377 }
378 }
379 m_xPropertyChangeListener.clear();
380 }
381 m_bIsListening = false;
382 }
383
SetPropsFromRect(const tools::Rectangle & _rRect)384 void OObjectBase::SetPropsFromRect(const tools::Rectangle& _rRect)
385 {
386 // set properties
387 OReportPage* pPage = dynamic_cast<OReportPage*>(GetImplPage());
388 if ( pPage && !_rRect.IsEmpty() )
389 {
390 const uno::Reference<report::XSection>& xSection = pPage->getSection();
391 assert(_rRect.getOpenHeight() >= 0);
392 const sal_uInt32 newHeight( ::std::max(tools::Long(0), _rRect.getOpenHeight()+_rRect.Top()) );
393 if ( xSection.is() && ( newHeight > xSection->getHeight() ) )
394 xSection->setHeight( newHeight );
395
396 // TODO
397 //pModel->GetRefDevice()->Invalidate(InvalidateFlags::Children);
398 }
399 }
400
_propertyChange(const beans::PropertyChangeEvent &)401 void OObjectBase::_propertyChange( const beans::PropertyChangeEvent& /*evt*/ )
402 {
403 }
404
supportsService(const OUString & _sServiceName) const405 bool OObjectBase::supportsService( const OUString& _sServiceName ) const
406 {
407 // TODO: cache xServiceInfo as member?
408 Reference< lang::XServiceInfo > xServiceInfo( m_xReportComponent , UNO_QUERY );
409
410 if ( xServiceInfo.is() )
411 return cppu::supportsService(xServiceInfo.get(), _sServiceName);
412 else
413 return false;
414 }
415
416
getUnoShapeOf(SdrObject & _rSdrObject)417 uno::Reference< drawing::XShape > OObjectBase::getUnoShapeOf( SdrObject& _rSdrObject )
418 {
419 uno::Reference< drawing::XShape > xShape( _rSdrObject.getWeakUnoShape() );
420 if ( xShape.is() )
421 return xShape;
422
423 xShape = _rSdrObject.SdrObject::getUnoShape();
424 if ( !xShape.is() )
425 return xShape;
426
427 m_xKeepShapeAlive = xShape;
428 return xShape;
429 }
430
OCustomShape(SdrModel & rSdrModel,const uno::Reference<report::XReportComponent> & _xComponent)431 OCustomShape::OCustomShape(
432 SdrModel& rSdrModel,
433 const uno::Reference< report::XReportComponent>& _xComponent)
434 : SdrObjCustomShape(rSdrModel)
435 ,OObjectBase(_xComponent)
436 {
437 setUnoShape( uno::Reference< drawing::XShape >(_xComponent,uno::UNO_QUERY_THROW) );
438 m_bIsListening = true;
439 }
440
OCustomShape(SdrModel & rSdrModel)441 OCustomShape::OCustomShape(
442 SdrModel& rSdrModel)
443 : SdrObjCustomShape(rSdrModel)
444 ,OObjectBase(SERVICE_SHAPE)
445 {
446 m_bIsListening = true;
447 }
448
449
~OCustomShape()450 OCustomShape::~OCustomShape()
451 {
452 }
453
GetObjIdentifier() const454 SdrObjKind OCustomShape::GetObjIdentifier() const
455 {
456 return SdrObjKind::CustomShape;
457 }
458
GetObjInventor() const459 SdrInventor OCustomShape::GetObjInventor() const
460 {
461 return SdrInventor::ReportDesign;
462 }
463
GetImplPage() const464 SdrPage* OCustomShape::GetImplPage() const
465 {
466 return getSdrPageFromSdrObject();
467 }
468
NbcMove(const Size & rSize)469 void OCustomShape::NbcMove( const Size& rSize )
470 {
471 if ( m_bIsListening )
472 {
473 m_bIsListening = false;
474
475 if ( m_xReportComponent.is() )
476 {
477 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
478 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
479 m_xReportComponent->setPositionX(m_xReportComponent->getPositionX() + rSize.Width());
480 m_xReportComponent->setPositionY(m_xReportComponent->getPositionY() + rSize.Height());
481 }
482
483 // set geometry properties
484 SetPropsFromRect(GetSnapRect());
485
486 m_bIsListening = true;
487 }
488 else
489 SdrObjCustomShape::NbcMove( rSize );
490 }
491
NbcResize(const Point & rRef,const Fraction & xFract,const Fraction & yFract)492 void OCustomShape::NbcResize(const Point& rRef, const Fraction& xFract, const Fraction& yFract)
493 {
494 SdrObjCustomShape::NbcResize( rRef, xFract, yFract );
495
496 SetPropsFromRect(GetSnapRect());
497 }
498
NbcSetLogicRect(const tools::Rectangle & rRect,bool bAdaptTextMinSize)499 void OCustomShape::NbcSetLogicRect(const tools::Rectangle& rRect, bool bAdaptTextMinSize)
500 {
501 SdrObjCustomShape::NbcSetLogicRect(rRect, bAdaptTextMinSize);
502 SetPropsFromRect(rRect);
503 }
504
EndCreate(SdrDragStat & rStat,SdrCreateCmd eCmd)505 bool OCustomShape::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd)
506 {
507 bool bResult = SdrObjCustomShape::EndCreate(rStat, eCmd);
508 if ( bResult )
509 {
510 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
511 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
512
513 if ( !m_xReportComponent.is() )
514 m_xReportComponent.set(getUnoShape(),uno::UNO_QUERY);
515
516 SetPropsFromRect(GetSnapRect());
517 }
518
519 return bResult;
520 }
521
522
getAwtComponent()523 uno::Reference< beans::XPropertySet> OCustomShape::getAwtComponent()
524 {
525 return m_xReportComponent;
526 }
527
528
getUnoShape()529 uno::Reference< drawing::XShape > OCustomShape::getUnoShape()
530 {
531 uno::Reference<drawing::XShape> xShape = OObjectBase::getUnoShapeOf( *this );
532 if ( !m_xReportComponent.is() )
533 {
534 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
535 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
536 m_xReportComponent.set(xShape,uno::UNO_QUERY);
537 }
538 return xShape;
539 }
540
setUnoShape(const uno::Reference<drawing::XShape> & rxUnoShape)541 void OCustomShape::setUnoShape( const uno::Reference< drawing::XShape >& rxUnoShape )
542 {
543 SdrObjCustomShape::setUnoShape( rxUnoShape );
544 releaseUnoShape();
545 m_xReportComponent.clear();
546 }
547
ObjectTypeToServiceName(SdrObjKind _nObjectType)548 static OUString ObjectTypeToServiceName(SdrObjKind _nObjectType)
549 {
550 switch (_nObjectType)
551 {
552 case SdrObjKind::ReportDesignFixedText:
553 return SERVICE_FIXEDTEXT;
554 case SdrObjKind::ReportDesignImageControl:
555 return SERVICE_IMAGECONTROL;
556 case SdrObjKind::ReportDesignFormattedField:
557 return SERVICE_FORMATTEDFIELD;
558 case SdrObjKind::ReportDesignVerticalFixedLine:
559 case SdrObjKind::ReportDesignHorizontalFixedLine:
560 return SERVICE_FIXEDLINE;
561 case SdrObjKind::CustomShape:
562 return SERVICE_SHAPE;
563 case SdrObjKind::ReportDesignSubReport:
564 return SERVICE_REPORTDEFINITION;
565 case SdrObjKind::OLE2:
566 return u"com.sun.star.chart2.ChartDocument"_ustr;
567 default:
568 break;
569 }
570 assert(false && "Unknown object id");
571 return u""_ustr;
572 }
OUnoObject(SdrModel & rSdrModel,const OUString & rModelName,SdrObjKind _nObjectType)573 OUnoObject::OUnoObject(
574 SdrModel& rSdrModel,
575 const OUString& rModelName,
576 SdrObjKind _nObjectType)
577 : SdrUnoObj(rSdrModel, rModelName)
578 ,OObjectBase(ObjectTypeToServiceName(_nObjectType))
579 ,m_nObjectType(_nObjectType)
580 // tdf#119067
581 ,m_bSetDefaultLabel(false)
582 {
583 if ( !rModelName.isEmpty() )
584 impl_initializeModel_nothrow();
585 }
586
OUnoObject(SdrModel & rSdrModel,OUnoObject const & rSource)587 OUnoObject::OUnoObject(
588 SdrModel& rSdrModel, OUnoObject const & rSource)
589 : SdrUnoObj(rSdrModel, rSource)
590 ,OObjectBase(ObjectTypeToServiceName(rSource.m_nObjectType)) // source may not have a service name
591 ,m_nObjectType(rSource.m_nObjectType)
592 // tdf#119067
593 ,m_bSetDefaultLabel(rSource.m_bSetDefaultLabel)
594 {
595 osl_atomic_increment(&m_refCount); // getUnoShape will ref-count this
596 {
597 if ( !rSource.getUnoControlModelTypeName().isEmpty() )
598 impl_initializeModel_nothrow();
599 Reference<XPropertySet> xSource(const_cast<OUnoObject&>(rSource).getUnoShape(), uno::UNO_QUERY);
600 Reference<XPropertySet> xDest(getUnoShape(), uno::UNO_QUERY);
601 if ( xSource.is() && xDest.is() )
602 comphelper::copyProperties(xSource, xDest);
603 }
604 osl_atomic_decrement(&m_refCount);
605 }
606
OUnoObject(SdrModel & rSdrModel,const uno::Reference<report::XReportComponent> & _xComponent,const OUString & rModelName,SdrObjKind _nObjectType)607 OUnoObject::OUnoObject(
608 SdrModel& rSdrModel,
609 const uno::Reference< report::XReportComponent>& _xComponent,
610 const OUString& rModelName,
611 SdrObjKind _nObjectType)
612 : SdrUnoObj(rSdrModel, rModelName)
613 ,OObjectBase(_xComponent)
614 ,m_nObjectType(_nObjectType)
615 // tdf#119067
616 ,m_bSetDefaultLabel(false)
617 {
618 setUnoShape( uno::Reference< drawing::XShape >( _xComponent, uno::UNO_QUERY_THROW ) );
619
620 if ( !rModelName.isEmpty() )
621 impl_initializeModel_nothrow();
622
623 }
624
~OUnoObject()625 OUnoObject::~OUnoObject()
626 {
627 }
628
impl_initializeModel_nothrow()629 void OUnoObject::impl_initializeModel_nothrow()
630 {
631 try
632 {
633 Reference< XFormattedField > xFormatted( m_xReportComponent, UNO_QUERY );
634 if ( xFormatted.is() )
635 {
636 const Reference< XPropertySet > xModelProps( GetUnoControlModel(), UNO_QUERY_THROW );
637 xModelProps->setPropertyValue( u"TreatAsNumber"_ustr, Any( false ) );
638 xModelProps->setPropertyValue( PROPERTY_VERTICALALIGN,m_xReportComponent->getPropertyValue(PROPERTY_VERTICALALIGN));
639 }
640 }
641 catch( const Exception& )
642 {
643 DBG_UNHANDLED_EXCEPTION("reportdesign");
644 }
645 }
646
GetObjIdentifier() const647 SdrObjKind OUnoObject::GetObjIdentifier() const
648 {
649 return m_nObjectType;
650 }
651
GetObjInventor() const652 SdrInventor OUnoObject::GetObjInventor() const
653 {
654 return SdrInventor::ReportDesign;
655 }
656
GetImplPage() const657 SdrPage* OUnoObject::GetImplPage() const
658 {
659 return getSdrPageFromSdrObject();
660 }
661
NbcMove(const Size & rSize)662 void OUnoObject::NbcMove( const Size& rSize )
663 {
664
665 if ( m_bIsListening )
666 {
667 // stop listening
668 OObjectBase::EndListening();
669
670 bool bPositionFixed = false;
671 Size aUndoSize(0,0);
672 if ( m_xReportComponent.is() )
673 {
674 bool bUndoMode = false;
675 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
676
677 if (rRptModel.GetUndoEnv().IsUndoMode())
678 {
679 // if we are locked from outside, then we must not handle wrong moves, we are in UNDO mode
680 bUndoMode = true;
681 }
682 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
683
684 // LLA: why there exists getPositionX and getPositionY and NOT getPosition() which return a Point?
685 int nNewX = m_xReportComponent->getPositionX() + rSize.Width();
686 m_xReportComponent->setPositionX(nNewX);
687 int nNewY = m_xReportComponent->getPositionY() + rSize.Height();
688 if (nNewY < 0 && !bUndoMode)
689 {
690 aUndoSize.setHeight( abs(nNewY) );
691 bPositionFixed = true;
692 nNewY = 0;
693 }
694 m_xReportComponent->setPositionY(nNewY);
695 }
696 if (bPositionFixed)
697 {
698 getSdrModelFromSdrObject().AddUndo(getSdrModelFromSdrObject().GetSdrUndoFactory().CreateUndoMoveObject(*this, aUndoSize));
699 }
700 // set geometry properties
701 SetPropsFromRect(GetLogicRect());
702
703 // start listening
704 OObjectBase::StartListening();
705 }
706 else
707 SdrUnoObj::NbcMove( rSize );
708 }
709
710
NbcResize(const Point & rRef,const Fraction & xFract,const Fraction & yFract)711 void OUnoObject::NbcResize(const Point& rRef, const Fraction& xFract, const Fraction& yFract)
712 {
713 SdrUnoObj::NbcResize( rRef, xFract, yFract );
714
715 // stop listening
716 OObjectBase::EndListening();
717
718 // set geometry properties
719 SetPropsFromRect(GetLogicRect());
720
721 // start listening
722 OObjectBase::StartListening();
723 }
724
NbcSetLogicRect(const tools::Rectangle & rRect,bool bAdaptTextMinSize)725 void OUnoObject::NbcSetLogicRect(const tools::Rectangle& rRect, bool bAdaptTextMinSize)
726 {
727 SdrUnoObj::NbcSetLogicRect(rRect, bAdaptTextMinSize);
728 // stop listening
729 OObjectBase::EndListening();
730
731 // set geometry properties
732 SetPropsFromRect(rRect);
733
734 // start listening
735 OObjectBase::StartListening();
736 }
737
EndCreate(SdrDragStat & rStat,SdrCreateCmd eCmd)738 bool OUnoObject::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd)
739 {
740 const bool bResult(SdrUnoObj::EndCreate(rStat, eCmd));
741
742 if(bResult)
743 {
744 // tdf#118730 remember if this object was created interactively (due to ::EndCreate being called)
745 m_bSetDefaultLabel = true;
746
747 // set geometry properties
748 SetPropsFromRect(GetLogicRect());
749 }
750
751 return bResult;
752 }
753
GetDefaultName(const OUnoObject * _pObj)754 OUString OUnoObject::GetDefaultName(const OUnoObject* _pObj)
755 {
756 OUString aDefaultName = u"HERE WE HAVE TO INSERT OUR NAME!"_ustr;
757 if ( _pObj->supportsService( SERVICE_FIXEDTEXT ) )
758 {
759 aDefaultName = RID_STR_CLASS_FIXEDTEXT;
760 }
761 else if ( _pObj->supportsService( SERVICE_FIXEDLINE ) )
762 {
763 aDefaultName = RID_STR_CLASS_FIXEDLINE;
764 }
765 else if ( _pObj->supportsService( SERVICE_IMAGECONTROL ) )
766 {
767 aDefaultName = RID_STR_CLASS_IMAGECONTROL;
768 }
769 else if ( _pObj->supportsService( SERVICE_FORMATTEDFIELD ) )
770 {
771 aDefaultName = RID_STR_CLASS_FORMATTEDFIELD;
772 }
773
774 return aDefaultName;
775 }
776
_propertyChange(const beans::PropertyChangeEvent & evt)777 void OUnoObject::_propertyChange( const beans::PropertyChangeEvent& evt )
778 {
779 OObjectBase::_propertyChange(evt);
780 if (!isListening())
781 return;
782
783 if ( evt.PropertyName == PROPERTY_CHARCOLOR )
784 {
785 Reference<XPropertySet> xControlModel(GetUnoControlModel(),uno::UNO_QUERY);
786 if ( xControlModel.is() )
787 {
788 OObjectBase::EndListening();
789 try
790 {
791 xControlModel->setPropertyValue(PROPERTY_TEXTCOLOR,evt.NewValue);
792 }
793 catch(uno::Exception&)
794 {
795 }
796 OObjectBase::StartListening();
797 }
798 }
799 else if ( evt.PropertyName == PROPERTY_NAME )
800 {
801 Reference<XPropertySet> xControlModel(GetUnoControlModel(),uno::UNO_QUERY);
802 if ( xControlModel.is() && xControlModel->getPropertySetInfo()->hasPropertyByName(PROPERTY_NAME) )
803 {
804 // get old name
805 OUString aOldName;
806 evt.OldValue >>= aOldName;
807
808 // get new name
809 OUString aNewName;
810 evt.NewValue >>= aNewName;
811
812 if ( aNewName != aOldName )
813 {
814 // set old name property
815 OObjectBase::EndListening();
816 if ( m_xMediator.is() )
817 m_xMediator->stopListening();
818 try
819 {
820 xControlModel->setPropertyValue( PROPERTY_NAME, evt.NewValue );
821 }
822 catch(uno::Exception&)
823 {
824 }
825 if ( m_xMediator.is() )
826 m_xMediator->startListening();
827 OObjectBase::StartListening();
828 }
829 }
830 }
831 }
832
CreateMediator(bool _bReverse)833 void OUnoObject::CreateMediator(bool _bReverse)
834 {
835 if ( m_xMediator.is() )
836 return;
837
838 // tdf#118730 Directly do things formerly done in
839 // OUnoObject::impl_setReportComponent_nothrow here
840 if(!m_xReportComponent.is())
841 {
842 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
843 OXUndoEnvironment::OUndoEnvLock aLock( rRptModel.GetUndoEnv() );
844 m_xReportComponent.set(getUnoShape(),uno::UNO_QUERY);
845
846 impl_initializeModel_nothrow();
847 }
848
849 if(m_xReportComponent.is() && m_bSetDefaultLabel)
850 {
851 // tdf#118730 Directly do things formerly done in
852 // OUnoObject::EndCreate here
853 // tdf#119067 ...but *only* if result of interactive
854 // creation in Report DesignView
855 m_bSetDefaultLabel = false;
856
857 try
858 {
859 if ( supportsService( SERVICE_FIXEDTEXT ) )
860 {
861 m_xReportComponent->setPropertyValue(
862 PROPERTY_LABEL,
863 uno::Any(GetDefaultName(this)));
864 }
865 }
866 catch(const uno::Exception&)
867 {
868 DBG_UNHANDLED_EXCEPTION("reportdesign");
869 }
870 }
871
872 if(!m_xMediator.is() && m_xReportComponent.is())
873 {
874 Reference<XPropertySet> xControlModel(GetUnoControlModel(),uno::UNO_QUERY);
875
876 if(xControlModel.is())
877 {
878 m_xMediator = new OPropertyMediator(
879 m_xReportComponent,
880 xControlModel,
881 TPropertyNamePair(getPropertyNameMap(GetObjIdentifier())),
882 _bReverse);
883 }
884 }
885
886 OObjectBase::StartListening();
887 }
888
getAwtComponent()889 uno::Reference< beans::XPropertySet> OUnoObject::getAwtComponent()
890 {
891 return Reference<XPropertySet>(GetUnoControlModel(),uno::UNO_QUERY);
892 }
893
894
getUnoShape()895 uno::Reference< drawing::XShape > OUnoObject::getUnoShape()
896 {
897 return OObjectBase::getUnoShapeOf( *this );
898 }
899
setUnoShape(const uno::Reference<drawing::XShape> & rxUnoShape)900 void OUnoObject::setUnoShape( const uno::Reference< drawing::XShape >& rxUnoShape )
901 {
902 SdrUnoObj::setUnoShape( rxUnoShape );
903 releaseUnoShape();
904 }
905
CloneSdrObject(SdrModel & rTargetModel) const906 rtl::Reference<SdrObject> OUnoObject::CloneSdrObject(SdrModel& rTargetModel) const
907 {
908 return new OUnoObject(rTargetModel, *this);
909 }
910
911 // OOle2Obj
OOle2Obj(SdrModel & rSdrModel,const uno::Reference<report::XReportComponent> & _xComponent,SdrObjKind _nType)912 OOle2Obj::OOle2Obj(
913 SdrModel& rSdrModel,
914 const uno::Reference< report::XReportComponent>& _xComponent,
915 SdrObjKind _nType)
916 : SdrOle2Obj(rSdrModel)
917 ,OObjectBase(_xComponent)
918 ,m_nType(_nType)
919 ,m_bOnlyOnce(true)
920 {
921 setUnoShape( uno::Reference< drawing::XShape >( _xComponent, uno::UNO_QUERY_THROW ) );
922 m_bIsListening = true;
923 }
924
OOle2Obj(SdrModel & rSdrModel,SdrObjKind _nType)925 OOle2Obj::OOle2Obj(
926 SdrModel& rSdrModel,
927 SdrObjKind _nType)
928 : SdrOle2Obj(rSdrModel)
929 ,OObjectBase(ObjectTypeToServiceName(_nType))
930 ,m_nType(_nType)
931 ,m_bOnlyOnce(true)
932 {
933 m_bIsListening = true;
934 }
935
936 static uno::Reference< chart2::data::XDatabaseDataProvider > lcl_getDataProvider(const uno::Reference < embed::XEmbeddedObject >& _xObj);
937
OOle2Obj(SdrModel & rSdrModel,OOle2Obj const & rSource)938 OOle2Obj::OOle2Obj(SdrModel& rSdrModel, OOle2Obj const & rSource)
939 : SdrOle2Obj(rSdrModel, rSource)
940 ,OObjectBase(rSource.getServiceName())
941 ,m_nType(rSource.m_nType)
942 ,m_bOnlyOnce(rSource.m_bOnlyOnce)
943 {
944 m_bIsListening = true;
945
946 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
947 (void)svt::EmbeddedObjectRef::TryRunningState( GetObjRef() );
948 impl_createDataProvider_nothrow(rRptModel.getReportDefinition());
949
950 uno::Reference< chart2::data::XDatabaseDataProvider > xSource( lcl_getDataProvider(rSource.GetObjRef()) );
951 uno::Reference< chart2::data::XDatabaseDataProvider > xDest( lcl_getDataProvider(GetObjRef()) );
952 if ( xSource.is() && xDest.is() )
953 comphelper::copyProperties(xSource, xDest);
954
955 initializeChart(rRptModel.getReportDefinition());
956 }
957
~OOle2Obj()958 OOle2Obj::~OOle2Obj()
959 {
960 }
961
GetObjIdentifier() const962 SdrObjKind OOle2Obj::GetObjIdentifier() const
963 {
964 return m_nType;
965 }
966
GetObjInventor() const967 SdrInventor OOle2Obj::GetObjInventor() const
968 {
969 return SdrInventor::ReportDesign;
970 }
971
GetImplPage() const972 SdrPage* OOle2Obj::GetImplPage() const
973 {
974 return getSdrPageFromSdrObject();
975 }
976
NbcMove(const Size & rSize)977 void OOle2Obj::NbcMove( const Size& rSize )
978 {
979
980 if ( m_bIsListening )
981 {
982 // stop listening
983 OObjectBase::EndListening();
984
985 bool bPositionFixed = false;
986 Size aUndoSize(0,0);
987 if ( m_xReportComponent.is() )
988 {
989 bool bUndoMode = false;
990 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
991
992 if (rRptModel.GetUndoEnv().IsUndoMode())
993 {
994 // if we are locked from outside, then we must not handle wrong moves, we are in UNDO mode
995 bUndoMode = true;
996 }
997 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
998
999 // LLA: why there exists getPositionX and getPositionY and NOT getPosition() which return a Point?
1000 int nNewX = m_xReportComponent->getPositionX() + rSize.Width();
1001 // can this hinder us to set components outside the area?
1002 // if (nNewX < 0)
1003 // {
1004 // nNewX = 0;
1005 // }
1006 m_xReportComponent->setPositionX(nNewX);
1007 int nNewY = m_xReportComponent->getPositionY() + rSize.Height();
1008 if (nNewY < 0 && !bUndoMode)
1009 {
1010 aUndoSize.setHeight( abs(nNewY) );
1011 bPositionFixed = true;
1012 nNewY = 0;
1013 }
1014 m_xReportComponent->setPositionY(nNewY);
1015 }
1016 if (bPositionFixed)
1017 {
1018 getSdrModelFromSdrObject().AddUndo(getSdrModelFromSdrObject().GetSdrUndoFactory().CreateUndoMoveObject(*this, aUndoSize));
1019 }
1020 // set geometry properties
1021 SetPropsFromRect(GetLogicRect());
1022
1023 // start listening
1024 OObjectBase::StartListening();
1025 }
1026 else
1027 SdrOle2Obj::NbcMove( rSize );
1028 }
1029
1030
NbcResize(const Point & rRef,const Fraction & xFract,const Fraction & yFract)1031 void OOle2Obj::NbcResize(const Point& rRef, const Fraction& xFract, const Fraction& yFract)
1032 {
1033 SdrOle2Obj::NbcResize( rRef, xFract, yFract );
1034
1035 // stop listening
1036 OObjectBase::EndListening();
1037
1038 // set geometry properties
1039 SetPropsFromRect(GetLogicRect());
1040
1041 // start listening
1042 OObjectBase::StartListening();
1043 }
1044
NbcSetLogicRect(const tools::Rectangle & rRect,bool bAdaptTextMinSize)1045 void OOle2Obj::NbcSetLogicRect(const tools::Rectangle& rRect, bool bAdaptTextMinSize)
1046 {
1047 SdrOle2Obj::NbcSetLogicRect(rRect, bAdaptTextMinSize);
1048 // stop listening
1049 OObjectBase::EndListening();
1050
1051 // set geometry properties
1052 SetPropsFromRect(rRect);
1053
1054 // start listening
1055 OObjectBase::StartListening();
1056 }
1057
1058
EndCreate(SdrDragStat & rStat,SdrCreateCmd eCmd)1059 bool OOle2Obj::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd)
1060 {
1061 bool bResult = SdrOle2Obj::EndCreate(rStat, eCmd);
1062 if ( bResult )
1063 {
1064 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
1065 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
1066
1067 if ( !m_xReportComponent.is() )
1068 m_xReportComponent.set(getUnoShape(),uno::UNO_QUERY);
1069
1070 // set geometry properties
1071 SetPropsFromRect(GetLogicRect());
1072 }
1073
1074 return bResult;
1075 }
1076
getAwtComponent()1077 uno::Reference< beans::XPropertySet> OOle2Obj::getAwtComponent()
1078 {
1079 return m_xReportComponent;
1080 }
1081
1082
getUnoShape()1083 uno::Reference< drawing::XShape > OOle2Obj::getUnoShape()
1084 {
1085 uno::Reference< drawing::XShape> xShape = OObjectBase::getUnoShapeOf( *this );
1086 if ( !m_xReportComponent.is() )
1087 {
1088 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
1089 OXUndoEnvironment::OUndoEnvLock aLock(rRptModel.GetUndoEnv());
1090 m_xReportComponent.set(xShape,uno::UNO_QUERY);
1091 }
1092 return xShape;
1093 }
1094
setUnoShape(const uno::Reference<drawing::XShape> & rxUnoShape)1095 void OOle2Obj::setUnoShape( const uno::Reference< drawing::XShape >& rxUnoShape )
1096 {
1097 SdrOle2Obj::setUnoShape( rxUnoShape );
1098 releaseUnoShape();
1099 m_xReportComponent.clear();
1100 }
1101
1102
lcl_getDataProvider(const uno::Reference<embed::XEmbeddedObject> & _xObj)1103 static uno::Reference< chart2::data::XDatabaseDataProvider > lcl_getDataProvider(const uno::Reference < embed::XEmbeddedObject >& _xObj)
1104 {
1105 uno::Reference< chart2::data::XDatabaseDataProvider > xSource;
1106 uno::Reference< embed::XComponentSupplier > xCompSupp(_xObj);
1107 if( xCompSupp.is())
1108 {
1109 uno::Reference< chart2::XChartDocument> xChartDoc( xCompSupp->getComponent(), uno::UNO_QUERY );
1110 if ( xChartDoc.is() )
1111 {
1112 xSource.set(xChartDoc->getDataProvider(),uno::UNO_QUERY);
1113 }
1114 }
1115 return xSource;
1116 }
1117
1118 // Clone() should make a complete copy of the object.
CloneSdrObject(SdrModel & rTargetModel) const1119 rtl::Reference<SdrObject> OOle2Obj::CloneSdrObject(SdrModel& rTargetModel) const
1120 {
1121 return new OOle2Obj(rTargetModel, *this);
1122 }
1123
impl_createDataProvider_nothrow(const uno::Reference<frame::XModel> & _xModel)1124 void OOle2Obj::impl_createDataProvider_nothrow(const uno::Reference< frame::XModel>& _xModel)
1125 {
1126 try
1127 {
1128 uno::Reference < embed::XEmbeddedObject > xObj = GetObjRef();
1129 uno::Reference< chart2::data::XDataReceiver > xReceiver;
1130 uno::Reference< embed::XComponentSupplier > xCompSupp( xObj );
1131 if( xCompSupp.is())
1132 xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY );
1133 OSL_ASSERT( xReceiver.is());
1134 if( xReceiver.is() )
1135 {
1136 uno::Reference< lang::XMultiServiceFactory> xFac(_xModel,uno::UNO_QUERY);
1137 uno::Reference< chart2::data::XDatabaseDataProvider > xDataProvider( xFac->createInstance(u"com.sun.star.chart2.data.DataProvider"_ustr),uno::UNO_QUERY);
1138 xReceiver->attachDataProvider( xDataProvider );
1139 }
1140 }
1141 catch(const uno::Exception &)
1142 {
1143 }
1144 }
1145
initializeOle()1146 void OOle2Obj::initializeOle()
1147 {
1148 if ( !m_bOnlyOnce )
1149 return;
1150
1151 m_bOnlyOnce = false;
1152 uno::Reference < embed::XEmbeddedObject > xObj = GetObjRef();
1153 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
1154 rRptModel.GetUndoEnv().AddElement(lcl_getDataProvider(xObj));
1155
1156 uno::Reference< embed::XComponentSupplier > xCompSupp( xObj );
1157 if( xCompSupp.is() )
1158 {
1159 uno::Reference< beans::XPropertySet > xChartProps( xCompSupp->getComponent(), uno::UNO_QUERY );
1160 if ( xChartProps.is() )
1161 xChartProps->setPropertyValue(u"NullDate"_ustr,
1162 uno::Any(util::DateTime(0,0,0,0,30,12,1899,false)));
1163 }
1164 }
1165
initializeChart(const uno::Reference<frame::XModel> & _xModel)1166 void OOle2Obj::initializeChart( const uno::Reference< frame::XModel>& _xModel)
1167 {
1168 uno::Reference < embed::XEmbeddedObject > xObj = GetObjRef();
1169 uno::Reference< chart2::data::XDataReceiver > xReceiver;
1170 uno::Reference< embed::XComponentSupplier > xCompSupp( xObj );
1171 if( xCompSupp.is())
1172 xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY );
1173 OSL_ASSERT( xReceiver.is());
1174 if( !xReceiver.is() )
1175 return;
1176
1177 // lock the model to suppress any internal updates
1178 uno::Reference< frame::XModel > xChartModel( xReceiver, uno::UNO_QUERY );
1179 if( xChartModel.is() )
1180 xChartModel->lockControllers();
1181
1182 if ( !lcl_getDataProvider(xObj).is() )
1183 impl_createDataProvider_nothrow(_xModel);
1184
1185 OReportModel& rRptModel(static_cast< OReportModel& >(getSdrModelFromSdrObject()));
1186 rRptModel.GetUndoEnv().AddElement(lcl_getDataProvider(xObj));
1187
1188 ::comphelper::NamedValueCollection aArgs;
1189 aArgs.put( u"CellRangeRepresentation"_ustr, uno::Any( u"all"_ustr ) );
1190 aArgs.put( u"HasCategories"_ustr, uno::Any( true ) );
1191 aArgs.put( u"FirstCellAsLabel"_ustr, uno::Any( true ) );
1192 aArgs.put( u"DataRowSource"_ustr, uno::Any( chart::ChartDataRowSource_COLUMNS ) );
1193 xReceiver->setArguments( aArgs.getPropertyValues() );
1194
1195 if( xChartModel.is() )
1196 xChartModel->unlockControllers();
1197 }
1198
getUsedStyle(const uno::Reference<report::XReportDefinition> & _xReport)1199 uno::Reference< style::XStyle> getUsedStyle(const uno::Reference< report::XReportDefinition>& _xReport)
1200 {
1201 uno::Reference<container::XNameAccess> xStyles = _xReport->getStyleFamilies();
1202 uno::Reference<container::XNameAccess> xPageStyles(xStyles->getByName(u"PageStyles"_ustr),uno::UNO_QUERY);
1203
1204 const uno::Sequence< OUString> aSeq = xPageStyles->getElementNames();
1205 for(const OUString& rName : aSeq)
1206 {
1207 uno::Reference< style::XStyle> xStyle(xPageStyles->getByName(rName),uno::UNO_QUERY);
1208 if ( xStyle->isInUse() )
1209 {
1210 return xStyle;
1211 break;
1212 }
1213 }
1214 return nullptr;
1215 }
1216
1217
1218 } // rptui
1219
1220
1221 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1222