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