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 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svx.hxx" 26 27 #define _SVX_USE_UNOGLOBALS_ 28 #include <cppuhelper/typeprovider.hxx> 29 #include <com/sun/star/awt/XBitmap.hpp> 30 #include <com/sun/star/awt/Rectangle.hpp> 31 #include <com/sun/star/drawing/CircleKind.hpp> 32 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp> 33 #include <vcl/svapp.hxx> 34 #include <svl/itemprop.hxx> 35 #include <svtools/fltcall.hxx> 36 #include <vos/mutex.hxx> 37 #include <editeng/unotext.hxx> 38 #include <svx/svdobj.hxx> 39 #include <svx/svdoole2.hxx> 40 #include <osl/mutex.hxx> 41 #include <comphelper/extract.hxx> 42 #include "svx/shapepropertynotifier.hxx" 43 #include <comphelper/serviceinfohelper.hxx> 44 #include <toolkit/unohlp.hxx> 45 #include <comphelper/serviceinfohelper.hxx> 46 #include <rtl/uuid.h> 47 #include <rtl/memory.h> 48 #include <vcl/gfxlink.hxx> 49 #include <vcl/virdev.hxx> 50 #include <sfx2/objsh.hxx> 51 #include <sfx2/viewsh.hxx> 52 #include "svx/svdopage.hxx" 53 #include "svx/xflbstit.hxx" 54 #include "svx/xflbmtit.hxx" 55 #include "svx/xlnstit.hxx" 56 #include "svx/xlnedit.hxx" 57 #include "svx/svdogrp.hxx" 58 #include "svx/scene3d.hxx" 59 #include "svx/svdmodel.hxx" 60 #include "svx/globl3d.hxx" 61 #include "svx/fmglob.hxx" 62 #include "svx/unopage.hxx" 63 #include "svx/view3d.hxx" 64 #include "svx/unoshape.hxx" 65 #include "svx/svxids.hrc" 66 #include "svx/unoshtxt.hxx" 67 #include "svx/svdpage.hxx" 68 #include "svx/unoshprp.hxx" 69 #include "svx/sxciaitm.hxx" // todo: remove 70 #include "svx/svdograf.hxx" 71 #include "svx/unoapi.hxx" 72 #include "svx/svdomeas.hxx" 73 #include "svx/svdpagv.hxx" 74 #include "svx/svdpool.hxx" 75 #include <tools/shl.hxx> // 76 #include "svx/dialmgr.hxx" // not nice, we need our own resources some day 77 #include "svx/dialogs.hrc" // 78 #include "svx/svdocapt.hxx" 79 #include <svx/obj3d.hxx> 80 #include <tools/diagnose_ex.h> 81 #include "svx/xflftrit.hxx" 82 #include "svx/xtable.hxx" 83 #include "svx/xbtmpit.hxx" 84 #include "svx/xflgrit.hxx" 85 #include "svx/xflhtit.hxx" 86 #include "svx/xlnedit.hxx" 87 #include "svx/xlnstit.hxx" 88 #include "svx/xlndsit.hxx" 89 #include "svx/svdglob.hxx" 90 #include "svx/svdstr.hrc" 91 #include "svx/unomaster.hxx" 92 #include <editeng/outlobj.hxx> 93 #include <basegfx/matrix/b2dhommatrix.hxx> 94 #include <basegfx/matrix/b2dhommatrixtools.hxx> 95 96 #include <vector> 97 98 // #i68523# 99 #include "svx/lathe3d.hxx" 100 #include "svx/extrud3d.hxx" 101 #include "unopolyhelper.hxx" 102 103 #include <comphelper/scopeguard.hxx> 104 #include <boost/bind.hpp> 105 106 using ::rtl::OUString; 107 using namespace ::osl; 108 using namespace ::vos; 109 using namespace ::cppu; 110 using namespace ::com::sun::star; 111 using namespace ::com::sun::star::uno; 112 using namespace ::com::sun::star::lang; 113 using namespace ::com::sun::star::container; 114 using ::svx::PropertyValueProvider; 115 using ::svx::IPropertyValueProvider; 116 117 #define QUERYINT( xint ) \ 118 if( rType == ::getCppuType((const uno::Reference< xint >*)0) ) \ 119 aAny <<= uno::Reference< xint >(this) 120 121 class GDIMetaFile; 122 class SvStream; 123 sal_Bool ConvertGDIMetaFileToWMF( const GDIMetaFile & rMTF, SvStream & rTargetStream, 124 FilterConfigItem* pFilterConfigItem = NULL, sal_Bool bPlaceable = sal_True ); 125 126 uno::Reference< uno::XInterface > SAL_CALL SvxUnoGluePointAccess_createInstance( SdrObject* pObject ); 127 128 /*********************************************************************** 129 * class SvxShapeImpl * 130 ***********************************************************************/ 131 132 struct SvxShapeImpl 133 { 134 SvxShape& mrAntiImpl; 135 SfxItemSet* mpItemSet; 136 sal_uInt32 mnObjId; 137 SvxShapeMaster* mpMaster; 138 bool mbHasSdrObjectOwnership; 139 bool mbDisposing; 140 141 /** CL, OD 2005-07-19 #i52126# - this is initially 0 and set when 142 * a SvxShape::Create() call is executed. It is then set to the created 143 * SdrObject so a multiple call to SvxShape::Create() with same SdrObject 144 * is prohibited. 145 */ 146 ::tools::WeakReference< SdrObject > mpCreatedObj; 147 148 // for xComponent 149 ::cppu::OInterfaceContainerHelper maDisposeListeners; 150 ::svx::PropertyChangeNotifier maPropertyNotifier; 151 152 SvxShapeImpl( SvxShape& _rAntiImpl, ::osl::Mutex& _rMutex ) 153 :mrAntiImpl( _rAntiImpl ) 154 ,mpItemSet( NULL ) 155 ,mnObjId( 0 ) 156 ,mpMaster( NULL ) 157 ,mbHasSdrObjectOwnership( false ) 158 ,mbDisposing( false ) 159 ,mpCreatedObj() 160 ,maDisposeListeners( _rMutex ) 161 ,maPropertyNotifier( _rAntiImpl, _rMutex ) 162 { 163 } 164 }; 165 166 /**********************************************************************/ 167 class ShapePositionProvider : public PropertyValueProvider 168 { 169 public: 170 ShapePositionProvider( const SvxShapeImpl& _shapeImpl ) 171 :PropertyValueProvider( _shapeImpl.mrAntiImpl, "Position" ) 172 { 173 } 174 175 protected: 176 virtual void getCurrentValue( Any& _out_rCurrentValue ) const 177 { 178 _out_rCurrentValue <<= static_cast< SvxShape& >( getContext() ).getPosition(); 179 } 180 }; 181 182 //---------------------------------------------------------------------- 183 class ShapeSizeProvider : public PropertyValueProvider 184 { 185 public: 186 ShapeSizeProvider( const SvxShapeImpl& _shapeImpl ) 187 :PropertyValueProvider( _shapeImpl.mrAntiImpl, "Size" ) 188 { 189 } 190 191 protected: 192 virtual void getCurrentValue( Any& _out_rCurrentValue ) const 193 { 194 _out_rCurrentValue <<= static_cast< SvxShape& >( getContext() ).getSize(); 195 } 196 }; 197 198 /*********************************************************************** 199 * class SvxShape * 200 ***********************************************************************/ 201 202 DBG_NAME(SvxShape) 203 204 SvxShape::SvxShape( SdrObject* pObject ) throw() 205 : maSize(100,100) 206 , mpImpl( new SvxShapeImpl( *this, maMutex ) ) 207 , mbIsMultiPropertyCall(false) 208 , mpPropSet(aSvxMapProvider.GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool())) 209 , maPropMapEntries(aSvxMapProvider.GetMap(SVXMAP_SHAPE)) 210 , mpObj(pObject) 211 , mpModel(NULL) 212 , mnLockCount(0) 213 { 214 DBG_CTOR(SvxShape,NULL); 215 impl_construct(); 216 } 217 218 //---------------------------------------------------------------------- 219 SvxShape::SvxShape( SdrObject* pObject, const SfxItemPropertyMapEntry* pEntries, const SvxItemPropertySet* pPropertySet ) throw() 220 : maSize(100,100) 221 , mpImpl( new SvxShapeImpl( *this, maMutex ) ) 222 , mbIsMultiPropertyCall(false) 223 , mpPropSet(pPropertySet) 224 , maPropMapEntries(pEntries) 225 , mpObj(pObject) 226 , mpModel(NULL) 227 , mnLockCount(0) 228 { 229 DBG_CTOR(SvxShape,NULL); 230 impl_construct(); 231 } 232 233 //---------------------------------------------------------------------- 234 SvxShape::SvxShape() throw() 235 : maSize(100,100) 236 , mpImpl( new SvxShapeImpl( *this, maMutex ) ) 237 , mbIsMultiPropertyCall(false) 238 , mpPropSet(aSvxMapProvider.GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool())) 239 , maPropMapEntries(aSvxMapProvider.GetMap(SVXMAP_SHAPE)) 240 , mpObj(NULL) 241 , mpModel(NULL) 242 , mnLockCount(0) 243 { 244 DBG_CTOR(SvxShape,NULL); 245 impl_construct(); 246 } 247 248 //---------------------------------------------------------------------- 249 SvxShape::~SvxShape() throw() 250 { 251 OGuard aGuard( Application::GetSolarMutex() ); 252 253 DBG_ASSERT( mnLockCount == 0, "Locked shape was disposed!" ); 254 255 if ( mpModel ) 256 EndListening( *mpModel ); 257 258 if ( mpImpl->mpMaster ) 259 mpImpl->mpMaster->dispose(); 260 261 if ( mpObj.is() ) 262 mpObj->setUnoShape( NULL, SdrObject::GrantXShapeAccess() ); 263 264 if( HasSdrObjectOwnership() && mpObj.is() ) 265 { 266 mpImpl->mbHasSdrObjectOwnership = false; 267 SdrObject* pObject = mpObj.get(); 268 SdrObject::Free( pObject ); 269 } 270 271 delete mpImpl, mpImpl = NULL; 272 273 DBG_DTOR(SvxShape,NULL); 274 } 275 276 //---------------------------------------------------------------------- 277 278 void SvxShape::TakeSdrObjectOwnership() 279 { 280 mpImpl->mbHasSdrObjectOwnership = true; 281 } 282 283 //---------------------------------------------------------------------- 284 285 bool SvxShape::HasSdrObjectOwnership() const 286 { 287 if ( !mpImpl->mbHasSdrObjectOwnership ) 288 return false; 289 290 OSL_ENSURE( mpObj.is(), "SvxShape::HasSdrObjectOwnership: have the ownership of an object which I don't know!" ); 291 return mpObj.is(); 292 } 293 294 //---------------------------------------------------------------------- 295 296 void SvxShape::setShapeKind( sal_uInt32 nKind ) 297 { 298 mpImpl->mnObjId = nKind; 299 } 300 301 //---------------------------------------------------------------------- 302 303 sal_uInt32 SvxShape::getShapeKind() const 304 { 305 return mpImpl->mnObjId; 306 } 307 308 //---------------------------------------------------------------------- 309 310 void SvxShape::setMaster( SvxShapeMaster* pMaster ) 311 { 312 mpImpl->mpMaster = pMaster; 313 } 314 315 SvxShapeMaster* SvxShape::getMaster() 316 { 317 return mpImpl->mpMaster; 318 } 319 320 const SvxShapeMaster* SvxShape::getMaster() const 321 { 322 return mpImpl->mpMaster; 323 } 324 325 //---------------------------------------------------------------------- 326 327 uno::Any SAL_CALL SvxShape::queryAggregation( const uno::Type& rType ) throw (uno::RuntimeException) 328 { 329 if( mpImpl->mpMaster ) 330 { 331 uno::Any aAny; 332 if( mpImpl->mpMaster->queryAggregation( rType, aAny ) ) 333 return aAny; 334 } 335 336 return SvxShape_UnoImplHelper::queryAggregation(rType); 337 } 338 339 //---------------------------------------------------------------------- 340 const ::com::sun::star::uno::Sequence< sal_Int8 > & SvxShape::getUnoTunnelId() throw() 341 { 342 static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = 0; 343 if( !pSeq ) 344 { 345 ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() ); 346 if( !pSeq ) 347 { 348 static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq( 16 ); 349 rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True ); 350 pSeq = &aSeq; 351 } 352 } 353 return *pSeq; 354 } 355 356 //---------------------------------------------------------------------- 357 SvxShape* SvxShape::getImplementation( const uno::Reference< uno::XInterface >& xInt ) 358 { 359 uno::Reference< lang::XUnoTunnel > xUT( xInt, ::com::sun::star::uno::UNO_QUERY ); 360 if( xUT.is() ) 361 return reinterpret_cast<SvxShape*>(sal::static_int_cast<sal_uIntPtr>(xUT->getSomething( SvxShape::getUnoTunnelId()))); 362 else 363 return NULL; 364 } 365 366 //---------------------------------------------------------------------- 367 sal_Int64 SAL_CALL SvxShape::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw(::com::sun::star::uno::RuntimeException) \ 368 { 369 if( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) 370 { 371 return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this)); 372 } 373 else 374 { 375 return 0; 376 } 377 } 378 379 //---------------------------------------------------------------------- 380 SvxShape* SvxShape::GetShapeForSdrObj( SdrObject* pObj ) throw() 381 { 382 return getImplementation( pObj->getUnoShape() ); 383 } 384 385 //---------------------------------------------------------------------- 386 ::svx::PropertyChangeNotifier& SvxShape::getShapePropertyChangeNotifier() 387 { 388 return mpImpl->maPropertyNotifier; 389 } 390 391 //---------------------------------------------------------------------- 392 void SvxShape::impl_construct() 393 { 394 mpImpl->maPropertyNotifier.registerProvider( ::svx::eShapePosition, 395 ::svx::PPropertyValueProvider( new ShapePositionProvider( *mpImpl ) ) ); 396 mpImpl->maPropertyNotifier.registerProvider( ::svx::eShapeSize, 397 ::svx::PPropertyValueProvider( new ShapeSizeProvider( *mpImpl ) ) ); 398 399 if ( mpObj.is() ) 400 impl_initFromSdrObject(); 401 } 402 403 //---------------------------------------------------------------------- 404 void SvxShape::impl_initFromSdrObject() 405 { 406 DBG_TESTSOLARMUTEX(); 407 OSL_PRECOND( mpObj.is(), "SvxShape::impl_initFromSdrObject: not to be called without SdrObject!" ); 408 if ( !mpObj.is() ) 409 return; 410 411 osl_incrementInterlockedCount( &m_refCount ); 412 { 413 mpObj->setUnoShape( *this, SdrObject::GrantXShapeAccess() ); 414 } 415 osl_decrementInterlockedCount( &m_refCount ); 416 417 mpModel = mpObj->GetModel(); 418 419 // #i40944# 420 // Do not simply return when no model but do the type corrections 421 // following below. 422 if(mpModel) 423 { 424 StartListening( *mpModel ); 425 } 426 427 const sal_uInt32 nInventor = mpObj->GetObjInventor(); 428 429 // is it one of ours (svx) ? 430 if( nInventor == SdrInventor || nInventor == E3dInventor || nInventor == FmFormInventor ) 431 { 432 if(nInventor == FmFormInventor) 433 { 434 mpImpl->mnObjId = OBJ_UNO; 435 } 436 else 437 { 438 mpImpl->mnObjId = mpObj->GetObjIdentifier(); 439 if( nInventor == E3dInventor ) 440 mpImpl->mnObjId |= E3D_INVENTOR_FLAG; 441 } 442 443 switch(mpImpl->mnObjId) 444 { 445 case OBJ_CCUT: // Kreisabschnitt 446 case OBJ_CARC: // Kreisbogen 447 case OBJ_SECT: // Kreissektor 448 mpImpl->mnObjId = OBJ_CIRC; 449 break; 450 451 case E3D_SCENE_ID | E3D_INVENTOR_FLAG: 452 mpImpl->mnObjId = E3D_POLYSCENE_ID | E3D_INVENTOR_FLAG; 453 break; 454 } 455 } 456 } 457 458 //---------------------------------------------------------------------- 459 void SvxShape::Create( SdrObject* pNewObj, SvxDrawPage* /*pNewPage*/ ) 460 { 461 DBG_TESTSOLARMUTEX(); 462 463 OSL_PRECOND( pNewObj, "SvxShape::Create: invalid new object!" ); 464 if ( !pNewObj ) 465 return; 466 467 SdrObject* pCreatedObj = mpImpl->mpCreatedObj.get(); 468 OSL_ENSURE( ( pCreatedObj == NULL ) || ( pCreatedObj == pNewObj ), 469 "SvxShape::Create: the same shape used for two different objects?! Strange ..." ); 470 471 // --> CL, OD 2005-07-19 #i52126# - correct condition 472 if ( pCreatedObj != pNewObj ) 473 // <-- 474 { 475 DBG_ASSERT( pNewObj->GetModel(), "no model for SdrObject?" ); 476 // --> CL, OD 2005-07-19 #i52126# 477 mpImpl->mpCreatedObj = pNewObj; 478 // <-- 479 480 if( mpObj.is() && mpObj->GetModel() ) 481 { 482 EndListening( *mpObj->GetModel() ); 483 } 484 485 mpObj.reset( pNewObj ); 486 487 OSL_ENSURE( !mbIsMultiPropertyCall, "SvxShape::Create: hmm?" ); 488 // this was previously set in impl_initFromSdrObject, but I think it was superfluous 489 // (it definitely was in the other context where it was called, but I strongly suppose 490 // it was also superfluous when called from here) 491 impl_initFromSdrObject(); 492 493 ObtainSettingsFromPropertySet( *mpPropSet ); 494 495 // save user call 496 SdrObjUserCall* pUser = mpObj->GetUserCall(); 497 mpObj->SetUserCall(NULL); 498 499 setPosition( maPosition ); 500 setSize( maSize ); 501 502 // restore user call after we set the initial size 503 mpObj->SetUserCall( pUser ); 504 505 // if this shape was already named, use this name 506 if( maShapeName.getLength() ) 507 { 508 mpObj->SetName( maShapeName ); 509 maShapeName = OUString(); 510 } 511 } 512 } 513 514 //---------------------------------------------------------------------- 515 516 void SvxShape::ChangeModel( SdrModel* pNewModel ) 517 { 518 DBG_TESTSOLARMUTEX(); 519 if( mpObj.is() && mpObj->GetModel() ) 520 { 521 if( mpObj->GetModel() != pNewModel ) 522 { 523 EndListening( *mpObj->GetModel() ); 524 } 525 } 526 527 // --> CL, OD 2005-07-19 #i52126# - always listen to new model 528 if( pNewModel ) 529 { 530 StartListening( *pNewModel ); 531 } 532 // <-- 533 534 // HACK #i53696# ChangeModel should be virtual, but it isn't. can't change that for 2.0.1 535 SvxShapeText* pShapeText = dynamic_cast< SvxShapeText* >( this ); 536 if( pShapeText ) 537 { 538 SvxTextEditSource* pTextEditSource = dynamic_cast< SvxTextEditSource* >( pShapeText->GetEditSource() ); 539 if( pTextEditSource ) 540 pTextEditSource->ChangeModel( pNewModel ); 541 } 542 543 mpModel = pNewModel; 544 545 if( mpImpl->mpMaster ) 546 mpImpl->mpMaster->modelChanged( pNewModel ); 547 } 548 549 //---------------------------------------------------------------------- 550 551 void SvxShape::ForceMetricToItemPoolMetric(Pair& rPoint) const throw() 552 { 553 DBG_TESTSOLARMUTEX(); 554 if(mpModel) 555 { 556 SfxMapUnit eMapUnit = mpModel->GetItemPool().GetMetric(0); 557 if(eMapUnit != SFX_MAPUNIT_100TH_MM) 558 { 559 switch(eMapUnit) 560 { 561 case SFX_MAPUNIT_TWIP : 562 { 563 rPoint.A() = MM_TO_TWIPS(rPoint.A()); 564 rPoint.B() = MM_TO_TWIPS(rPoint.B()); 565 break; 566 } 567 default: 568 { 569 DBG_ERROR("AW: Missing unit translation to PoolMetric!"); 570 } 571 } 572 } 573 } 574 } 575 576 //---------------------------------------------------------------------- 577 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051 578 void SvxShape::ForceMetricToItemPoolMetric(basegfx::B2DPolyPolygon& rPolyPolygon) const throw() 579 { 580 DBG_TESTSOLARMUTEX(); 581 if(mpModel) 582 { 583 SfxMapUnit eMapUnit = mpModel->GetItemPool().GetMetric(0); 584 if(eMapUnit != SFX_MAPUNIT_100TH_MM) 585 { 586 switch(eMapUnit) 587 { 588 case SFX_MAPUNIT_TWIP : 589 { 590 basegfx::B2DHomMatrix aTransform; 591 const double fMMToTWIPS(72.0 / 127.0); 592 593 aTransform.scale(fMMToTWIPS, fMMToTWIPS); 594 rPolyPolygon.transform(aTransform); 595 break; 596 } 597 default: 598 { 599 DBG_ERROR("Missing unit translation to PoolMetric!"); 600 } 601 } 602 } 603 } 604 } 605 // <-- 606 607 //---------------------------------------------------------------------- 608 void SvxShape::ForceMetricTo100th_mm(Pair& rPoint) const throw() 609 { 610 DBG_TESTSOLARMUTEX(); 611 SfxMapUnit eMapUnit = SFX_MAPUNIT_100TH_MM; 612 if(mpModel) 613 { 614 eMapUnit = mpModel->GetItemPool().GetMetric(0); 615 if(eMapUnit != SFX_MAPUNIT_100TH_MM) 616 { 617 switch(eMapUnit) 618 { 619 case SFX_MAPUNIT_TWIP : 620 { 621 rPoint.A() = TWIPS_TO_MM(rPoint.A()); 622 rPoint.B() = TWIPS_TO_MM(rPoint.B()); 623 break; 624 } 625 default: 626 { 627 DBG_ERROR("AW: Missing unit translation to 100th mm!"); 628 } 629 } 630 } 631 } 632 } 633 634 //---------------------------------------------------------------------- 635 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051 636 void SvxShape::ForceMetricTo100th_mm(basegfx::B2DPolyPolygon& rPolyPolygon) const throw() 637 { 638 DBG_TESTSOLARMUTEX(); 639 SfxMapUnit eMapUnit = SFX_MAPUNIT_100TH_MM; 640 if(mpModel) 641 { 642 eMapUnit = mpModel->GetItemPool().GetMetric(0); 643 if(eMapUnit != SFX_MAPUNIT_100TH_MM) 644 { 645 switch(eMapUnit) 646 { 647 case SFX_MAPUNIT_TWIP : 648 { 649 basegfx::B2DHomMatrix aTransform; 650 const double fTWIPSToMM(127.0 / 72.0); 651 aTransform.scale(fTWIPSToMM, fTWIPSToMM); 652 rPolyPolygon.transform(aTransform); 653 break; 654 } 655 default: 656 { 657 DBG_ERROR("Missing unit translation to 100th mm!"); 658 } 659 } 660 } 661 } 662 } 663 // <-- 664 //---------------------------------------------------------------------- 665 666 667 //---------------------------------------------------------------------- 668 void SvxItemPropertySet_ObtainSettingsFromPropertySet(const SvxItemPropertySet& rPropSet, 669 SfxItemSet& rSet, uno::Reference< beans::XPropertySet > xSet, const SfxItemPropertyMap* pMap ) 670 { 671 if(rPropSet.AreThereOwnUsrAnys()) 672 { 673 const SfxItemPropertyMap* pSrc = rPropSet.getPropertyMap(); 674 PropertyEntryVector_t aSrcPropVector = pSrc->getPropertyEntries(); 675 PropertyEntryVector_t::const_iterator aSrcIt = aSrcPropVector.begin(); 676 while(aSrcIt != aSrcPropVector.end()) 677 { 678 if(aSrcIt->nWID) 679 { 680 uno::Any* pUsrAny = rPropSet.GetUsrAnyForID(aSrcIt->nWID); 681 if(pUsrAny) 682 { 683 // Aequivalenten Eintrag in pDst suchen 684 const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( aSrcIt->sName ); 685 if(pEntry) 686 { 687 // entry found 688 if(pEntry->nWID >= OWN_ATTR_VALUE_START && pEntry->nWID <= OWN_ATTR_VALUE_END) 689 { 690 // Special ID im PropertySet, kann nur direkt am 691 // Objekt gesetzt werden+ 692 xSet->setPropertyValue( aSrcIt->sName, *pUsrAny); 693 } 694 else 695 { 696 if(rSet.GetPool()->IsWhich(pEntry->nWID)) 697 rSet.Put(rSet.GetPool()->GetDefaultItem(pEntry->nWID)); 698 // setzen 699 SvxItemPropertySet_setPropertyValue(rPropSet, pEntry, *pUsrAny, rSet); 700 } 701 } 702 } 703 } 704 705 // next entry 706 ++aSrcIt; 707 } 708 const_cast< SvxItemPropertySet& >(rPropSet).ClearAllUsrAny(); 709 } 710 } 711 712 713 void SvxShape::ObtainSettingsFromPropertySet(const SvxItemPropertySet& rPropSet) 714 { 715 DBG_TESTSOLARMUTEX(); 716 if(mpObj.is() && rPropSet.AreThereOwnUsrAnys() && mpModel) 717 { 718 SfxItemSet aSet( mpModel->GetItemPool(), SDRATTR_START, SDRATTR_END, 0); 719 Reference< beans::XPropertySet > xShape( (OWeakObject*)this, UNO_QUERY ); 720 SvxItemPropertySet_ObtainSettingsFromPropertySet(rPropSet, aSet, xShape, mpPropSet->getPropertyMap() ); 721 722 mpObj->SetMergedItemSetAndBroadcast(aSet); 723 724 mpObj->ApplyNotPersistAttr( aSet ); 725 } 726 } 727 728 //---------------------------------------------------------------------- 729 730 uno::Any SvxShape::GetBitmap( sal_Bool bMetaFile /* = sal_False */ ) const throw() 731 { 732 DBG_TESTSOLARMUTEX(); 733 uno::Any aAny; 734 735 if( !mpObj.is() || mpModel == NULL || !mpObj->IsInserted() || NULL == mpObj->GetPage() ) 736 return aAny; 737 738 VirtualDevice aVDev; 739 aVDev.SetMapMode(MapMode(MAP_100TH_MM)); 740 741 SdrModel* pModel = mpObj->GetModel(); 742 SdrPage* pPage = mpObj->GetPage(); 743 744 E3dView* pView = new E3dView( pModel, &aVDev ); 745 pView->hideMarkHandles(); 746 SdrPageView* pPageView = pView->ShowSdrPage(pPage); 747 748 SdrObject *pTempObj = mpObj.get(); 749 pView->MarkObj(pTempObj,pPageView); 750 751 Rectangle aRect(pTempObj->GetCurrentBoundRect()); 752 aRect.Justify(); 753 Size aSize(aRect.GetSize()); 754 755 GDIMetaFile aMtf( pView->GetAllMarkedMetaFile() ); 756 if( bMetaFile ) 757 { 758 SvMemoryStream aDestStrm( 65535, 65535 ); 759 ConvertGDIMetaFileToWMF( aMtf, aDestStrm, NULL, sal_False ); 760 const uno::Sequence<sal_Int8> aSeq( 761 static_cast< const sal_Int8* >(aDestStrm.GetData()), 762 aDestStrm.GetEndOfData()); 763 aAny.setValue( &aSeq, ::getCppuType((const uno::Sequence< sal_Int8 >*)0) ); 764 } 765 else 766 { 767 Graphic aGraph(aMtf); 768 aGraph.SetPrefSize(aSize); 769 aGraph.SetPrefMapMode(MAP_100TH_MM); 770 771 Reference< awt::XBitmap > xBmp( aGraph.GetXGraphic(), UNO_QUERY ); 772 aAny <<= xBmp; 773 } 774 775 pView->UnmarkAll(); 776 delete pView; 777 778 return aAny; 779 } 780 781 //---------------------------------------------------------------------- 782 783 uno::Sequence< uno::Type > SAL_CALL SvxShape::getTypes() 784 throw (uno::RuntimeException) 785 { 786 if( mpImpl->mpMaster ) 787 { 788 return mpImpl->mpMaster->getTypes(); 789 } 790 else 791 { 792 return _getTypes(); 793 } 794 } 795 796 //---------------------------------------------------------------------- 797 798 uno::Sequence< uno::Type > SAL_CALL SvxShape::_getTypes() 799 throw(uno::RuntimeException) 800 { 801 switch( mpImpl->mnObjId ) 802 { 803 // shapes without text 804 case OBJ_PAGE: 805 case OBJ_FRAME: 806 case OBJ_OLE2_PLUGIN: 807 case OBJ_OLE2_APPLET: 808 case E3D_CUBEOBJ_ID|E3D_INVENTOR_FLAG: 809 case E3D_SPHEREOBJ_ID|E3D_INVENTOR_FLAG: 810 case E3D_LATHEOBJ_ID|E3D_INVENTOR_FLAG: 811 case E3D_EXTRUDEOBJ_ID|E3D_INVENTOR_FLAG: 812 case E3D_POLYGONOBJ_ID|E3D_INVENTOR_FLAG: 813 case OBJ_MEDIA: 814 { 815 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence; 816 817 if( aTypeSequence.getLength() == 0 ) 818 { 819 // Ready for multithreading; get global mutex for first call of this method only! see before 820 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 821 822 // Control these pointer again ... it can be, that another instance will be faster then these! 823 if( aTypeSequence.getLength() == 0 ) 824 { 825 aTypeSequence.realloc( 12 ); 826 uno::Type* pTypes = aTypeSequence.getArray(); 827 828 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0); 829 *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0); 830 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 831 *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0); 832 // *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0); 833 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0); 834 *pTypes++ = beans::XMultiPropertyStates::static_type(); 835 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0); 836 *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0); 837 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0); 838 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0); 839 *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0); 840 *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0); 841 } 842 } 843 return aTypeSequence; 844 } 845 // group shape 846 case OBJ_GRUP: 847 { 848 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence; 849 850 if( aTypeSequence.getLength() == 0 ) 851 { 852 // Ready for multithreading; get global mutex for first call of this method only! see before 853 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 854 855 // Control these pointer again ... it can be, that another instance will be faster then these! 856 if( aTypeSequence.getLength() == 0 ) 857 { 858 aTypeSequence.realloc( 14 ); 859 uno::Type* pTypes = aTypeSequence.getArray(); 860 861 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0); 862 *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0); 863 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 864 *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0); 865 // *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0); 866 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0); 867 *pTypes++ = beans::XMultiPropertyStates::static_type(); 868 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0); 869 *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0); 870 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0); 871 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0); 872 *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0); 873 *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0); 874 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShapes>*)0); 875 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShapeGroup>*)0); 876 } 877 } 878 return aTypeSequence; 879 } 880 // connector shape 881 case OBJ_EDGE: 882 { 883 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence; 884 885 if( aTypeSequence.getLength() == 0 ) 886 { 887 // Ready for multithreading; get global mutex for first call of this method only! see before 888 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 889 890 // Control these pointer again ... it can be, that another instance will be faster then these! 891 if( aTypeSequence.getLength() == 0 ) 892 { 893 aTypeSequence.realloc( 17 ); 894 uno::Type* pTypes = aTypeSequence.getArray(); 895 896 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0); 897 *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0); 898 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 899 *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0); 900 // *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0); 901 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0); 902 *pTypes++ = beans::XMultiPropertyStates::static_type(); 903 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0); 904 *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0); 905 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0); 906 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0); 907 *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0); 908 *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0); 909 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XConnectorShape>*)0); 910 // from SvxUnoTextBase::getTypes() 911 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextAppend >*)0); 912 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextCopy >*)0); 913 *pTypes++ = ::getCppuType(( const uno::Reference< container::XEnumerationAccess >*)0); 914 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRangeMover >*)0); 915 } 916 } 917 return aTypeSequence; 918 } 919 // control shape 920 case OBJ_UNO: 921 { 922 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence; 923 924 if( aTypeSequence.getLength() == 0 ) 925 { 926 // Ready for multithreading; get global mutex for first call of this method only! see before 927 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 928 929 // Control these pointer again ... it can be, that another instance will be faster then these! 930 if( aTypeSequence.getLength() == 0 ) 931 { 932 aTypeSequence.realloc( 13 ); 933 uno::Type* pTypes = aTypeSequence.getArray(); 934 935 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0); 936 *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0); 937 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 938 *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0); 939 // *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0); 940 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0); 941 *pTypes++ = beans::XMultiPropertyStates::static_type(); 942 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0); 943 *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0); 944 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0); 945 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0); 946 *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0); 947 *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0); 948 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XControlShape>*)0); 949 } 950 } 951 return aTypeSequence; 952 } 953 // 3d scene shape 954 case E3D_POLYSCENE_ID|E3D_INVENTOR_FLAG: 955 { 956 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence; 957 958 if( aTypeSequence.getLength() == 0 ) 959 { 960 // Ready for multithreading; get global mutex for first call of this method only! see before 961 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 962 963 // Control these pointer again ... it can be, that another instance will be faster then these! 964 if( aTypeSequence.getLength() == 0 ) 965 { 966 aTypeSequence.realloc( 13 ); 967 uno::Type* pTypes = aTypeSequence.getArray(); 968 969 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0); 970 *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0); 971 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 972 *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0); 973 // *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0); 974 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0); 975 *pTypes++ = beans::XMultiPropertyStates::static_type(); 976 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0); 977 *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0); 978 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0); 979 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0); 980 *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0); 981 *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0); 982 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShapes>*)0); 983 } 984 } 985 return aTypeSequence; 986 } 987 case OBJ_CUSTOMSHAPE: 988 { 989 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence; 990 991 if( aTypeSequence.getLength() == 0 ) 992 { 993 // Ready for multithreading; get global mutex for first call of this method only! see before 994 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 995 996 // Control these pointer again ... it can be, that another instance will be faster then these! 997 if( aTypeSequence.getLength() == 0 ) 998 { 999 aTypeSequence.realloc( 16 ); 1000 uno::Type* pTypes = aTypeSequence.getArray(); 1001 1002 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0); 1003 *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0); 1004 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 1005 *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0); 1006 // *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0); 1007 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0); 1008 *pTypes++ = beans::XMultiPropertyStates::static_type(); 1009 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0); 1010 *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0); 1011 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0); 1012 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0); 1013 *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0); 1014 *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0); 1015 // from SvxUnoTextBase::getTypes() 1016 *pTypes++ = ::getCppuType(( const uno::Reference< text::XText >*)0); 1017 *pTypes++ = ::getCppuType(( const uno::Reference< container::XEnumerationAccess >*)0); 1018 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRangeMover >*)0); 1019 *pTypes++ = ::getCppuType(( const uno::Reference< drawing::XEnhancedCustomShapeDefaulter >*)0); 1020 } 1021 } 1022 return aTypeSequence; 1023 } 1024 // shapes with text 1025 case OBJ_RECT: 1026 case OBJ_CIRC: 1027 case OBJ_MEASURE: 1028 case OBJ_LINE: 1029 case OBJ_POLY: 1030 case OBJ_PLIN: 1031 case OBJ_PATHLINE: 1032 case OBJ_PATHFILL: 1033 case OBJ_FREELINE: 1034 case OBJ_FREEFILL: 1035 case OBJ_PATHPOLY: 1036 case OBJ_PATHPLIN: 1037 case OBJ_GRAF: 1038 case OBJ_TEXT: 1039 case OBJ_CAPTION: 1040 case OBJ_TABLE: 1041 case OBJ_OLE2: // #i118485# Moved to shapes with text, was at (shapes without text) before, see above 1042 default: 1043 { 1044 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > aTypeSequence; 1045 1046 if( aTypeSequence.getLength() == 0 ) 1047 { 1048 // Ready for multithreading; get global mutex for first call of this method only! see before 1049 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 1050 1051 // Control these pointer again ... it can be, that another instance will be faster then these! 1052 if( aTypeSequence.getLength() == 0 ) 1053 { 1054 aTypeSequence.realloc( 16 ); 1055 uno::Type* pTypes = aTypeSequence.getArray(); 1056 1057 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XShape >*)0); 1058 *pTypes++ = ::getCppuType((const uno::Reference< lang::XComponent >*)0); 1059 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 1060 *pTypes++ = ::getCppuType((const uno::Reference< beans::XMultiPropertySet >*)0); 1061 // *pTypes++ = ::getCppuType((const uno::Reference< beans::XTolerantMultiPropertySet >*)0); 1062 *pTypes++ = ::getCppuType((const uno::Reference< beans::XPropertyState >*)0); 1063 *pTypes++ = beans::XMultiPropertyStates::static_type(); 1064 *pTypes++ = ::getCppuType((const uno::Reference< drawing::XGluePointsSupplier >*)0); 1065 *pTypes++ = ::getCppuType((const uno::Reference< container::XChild >*)0); 1066 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo >*)0); 1067 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider >*)0); 1068 *pTypes++ = ::getCppuType((const uno::Reference< lang::XUnoTunnel >*)0); 1069 *pTypes++ = ::getCppuType((const uno::Reference< container::XNamed >*)0); 1070 // from SvxUnoTextBase::getTypes() 1071 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextAppend >*)0); 1072 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextCopy >*)0); 1073 *pTypes++ = ::getCppuType(( const uno::Reference< container::XEnumerationAccess >*)0); 1074 *pTypes++ = ::getCppuType(( const uno::Reference< text::XTextRangeMover >*)0); 1075 } 1076 } 1077 return aTypeSequence; 1078 } 1079 } 1080 } 1081 1082 //---------------------------------------------------------------------- 1083 1084 uno::Sequence< sal_Int8 > SAL_CALL SvxShape::getImplementationId() 1085 throw (uno::RuntimeException) 1086 { 1087 static ::cppu::OImplementationId* pID = NULL ; 1088 1089 if ( pID == NULL ) 1090 { 1091 // Ready for multithreading; get global mutex for first call of this method only! see before 1092 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 1093 1094 // Control these pointer again ... it can be, that another instance will be faster then these! 1095 if ( pID == NULL ) 1096 { 1097 // Create a new static ID ... 1098 static ::cppu::OImplementationId aID( sal_False ) ; 1099 // ... and set his address to static pointer! 1100 pID = &aID ; 1101 } 1102 } 1103 1104 return pID->getImplementationId() ; 1105 } 1106 1107 //---------------------------------------------------------------------- 1108 1109 Reference< uno::XInterface > SvxShape_NewInstance() 1110 { 1111 return uno::Reference< uno::XInterface >(static_cast< OWeakObject* >( new SvxShape() ) ); 1112 } 1113 1114 //---------------------------------------------------------------------- 1115 1116 void SvxShape::onUserCall(SdrUserCallType /*_eUserCall*/, const Rectangle& /*_rNewBoundRect*/ ) 1117 { 1118 // obsolete, not called anymore 1119 } 1120 1121 //---------------------------------------------------------------------- 1122 // SfxListener 1123 //---------------------------------------------------------------------- 1124 1125 void SvxShape::Notify( SfxBroadcaster&, const SfxHint& rHint ) throw() 1126 { 1127 DBG_TESTSOLARMUTEX(); 1128 if( !mpObj.is() ) 1129 return; 1130 1131 // #i55919# HINT_OBJCHG is only interesting if it's for this object 1132 1133 const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint ); 1134 if (!pSdrHint || ( /* (pSdrHint->GetKind() != HINT_OBJREMOVED) && */ 1135 (pSdrHint->GetKind() != HINT_MODELCLEARED) && 1136 // #110094#-9 (pSdrHint->GetKind() != HINT_OBJLISTCLEAR) && 1137 ((pSdrHint->GetKind() != HINT_OBJCHG || pSdrHint->GetObject() != mpObj.get() )))) 1138 return; 1139 1140 uno::Reference< uno::XInterface > xSelf( mpObj->getWeakUnoShape() ); 1141 if( !xSelf.is() ) 1142 { 1143 mpObj.reset( NULL ); 1144 return; 1145 } 1146 1147 sal_Bool bClearMe = sal_False; 1148 1149 switch( pSdrHint->GetKind() ) 1150 { 1151 case HINT_OBJCHG: 1152 { 1153 updateShapeKind(); 1154 break; 1155 } 1156 case HINT_MODELCLEARED: 1157 { 1158 bClearMe = sal_True; 1159 mpModel = NULL; 1160 break; 1161 } 1162 default: 1163 break; 1164 }; 1165 1166 if( bClearMe ) 1167 { 1168 if( !HasSdrObjectOwnership() ) 1169 mpObj.reset( NULL ); 1170 if ( !mpImpl->mbDisposing ) 1171 dispose(); 1172 } 1173 } 1174 1175 // XShape 1176 1177 //---------------------------------------------------------------------- 1178 // The "*LogicRectHack" functions also existed in sch, and those 1179 // duplicate symbols cause Bad Things To Happen (TM) #i9462#. 1180 // Prefixing with 'svx' and marking static to make sure name collisions 1181 // do not occur. 1182 1183 static sal_Bool svx_needLogicRectHack( SdrObject* pObj ) 1184 { 1185 if( pObj->GetObjInventor() == SdrInventor) 1186 { 1187 switch(pObj->GetObjIdentifier()) 1188 { 1189 case OBJ_GRUP: 1190 case OBJ_LINE: 1191 case OBJ_POLY: 1192 case OBJ_PLIN: 1193 case OBJ_PATHLINE: 1194 case OBJ_PATHFILL: 1195 case OBJ_FREELINE: 1196 case OBJ_FREEFILL: 1197 case OBJ_SPLNLINE: 1198 case OBJ_SPLNFILL: 1199 case OBJ_EDGE: 1200 case OBJ_PATHPOLY: 1201 case OBJ_PATHPLIN: 1202 case OBJ_MEASURE: 1203 return sal_True; 1204 } 1205 } 1206 return sal_False; 1207 } 1208 1209 //---------------------------------------------------------------------- 1210 1211 static Rectangle svx_getLogicRectHack( SdrObject* pObj ) 1212 { 1213 if(svx_needLogicRectHack(pObj)) 1214 { 1215 return pObj->GetSnapRect(); 1216 } 1217 else 1218 { 1219 return pObj->GetLogicRect(); 1220 } 1221 } 1222 1223 //---------------------------------------------------------------------- 1224 1225 static void svx_setLogicRectHack( SdrObject* pObj, const Rectangle& rRect ) 1226 { 1227 if(svx_needLogicRectHack(pObj)) 1228 { 1229 pObj->SetSnapRect( rRect ); 1230 } 1231 else 1232 { 1233 pObj->SetLogicRect( rRect ); 1234 } 1235 } 1236 1237 //---------------------------------------------------------------------- 1238 1239 awt::Point SAL_CALL SvxShape::getPosition() throw(uno::RuntimeException) 1240 { 1241 OGuard aGuard( Application::GetSolarMutex() ); 1242 1243 if( mpObj.is() && mpModel) 1244 { 1245 Rectangle aRect( svx_getLogicRectHack(mpObj.get()) ); 1246 Point aPt( aRect.Left(), aRect.Top() ); 1247 1248 // Position is relativ to anchor, so recalc to absolut position 1249 if( mpModel->IsWriter() ) 1250 aPt -= mpObj->GetAnchorPos(); 1251 1252 ForceMetricTo100th_mm(aPt); 1253 return ::com::sun::star::awt::Point( aPt.X(), aPt.Y() ); 1254 } 1255 else 1256 { 1257 return maPosition; 1258 } 1259 } 1260 1261 //---------------------------------------------------------------------- 1262 void SAL_CALL SvxShape::setPosition( const awt::Point& Position ) throw(uno::RuntimeException) 1263 { 1264 OGuard aGuard( Application::GetSolarMutex() ); 1265 1266 if( mpObj.is() && mpModel ) 1267 { 1268 // do NOT move 3D objects, this would change the homogen 1269 // transformation matrix 1270 if(!mpObj->ISA(E3dCompoundObject)) 1271 { 1272 Rectangle aRect( svx_getLogicRectHack(mpObj.get()) ); 1273 Point aLocalPos( Position.X, Position.Y ); 1274 ForceMetricToItemPoolMetric(aLocalPos); 1275 1276 // Position ist absolut, relativ zum Anker stellen 1277 if( mpModel->IsWriter() ) 1278 aLocalPos += mpObj->GetAnchorPos(); 1279 1280 long nDX = aLocalPos.X() - aRect.Left(); 1281 long nDY = aLocalPos.Y() - aRect.Top(); 1282 1283 mpObj->Move( Size( nDX, nDY ) ); 1284 mpModel->SetChanged(); 1285 } 1286 } 1287 1288 maPosition = Position; 1289 } 1290 1291 //---------------------------------------------------------------------- 1292 awt::Size SAL_CALL SvxShape::getSize() throw(uno::RuntimeException) 1293 { 1294 OGuard aGuard( Application::GetSolarMutex() ); 1295 1296 if( mpObj.is() && mpModel) 1297 { 1298 Rectangle aRect( svx_getLogicRectHack(mpObj.get()) ); 1299 Size aObjSize( aRect.getWidth(), aRect.getHeight() ); 1300 ForceMetricTo100th_mm(aObjSize); 1301 return ::com::sun::star::awt::Size( aObjSize.getWidth(), aObjSize.getHeight() ); 1302 } 1303 else 1304 return maSize; 1305 } 1306 1307 //---------------------------------------------------------------------- 1308 void SAL_CALL SvxShape::setSize( const awt::Size& rSize ) 1309 throw(beans::PropertyVetoException, uno::RuntimeException) 1310 { 1311 OGuard aGuard( Application::GetSolarMutex() ); 1312 1313 if( mpObj.is() && mpModel) 1314 { 1315 Rectangle aRect( svx_getLogicRectHack(mpObj.get()) ); 1316 Size aLocalSize( rSize.Width, rSize.Height ); 1317 ForceMetricToItemPoolMetric(aLocalSize); 1318 1319 if(mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_MEASURE ) 1320 { 1321 Fraction aWdt(aLocalSize.Width(),aRect.Right()-aRect.Left()); 1322 Fraction aHgt(aLocalSize.Height(),aRect.Bottom()-aRect.Top()); 1323 Point aPt = mpObj->GetSnapRect().TopLeft(); 1324 mpObj->Resize(aPt,aWdt,aHgt); 1325 } 1326 else 1327 { 1328 //aRect.SetSize(aLocalSize); // this call substract 1 // http://www.openoffice.org/issues/show_bug.cgi?id=83193 1329 if ( !aLocalSize.Width() ) 1330 { 1331 aRect.Right() = RECT_EMPTY; 1332 } 1333 else 1334 aRect.setWidth(aLocalSize.Width()); 1335 if ( !aLocalSize.Height() ) 1336 { 1337 aRect.Bottom() = RECT_EMPTY; 1338 } 1339 else 1340 aRect.setHeight(aLocalSize.Height()); 1341 1342 svx_setLogicRectHack( mpObj.get(), aRect ); 1343 } 1344 1345 mpModel->SetChanged(); 1346 } 1347 maSize = rSize; 1348 } 1349 1350 //---------------------------------------------------------------------- 1351 1352 // XNamed 1353 OUString SAL_CALL SvxShape::getName( ) throw(::com::sun::star::uno::RuntimeException) 1354 { 1355 OGuard aGuard( Application::GetSolarMutex() ); 1356 if( mpObj.is() ) 1357 { 1358 return mpObj->GetName(); 1359 } 1360 else 1361 { 1362 return maShapeName; 1363 } 1364 } 1365 1366 //---------------------------------------------------------------------- 1367 1368 void SAL_CALL SvxShape::setName( const ::rtl::OUString& aName ) throw(::com::sun::star::uno::RuntimeException) 1369 { 1370 OGuard aGuard( Application::GetSolarMutex() ); 1371 if( mpObj.is() ) 1372 { 1373 mpObj->SetName( aName ); 1374 } 1375 else 1376 { 1377 maShapeName = aName; 1378 } 1379 } 1380 1381 // XShapeDescriptor 1382 1383 //---------------------------------------------------------------------- 1384 OUString SAL_CALL SvxShape::getShapeType() throw(uno::RuntimeException) 1385 { 1386 if( 0 == maShapeType.getLength() ) 1387 { 1388 UHashMapEntry* pMap = pSdrShapeIdentifierMap; 1389 while ( ( pMap->nId != mpImpl->mnObjId ) && pMap->aIdentifier.getLength() ) 1390 ++pMap; 1391 1392 if ( pMap->aIdentifier.getLength() ) 1393 { 1394 return pMap->aIdentifier; 1395 } 1396 else 1397 { 1398 DBG_ERROR("[CL] unknown SdrObjekt identifier"); 1399 } 1400 } 1401 1402 return maShapeType; 1403 } 1404 1405 // XComponent 1406 1407 //---------------------------------------------------------------------- 1408 void SAL_CALL SvxShape::dispose() throw(uno::RuntimeException) 1409 { 1410 OGuard aGuard( Application::GetSolarMutex() ); 1411 1412 if( mpImpl->mbDisposing ) 1413 return; // caught a recursion 1414 1415 mpImpl->mbDisposing = true; 1416 1417 lang::EventObject aEvt; 1418 aEvt.Source = *(OWeakAggObject*) this; 1419 mpImpl->maDisposeListeners.disposeAndClear(aEvt); 1420 mpImpl->maPropertyNotifier.disposing(); 1421 1422 if ( mpObj.is() ) 1423 { 1424 bool bFreeSdrObject = false; 1425 1426 if ( mpObj->IsInserted() && mpObj->GetPage() ) 1427 { 1428 OSL_ENSURE( HasSdrObjectOwnership(), "SvxShape::dispose: is the below code correct?" ); 1429 // normally, we are allowed to free the SdrObject only if we have its ownership. 1430 // Why isn't this checked here? 1431 1432 SdrPage* pPage = mpObj->GetPage(); 1433 // SdrObject aus der Page loeschen 1434 sal_uInt32 nCount = pPage->GetObjCount(); 1435 for ( sal_uInt32 nNum = 0; nNum < nCount; ++nNum ) 1436 { 1437 if ( pPage->GetObj( nNum ) == mpObj.get() ) 1438 { 1439 OSL_VERIFY( pPage->RemoveObject( nNum ) == mpObj.get() ); 1440 bFreeSdrObject = true; 1441 break; 1442 } 1443 } 1444 } 1445 1446 mpObj->setUnoShape( NULL, SdrObject::GrantXShapeAccess() ); 1447 1448 if ( bFreeSdrObject ) 1449 { 1450 // in case we have the ownership of the SdrObject, a Free 1451 // would do nothing. So ensure the ownership is reset. 1452 mpImpl->mbHasSdrObjectOwnership = false; 1453 SdrObject* pObject = mpObj.get(); 1454 SdrObject::Free( pObject ); 1455 } 1456 } 1457 1458 if( mpModel ) 1459 { 1460 EndListening( *mpModel ); 1461 mpModel = NULL; 1462 } 1463 } 1464 1465 //---------------------------------------------------------------------- 1466 1467 void SAL_CALL SvxShape::addEventListener( const Reference< lang::XEventListener >& xListener ) 1468 throw(uno::RuntimeException) 1469 { 1470 mpImpl->maDisposeListeners.addInterface(xListener); 1471 } 1472 1473 //---------------------------------------------------------------------- 1474 1475 void SAL_CALL SvxShape::removeEventListener( const Reference< lang::XEventListener >& aListener ) throw(uno::RuntimeException) 1476 { 1477 mpImpl->maDisposeListeners.removeInterface(aListener); 1478 } 1479 1480 // XPropertySet 1481 1482 //---------------------------------------------------------------------- 1483 1484 Reference< beans::XPropertySetInfo > SAL_CALL 1485 SvxShape::getPropertySetInfo() throw(uno::RuntimeException) 1486 { 1487 if( mpImpl->mpMaster ) 1488 { 1489 return mpImpl->mpMaster->getPropertySetInfo(); 1490 } 1491 else 1492 { 1493 return _getPropertySetInfo(); 1494 } 1495 } 1496 1497 Reference< beans::XPropertySetInfo > SAL_CALL 1498 SvxShape::_getPropertySetInfo() throw(uno::RuntimeException) 1499 { 1500 return mpPropSet->getPropertySetInfo(); 1501 } 1502 1503 //---------------------------------------------------------------------- 1504 1505 void SAL_CALL SvxShape::addPropertyChangeListener( const OUString& _propertyName, const Reference< beans::XPropertyChangeListener >& _listener ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 1506 { 1507 ::osl::MutexGuard aGuard( maMutex ); 1508 mpImpl->maPropertyNotifier.addPropertyChangeListener( _propertyName, _listener ); 1509 } 1510 1511 //---------------------------------------------------------------------- 1512 1513 void SAL_CALL SvxShape::removePropertyChangeListener( const OUString& _propertyName, const Reference< beans::XPropertyChangeListener >& _listener ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 1514 { 1515 ::osl::MutexGuard aGuard( maMutex ); 1516 mpImpl->maPropertyNotifier.removePropertyChangeListener( _propertyName, _listener ); 1517 } 1518 1519 //---------------------------------------------------------------------- 1520 1521 void SAL_CALL SvxShape::addVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 1522 { 1523 OSL_ENSURE( false, "SvxShape::addVetoableChangeListener: don't have any vetoable properties, so why ...?" ); 1524 } 1525 1526 //---------------------------------------------------------------------- 1527 1528 void SAL_CALL SvxShape::removeVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 1529 { 1530 OSL_ENSURE( false, "SvxShape::removeVetoableChangeListener: don't have any vetoable properties, so why ...?" ); 1531 } 1532 1533 //---------------------------------------------------------------------- 1534 1535 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const OUString& rName ) 1536 { 1537 SfxItemSet aSet( mpModel->GetItemPool(), (sal_uInt16)nWID, (sal_uInt16)nWID ); 1538 1539 if( SetFillAttribute( nWID, rName, aSet, mpModel ) ) 1540 { 1541 //mpObj->SetItemSetAndBroadcast(aSet); 1542 mpObj->SetMergedItemSetAndBroadcast(aSet); 1543 1544 return sal_True; 1545 } 1546 else 1547 { 1548 return sal_False; 1549 } 1550 } 1551 1552 //---------------------------------------------------------------------- 1553 1554 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const ::rtl::OUString& rName, SfxItemSet& rSet, SdrModel* pModel ) 1555 { 1556 // check if an item with the given name and which id is inside the models 1557 // pool or the stylesheet pool, if found its puttet in the itemse 1558 if( !SetFillAttribute( nWID, rName, rSet ) ) 1559 { 1560 // we did not find such item in one of the pools, so we check 1561 // the property lists that are loaded for the model for items 1562 // that support such. 1563 String aStrName; 1564 SvxUnogetInternalNameForItem( (sal_Int16)nWID, rName, aStrName ); 1565 1566 switch( nWID ) 1567 { 1568 case XATTR_FILLBITMAP: 1569 { 1570 XBitmapList* pBitmapList = pModel->GetBitmapList(); 1571 1572 if( !pBitmapList ) 1573 return sal_False; 1574 1575 long nPos = ((XPropertyList*)pBitmapList)->Get(aStrName); 1576 if( nPos == -1 ) 1577 return sal_False; 1578 1579 XBitmapEntry* pEntry = pBitmapList->GetBitmap( nPos ); 1580 XFillBitmapItem aBmpItem; 1581 aBmpItem.SetWhich( XATTR_FILLBITMAP ); 1582 aBmpItem.SetName( rName ); 1583 aBmpItem.SetBitmapValue( pEntry->GetXBitmap() ); 1584 rSet.Put( aBmpItem ); 1585 break; 1586 } 1587 case XATTR_FILLGRADIENT: 1588 { 1589 XGradientList* pGradientList = pModel->GetGradientList(); 1590 1591 if( !pGradientList ) 1592 return sal_False; 1593 1594 long nPos = ((XPropertyList*)pGradientList)->Get(aStrName); 1595 if( nPos == -1 ) 1596 return sal_False; 1597 1598 XGradientEntry* pEntry = pGradientList->GetGradient( nPos ); 1599 XFillGradientItem aGrdItem; 1600 aGrdItem.SetWhich( XATTR_FILLGRADIENT ); 1601 aGrdItem.SetName( rName ); 1602 aGrdItem.SetGradientValue( pEntry->GetGradient() ); 1603 rSet.Put( aGrdItem ); 1604 break; 1605 } 1606 case XATTR_FILLHATCH: 1607 { 1608 XHatchList* pHatchList = pModel->GetHatchList(); 1609 1610 if( !pHatchList ) 1611 return sal_False; 1612 1613 long nPos = ((XPropertyList*)pHatchList)->Get(aStrName); 1614 if( nPos == -1 ) 1615 return sal_False; 1616 1617 XHatchEntry* pEntry = pHatchList->GetHatch( nPos ); 1618 XFillHatchItem aHatchItem; 1619 aHatchItem.SetWhich( XATTR_FILLHATCH ); 1620 aHatchItem.SetName( rName ); 1621 aHatchItem.SetHatchValue( pEntry->GetHatch() ); 1622 rSet.Put( aHatchItem ); 1623 break; 1624 } 1625 case XATTR_LINEEND: 1626 case XATTR_LINESTART: 1627 { 1628 XLineEndList* pLineEndList = pModel->GetLineEndList(); 1629 1630 if( !pLineEndList ) 1631 return sal_False; 1632 1633 long nPos = ((XPropertyList*)pLineEndList)->Get(aStrName); 1634 if( nPos == -1 ) 1635 return sal_False; 1636 1637 XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nPos ); 1638 if( XATTR_LINEEND == nWID ) 1639 { 1640 XLineEndItem aLEItem; 1641 aLEItem.SetWhich( XATTR_LINEEND ); 1642 aLEItem.SetName( rName ); 1643 aLEItem.SetLineEndValue( pEntry->GetLineEnd() ); 1644 rSet.Put( aLEItem ); 1645 } 1646 else 1647 { 1648 XLineStartItem aLSItem; 1649 aLSItem.SetWhich( XATTR_LINESTART ); 1650 aLSItem.SetName( rName ); 1651 aLSItem.SetLineStartValue( pEntry->GetLineEnd() ); 1652 rSet.Put( aLSItem ); 1653 } 1654 1655 break; 1656 } 1657 case XATTR_LINEDASH: 1658 { 1659 XDashList* pDashList = pModel->GetDashList(); 1660 1661 if( !pDashList ) 1662 return sal_False; 1663 1664 long nPos = ((XPropertyList*)pDashList)->Get(aStrName); 1665 if( nPos == -1 ) 1666 return sal_False; 1667 1668 XDashEntry* pEntry = pDashList->GetDash( nPos ); 1669 XLineDashItem aDashItem; 1670 aDashItem.SetWhich( XATTR_LINEDASH ); 1671 aDashItem.SetName( rName ); 1672 aDashItem.SetDashValue( pEntry->GetDash() ); 1673 rSet.Put( aDashItem ); 1674 break; 1675 } 1676 default: 1677 return sal_False; 1678 } 1679 } 1680 1681 return sal_True; 1682 } 1683 1684 //---------------------------------------------------------------------- 1685 1686 sal_Bool SAL_CALL SvxShape::SetFillAttribute( sal_Int32 nWID, const OUString& rName, SfxItemSet& rSet ) 1687 { 1688 String aName; 1689 SvxUnogetInternalNameForItem( (sal_Int16)nWID, rName, aName ); 1690 1691 if( aName.Len() == 0 ) 1692 { 1693 switch( nWID ) 1694 { 1695 case XATTR_LINEEND: 1696 case XATTR_LINESTART: 1697 { 1698 const String aEmpty; 1699 const basegfx::B2DPolyPolygon aEmptyPoly; 1700 if( nWID == XATTR_LINEEND ) 1701 rSet.Put( XLineEndItem( aEmpty, aEmptyPoly ) ); 1702 else 1703 rSet.Put( XLineStartItem( aEmpty, aEmptyPoly ) ); 1704 1705 return sal_True; 1706 } 1707 case XATTR_FILLFLOATTRANSPARENCE: 1708 { 1709 // #85953# Set a disabled XFillFloatTransparenceItem 1710 rSet.Put(XFillFloatTransparenceItem()); 1711 1712 return sal_True; 1713 } 1714 } 1715 1716 return sal_False; 1717 } 1718 1719 const SfxItemPool* pPool = rSet.GetPool(); 1720 1721 const String aSearchName( aName ); 1722 const sal_uInt32 nCount = pPool->GetItemCount2((sal_uInt16)nWID); 1723 const NameOrIndex* pItem; 1724 1725 for( sal_uInt32 nSurrogate = 0; nSurrogate < nCount; nSurrogate++ ) 1726 { 1727 pItem = (NameOrIndex*)pPool->GetItem2((sal_uInt16)nWID, nSurrogate); 1728 if( pItem && ( pItem->GetName() == aSearchName ) ) 1729 { 1730 rSet.Put( *pItem ); 1731 return sal_True; 1732 } 1733 } 1734 1735 return sal_False; 1736 } 1737 1738 //---------------------------------------------------------------------- 1739 1740 // static 1741 /* os: unused function 1742 uno::Any SAL_CALL SvxShape::GetFillAttributeByName( 1743 const ::rtl::OUString& rPropertyName, const ::rtl::OUString& rName, SdrModel* pModel ) 1744 { 1745 uno::Any aResult; 1746 DBG_ASSERT( pModel, "Invalid Model in GetFillAttributeByName()" ); 1747 if( ! pModel ) 1748 return aResult; 1749 1750 sal_Int16 nWhich = SvxUnoGetWhichIdForNamedProperty( rPropertyName ); 1751 1752 // search pool for item 1753 const SfxItemPool& rPool = pModel->GetItemPool(); 1754 1755 const String aSearchName( rName ); 1756 const sal_uInt32 nCount = rPool.GetItemCount((sal_uInt16)nWhich); 1757 const NameOrIndex* pItem = 0; 1758 bool bFound = false; 1759 1760 for( sal_uInt32 nSurrogate = 0; ! bFound && nSurrogate < nCount; nSurrogate++ ) 1761 { 1762 pItem = (NameOrIndex*)rPool.GetItem((sal_uInt16)nWhich, nSurrogate); 1763 if( pItem && ( pItem->GetName() == aSearchName ) ) 1764 { 1765 bFound = true; 1766 } 1767 } 1768 1769 // check the property lists that are loaded for the model for items that 1770 // support such. 1771 String aStrName; 1772 SvxUnogetInternalNameForItem( nWhich, rName, aStrName ); 1773 1774 switch( nWhich ) 1775 { 1776 case XATTR_FILLBITMAP: 1777 { 1778 XFillBitmapItem aBmpItem; 1779 if( ! bFound ) 1780 { 1781 XBitmapList* pBitmapList = pModel->GetBitmapList(); 1782 1783 if( !pBitmapList ) 1784 break; 1785 1786 long nPos = ((XPropertyList*)pBitmapList)->Get(aStrName); 1787 if( nPos == -1 ) 1788 break; 1789 1790 XBitmapEntry* pEntry = pBitmapList->GetBitmap( nPos ); 1791 aBmpItem.SetWhich( XATTR_FILLBITMAP ); 1792 aBmpItem.SetName( rName ); 1793 aBmpItem.SetBitmapValue( pEntry->GetXBitmap() ); 1794 pItem = & aBmpItem; 1795 } 1796 DBG_ASSERT( pItem, "Invalid Item" ); 1797 if( pItem ) 1798 pItem->QueryValue( aResult ); // default: XBitmap. MID_GRAFURL instead? 1799 } 1800 break; 1801 1802 case XATTR_FILLGRADIENT: 1803 { 1804 XFillGradientItem aGrdItem; 1805 if( ! bFound ) 1806 { 1807 XGradientList* pGradientList = pModel->GetGradientList(); 1808 1809 if( !pGradientList ) 1810 break; 1811 1812 long nPos = ((XPropertyList*)pGradientList)->Get(aStrName); 1813 if( nPos == -1 ) 1814 break; 1815 1816 XGradientEntry* pEntry = pGradientList->GetGradient( nPos ); 1817 aGrdItem.SetWhich( XATTR_FILLGRADIENT ); 1818 aGrdItem.SetName( rName ); 1819 aGrdItem.SetGradientValue( pEntry->GetGradient() ); 1820 pItem = & aGrdItem; 1821 } 1822 DBG_ASSERT( pItem, "Invalid Item" ); 1823 if( pItem ) 1824 pItem->QueryValue( aResult, MID_FILLGRADIENT ); 1825 } 1826 break; 1827 1828 case XATTR_FILLHATCH: 1829 { 1830 XFillHatchItem aHatchItem; 1831 if( ! bFound ) 1832 { 1833 XHatchList* pHatchList = pModel->GetHatchList(); 1834 1835 if( !pHatchList ) 1836 break; 1837 1838 long nPos = ((XPropertyList*)pHatchList)->Get(aStrName); 1839 if( nPos == -1 ) 1840 break; 1841 1842 XHatchEntry* pEntry = pHatchList->GetHatch( nPos ); 1843 aHatchItem.SetWhich( XATTR_FILLHATCH ); 1844 aHatchItem.SetName( rName ); 1845 aHatchItem.SetHatchValue( pEntry->GetHatch() ); 1846 pItem = & aHatchItem; 1847 } 1848 DBG_ASSERT( pItem, "Invalid Item" ); 1849 if( pItem ) 1850 pItem->QueryValue( aResult, MID_FILLHATCH ); 1851 } 1852 break; 1853 1854 case XATTR_LINEEND: 1855 case XATTR_LINESTART: 1856 { 1857 if( ! bFound ) 1858 { 1859 XLineEndList* pLineEndList = pModel->GetLineEndList(); 1860 1861 if( !pLineEndList ) 1862 break; 1863 1864 long nPos = ((XPropertyList*)pLineEndList)->Get(aStrName); 1865 if( nPos == -1 ) 1866 break; 1867 1868 XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nPos ); 1869 if( nWhich == XATTR_LINEEND ) 1870 { 1871 XLineEndItem aLEItem; 1872 aLEItem.SetWhich( XATTR_LINEEND ); 1873 aLEItem.SetName( rName ); 1874 aLEItem.SetLineEndValue( pEntry->GetLineEnd() ); 1875 aLEItem.QueryValue( aResult ); 1876 } 1877 else 1878 { 1879 XLineStartItem aLSItem; 1880 aLSItem.SetWhich( XATTR_LINESTART ); 1881 aLSItem.SetName( rName ); 1882 aLSItem.SetLineStartValue( pEntry->GetLineEnd() ); 1883 aLSItem.QueryValue( aResult ); 1884 } 1885 } 1886 else 1887 { 1888 DBG_ASSERT( pItem, "Invalid Item" ); 1889 if( pItem ) 1890 pItem->QueryValue( aResult ); 1891 } 1892 } 1893 break; 1894 1895 case XATTR_LINEDASH: 1896 { 1897 XLineDashItem aDashItem; 1898 if( ! bFound ) 1899 { 1900 XDashList* pDashList = pModel->GetDashList(); 1901 1902 if( !pDashList ) 1903 break; 1904 1905 long nPos = ((XPropertyList*)pDashList)->Get(aStrName); 1906 if( nPos == -1 ) 1907 break; 1908 1909 XDashEntry* pEntry = pDashList->GetDash( nPos ); 1910 aDashItem.SetWhich( XATTR_LINEDASH ); 1911 aDashItem.SetName( rName ); 1912 aDashItem.SetDashValue( pEntry->GetDash() ); 1913 pItem = & aDashItem; 1914 } 1915 DBG_ASSERT( pItem, "Invalid Item" ); 1916 if( pItem ) 1917 pItem->QueryValue( aResult, MID_LINEDASH ); 1918 } 1919 break; 1920 } 1921 1922 return aResult; 1923 } */ 1924 1925 //---------------------------------------------------------------------- 1926 1927 void SAL_CALL SvxShape::setPropertyValue( const OUString& rPropertyName, const uno::Any& rVal ) 1928 throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 1929 { 1930 if( mpImpl->mpMaster ) 1931 { 1932 mpImpl->mpMaster->setPropertyValue( rPropertyName, rVal ); 1933 } 1934 else 1935 { 1936 _setPropertyValue( rPropertyName, rVal ); 1937 } 1938 } 1939 1940 void SAL_CALL SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& rVal ) 1941 throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 1942 { 1943 OGuard aGuard( Application::GetSolarMutex() ); 1944 1945 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(rPropertyName); 1946 1947 if( mpObj.is() && mpModel ) 1948 { 1949 if( pMap == NULL ) 1950 throw beans::UnknownPropertyException(); 1951 1952 if( (pMap->nFlags & beans::PropertyAttribute::READONLY ) != 0 ) 1953 throw beans::PropertyVetoException(); 1954 1955 mpModel->SetChanged(); 1956 1957 if(!setPropertyValueImpl( rPropertyName, pMap, rVal ) ) 1958 { 1959 DBG_ASSERT( pMap->nWID == SDRATTR_TEXTDIRECTION || pMap->nWID < SDRATTR_NOTPERSIST_FIRST || pMap->nWID > SDRATTR_NOTPERSIST_LAST, "Not persist item not handled!" ); 1960 DBG_ASSERT( pMap->nWID < OWN_ATTR_VALUE_START || pMap->nWID > OWN_ATTR_VALUE_END, "Not item property not handled!" ); 1961 1962 sal_Bool bIsNotPersist = pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST && pMap->nWID != SDRATTR_TEXTDIRECTION; 1963 1964 if( pMap->nWID == SDRATTR_ECKENRADIUS ) 1965 { 1966 sal_Int32 nCornerRadius = 0; 1967 if( !(rVal >>= nCornerRadius) || (nCornerRadius < 0) || (nCornerRadius > 5000000)) 1968 throw IllegalArgumentException(); 1969 } 1970 1971 SfxItemSet* pSet; 1972 if( mbIsMultiPropertyCall && !bIsNotPersist ) 1973 { 1974 if( mpImpl->mpItemSet == NULL ) 1975 { 1976 pSet = mpImpl->mpItemSet = mpObj->GetMergedItemSet().Clone(); 1977 } 1978 else 1979 { 1980 pSet = mpImpl->mpItemSet; 1981 } 1982 } 1983 else 1984 { 1985 pSet = new SfxItemSet( mpModel->GetItemPool(), pMap->nWID, pMap->nWID); 1986 } 1987 1988 if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET ) 1989 pSet->Put(mpObj->GetMergedItem(pMap->nWID)); 1990 1991 if( !SvxUnoTextRangeBase::SetPropertyValueHelper( *pSet, pMap, rVal, *pSet )) 1992 { 1993 if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET ) 1994 { 1995 if(bIsNotPersist) 1996 { 1997 // Not-Persistant Attribute, hole diese extra 1998 mpObj->TakeNotPersistAttr(*pSet, sal_False); 1999 } 2000 } 2001 2002 if( pSet->GetItemState( pMap->nWID ) != SFX_ITEM_SET ) 2003 { 2004 // Default aus ItemPool holen 2005 if(mpModel->GetItemPool().IsWhich(pMap->nWID)) 2006 pSet->Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID)); 2007 } 2008 2009 if( pSet->GetItemState( pMap->nWID ) == SFX_ITEM_SET ) 2010 { 2011 SvxItemPropertySet_setPropertyValue( *mpPropSet, pMap, rVal, *pSet ); 2012 } 2013 } 2014 2015 if(bIsNotPersist) 2016 { 2017 // Not-Persist Attribute extra setzen 2018 mpObj->ApplyNotPersistAttr( *pSet ); 2019 delete pSet; 2020 } 2021 else 2022 { 2023 // if we have a XMultiProperty call then the item set 2024 // will be set in setPropertyValues later 2025 if( !mbIsMultiPropertyCall ) 2026 { 2027 mpObj->SetMergedItemSetAndBroadcast( *pSet ); 2028 2029 delete pSet; 2030 } 2031 } 2032 return; 2033 } 2034 } 2035 else 2036 { 2037 // since we have no actual sdr object right now 2038 // remember all properties in a list. These 2039 // properties will be set when the sdr object is 2040 // created 2041 2042 if(pMap && pMap->nWID) 2043 // Fixme: We should throw a UnknownPropertyException here. 2044 // But since this class is aggregated from classes 2045 // that support additional properties that we don't 2046 // know here we silently store *all* properties, even 2047 // if they may be not supported after creation 2048 mpPropSet->setPropertyValue( pMap, rVal ); 2049 } 2050 } 2051 2052 //---------------------------------------------------------------------- 2053 2054 uno::Any SAL_CALL SvxShape::getPropertyValue( const OUString& PropertyName ) 2055 throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 2056 { 2057 if ( mpImpl->mpMaster ) 2058 return mpImpl->mpMaster->getPropertyValue( PropertyName ); 2059 else 2060 return _getPropertyValue( PropertyName ); 2061 } 2062 2063 //---------------------------------------------------------------------- 2064 2065 uno::Any SvxShape::_getPropertyValue( const OUString& PropertyName ) 2066 throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 2067 { 2068 OGuard aGuard( Application::GetSolarMutex() ); 2069 2070 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName); 2071 2072 uno::Any aAny; 2073 if( mpObj.is() && mpModel ) 2074 { 2075 if(pMap == NULL ) 2076 throw beans::UnknownPropertyException(); 2077 2078 if( !getPropertyValueImpl( PropertyName, pMap, aAny ) ) 2079 { 2080 DBG_ASSERT( pMap->nWID == SDRATTR_TEXTDIRECTION || (pMap->nWID < SDRATTR_NOTPERSIST_FIRST || pMap->nWID > SDRATTR_NOTPERSIST_LAST), "Not persist item not handled!" ); 2081 DBG_ASSERT( pMap->nWID < OWN_ATTR_VALUE_START || pMap->nWID > OWN_ATTR_VALUE_END, "Not item property not handled!" ); 2082 2083 SfxItemSet aSet( mpModel->GetItemPool(), pMap->nWID, pMap->nWID); 2084 aSet.Put(mpObj->GetMergedItem(pMap->nWID)); 2085 2086 if(SvxUnoTextRangeBase::GetPropertyValueHelper( aSet, pMap, aAny )) 2087 return aAny; 2088 2089 if(!aSet.Count()) 2090 { 2091 if(pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST) 2092 { 2093 // Not-Persistant Attribute, hole diese extra 2094 mpObj->TakeNotPersistAttr(aSet, sal_False); 2095 } 2096 } 2097 2098 if(!aSet.Count()) 2099 { 2100 // Default aus ItemPool holen 2101 if(mpModel->GetItemPool().IsWhich(pMap->nWID)) 2102 aSet.Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID)); 2103 } 2104 2105 if(aSet.Count()) 2106 aAny = GetAnyForItem( aSet, pMap ); 2107 } 2108 } 2109 else 2110 { 2111 2112 // Fixme: we should return default values for OWN_ATTR ! 2113 2114 if(pMap && pMap->nWID) 2115 // FixMe: see setPropertyValue 2116 aAny = mpPropSet->getPropertyValue( pMap ); 2117 2118 } 2119 return aAny; 2120 } 2121 2122 //---------------------------------------------------------------------- 2123 2124 // XMultiPropertySet 2125 void SAL_CALL SvxShape::setPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aValues ) throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 2126 { 2127 OGuard aSolarGuard( Application::GetSolarMutex() ); 2128 2129 const sal_Int32 nCount = aPropertyNames.getLength(); 2130 const OUString* pNames = aPropertyNames.getConstArray(); 2131 2132 const uno::Any* pValues = aValues.getConstArray(); 2133 2134 // make sure mbIsMultiPropertyCall and mpImpl->mpItemSet are 2135 // reseted even when an execption is thrown 2136 const ::comphelper::ScopeGuard aGuard( boost::bind( &SvxShape::endSetPropertyValues, this ) ); 2137 2138 mbIsMultiPropertyCall = sal_True; 2139 2140 if( mpImpl->mpMaster ) 2141 { 2142 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pValues++ ) 2143 { 2144 try 2145 { 2146 setPropertyValue( *pNames, *pValues ); 2147 } 2148 catch( beans::UnknownPropertyException& e ) 2149 { 2150 (void)e; 2151 } 2152 catch( uno::Exception& ex ) 2153 { 2154 (void)ex; 2155 } 2156 } 2157 } 2158 else 2159 { 2160 uno::Reference< beans::XPropertySet > xSet; 2161 queryInterface( ::getCppuType( (const uno::Reference< beans::XPropertySet >*) 0) ) >>= xSet; 2162 2163 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pValues++ ) 2164 { 2165 try 2166 { 2167 xSet->setPropertyValue( *pNames, *pValues ); 2168 } 2169 catch( beans::UnknownPropertyException& e ) 2170 { 2171 (void)e; 2172 } 2173 catch( uno::Exception& ex ) 2174 { 2175 (void)ex; 2176 } 2177 } 2178 } 2179 2180 if( mpImpl->mpItemSet && mpObj.is() ) 2181 mpObj->SetMergedItemSetAndBroadcast( *mpImpl->mpItemSet ); 2182 } 2183 2184 //---------------------------------------------------------------------- 2185 2186 void SvxShape::endSetPropertyValues() 2187 { 2188 mbIsMultiPropertyCall = sal_False; 2189 if( mpImpl->mpItemSet ) 2190 { 2191 delete mpImpl->mpItemSet; 2192 mpImpl->mpItemSet = 0; 2193 } 2194 } 2195 2196 //---------------------------------------------------------------------- 2197 2198 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > SAL_CALL SvxShape::getPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames ) throw (::com::sun::star::uno::RuntimeException) 2199 { 2200 const sal_Int32 nCount = aPropertyNames.getLength(); 2201 const OUString* pNames = aPropertyNames.getConstArray(); 2202 2203 uno::Sequence< uno::Any > aRet( nCount ); 2204 uno::Any* pValue = aRet.getArray();; 2205 2206 if( mpImpl->mpMaster ) 2207 { 2208 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pValue++, pNames++ ) 2209 { 2210 try 2211 { 2212 *pValue = getPropertyValue( *pNames ); 2213 } 2214 catch( uno::Exception& ) 2215 { 2216 DBG_ERROR( "SvxShape::getPropertyValues, unknown property asked" ); 2217 } 2218 } 2219 } 2220 else 2221 { 2222 uno::Reference< beans::XPropertySet > xSet; 2223 queryInterface( ::getCppuType( (const uno::Reference< beans::XPropertySet >*) 0) ) >>= xSet; 2224 2225 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pValue++, pNames++ ) 2226 { 2227 try 2228 { 2229 *pValue = xSet->getPropertyValue( *pNames ); 2230 } 2231 catch( uno::Exception& ) 2232 { 2233 DBG_ERROR( "SvxShape::getPropertyValues, unknown property asked" ); 2234 } 2235 } 2236 } 2237 2238 return aRet; 2239 } 2240 2241 void SAL_CALL SvxShape::addPropertiesChangeListener( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& ) throw (::com::sun::star::uno::RuntimeException) 2242 { 2243 } 2244 2245 void SAL_CALL SvxShape::removePropertiesChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& ) throw (::com::sun::star::uno::RuntimeException) 2246 { 2247 } 2248 2249 void SAL_CALL SvxShape::firePropertiesChangeEvent( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& ) throw (::com::sun::star::uno::RuntimeException) 2250 { 2251 } 2252 2253 //---------------------------------------------------------------------- 2254 2255 uno::Any SvxShape::GetAnyForItem( SfxItemSet& aSet, const SfxItemPropertySimpleEntry* pMap ) const 2256 { 2257 DBG_TESTSOLARMUTEX(); 2258 uno::Any aAny; 2259 2260 switch(pMap->nWID) 2261 { 2262 case SDRATTR_CIRCSTARTANGLE: 2263 { 2264 const SfxPoolItem* pPoolItem=NULL; 2265 if(aSet.GetItemState(SDRATTR_CIRCSTARTANGLE,sal_False,&pPoolItem)==SFX_ITEM_SET) 2266 { 2267 sal_Int32 nAngle = ((SdrCircStartAngleItem*)pPoolItem)->GetValue(); 2268 aAny <<= nAngle; 2269 } 2270 break; 2271 } 2272 2273 case SDRATTR_CIRCENDANGLE: 2274 { 2275 const SfxPoolItem* pPoolItem=NULL; 2276 if (aSet.GetItemState(SDRATTR_CIRCENDANGLE,sal_False,&pPoolItem)==SFX_ITEM_SET) 2277 { 2278 sal_Int32 nAngle = ((SdrCircEndAngleItem*)pPoolItem)->GetValue(); 2279 aAny <<= nAngle; 2280 } 2281 break; 2282 } 2283 2284 case SDRATTR_CIRCKIND: 2285 { 2286 if( mpObj->GetObjInventor() == SdrInventor) 2287 { 2288 drawing::CircleKind eKind; 2289 switch(mpObj->GetObjIdentifier()) 2290 { 2291 case OBJ_CIRC: // Kreis, Ellipse 2292 eKind = drawing::CircleKind_FULL; 2293 break; 2294 case OBJ_CCUT: // Kreisabschnitt 2295 eKind = drawing::CircleKind_CUT; 2296 break; 2297 case OBJ_CARC: // Kreisbogen 2298 eKind = drawing::CircleKind_ARC; 2299 break; 2300 case OBJ_SECT: // Kreissektor 2301 eKind = drawing::CircleKind_SECTION; 2302 break; 2303 } 2304 aAny <<= eKind; 2305 } 2306 break; 2307 } 2308 default: 2309 { 2310 // Hole Wert aus ItemSet 2311 aAny = SvxItemPropertySet_getPropertyValue( *mpPropSet, pMap, aSet ); 2312 2313 if( *pMap->pType != aAny.getValueType() ) 2314 { 2315 // since the sfx uint16 item now exports a sal_Int32, we may have to fix this here 2316 if( ( *pMap->pType == ::getCppuType((const sal_Int16*)0)) && aAny.getValueType() == ::getCppuType((const sal_Int32*)0) ) 2317 { 2318 sal_Int32 nValue = 0; 2319 aAny >>= nValue; 2320 aAny <<= (sal_Int16)nValue; 2321 } 2322 else 2323 { 2324 DBG_ERROR("SvxShape::GetAnyForItem() Returnvalue has wrong Type!" ); 2325 } 2326 } 2327 2328 } 2329 } 2330 2331 return aAny; 2332 } 2333 2334 //---------------------------------------------------------------------- 2335 2336 // XPropertyState 2337 beans::PropertyState SAL_CALL SvxShape::getPropertyState( const OUString& PropertyName ) 2338 throw(beans::UnknownPropertyException, uno::RuntimeException) 2339 { 2340 if( mpImpl->mpMaster ) 2341 { 2342 return mpImpl->mpMaster->getPropertyState( PropertyName ); 2343 } 2344 else 2345 { 2346 return _getPropertyState( PropertyName ); 2347 } 2348 } 2349 2350 beans::PropertyState SAL_CALL SvxShape::_getPropertyState( const OUString& PropertyName ) 2351 throw(beans::UnknownPropertyException, uno::RuntimeException) 2352 { 2353 OGuard aGuard( Application::GetSolarMutex() ); 2354 2355 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName); 2356 2357 if( !mpObj.is() || pMap == NULL ) 2358 throw beans::UnknownPropertyException(); 2359 2360 beans::PropertyState eState; 2361 if( !getPropertyStateImpl( pMap, eState ) ) 2362 { 2363 const SfxItemSet& rSet = mpObj->GetMergedItemSet(); 2364 2365 switch( rSet.GetItemState( pMap->nWID, sal_False ) ) 2366 { 2367 case SFX_ITEM_READONLY: 2368 case SFX_ITEM_SET: 2369 eState = beans::PropertyState_DIRECT_VALUE; 2370 break; 2371 case SFX_ITEM_DEFAULT: 2372 eState = beans::PropertyState_DEFAULT_VALUE; 2373 break; 2374 // case SFX_ITEM_UNKNOWN: 2375 // case SFX_ITEM_DONTCARE: 2376 // case SFX_ITEM_DISABLED: 2377 default: 2378 eState = beans::PropertyState_AMBIGUOUS_VALUE; 2379 break; 2380 } 2381 2382 // if a item is set, this doesn't mean we want it :) 2383 if( ( beans::PropertyState_DIRECT_VALUE == eState ) ) 2384 { 2385 switch( pMap->nWID ) 2386 { 2387 // the following items are disabled by changing the 2388 // fill style or the line style. so there is no need 2389 // to export items without names which should be empty 2390 case XATTR_FILLBITMAP: 2391 case XATTR_FILLGRADIENT: 2392 case XATTR_FILLHATCH: 2393 case XATTR_LINEDASH: 2394 { 2395 NameOrIndex* pItem = (NameOrIndex*)rSet.GetItem((sal_uInt16)pMap->nWID); 2396 if( ( pItem == NULL ) || ( pItem->GetName().Len() == 0) ) 2397 eState = beans::PropertyState_DEFAULT_VALUE; 2398 } 2399 break; 2400 2401 // #i36115# 2402 // If e.g. the LineStart is on NONE and thus the string has length 0, it still 2403 // may be a hard attribute covering the set LineStart of the parent (Style). 2404 // #i37644# 2405 // same is for fill float transparency 2406 case XATTR_LINEEND: 2407 case XATTR_LINESTART: 2408 case XATTR_FILLFLOATTRANSPARENCE: 2409 { 2410 NameOrIndex* pItem = (NameOrIndex*)rSet.GetItem((sal_uInt16)pMap->nWID); 2411 if( ( pItem == NULL ) ) 2412 eState = beans::PropertyState_DEFAULT_VALUE; 2413 } 2414 break; 2415 } 2416 } 2417 } 2418 return eState; 2419 } 2420 2421 //---------------------------------------------------------------------- 2422 2423 bool SvxShape::setPropertyValueImpl( const ::rtl::OUString&, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 2424 { 2425 switch( pProperty->nWID ) 2426 { 2427 case OWN_ATTR_CAPTION_POINT: 2428 { 2429 awt::Point aPnt; 2430 if( rValue >>= aPnt ) 2431 { 2432 Point aVclPoint( aPnt.X, aPnt.Y ); 2433 2434 // #90763# position is relative to top left, make it absolute 2435 basegfx::B2DPolyPolygon aNewPolyPolygon; 2436 basegfx::B2DHomMatrix aNewHomogenMatrix; 2437 mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); 2438 2439 aVclPoint.X() += basegfx::fround(aNewHomogenMatrix.get(0, 2)); 2440 aVclPoint.Y() += basegfx::fround(aNewHomogenMatrix.get(1, 2)); 2441 2442 // #88657# metric of pool maybe twips (writer) 2443 ForceMetricToItemPoolMetric(aVclPoint); 2444 2445 // #88491# position relative to anchor 2446 if( mpModel->IsWriter() ) 2447 { 2448 aVclPoint += mpObj->GetAnchorPos(); 2449 } 2450 2451 ((SdrCaptionObj*)mpObj.get())->SetTailPos(aVclPoint); 2452 2453 return true; 2454 } 2455 break; 2456 } 2457 case OWN_ATTR_TRANSFORMATION: 2458 { 2459 drawing::HomogenMatrix3 aMatrix; 2460 if(rValue >>= aMatrix) 2461 { 2462 basegfx::B2DPolyPolygon aNewPolyPolygon; 2463 basegfx::B2DHomMatrix aNewHomogenMatrix; 2464 2465 mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); 2466 2467 aNewHomogenMatrix.set(0, 0, aMatrix.Line1.Column1); 2468 aNewHomogenMatrix.set(0, 1, aMatrix.Line1.Column2); 2469 aNewHomogenMatrix.set(0, 2, aMatrix.Line1.Column3); 2470 aNewHomogenMatrix.set(1, 0, aMatrix.Line2.Column1); 2471 aNewHomogenMatrix.set(1, 1, aMatrix.Line2.Column2); 2472 aNewHomogenMatrix.set(1, 2, aMatrix.Line2.Column3); 2473 aNewHomogenMatrix.set(2, 0, aMatrix.Line3.Column1); 2474 aNewHomogenMatrix.set(2, 1, aMatrix.Line3.Column2); 2475 aNewHomogenMatrix.set(2, 2, aMatrix.Line3.Column3); 2476 2477 mpObj->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); 2478 return true; 2479 } 2480 break; 2481 } 2482 2483 case OWN_ATTR_ZORDER: 2484 { 2485 sal_Int32 nNewOrdNum = 0; 2486 if(rValue >>= nNewOrdNum) 2487 { 2488 SdrObjList* pObjList = mpObj->GetObjList(); 2489 if( pObjList ) 2490 { 2491 #ifdef DBG_UTIL 2492 SdrObject* pCheck = 2493 #endif 2494 pObjList->SetObjectOrdNum( mpObj->GetOrdNum(), (sal_uIntPtr)nNewOrdNum ); 2495 DBG_ASSERT( pCheck == mpObj.get(), "GetOrdNum() failed!" ); 2496 } 2497 return true; 2498 } 2499 break; 2500 } 2501 case OWN_ATTR_FRAMERECT: 2502 { 2503 awt::Rectangle aUnoRect; 2504 if(rValue >>= aUnoRect) 2505 { 2506 Point aTopLeft( aUnoRect.X, aUnoRect.Y ); 2507 Size aObjSize( aUnoRect.Width, aUnoRect.Height ); 2508 ForceMetricToItemPoolMetric(aTopLeft); 2509 ForceMetricToItemPoolMetric(aObjSize); 2510 Rectangle aRect; 2511 aRect.SetPos(aTopLeft); 2512 aRect.SetSize(aObjSize); 2513 mpObj->SetSnapRect(aRect); 2514 return true; 2515 } 2516 break; 2517 } 2518 case OWN_ATTR_MIRRORED: 2519 { 2520 sal_Bool bMirror = sal_Bool(); 2521 if(rValue >>= bMirror ) 2522 { 2523 SdrGrafObj* pObj = dynamic_cast< SdrGrafObj* >( mpObj.get() ); 2524 if( pObj ) 2525 pObj->SetMirrored(bMirror); 2526 return true; 2527 } 2528 break; 2529 } 2530 case OWN_ATTR_EDGE_START_OBJ: 2531 case OWN_ATTR_EDGE_END_OBJ: 2532 case OWN_ATTR_GLUEID_HEAD: 2533 case OWN_ATTR_GLUEID_TAIL: 2534 case OWN_ATTR_EDGE_START_POS: 2535 case OWN_ATTR_EDGE_END_POS: 2536 case OWN_ATTR_EDGE_POLYPOLYGONBEZIER: 2537 { 2538 SdrEdgeObj* pEdgeObj = dynamic_cast< SdrEdgeObj* >(mpObj.get()); 2539 if(pEdgeObj) 2540 { 2541 switch(pProperty->nWID) 2542 { 2543 case OWN_ATTR_EDGE_START_OBJ: 2544 case OWN_ATTR_EDGE_END_OBJ: 2545 { 2546 Reference< drawing::XShape > xShape; 2547 if( rValue >>= xShape ) 2548 { 2549 SdrObject* pNode = GetSdrObjectFromXShape( xShape ); 2550 if( pNode ) 2551 { 2552 pEdgeObj->ConnectToNode( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, pNode ); 2553 pEdgeObj->setGluePointIndex( pProperty->nWID == OWN_ATTR_EDGE_START_OBJ, -1 ); 2554 return true; 2555 } 2556 } 2557 break; 2558 } 2559 2560 case OWN_ATTR_EDGE_START_POS: 2561 case OWN_ATTR_EDGE_END_POS: 2562 { 2563 awt::Point aUnoPoint; 2564 if( rValue >>= aUnoPoint ) 2565 { 2566 Point aPoint( aUnoPoint.X, aUnoPoint.Y ); 2567 2568 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051 2569 // perform metric change before applying anchor position, 2570 // because the anchor position is in pool metric. 2571 ForceMetricToItemPoolMetric( aPoint ); 2572 // <-- 2573 if( mpModel->IsWriter() ) 2574 aPoint += mpObj->GetAnchorPos(); 2575 2576 pEdgeObj->SetTailPoint( pProperty->nWID == OWN_ATTR_EDGE_START_POS, aPoint ); 2577 return true; 2578 } 2579 break; 2580 } 2581 2582 case OWN_ATTR_GLUEID_HEAD: 2583 case OWN_ATTR_GLUEID_TAIL: 2584 { 2585 sal_Int32 nId = 0; 2586 if( rValue >>= nId ) 2587 { 2588 pEdgeObj->setGluePointIndex( pProperty->nWID == OWN_ATTR_GLUEID_HEAD, nId ); 2589 return true; 2590 } 2591 break; 2592 } 2593 case OWN_ATTR_EDGE_POLYPOLYGONBEZIER: 2594 { 2595 drawing::PolyPolygonBezierCoords aPolyPoly; 2596 if ( rValue >>= aPolyPoly ) 2597 { 2598 basegfx::B2DPolyPolygon aNewPolyPolygon( SvxConvertPolyPolygonBezierToB2DPolyPolygon( &aPolyPoly ) ); 2599 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051 2600 ForceMetricToItemPoolMetric( aNewPolyPolygon ); 2601 // <-- 2602 if( mpModel->IsWriter() ) 2603 { 2604 Point aPoint( mpObj->GetAnchorPos() ); 2605 aNewPolyPolygon.transform(basegfx::tools::createTranslateB2DHomMatrix(aPoint.X(), aPoint.Y())); 2606 } 2607 pEdgeObj->SetEdgeTrackPath( aNewPolyPolygon ); 2608 return true; 2609 } 2610 } 2611 } 2612 } 2613 break; 2614 } 2615 case OWN_ATTR_MEASURE_START_POS: 2616 case OWN_ATTR_MEASURE_END_POS: 2617 { 2618 SdrMeasureObj* pMeasureObj = dynamic_cast< SdrMeasureObj* >(mpObj.get()); 2619 awt::Point aUnoPoint; 2620 if(pMeasureObj && ( rValue >>= aUnoPoint ) ) 2621 { 2622 Point aPoint( aUnoPoint.X, aUnoPoint.Y ); 2623 2624 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue i59051 2625 ForceMetricToItemPoolMetric( aPoint ); 2626 // <-- 2627 if( mpModel->IsWriter() ) 2628 aPoint += mpObj->GetAnchorPos(); 2629 2630 pMeasureObj->NbcSetPoint( aPoint, pProperty->nWID == OWN_ATTR_MEASURE_START_POS ? 0L : 1L ); 2631 pMeasureObj->SetChanged(); 2632 pMeasureObj->BroadcastObjectChange(); 2633 return true; 2634 } 2635 break; 2636 } 2637 case OWN_ATTR_FILLBMP_MODE: 2638 { 2639 drawing::BitmapMode eMode; 2640 if(!(rValue >>= eMode) ) 2641 { 2642 sal_Int32 nMode = 0; 2643 if(!(rValue >>= nMode)) 2644 break; 2645 2646 eMode = (drawing::BitmapMode)nMode; 2647 } 2648 mpObj->SetMergedItem( XFillBmpStretchItem( eMode == drawing::BitmapMode_STRETCH ) ); 2649 mpObj->SetMergedItem( XFillBmpTileItem( eMode == drawing::BitmapMode_REPEAT ) ); 2650 return true; 2651 } 2652 2653 case SDRATTR_LAYERID: 2654 { 2655 sal_Int16 nLayerId = sal_Int16(); 2656 if( rValue >>= nLayerId ) 2657 { 2658 SdrLayer* pLayer = mpModel->GetLayerAdmin().GetLayerPerID((unsigned char)nLayerId); 2659 if( pLayer ) 2660 { 2661 mpObj->SetLayer((unsigned char)nLayerId); 2662 return true; 2663 } 2664 } 2665 break; 2666 } 2667 2668 case SDRATTR_LAYERNAME: 2669 { 2670 OUString aLayerName; 2671 if( rValue >>= aLayerName ) 2672 { 2673 const SdrLayer* pLayer=mpModel->GetLayerAdmin().GetLayer(aLayerName, sal_True); 2674 if( pLayer != NULL ) 2675 { 2676 mpObj->SetLayer( pLayer->GetID() ); 2677 return true; 2678 } 2679 } 2680 break; 2681 } 2682 case SDRATTR_ROTATEANGLE: 2683 { 2684 sal_Int32 nAngle = 0; 2685 if( rValue >>= nAngle ) 2686 { 2687 Point aRef1(mpObj->GetSnapRect().Center()); 2688 nAngle -= mpObj->GetRotateAngle(); 2689 if (nAngle!=0) 2690 { 2691 double nSin=sin(nAngle*nPi180); 2692 double nCos=cos(nAngle*nPi180); 2693 mpObj->Rotate(aRef1,nAngle,nSin,nCos); 2694 } 2695 return true; 2696 } 2697 2698 break; 2699 } 2700 2701 case SDRATTR_SHEARANGLE: 2702 { 2703 sal_Int32 nShear = 0; 2704 if( rValue >>= nShear ) 2705 { 2706 nShear -= mpObj->GetShearAngle(); 2707 if(nShear != 0 ) 2708 { 2709 Point aRef1(mpObj->GetSnapRect().Center()); 2710 double nTan=tan(nShear*nPi180); 2711 mpObj->Shear(aRef1,nShear,nTan,sal_False); 2712 return true; 2713 } 2714 } 2715 2716 break; 2717 } 2718 2719 case SDRATTR_OBJMOVEPROTECT: 2720 { 2721 sal_Bool bMoveProtect = sal_Bool(); 2722 if( rValue >>= bMoveProtect ) 2723 { 2724 mpObj->SetMoveProtect(bMoveProtect); 2725 return true; 2726 } 2727 break; 2728 } 2729 case SDRATTR_OBJECTNAME: 2730 { 2731 OUString aName; 2732 if( rValue >>= aName ) 2733 { 2734 mpObj->SetName( aName ); 2735 return true; 2736 } 2737 break; 2738 } 2739 2740 // #i68101# 2741 case OWN_ATTR_MISC_OBJ_TITLE: 2742 { 2743 OUString aTitle; 2744 if( rValue >>= aTitle ) 2745 { 2746 mpObj->SetTitle( aTitle ); 2747 return true; 2748 } 2749 break; 2750 } 2751 case OWN_ATTR_MISC_OBJ_DESCRIPTION: 2752 { 2753 OUString aDescription; 2754 if( rValue >>= aDescription ) 2755 { 2756 mpObj->SetDescription( aDescription ); 2757 return true; 2758 } 2759 break; 2760 } 2761 2762 case SDRATTR_OBJPRINTABLE: 2763 { 2764 sal_Bool bPrintable = sal_Bool(); 2765 if( rValue >>= bPrintable ) 2766 { 2767 mpObj->SetPrintable(bPrintable); 2768 return true; 2769 } 2770 break; 2771 } 2772 case SDRATTR_OBJVISIBLE: 2773 { 2774 sal_Bool bVisible = sal_Bool(); 2775 if( rValue >>= bVisible ) 2776 { 2777 mpObj->SetVisible(bVisible); 2778 return true; 2779 } 2780 break; 2781 } 2782 case SDRATTR_OBJSIZEPROTECT: 2783 { 2784 sal_Bool bResizeProtect = sal_Bool(); 2785 if( rValue >>= bResizeProtect ) 2786 { 2787 mpObj->SetResizeProtect(bResizeProtect); 2788 return true; 2789 } 2790 break; 2791 } 2792 case OWN_ATTR_PAGE_NUMBER: 2793 { 2794 sal_Int32 nPageNum = 0; 2795 if( (rValue >>= nPageNum) && ( nPageNum >= 0 ) && ( nPageNum <= 0xffff ) ) 2796 { 2797 SdrPageObj* pPageObj = dynamic_cast< SdrPageObj* >(mpObj.get()); 2798 if( pPageObj ) 2799 { 2800 SdrModel* pModel = pPageObj->GetModel(); 2801 SdrPage* pNewPage = 0L; 2802 const sal_uInt16 nDestinationPageNum((sal_uInt16)((nPageNum << 1L) - 1L)); 2803 2804 if(pModel) 2805 { 2806 if(nDestinationPageNum < pModel->GetPageCount()) 2807 { 2808 pNewPage = pModel->GetPage(nDestinationPageNum); 2809 } 2810 } 2811 2812 pPageObj->SetReferencedPage(pNewPage); 2813 } 2814 2815 return true; 2816 } 2817 break; 2818 } 2819 case XATTR_FILLBITMAP: 2820 case XATTR_FILLGRADIENT: 2821 case XATTR_FILLHATCH: 2822 case XATTR_FILLFLOATTRANSPARENCE: 2823 case XATTR_LINEEND: 2824 case XATTR_LINESTART: 2825 case XATTR_LINEDASH: 2826 { 2827 if( pProperty->nMemberId == MID_NAME ) 2828 { 2829 OUString aApiName; 2830 if( rValue >>= aApiName ) 2831 { 2832 if( SetFillAttribute( pProperty->nWID, aApiName ) ) 2833 return true; 2834 } 2835 break; 2836 } 2837 else 2838 { 2839 return false; 2840 } 2841 } 2842 default: 2843 { 2844 return false; 2845 } 2846 } 2847 throw lang::IllegalArgumentException(); 2848 } 2849 2850 //---------------------------------------------------------------------- 2851 2852 bool SvxShape::getPropertyValueImpl( const ::rtl::OUString&, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 2853 { 2854 switch( pProperty->nWID ) 2855 { 2856 /* 2857 case OWN_ATTR_HASLEVELS: 2858 { 2859 rValue <<= SvxTextEditSource::hasLevels( mpObj.get() ); 2860 break; 2861 } 2862 */ 2863 case OWN_ATTR_CAPTION_POINT: 2864 { 2865 Point aVclPoint = ((SdrCaptionObj*)mpObj.get())->GetTailPos(); 2866 2867 // #88491# make pos relative to anchor 2868 if( mpModel->IsWriter() ) 2869 { 2870 aVclPoint -= mpObj->GetAnchorPos(); 2871 } 2872 2873 // #88657# metric of pool maybe twips (writer) 2874 ForceMetricTo100th_mm(aVclPoint); 2875 2876 // #90763# pos is absolute, make it relative to top left 2877 basegfx::B2DPolyPolygon aNewPolyPolygon; 2878 basegfx::B2DHomMatrix aNewHomogenMatrix; 2879 mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); 2880 2881 aVclPoint.X() -= basegfx::fround(aNewHomogenMatrix.get(0, 2)); 2882 aVclPoint.Y() -= basegfx::fround(aNewHomogenMatrix.get(1, 2)); 2883 2884 awt::Point aPnt( aVclPoint.X(), aVclPoint.Y() ); 2885 rValue <<= aPnt; 2886 break; 2887 } 2888 2889 case OWN_ATTR_TRANSFORMATION: 2890 { 2891 basegfx::B2DPolyPolygon aNewPolyPolygon; 2892 basegfx::B2DHomMatrix aNewHomogenMatrix; 2893 mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); 2894 drawing::HomogenMatrix3 aMatrix; 2895 2896 aMatrix.Line1.Column1 = aNewHomogenMatrix.get(0, 0); 2897 aMatrix.Line1.Column2 = aNewHomogenMatrix.get(0, 1); 2898 aMatrix.Line1.Column3 = aNewHomogenMatrix.get(0, 2); 2899 aMatrix.Line2.Column1 = aNewHomogenMatrix.get(1, 0); 2900 aMatrix.Line2.Column2 = aNewHomogenMatrix.get(1, 1); 2901 aMatrix.Line2.Column3 = aNewHomogenMatrix.get(1, 2); 2902 aMatrix.Line3.Column1 = aNewHomogenMatrix.get(2, 0); 2903 aMatrix.Line3.Column2 = aNewHomogenMatrix.get(2, 1); 2904 aMatrix.Line3.Column3 = aNewHomogenMatrix.get(2, 2); 2905 2906 rValue <<= aMatrix; 2907 2908 break; 2909 } 2910 2911 case OWN_ATTR_ZORDER: 2912 { 2913 rValue <<= (sal_Int32)mpObj->GetOrdNum(); 2914 break; 2915 } 2916 2917 case OWN_ATTR_BITMAP: 2918 { 2919 rValue = GetBitmap(); 2920 if(!rValue.hasValue()) 2921 throw uno::RuntimeException(); 2922 2923 break; 2924 } 2925 2926 case OWN_ATTR_ISFONTWORK: 2927 { 2928 rValue <<= (sal_Bool)(mpObj->ISA(SdrTextObj) && ((SdrTextObj*)mpObj.get())->IsFontwork()); 2929 break; 2930 } 2931 2932 case OWN_ATTR_FRAMERECT: 2933 { 2934 Rectangle aRect( mpObj->GetSnapRect() ); 2935 Point aTopLeft( aRect.TopLeft() ); 2936 Size aObjSize( aRect.GetWidth(), aRect.GetHeight() ); 2937 ForceMetricTo100th_mm(aTopLeft); 2938 ForceMetricTo100th_mm(aObjSize); 2939 ::com::sun::star::awt::Rectangle aUnoRect( 2940 aTopLeft.X(), aTopLeft.Y(), 2941 aObjSize.getWidth(), aObjSize.getHeight() ); 2942 rValue <<= aUnoRect; 2943 break; 2944 } 2945 2946 case OWN_ATTR_BOUNDRECT: 2947 { 2948 Rectangle aRect( mpObj->GetCurrentBoundRect() ); 2949 Point aTopLeft( aRect.TopLeft() ); 2950 Size aObjSize( aRect.GetWidth(), aRect.GetHeight() ); 2951 ForceMetricTo100th_mm(aTopLeft); 2952 ForceMetricTo100th_mm(aObjSize); 2953 ::com::sun::star::awt::Rectangle aUnoRect( 2954 aTopLeft.X(), aTopLeft.Y(), 2955 aObjSize.getWidth(), aObjSize.getHeight() ); 2956 rValue <<= aUnoRect; 2957 break; 2958 } 2959 2960 case OWN_ATTR_LDNAME: 2961 { 2962 OUString aName( mpObj->GetName() ); 2963 rValue <<= aName; 2964 break; 2965 } 2966 2967 case OWN_ATTR_LDBITMAP: 2968 { 2969 sal_uInt16 nId; 2970 if( mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_OLE2 ) 2971 { 2972 nId = RID_UNODRAW_OLE2; 2973 } 2974 else if( mpObj->GetObjInventor() == SdrInventor && mpObj->GetObjIdentifier() == OBJ_GRAF ) 2975 { 2976 nId = RID_UNODRAW_GRAPHICS; 2977 } 2978 else 2979 { 2980 nId = RID_UNODRAW_OBJECTS; 2981 } 2982 2983 BitmapEx aBmp( SVX_RES(nId) ); 2984 Reference< awt::XBitmap > xBmp( VCLUnoHelper::CreateBitmap( aBmp ) ); 2985 2986 rValue <<= xBmp; 2987 break; 2988 } 2989 2990 case OWN_ATTR_MIRRORED: 2991 { 2992 sal_Bool bMirror = sal_False; 2993 if( mpObj.is() && mpObj->ISA(SdrGrafObj) ) 2994 bMirror = ((SdrGrafObj*)mpObj.get())->IsMirrored(); 2995 2996 rValue <<= bMirror; 2997 } 2998 2999 case OWN_ATTR_EDGE_START_OBJ: 3000 case OWN_ATTR_EDGE_START_POS: 3001 case OWN_ATTR_EDGE_END_POS: 3002 case OWN_ATTR_EDGE_END_OBJ: 3003 case OWN_ATTR_GLUEID_HEAD: 3004 case OWN_ATTR_GLUEID_TAIL: 3005 case OWN_ATTR_EDGE_POLYPOLYGONBEZIER: 3006 { 3007 SdrEdgeObj* pEdgeObj = dynamic_cast<SdrEdgeObj*>(mpObj.get()); 3008 if(pEdgeObj) 3009 { 3010 switch(pProperty->nWID) 3011 { 3012 case OWN_ATTR_EDGE_START_OBJ: 3013 case OWN_ATTR_EDGE_END_OBJ: 3014 { 3015 SdrObject* pNode = pEdgeObj->GetConnectedNode(pProperty->nWID == OWN_ATTR_EDGE_START_OBJ); 3016 if(pNode) 3017 { 3018 Reference< drawing::XShape > xShape( GetXShapeForSdrObject( pNode ) ); 3019 if(xShape.is()) 3020 rValue <<= xShape; 3021 3022 } 3023 break; 3024 } 3025 3026 case OWN_ATTR_EDGE_START_POS: 3027 case OWN_ATTR_EDGE_END_POS: 3028 { 3029 Point aPoint( pEdgeObj->GetTailPoint( pProperty->nWID == OWN_ATTR_EDGE_START_POS ) ); 3030 if( mpModel->IsWriter() ) 3031 aPoint -= mpObj->GetAnchorPos(); 3032 3033 ForceMetricTo100th_mm( aPoint ); 3034 awt::Point aUnoPoint( aPoint.X(), aPoint.Y() ); 3035 3036 rValue <<= aUnoPoint; 3037 break; 3038 } 3039 case OWN_ATTR_GLUEID_HEAD: 3040 case OWN_ATTR_GLUEID_TAIL: 3041 { 3042 rValue <<= pEdgeObj->getGluePointIndex( pProperty->nWID == OWN_ATTR_GLUEID_HEAD ); 3043 break; 3044 } 3045 case OWN_ATTR_EDGE_POLYPOLYGONBEZIER: 3046 { 3047 basegfx::B2DPolyPolygon aPolyPoly( pEdgeObj->GetEdgeTrackPath() ); 3048 if( mpModel->IsWriter() ) 3049 { 3050 Point aPoint( mpObj->GetAnchorPos() ); 3051 aPolyPoly.transform(basegfx::tools::createTranslateB2DHomMatrix(-aPoint.X(), -aPoint.Y())); 3052 } 3053 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue 59051 3054 ForceMetricTo100th_mm( aPolyPoly ); 3055 // <-- 3056 drawing::PolyPolygonBezierCoords aRetval; 3057 SvxConvertB2DPolyPolygonToPolyPolygonBezier( aPolyPoly, aRetval); 3058 rValue <<= aRetval; 3059 break; 3060 } 3061 } 3062 } 3063 break; 3064 } 3065 3066 case OWN_ATTR_MEASURE_START_POS: 3067 case OWN_ATTR_MEASURE_END_POS: 3068 { 3069 SdrMeasureObj* pMeasureObj = dynamic_cast<SdrMeasureObj*>(mpObj.get()); 3070 if(pMeasureObj) 3071 { 3072 Point aPoint( pMeasureObj->GetPoint( pProperty->nWID == OWN_ATTR_MEASURE_START_POS ? 0 : 1 ) ); 3073 if( mpModel->IsWriter() ) 3074 aPoint -= mpObj->GetAnchorPos(); 3075 3076 // --> OD 2010-02-19 #i108851# - reintroduction of fix for issue 59051 3077 ForceMetricTo100th_mm( aPoint ); 3078 // <-- 3079 awt::Point aUnoPoint( aPoint.X(), aPoint.Y() ); 3080 3081 rValue <<= aUnoPoint; 3082 break; 3083 } 3084 break; 3085 } 3086 3087 case OWN_ATTR_FILLBMP_MODE: 3088 { 3089 const SfxItemSet& rObjItemSet = mpObj->GetMergedItemSet(); 3090 3091 XFillBmpStretchItem* pStretchItem = (XFillBmpStretchItem*)&rObjItemSet.Get(XATTR_FILLBMP_STRETCH); 3092 XFillBmpTileItem* pTileItem = (XFillBmpTileItem*)&rObjItemSet.Get(XATTR_FILLBMP_TILE); 3093 3094 if( pTileItem && pTileItem->GetValue() ) 3095 { 3096 rValue <<= drawing::BitmapMode_REPEAT; 3097 } 3098 else if( pStretchItem && pStretchItem->GetValue() ) 3099 { 3100 rValue <<= drawing::BitmapMode_STRETCH; 3101 } 3102 else 3103 { 3104 rValue <<= drawing::BitmapMode_NO_REPEAT; 3105 } 3106 break; 3107 } 3108 case SDRATTR_LAYERID: 3109 rValue <<= (sal_Int16)mpObj->GetLayer(); 3110 break; 3111 3112 case SDRATTR_LAYERNAME: 3113 { 3114 SdrLayer* pLayer = mpModel->GetLayerAdmin().GetLayerPerID(mpObj->GetLayer()); 3115 if( pLayer ) 3116 { 3117 OUString aName( pLayer->GetName() ); 3118 rValue <<= aName; 3119 } 3120 break; 3121 } 3122 3123 case SDRATTR_ROTATEANGLE: 3124 rValue <<= mpObj->GetRotateAngle(); 3125 break; 3126 3127 case SDRATTR_SHEARANGLE: 3128 rValue <<= mpObj->GetShearAngle(); 3129 break; 3130 3131 case SDRATTR_OBJMOVEPROTECT: 3132 rValue = uno::makeAny( (sal_Bool) mpObj->IsMoveProtect() ); 3133 break; 3134 3135 case SDRATTR_OBJECTNAME: 3136 { 3137 OUString aName( mpObj->GetName() ); 3138 rValue <<= aName; 3139 break; 3140 } 3141 3142 // #i68101# 3143 case OWN_ATTR_MISC_OBJ_TITLE: 3144 { 3145 OUString aTitle( mpObj->GetTitle() ); 3146 rValue <<= aTitle; 3147 break; 3148 } 3149 3150 case OWN_ATTR_MISC_OBJ_DESCRIPTION: 3151 { 3152 OUString aDescription( mpObj->GetDescription() ); 3153 rValue <<= aDescription; 3154 break; 3155 } 3156 3157 case SDRATTR_OBJPRINTABLE: 3158 rValue <<= static_cast<sal_Bool>( mpObj->IsPrintable() ); 3159 break; 3160 3161 case SDRATTR_OBJVISIBLE: 3162 rValue <<= static_cast<sal_Bool>( mpObj->IsVisible() ); 3163 break; 3164 3165 case SDRATTR_OBJSIZEPROTECT: 3166 rValue <<= static_cast<sal_Bool>( mpObj->IsResizeProtect() ); 3167 break; 3168 3169 case OWN_ATTR_PAGE_NUMBER: 3170 { 3171 SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(mpObj.get()); 3172 if(pPageObj) 3173 { 3174 SdrPage* pPage = pPageObj->GetReferencedPage(); 3175 sal_Int32 nPageNumber = (pPage) ? pPage->GetPageNum() : 0L; 3176 nPageNumber++; 3177 nPageNumber >>= 1; 3178 rValue <<= nPageNumber; 3179 } 3180 break; 3181 } 3182 3183 case OWN_ATTR_UINAME_SINGULAR: 3184 { 3185 String aTmp; 3186 mpObj->TakeObjNameSingul( aTmp ); 3187 rValue <<= OUString( aTmp ); 3188 break; 3189 } 3190 3191 case OWN_ATTR_UINAME_PLURAL: 3192 { 3193 String aTmp; 3194 mpObj->TakeObjNamePlural( aTmp ); 3195 rValue <<= OUString( aTmp ); 3196 break; 3197 } 3198 case OWN_ATTR_METAFILE: 3199 { 3200 SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>(mpObj.get()); 3201 if( pObj ) 3202 { 3203 Graphic* pGraphic = pObj->GetGraphic(); 3204 if( pGraphic ) 3205 { 3206 sal_Bool bIsWMF = sal_False; 3207 if ( pGraphic->IsLink() ) 3208 { 3209 GfxLink aLnk = pGraphic->GetLink(); 3210 if ( aLnk.GetType() == GFX_LINK_TYPE_NATIVE_WMF ) 3211 { 3212 bIsWMF = sal_True; 3213 uno::Sequence<sal_Int8> aSeq((sal_Int8*)aLnk.GetData(), (sal_Int32) aLnk.GetDataSize()); 3214 rValue <<= aSeq; 3215 } 3216 } 3217 if ( !bIsWMF ) 3218 { 3219 GDIMetaFile aMtf; 3220 if ( pGraphic->GetType() != GRAPHIC_BITMAP ) 3221 aMtf = pObj->GetGraphic()->GetGDIMetaFile(); 3222 else 3223 { 3224 VirtualDevice aVirDev; 3225 aMtf.Record( &aVirDev ); 3226 pGraphic->Draw( &aVirDev, Point(), pGraphic->GetPrefSize() ); 3227 aMtf.Stop(); 3228 aMtf.SetPrefSize( pGraphic->GetPrefSize() ); 3229 aMtf.SetPrefMapMode( pGraphic->GetPrefMapMode() ); 3230 } 3231 SvMemoryStream aDestStrm( 65535, 65535 ); 3232 ConvertGDIMetaFileToWMF( aMtf, aDestStrm, NULL, sal_False ); 3233 const uno::Sequence<sal_Int8> aSeq( 3234 static_cast< const sal_Int8* >(aDestStrm.GetData()), 3235 aDestStrm.GetEndOfData()); 3236 rValue <<= aSeq; 3237 } 3238 } 3239 } 3240 else 3241 { 3242 rValue = GetBitmap( sal_True ); 3243 } 3244 break; 3245 } 3246 3247 3248 default: 3249 return false; 3250 } 3251 return true; 3252 } 3253 3254 //---------------------------------------------------------------------- 3255 3256 bool SvxShape::getPropertyStateImpl( const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::beans::PropertyState& rState ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException) 3257 { 3258 if( pProperty->nWID == OWN_ATTR_FILLBMP_MODE ) 3259 { 3260 const SfxItemSet& rSet = mpObj->GetMergedItemSet(); 3261 3262 if( rSet.GetItemState( XATTR_FILLBMP_STRETCH, false ) == SFX_ITEM_SET || 3263 rSet.GetItemState( XATTR_FILLBMP_TILE, false ) == SFX_ITEM_SET ) 3264 { 3265 rState = beans::PropertyState_DIRECT_VALUE; 3266 } 3267 else 3268 { 3269 rState = beans::PropertyState_AMBIGUOUS_VALUE; 3270 } 3271 } 3272 else if((( pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID <= OWN_ATTR_VALUE_END ) || 3273 ( pProperty->nWID >= SDRATTR_NOTPERSIST_FIRST && pProperty->nWID <= SDRATTR_NOTPERSIST_LAST )) && ( pProperty->nWID != SDRATTR_TEXTDIRECTION ) ) 3274 { 3275 rState = beans::PropertyState_DIRECT_VALUE; 3276 } 3277 else 3278 { 3279 return false; 3280 } 3281 3282 return true; 3283 } 3284 3285 //---------------------------------------------------------------------- 3286 3287 bool SvxShape::setPropertyToDefaultImpl( const SfxItemPropertySimpleEntry* pProperty ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException) 3288 { 3289 if( pProperty->nWID == OWN_ATTR_FILLBMP_MODE ) 3290 { 3291 mpObj->ClearMergedItem( XATTR_FILLBMP_STRETCH ); 3292 mpObj->ClearMergedItem( XATTR_FILLBMP_TILE ); 3293 return true; 3294 } 3295 else if((pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID <= OWN_ATTR_VALUE_END ) || 3296 ( pProperty->nWID >= SDRATTR_NOTPERSIST_FIRST && pProperty->nWID <= SDRATTR_NOTPERSIST_LAST )) 3297 { 3298 return true; 3299 } 3300 else 3301 { 3302 return false; 3303 } 3304 } 3305 3306 //---------------------------------------------------------------------- 3307 3308 uno::Sequence< beans::PropertyState > SAL_CALL SvxShape::getPropertyStates( const uno::Sequence< OUString >& aPropertyName ) 3309 throw(beans::UnknownPropertyException, uno::RuntimeException) 3310 { 3311 const sal_Int32 nCount = aPropertyName.getLength(); 3312 const OUString* pNames = aPropertyName.getConstArray(); 3313 3314 uno::Sequence< beans::PropertyState > aRet( nCount ); 3315 beans::PropertyState* pState = aRet.getArray(); 3316 3317 if( mpImpl->mpMaster ) 3318 { 3319 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++ ) 3320 pState[nIdx] = getPropertyState( pNames[nIdx] ); 3321 3322 } 3323 else 3324 { 3325 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++ ) 3326 pState[nIdx] = getPropertyState( pNames[nIdx] ); 3327 } 3328 3329 return aRet; 3330 } 3331 3332 //---------------------------------------------------------------------- 3333 3334 void SAL_CALL SvxShape::setPropertyToDefault( const OUString& PropertyName ) 3335 throw(beans::UnknownPropertyException, uno::RuntimeException) 3336 { 3337 if( mpImpl->mpMaster ) 3338 { 3339 mpImpl->mpMaster->setPropertyToDefault( PropertyName ); 3340 } 3341 else 3342 { 3343 _setPropertyToDefault( PropertyName ); 3344 } 3345 } 3346 3347 void SAL_CALL SvxShape::_setPropertyToDefault( const OUString& PropertyName ) 3348 throw(beans::UnknownPropertyException, uno::RuntimeException) 3349 { 3350 OGuard aGuard( Application::GetSolarMutex() ); 3351 3352 const SfxItemPropertySimpleEntry* pProperty = mpPropSet->getPropertyMapEntry(PropertyName); 3353 3354 if( !mpObj.is() || mpModel == NULL || pProperty == NULL ) 3355 throw beans::UnknownPropertyException(); 3356 3357 if( !setPropertyToDefaultImpl( pProperty ) ) 3358 { 3359 mpObj->ClearMergedItem( pProperty->nWID ); 3360 } 3361 3362 mpModel->SetChanged(); 3363 } 3364 3365 //---------------------------------------------------------------------- 3366 3367 uno::Any SAL_CALL SvxShape::getPropertyDefault( const OUString& aPropertyName ) 3368 throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 3369 { 3370 if( mpImpl->mpMaster ) 3371 { 3372 return mpImpl->mpMaster->getPropertyDefault( aPropertyName ); 3373 } 3374 else 3375 { 3376 return _getPropertyDefault( aPropertyName ); 3377 } 3378 } 3379 3380 uno::Any SAL_CALL SvxShape::_getPropertyDefault( const OUString& aPropertyName ) 3381 throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 3382 { 3383 OGuard aGuard( Application::GetSolarMutex() ); 3384 3385 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(aPropertyName); 3386 3387 if( !mpObj.is() || pMap == NULL || mpModel == NULL ) 3388 throw beans::UnknownPropertyException(); 3389 3390 if(( pMap->nWID >= OWN_ATTR_VALUE_START && pMap->nWID <= OWN_ATTR_VALUE_END ) || 3391 ( pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST )) 3392 { 3393 return getPropertyValue( aPropertyName ); 3394 } 3395 3396 // Default aus ItemPool holen 3397 if(!mpModel->GetItemPool().IsWhich(pMap->nWID)) 3398 throw beans::UnknownPropertyException(); 3399 3400 SfxItemSet aSet( mpModel->GetItemPool(), pMap->nWID, pMap->nWID); 3401 aSet.Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID)); 3402 3403 return GetAnyForItem( aSet, pMap ); 3404 } 3405 3406 // XMultiPropertyStates 3407 void SvxShape::setAllPropertiesToDefault() throw (uno::RuntimeException) 3408 { 3409 OGuard aGuard( Application::GetSolarMutex() ); 3410 3411 if( !mpObj.is() ) 3412 throw lang::DisposedException(); 3413 mpObj->ClearMergedItem(); // nWhich == 0 => all 3414 3415 if(mpObj->ISA(SdrGrafObj)) 3416 { 3417 // defaults for graphic objects have changed: 3418 mpObj->SetMergedItem( XFillStyleItem( XFILL_NONE ) ); 3419 mpObj->SetMergedItem( XLineStyleItem( XLINE_NONE ) ); 3420 } 3421 3422 // #i68523# special handling for Svx3DCharacterModeItem, this is not saved 3423 // but needs to be sal_True in svx, pool default (false) in sch. Since sch 3424 // does not load lathe or extrude objects, it is possible to set the items 3425 // here. 3426 // For other solution possibilities, see task description. 3427 if(mpObj->ISA(E3dLatheObj) || mpObj->ISA(E3dExtrudeObj)) 3428 { 3429 mpObj->SetMergedItem(Svx3DCharacterModeItem(true)); 3430 } 3431 3432 mpModel->SetChanged(); 3433 } 3434 3435 void SvxShape::setPropertiesToDefault( 3436 const uno::Sequence<OUString>& aPropertyNames ) 3437 throw (beans::UnknownPropertyException, uno::RuntimeException) 3438 { 3439 for ( sal_Int32 pos = 0; pos < aPropertyNames.getLength(); ++pos ) 3440 setPropertyToDefault( aPropertyNames[pos] ); 3441 } 3442 3443 uno::Sequence<uno::Any> SvxShape::getPropertyDefaults( 3444 const uno::Sequence<OUString>& aPropertyNames ) 3445 throw (beans::UnknownPropertyException, lang::WrappedTargetException, 3446 uno::RuntimeException) 3447 { 3448 ::std::vector<uno::Any> ret; 3449 for ( sal_Int32 pos = 0; pos < aPropertyNames.getLength(); ++pos ) 3450 ret.push_back( getPropertyDefault( aPropertyNames[pos] ) ); 3451 return uno::Sequence<uno::Any>( &ret[0], ret.size() ); 3452 } 3453 3454 //---------------------------------------------------------------------- 3455 3456 //---------------------------------------------------------------------- 3457 // XServiceInfo 3458 //---------------------------------------------------------------------- 3459 OUString SAL_CALL SvxShape::getImplementationName() 3460 throw(uno::RuntimeException) 3461 { 3462 static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM("SvxShape") ); 3463 return aServiceName; 3464 } 3465 3466 #define STAR_NAMESPACE "com.sun.star." 3467 3468 const char* sUNO_service_style_ParagraphProperties = STAR_NAMESPACE "style.ParagraphProperties"; 3469 const char* sUNO_service_style_ParagraphPropertiesComplex = STAR_NAMESPACE "style.ParagraphPropertiesComplex"; 3470 const char* sUNO_service_style_ParagraphPropertiesAsian = STAR_NAMESPACE "style.ParagraphPropertiesAsian"; 3471 const char* sUNO_service_style_CharacterProperties = STAR_NAMESPACE "style.CharacterProperties"; 3472 const char* sUNO_service_style_CharacterPropertiesComplex = STAR_NAMESPACE "style.CharacterPropertiesComplex"; 3473 const char* sUNO_service_style_CharacterPropertiesAsian = STAR_NAMESPACE "style.CharacterPropertiesAsian"; 3474 3475 const char* sUNO_service_drawing_FillProperties = STAR_NAMESPACE "drawing.FillProperties"; 3476 const char* sUNO_service_drawing_TextProperties = STAR_NAMESPACE "drawing.TextProperties"; 3477 const char* sUNO_service_drawing_LineProperties = STAR_NAMESPACE "drawing.LineProperties"; 3478 const char* sUNO_service_drawing_ConnectorProperties = STAR_NAMESPACE "drawing.ConnectorProperties"; 3479 const char* sUNO_service_drawing_MeasureProperties = STAR_NAMESPACE "drawing.MeasureProperties"; 3480 const char* sUNO_service_drawing_ShadowProperties = STAR_NAMESPACE "drawing.ShadowProperties"; 3481 3482 const char* sUNO_service_drawing_RotationDescriptor = STAR_NAMESPACE "drawing.RotationDescriptor"; 3483 3484 const char* sUNO_service_drawing_Text = STAR_NAMESPACE "drawing.Text"; 3485 const char* sUNO_service_drawing_GroupShape = STAR_NAMESPACE "drawing.GroupShape"; 3486 3487 const char* sUNO_service_drawing_CustomShapeProperties = STAR_NAMESPACE "drawing.CustomShapeProperties"; 3488 const char* sUNO_service_drawing_CustomShape = STAR_NAMESPACE "drawing.CustomShape"; 3489 3490 const char* sUNO_service_drawing_PolyPolygonDescriptor = STAR_NAMESPACE "drawing.PolyPolygonDescriptor"; 3491 const char* sUNO_service_drawing_PolyPolygonBezierDescriptor= STAR_NAMESPACE "drawing.PolyPolygonBezierDescriptor"; 3492 3493 const char* sUNO_service_drawing_LineShape = STAR_NAMESPACE "drawing.LineShape"; 3494 const char* sUNO_service_drawing_Shape = STAR_NAMESPACE "drawing.Shape"; 3495 const char* sUNO_service_drawing_RectangleShape = STAR_NAMESPACE "drawing.RectangleShape"; 3496 const char* sUNO_service_drawing_EllipseShape = STAR_NAMESPACE "drawing.EllipseShape"; 3497 const char* sUNO_service_drawing_PolyPolygonShape = STAR_NAMESPACE "drawing.PolyPolygonShape"; 3498 const char* sUNO_service_drawing_PolyLineShape = STAR_NAMESPACE "drawing.PolyLineShape"; 3499 const char* sUNO_service_drawing_OpenBezierShape = STAR_NAMESPACE "drawing.OpenBezierShape"; 3500 const char* sUNO_service_drawing_ClosedBezierShape = STAR_NAMESPACE "drawing.ClosedBezierShape"; 3501 const char* sUNO_service_drawing_TextShape = STAR_NAMESPACE "drawing.TextShape"; 3502 const char* sUNO_service_drawing_GraphicObjectShape = STAR_NAMESPACE "drawing.GraphicObjectShape"; 3503 const char* sUNO_service_drawing_OLE2Shape = STAR_NAMESPACE "drawing.OLE2Shape"; 3504 const char* sUNO_service_drawing_PageShape = STAR_NAMESPACE "drawing.PageShape"; 3505 const char* sUNO_service_drawing_CaptionShape = STAR_NAMESPACE "drawing.CaptionShape"; 3506 const char* sUNO_service_drawing_MeasureShape = STAR_NAMESPACE "drawing.MeasureShape"; 3507 const char* sUNO_service_drawing_FrameShape = STAR_NAMESPACE "drawing.FrameShape"; 3508 const char* sUNO_service_drawing_ControlShape = STAR_NAMESPACE "drawing.ControlShape"; 3509 const char* sUNO_service_drawing_ConnectorShape = STAR_NAMESPACE "drawing.ConnectorShape"; 3510 const char* sUNO_service_drawing_MediaShape = STAR_NAMESPACE "drawing.MediaShape"; 3511 3512 3513 uno::Sequence< OUString > SAL_CALL SvxShape::getSupportedServiceNames() 3514 throw(uno::RuntimeException) 3515 { 3516 if( mpImpl->mpMaster ) 3517 { 3518 return mpImpl->mpMaster->getSupportedServiceNames(); 3519 } 3520 else 3521 { 3522 return _getSupportedServiceNames(); 3523 } 3524 } 3525 3526 uno::Sequence< OUString > SAL_CALL SvxShape::_getSupportedServiceNames() 3527 throw(uno::RuntimeException) 3528 { 3529 OGuard aGuard( Application::GetSolarMutex() ); 3530 3531 if( mpObj.is() && mpObj->GetObjInventor() == SdrInventor) 3532 { 3533 const sal_uInt16 nIdent = mpObj->GetObjIdentifier(); 3534 3535 switch(nIdent) 3536 { 3537 case OBJ_GRUP: 3538 { 3539 static uno::Sequence< OUString > *pSeq = 0; 3540 if( 0 == pSeq ) 3541 { 3542 // OGuard aGuard( Application::GetSolarMutex() ); 3543 // if( 0 == pSeq ) 3544 { 3545 static uno::Sequence< OUString > SvxShape_GroupServices; 3546 3547 comphelper::ServiceInfoHelper::addToSequence( SvxShape_GroupServices, 2, 3548 sUNO_service_drawing_GroupShape, 3549 sUNO_service_drawing_Shape ); 3550 3551 pSeq = &SvxShape_GroupServices; 3552 } 3553 } 3554 3555 return *pSeq; 3556 } 3557 case OBJ_CUSTOMSHAPE: 3558 { 3559 static uno::Sequence< OUString > *pSeq = 0; 3560 if( 0 == pSeq ) 3561 { 3562 // OGuard aGuard( Application::GetSolarMutex() ); 3563 // if( 0 == pSeq ) 3564 { 3565 static uno::Sequence< OUString > SvxShape_CustomShapeServices; 3566 3567 comphelper::ServiceInfoHelper::addToSequence( SvxShape_CustomShapeServices, 13, 3568 sUNO_service_drawing_CustomShape, 3569 sUNO_service_drawing_Shape, 3570 sUNO_service_drawing_CustomShapeProperties, 3571 sUNO_service_drawing_FillProperties, 3572 sUNO_service_drawing_LineProperties, 3573 sUNO_service_drawing_Text, 3574 sUNO_service_drawing_TextProperties, 3575 sUNO_service_style_ParagraphProperties, 3576 sUNO_service_style_ParagraphPropertiesComplex, 3577 sUNO_service_style_ParagraphPropertiesAsian, 3578 sUNO_service_style_CharacterProperties, 3579 sUNO_service_style_CharacterPropertiesComplex, 3580 sUNO_service_style_CharacterPropertiesAsian, 3581 sUNO_service_drawing_ShadowProperties, 3582 sUNO_service_drawing_RotationDescriptor); 3583 pSeq = &SvxShape_CustomShapeServices; 3584 } 3585 } 3586 return *pSeq; 3587 } 3588 case OBJ_LINE: 3589 { 3590 static uno::Sequence< OUString > *pSeq = 0; 3591 if( 0 == pSeq ) 3592 { 3593 // OGuard aGuard( Application::GetSolarMutex() ); 3594 // if( 0 == pSeq ) 3595 { 3596 static uno::Sequence< OUString > SvxShape_LineServices; 3597 3598 comphelper::ServiceInfoHelper::addToSequence( SvxShape_LineServices,14, 3599 sUNO_service_drawing_LineShape, 3600 3601 sUNO_service_drawing_Shape, 3602 sUNO_service_drawing_LineProperties, 3603 3604 sUNO_service_drawing_Text, 3605 sUNO_service_drawing_TextProperties, 3606 sUNO_service_style_ParagraphProperties, 3607 sUNO_service_style_ParagraphPropertiesComplex, 3608 sUNO_service_style_ParagraphPropertiesAsian, 3609 sUNO_service_style_CharacterProperties, 3610 sUNO_service_style_CharacterPropertiesComplex, 3611 sUNO_service_style_CharacterPropertiesAsian, 3612 3613 sUNO_service_drawing_PolyPolygonDescriptor, 3614 sUNO_service_drawing_ShadowProperties, 3615 sUNO_service_drawing_RotationDescriptor); 3616 3617 pSeq = &SvxShape_LineServices; 3618 } 3619 } 3620 return *pSeq; 3621 } 3622 3623 case OBJ_RECT: 3624 { 3625 static uno::Sequence< OUString > *pSeq = 0; 3626 if( 0 == pSeq ) 3627 { 3628 // OGuard aGuard( Application::GetSolarMutex() ); 3629 // if( 0 == pSeq ) 3630 { 3631 static uno::Sequence< OUString > SvxShape_RectServices; 3632 3633 comphelper::ServiceInfoHelper::addToSequence( SvxShape_RectServices,14, 3634 sUNO_service_drawing_RectangleShape, 3635 3636 sUNO_service_drawing_Shape, 3637 sUNO_service_drawing_FillProperties, 3638 sUNO_service_drawing_LineProperties, 3639 sUNO_service_drawing_Text, 3640 sUNO_service_drawing_TextProperties, 3641 sUNO_service_style_ParagraphProperties, 3642 sUNO_service_style_ParagraphPropertiesComplex, 3643 sUNO_service_style_ParagraphPropertiesAsian, 3644 sUNO_service_style_CharacterProperties, 3645 sUNO_service_style_CharacterPropertiesComplex, 3646 sUNO_service_style_CharacterPropertiesAsian, 3647 3648 sUNO_service_drawing_ShadowProperties, 3649 sUNO_service_drawing_RotationDescriptor); 3650 pSeq = &SvxShape_RectServices; 3651 } 3652 3653 } 3654 return *pSeq; 3655 } 3656 3657 case OBJ_CIRC: 3658 case OBJ_SECT: 3659 case OBJ_CARC: 3660 case OBJ_CCUT: 3661 { 3662 static uno::Sequence< OUString > *pSeq = 0; 3663 if( 0 == pSeq ) 3664 { 3665 // OGuard aGuard( Application::GetSolarMutex() ); 3666 // if( 0 == pSeq ) 3667 { 3668 static uno::Sequence< OUString > SvxShape_CircServices; 3669 3670 comphelper::ServiceInfoHelper::addToSequence( SvxShape_CircServices,14, 3671 sUNO_service_drawing_EllipseShape, 3672 3673 sUNO_service_drawing_Shape, 3674 sUNO_service_drawing_FillProperties, 3675 sUNO_service_drawing_LineProperties, 3676 3677 sUNO_service_drawing_Text, 3678 sUNO_service_drawing_TextProperties, 3679 sUNO_service_style_ParagraphProperties, 3680 sUNO_service_style_ParagraphPropertiesComplex, 3681 sUNO_service_style_ParagraphPropertiesAsian, 3682 sUNO_service_style_CharacterProperties, 3683 sUNO_service_style_CharacterPropertiesComplex, 3684 sUNO_service_style_CharacterPropertiesAsian, 3685 3686 sUNO_service_drawing_ShadowProperties, 3687 sUNO_service_drawing_RotationDescriptor); 3688 3689 pSeq = &SvxShape_CircServices; 3690 } 3691 } 3692 3693 return *pSeq; 3694 } 3695 3696 case OBJ_PATHPLIN: 3697 case OBJ_PLIN: 3698 { 3699 static uno::Sequence< OUString > *pSeq = 0; 3700 if( 0 == pSeq ) 3701 { 3702 // OGuard aGuard( Application::GetSolarMutex() ); 3703 // if( 0 == pSeq ) 3704 { 3705 static uno::Sequence< OUString > SvxShape_PathServices; 3706 comphelper::ServiceInfoHelper::addToSequence( SvxShape_PathServices,14, 3707 sUNO_service_drawing_PolyLineShape, 3708 3709 sUNO_service_drawing_Shape, 3710 sUNO_service_drawing_LineProperties, 3711 3712 sUNO_service_drawing_PolyPolygonDescriptor, 3713 3714 sUNO_service_drawing_Text, 3715 sUNO_service_drawing_TextProperties, 3716 sUNO_service_style_ParagraphProperties, 3717 sUNO_service_style_ParagraphPropertiesComplex, 3718 sUNO_service_style_ParagraphPropertiesAsian, 3719 sUNO_service_style_CharacterProperties, 3720 sUNO_service_style_CharacterPropertiesComplex, 3721 sUNO_service_style_CharacterPropertiesAsian, 3722 3723 sUNO_service_drawing_ShadowProperties, 3724 sUNO_service_drawing_RotationDescriptor); 3725 pSeq = &SvxShape_PathServices; 3726 } 3727 } 3728 return *pSeq; 3729 } 3730 3731 case OBJ_PATHPOLY: 3732 case OBJ_POLY: 3733 { 3734 static uno::Sequence< OUString > *pSeq = 0; 3735 if( 0 == pSeq ) 3736 { 3737 // OGuard aGuard( Application::GetSolarMutex() ); 3738 // if( 0 == pSeq ) 3739 { 3740 static uno::Sequence< OUString > SvxShape_PolyServices; 3741 comphelper::ServiceInfoHelper::addToSequence( SvxShape_PolyServices,15, 3742 sUNO_service_drawing_PolyPolygonShape, 3743 3744 sUNO_service_drawing_Shape, 3745 sUNO_service_drawing_LineProperties, 3746 sUNO_service_drawing_FillProperties, 3747 3748 sUNO_service_drawing_PolyPolygonDescriptor, 3749 3750 sUNO_service_drawing_Text, 3751 sUNO_service_drawing_TextProperties, 3752 sUNO_service_style_ParagraphProperties, 3753 sUNO_service_style_ParagraphPropertiesComplex, 3754 sUNO_service_style_ParagraphPropertiesAsian, 3755 sUNO_service_style_CharacterProperties, 3756 sUNO_service_style_CharacterPropertiesComplex, 3757 sUNO_service_style_CharacterPropertiesAsian, 3758 3759 sUNO_service_drawing_ShadowProperties, 3760 sUNO_service_drawing_RotationDescriptor); 3761 3762 pSeq = &SvxShape_PolyServices; 3763 } 3764 } 3765 return *pSeq; 3766 } 3767 3768 case OBJ_FREELINE: 3769 case OBJ_PATHLINE: 3770 { 3771 static uno::Sequence< OUString > *pSeq = 0; 3772 if( 0 == pSeq ) 3773 { 3774 // OGuard aGuard( Application::GetSolarMutex() ); 3775 // if( 0 == pSeq ) 3776 { 3777 static uno::Sequence< OUString > SvxShape_FreeLineServices; 3778 3779 comphelper::ServiceInfoHelper::addToSequence( SvxShape_FreeLineServices,15, 3780 sUNO_service_drawing_OpenBezierShape, 3781 3782 sUNO_service_drawing_Shape, 3783 sUNO_service_drawing_LineProperties, 3784 sUNO_service_drawing_FillProperties, 3785 3786 sUNO_service_drawing_PolyPolygonBezierDescriptor, 3787 3788 sUNO_service_drawing_Text, 3789 sUNO_service_drawing_TextProperties, 3790 sUNO_service_style_ParagraphProperties, 3791 sUNO_service_style_ParagraphPropertiesComplex, 3792 sUNO_service_style_ParagraphPropertiesAsian, 3793 sUNO_service_style_CharacterProperties, 3794 sUNO_service_style_CharacterPropertiesComplex, 3795 sUNO_service_style_CharacterPropertiesAsian, 3796 3797 sUNO_service_drawing_ShadowProperties, 3798 sUNO_service_drawing_RotationDescriptor); 3799 3800 pSeq = &SvxShape_FreeLineServices; 3801 } 3802 } 3803 3804 return *pSeq; 3805 } 3806 3807 case OBJ_FREEFILL: 3808 case OBJ_PATHFILL: 3809 { 3810 static uno::Sequence< OUString > *pSeq = 0; 3811 if( 0 == pSeq ) 3812 { 3813 // OGuard aGuard( Application::GetSolarMutex() ); 3814 // if( 0 == pSeq ) 3815 { 3816 static uno::Sequence< OUString > SvxShape_FreeFillServices; 3817 comphelper::ServiceInfoHelper::addToSequence( SvxShape_FreeFillServices,15, 3818 sUNO_service_drawing_ClosedBezierShape, 3819 3820 sUNO_service_drawing_Shape, 3821 sUNO_service_drawing_LineProperties, 3822 sUNO_service_drawing_FillProperties, 3823 3824 sUNO_service_drawing_PolyPolygonBezierDescriptor, 3825 3826 sUNO_service_drawing_Text, 3827 sUNO_service_drawing_TextProperties, 3828 sUNO_service_style_ParagraphProperties, 3829 sUNO_service_style_ParagraphPropertiesComplex, 3830 sUNO_service_style_ParagraphPropertiesAsian, 3831 sUNO_service_style_CharacterProperties, 3832 sUNO_service_style_CharacterPropertiesComplex, 3833 sUNO_service_style_CharacterPropertiesAsian, 3834 3835 sUNO_service_drawing_ShadowProperties, 3836 sUNO_service_drawing_RotationDescriptor); 3837 3838 pSeq = &SvxShape_FreeFillServices; 3839 } 3840 } 3841 return *pSeq; 3842 } 3843 3844 case OBJ_OUTLINETEXT: 3845 case OBJ_TITLETEXT: 3846 case OBJ_TEXT: 3847 { 3848 static uno::Sequence< OUString > *pSeq = 0; 3849 if( 0 == pSeq ) 3850 { 3851 // OGuard aGuard( Application::GetSolarMutex() ); 3852 // if( 0 == pSeq ) 3853 { 3854 static uno::Sequence< OUString > SvxShape_TextServices; 3855 comphelper::ServiceInfoHelper::addToSequence( SvxShape_TextServices,14, 3856 sUNO_service_drawing_TextShape, 3857 3858 sUNO_service_drawing_Shape, 3859 sUNO_service_drawing_FillProperties, 3860 sUNO_service_drawing_LineProperties, 3861 3862 sUNO_service_drawing_Text, 3863 sUNO_service_drawing_TextProperties, 3864 sUNO_service_style_ParagraphProperties, 3865 sUNO_service_style_ParagraphPropertiesComplex, 3866 sUNO_service_style_ParagraphPropertiesAsian, 3867 sUNO_service_style_CharacterProperties, 3868 sUNO_service_style_CharacterPropertiesComplex, 3869 sUNO_service_style_CharacterPropertiesAsian, 3870 3871 sUNO_service_drawing_ShadowProperties, 3872 sUNO_service_drawing_RotationDescriptor); 3873 3874 pSeq = &SvxShape_TextServices; 3875 } 3876 } 3877 return *pSeq; 3878 } 3879 3880 case OBJ_GRAF: 3881 { 3882 static uno::Sequence< OUString > *pSeq = 0; 3883 if( 0 == pSeq ) 3884 { 3885 // OGuard aGuard( Application::GetSolarMutex() ); 3886 // if( 0 == pSeq ) 3887 { 3888 static uno::Sequence< OUString > SvxShape_GrafServices; 3889 comphelper::ServiceInfoHelper::addToSequence( SvxShape_GrafServices, 12, 3890 sUNO_service_drawing_GraphicObjectShape, 3891 3892 sUNO_service_drawing_Shape, 3893 3894 sUNO_service_drawing_Text, 3895 sUNO_service_drawing_TextProperties, 3896 sUNO_service_style_ParagraphProperties, 3897 sUNO_service_style_ParagraphPropertiesComplex, 3898 sUNO_service_style_ParagraphPropertiesAsian, 3899 sUNO_service_style_CharacterProperties, 3900 sUNO_service_style_CharacterPropertiesComplex, 3901 sUNO_service_style_CharacterPropertiesAsian, 3902 3903 sUNO_service_drawing_ShadowProperties, 3904 sUNO_service_drawing_RotationDescriptor); 3905 3906 pSeq = &SvxShape_GrafServices; 3907 } 3908 } 3909 return *pSeq; 3910 } 3911 3912 case OBJ_OLE2: 3913 { 3914 static uno::Sequence< OUString > *pSeq = 0; 3915 if( 0 == pSeq ) 3916 { 3917 // OGuard aGuard( Application::GetSolarMutex() ); 3918 // if( 0 == pSeq ) 3919 { 3920 static uno::Sequence< OUString > SvxShape_Ole2Services; 3921 3922 comphelper::ServiceInfoHelper::addToSequence( SvxShape_Ole2Services, 2, 3923 sUNO_service_drawing_OLE2Shape, 3924 sUNO_service_drawing_Shape, 3925 3926 // #i118485# Added Text, Shadow and Rotation 3927 sUNO_service_drawing_Text, 3928 sUNO_service_drawing_TextProperties, 3929 sUNO_service_style_ParagraphProperties, 3930 sUNO_service_style_ParagraphPropertiesComplex, 3931 sUNO_service_style_ParagraphPropertiesAsian, 3932 sUNO_service_style_CharacterProperties, 3933 sUNO_service_style_CharacterPropertiesComplex, 3934 sUNO_service_style_CharacterPropertiesAsian, 3935 3936 sUNO_service_drawing_ShadowProperties, 3937 sUNO_service_drawing_RotationDescriptor); 3938 3939 pSeq = &SvxShape_Ole2Services; 3940 } 3941 } 3942 return *pSeq; 3943 } 3944 3945 case OBJ_CAPTION: 3946 { 3947 static uno::Sequence< OUString > *pSeq = 0; 3948 if( 0 == pSeq ) 3949 { 3950 // OGuard aGuard( Application::GetSolarMutex() ); 3951 // if( 0 == pSeq ) 3952 { 3953 static uno::Sequence< OUString > SvxShape_CaptionServices; 3954 3955 comphelper::ServiceInfoHelper::addToSequence( SvxShape_CaptionServices,14, 3956 sUNO_service_drawing_CaptionShape, 3957 3958 sUNO_service_drawing_Shape, 3959 sUNO_service_drawing_FillProperties, 3960 sUNO_service_drawing_LineProperties, 3961 3962 sUNO_service_drawing_Text, 3963 sUNO_service_drawing_TextProperties, 3964 sUNO_service_style_ParagraphProperties, 3965 sUNO_service_style_ParagraphPropertiesComplex, 3966 sUNO_service_style_ParagraphPropertiesAsian, 3967 sUNO_service_style_CharacterProperties, 3968 sUNO_service_style_CharacterPropertiesComplex, 3969 sUNO_service_style_CharacterPropertiesAsian, 3970 3971 sUNO_service_drawing_ShadowProperties, 3972 sUNO_service_drawing_RotationDescriptor); 3973 3974 pSeq = &SvxShape_CaptionServices; 3975 } 3976 } 3977 3978 return *pSeq; 3979 } 3980 3981 case OBJ_PAGE: 3982 { 3983 static uno::Sequence< OUString > *pSeq = 0; 3984 if( 0 == pSeq ) 3985 { 3986 // OGuard aGuard( Application::GetSolarMutex() ); 3987 // if( 0 == pSeq ) 3988 { 3989 static uno::Sequence< OUString > SvxShape_PageServices; 3990 3991 comphelper::ServiceInfoHelper::addToSequence( SvxShape_PageServices, 2, 3992 sUNO_service_drawing_PageShape, 3993 sUNO_service_drawing_Shape ); 3994 3995 pSeq = &SvxShape_PageServices; 3996 } 3997 } 3998 3999 return *pSeq; 4000 } 4001 4002 case OBJ_MEASURE: 4003 { 4004 static uno::Sequence< OUString > *pSeq = 0; 4005 if( 0 == pSeq ) 4006 { 4007 // OGuard aGuard( Application::GetSolarMutex() ); 4008 // if( 0 == pSeq ) 4009 { 4010 static uno::Sequence< OUString > SvxShape_MeasureServices; 4011 comphelper::ServiceInfoHelper::addToSequence( SvxShape_MeasureServices,15, 4012 sUNO_service_drawing_MeasureShape, 4013 4014 sUNO_service_drawing_MeasureProperties, 4015 4016 sUNO_service_drawing_Shape, 4017 sUNO_service_drawing_LineProperties, 4018 4019 sUNO_service_drawing_Text, 4020 sUNO_service_drawing_TextProperties, 4021 sUNO_service_style_ParagraphProperties, 4022 sUNO_service_style_ParagraphPropertiesComplex, 4023 sUNO_service_style_ParagraphPropertiesAsian, 4024 sUNO_service_style_CharacterProperties, 4025 sUNO_service_style_CharacterPropertiesComplex, 4026 sUNO_service_style_CharacterPropertiesAsian, 4027 4028 sUNO_service_drawing_PolyPolygonDescriptor, 4029 sUNO_service_drawing_ShadowProperties, 4030 sUNO_service_drawing_RotationDescriptor); 4031 4032 pSeq = &SvxShape_MeasureServices; 4033 } 4034 } 4035 4036 return *pSeq; 4037 } 4038 4039 case OBJ_FRAME: 4040 { 4041 static uno::Sequence< OUString > *pSeq = 0; 4042 if( 0 == pSeq ) 4043 { 4044 // OGuard aGuard( Application::GetSolarMutex() ); 4045 // if( 0 == pSeq ) 4046 { 4047 static uno::Sequence< OUString > SvxShape_FrameServices; 4048 4049 comphelper::ServiceInfoHelper::addToSequence( SvxShape_FrameServices, 2, 4050 sUNO_service_drawing_FrameShape, 4051 sUNO_service_drawing_Shape ); 4052 4053 pSeq = &SvxShape_FrameServices; 4054 } 4055 } 4056 4057 return *pSeq; 4058 } 4059 4060 case OBJ_UNO: 4061 { 4062 static uno::Sequence< OUString > *pSeq = 0; 4063 if( 0 == pSeq ) 4064 { 4065 // OGuard _aGuard( Application::GetSolarMutex() ); 4066 // if( 0 == pSeq ) 4067 { 4068 static uno::Sequence< OUString > SvxShape_UnoServices; 4069 comphelper::ServiceInfoHelper::addToSequence( SvxShape_UnoServices, 2, 4070 sUNO_service_drawing_ControlShape, 4071 sUNO_service_drawing_Shape ); 4072 4073 pSeq = &SvxShape_UnoServices; 4074 } 4075 } 4076 return *pSeq; 4077 } 4078 4079 case OBJ_EDGE: 4080 { 4081 static uno::Sequence< OUString > *pSeq = 0; 4082 if( 0 == pSeq ) 4083 { 4084 // OGuard aGuard( Application::GetSolarMutex() ); 4085 // if( 0 == pSeq ) 4086 { 4087 static uno::Sequence< OUString > SvxShape_EdgeServices; 4088 4089 comphelper::ServiceInfoHelper::addToSequence( SvxShape_EdgeServices,15, 4090 sUNO_service_drawing_ConnectorShape, 4091 sUNO_service_drawing_ConnectorProperties, 4092 4093 sUNO_service_drawing_Shape, 4094 sUNO_service_drawing_LineProperties, 4095 4096 sUNO_service_drawing_Text, 4097 sUNO_service_drawing_TextProperties, 4098 sUNO_service_style_ParagraphProperties, 4099 sUNO_service_style_ParagraphPropertiesComplex, 4100 sUNO_service_style_ParagraphPropertiesAsian, 4101 sUNO_service_style_CharacterProperties, 4102 sUNO_service_style_CharacterPropertiesComplex, 4103 sUNO_service_style_CharacterPropertiesAsian, 4104 4105 sUNO_service_drawing_PolyPolygonDescriptor, 4106 sUNO_service_drawing_ShadowProperties, 4107 sUNO_service_drawing_RotationDescriptor); 4108 4109 pSeq = &SvxShape_EdgeServices; 4110 } 4111 } 4112 return *pSeq; 4113 } 4114 case OBJ_MEDIA: 4115 { 4116 static uno::Sequence< OUString > *pSeq = 0; 4117 if( 0 == pSeq ) 4118 { 4119 // OGuard aGuard( Application::GetSolarMutex() ); 4120 // if( 0 == pSeq ) 4121 { 4122 static uno::Sequence< OUString > SvxShape_MediaServices; 4123 4124 comphelper::ServiceInfoHelper::addToSequence( SvxShape_MediaServices, 2, 4125 sUNO_service_drawing_MediaShape, 4126 sUNO_service_drawing_Shape); 4127 4128 pSeq = &SvxShape_MediaServices; 4129 } 4130 } 4131 return *pSeq; 4132 } 4133 } 4134 } 4135 else if( mpObj.is() && mpObj->GetObjInventor() == FmFormInventor) 4136 { 4137 #if OSL_DEBUG_LEVEL > 0 4138 const sal_uInt16 nIdent = mpObj->GetObjIdentifier(); 4139 OSL_ENSURE( nIdent == OBJ_UNO, "SvxShape::_getSupportedServiceNames: FmFormInventor, but no UNO object?" ); 4140 #endif 4141 static uno::Sequence< OUString > *pSeq = 0; 4142 if( 0 == pSeq ) 4143 { 4144 // OGuard aGuard( Application::GetSolarMutex() ); 4145 // if( 0 == pSeq ) 4146 { 4147 static uno::Sequence< OUString > SvxShape_UnoServices; 4148 comphelper::ServiceInfoHelper::addToSequence( SvxShape_UnoServices, 2, 4149 sUNO_service_drawing_ControlShape, 4150 sUNO_service_drawing_Shape ); 4151 4152 pSeq = &SvxShape_UnoServices; 4153 } 4154 } 4155 return *pSeq; 4156 } 4157 OSL_ENSURE( false, "SvxShape::_getSupportedServiceNames: could not determine object type!" ); 4158 uno::Sequence< OUString > aSeq; 4159 return aSeq; 4160 } 4161 4162 //---------------------------------------------------------------------- 4163 sal_Bool SAL_CALL SvxShape::supportsService( const OUString& ServiceName ) throw ( uno::RuntimeException ) 4164 { 4165 Sequence< OUString > SupportedServices( getSupportedServiceNames() ); 4166 const ::rtl::OUString * pArray = SupportedServices.getConstArray(); 4167 const sal_Int32 nCount = SupportedServices.getLength(); 4168 sal_Int32 i; 4169 for( i = 0; i < nCount; i++ ) 4170 if( *pArray++ == ServiceName ) 4171 return sal_True; 4172 return sal_False; 4173 } 4174 4175 //---------------------------------------------------------------------- 4176 4177 // XGluePointsSupplier 4178 uno::Reference< container::XIndexContainer > SAL_CALL SvxShape::getGluePoints() 4179 throw(uno::RuntimeException) 4180 { 4181 OGuard aGuard( Application::GetSolarMutex() ); 4182 uno::Reference< container::XIndexContainer > xGluePoints( mxGluePoints ); 4183 4184 if( mpObj.is() && !xGluePoints.is() ) 4185 { 4186 uno::Reference< container::XIndexContainer > xNew( SvxUnoGluePointAccess_createInstance( mpObj.get() ), uno::UNO_QUERY ); 4187 mxGluePoints = xGluePoints = xNew; 4188 } 4189 4190 return xGluePoints; 4191 } 4192 4193 //---------------------------------------------------------------------- 4194 4195 // XChild 4196 uno::Reference< uno::XInterface > SAL_CALL SvxShape::getParent( ) 4197 throw(uno::RuntimeException) 4198 { 4199 OGuard aGuard( Application::GetSolarMutex() ); 4200 4201 if( mpObj.is() && mpObj->GetObjList() ) 4202 { 4203 SdrObjList* pObjList = mpObj->GetObjList(); 4204 4205 switch( pObjList->GetListKind() ) 4206 { 4207 case SDROBJLIST_GROUPOBJ: 4208 if( pObjList->GetOwnerObj()->ISA( SdrObjGroup ) ) 4209 return PTR_CAST( SdrObjGroup, pObjList->GetOwnerObj())->getUnoShape(); 4210 else if( pObjList->GetOwnerObj()->ISA( E3dScene ) ) 4211 return PTR_CAST( E3dScene, pObjList->GetOwnerObj())->getUnoShape(); 4212 break; 4213 case SDROBJLIST_DRAWPAGE: 4214 case SDROBJLIST_MASTERPAGE: 4215 return PTR_CAST( SdrPage, pObjList )->getUnoPage(); 4216 default: 4217 DBG_ERROR( "SvxShape::getParent( ): unexpected SdrObjListKind" ); 4218 break; 4219 } 4220 } 4221 4222 uno::Reference< uno::XInterface > xParent; 4223 return xParent; 4224 } 4225 4226 //---------------------------------------------------------------------- 4227 4228 void SAL_CALL SvxShape::setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& ) 4229 throw(lang::NoSupportException, uno::RuntimeException) 4230 { 4231 throw lang::NoSupportException(); 4232 } 4233 4234 //---------------------------------------------------------------------- 4235 4236 /** called from the XActionLockable interface methods on initial locking */ 4237 void SvxShape::lock() 4238 { 4239 } 4240 4241 //---------------------------------------------------------------------- 4242 4243 /** called from the XActionLockable interface methods on final unlock */ 4244 void SvxShape::unlock() 4245 { 4246 } 4247 4248 //---------------------------------------------------------------------- 4249 4250 // XActionLockable 4251 sal_Bool SAL_CALL SvxShape::isActionLocked( ) throw (::com::sun::star::uno::RuntimeException) 4252 { 4253 OGuard aGuard( Application::GetSolarMutex() ); 4254 4255 return mnLockCount != 0; 4256 } 4257 4258 //---------------------------------------------------------------------- 4259 4260 void SAL_CALL SvxShape::addActionLock( ) throw (::com::sun::star::uno::RuntimeException) 4261 { 4262 OGuard aGuard( Application::GetSolarMutex() ); 4263 4264 DBG_ASSERT( mnLockCount < 0xffff, "lock overflow in SvxShape!" ); 4265 mnLockCount++; 4266 4267 if( mnLockCount == 1 ) 4268 lock(); 4269 } 4270 4271 //---------------------------------------------------------------------- 4272 4273 void SAL_CALL SvxShape::removeActionLock( ) throw (::com::sun::star::uno::RuntimeException) 4274 { 4275 OGuard aGuard( Application::GetSolarMutex() ); 4276 4277 DBG_ASSERT( mnLockCount > 0, "lock underflow in SvxShape!" ); 4278 mnLockCount--; 4279 4280 if( mnLockCount == 0 ) 4281 unlock(); 4282 } 4283 4284 //---------------------------------------------------------------------- 4285 4286 void SAL_CALL SvxShape::setActionLocks( sal_Int16 nLock ) throw (::com::sun::star::uno::RuntimeException ) 4287 { 4288 OGuard aGuard( Application::GetSolarMutex() ); 4289 4290 if( (mnLockCount == 0) && (nLock != 0) ) 4291 unlock(); 4292 4293 if( (mnLockCount != 0) && (nLock == 0) ) 4294 lock(); 4295 4296 mnLockCount = (sal_uInt16)nLock; 4297 } 4298 4299 //---------------------------------------------------------------------- 4300 4301 sal_Int16 SAL_CALL SvxShape::resetActionLocks( ) throw (::com::sun::star::uno::RuntimeException) 4302 { 4303 OGuard aGuard( Application::GetSolarMutex() ); 4304 4305 if( mnLockCount != 0 ) 4306 unlock(); 4307 4308 sal_Int16 nOldLocks = (sal_Int16)mnLockCount; 4309 mnLockCount = 0; 4310 4311 return nOldLocks; 4312 } 4313 4314 //---------------------------------------------------------------------- 4315 4316 /** since polygon shapes can change theire kind during editing, we have 4317 to recheck it here. 4318 Circle shapes also change theire kind, but theire all treated equal 4319 so no update is necessary. 4320 */ 4321 void SvxShape::updateShapeKind() 4322 { 4323 switch( mpImpl->mnObjId ) 4324 { 4325 case OBJ_LINE: 4326 case OBJ_POLY: 4327 case OBJ_PLIN: 4328 case OBJ_PATHLINE: 4329 case OBJ_PATHFILL: 4330 case OBJ_FREELINE: 4331 case OBJ_FREEFILL: 4332 case OBJ_PATHPOLY: 4333 case OBJ_PATHPLIN: 4334 { 4335 const sal_uInt32 nId = mpObj->GetObjIdentifier(); 4336 4337 if( nId != mpImpl->mnObjId ) 4338 { 4339 mpImpl->mnObjId = nId; 4340 4341 } 4342 break; 4343 } 4344 }; 4345 } 4346 4347 /*********************************************************************** 4348 * class SvxShapeText * 4349 ***********************************************************************/ 4350 SvxShapeText::SvxShapeText() throw () 4351 : SvxShape(NULL, aSvxMapProvider.GetMap(SVXMAP_TEXT), aSvxMapProvider.GetPropertySet(SVXMAP_TEXT, SdrObject::GetGlobalDrawObjectItemPool()) ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() ) 4352 { 4353 } 4354 4355 //---------------------------------------------------------------------- 4356 SvxShapeText::SvxShapeText( SdrObject* pObject ) throw () 4357 : SvxShape( pObject, aSvxMapProvider.GetMap(SVXMAP_TEXT), aSvxMapProvider.GetPropertySet(SVXMAP_TEXT, SdrObject::GetGlobalDrawObjectItemPool()) ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() ) 4358 { 4359 if( pObject && pObject->GetModel() ) 4360 SetEditSource( new SvxTextEditSource( pObject, 0, static_cast< uno::XWeak * >( this ) ) ); 4361 } 4362 4363 //---------------------------------------------------------------------- 4364 SvxShapeText::SvxShapeText( SdrObject* pObject, const SfxItemPropertyMapEntry* pPropertyMap, const SvxItemPropertySet* pPropertySet ) throw () 4365 : SvxShape( pObject, pPropertyMap, pPropertySet ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() ) 4366 { 4367 if( pObject && pObject->GetModel() ) 4368 SetEditSource( new SvxTextEditSource( pObject, 0, static_cast< uno::XWeak * >( this ) ) ); 4369 } 4370 4371 //---------------------------------------------------------------------- 4372 SvxShapeText::~SvxShapeText() throw () 4373 { 4374 // check if only this instance is registered at the ranges 4375 DBG_ASSERT( (NULL == GetEditSource()) || (GetEditSource()->getRanges().size()==1), 4376 "svx::SvxShapeText::~SvxShapeText(), text shape with living text ranges destroyed!"); 4377 } 4378 4379 void SvxShapeText::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage ) 4380 { 4381 if( pNewObj && (NULL == GetEditSource())) 4382 SetEditSource( new SvxTextEditSource( pNewObj, 0, static_cast< uno::XWeak* >(this) ) ); 4383 4384 SvxShape::Create( pNewObj, pNewPage ); 4385 } 4386 4387 // XInterface 4388 //---------------------------------------------------------------------- 4389 uno::Any SAL_CALL SvxShapeText::queryInterface( const uno::Type & rType ) 4390 throw( uno::RuntimeException ) 4391 { 4392 return SvxShape::queryInterface( rType ); 4393 } 4394 4395 //---------------------------------------------------------------------- 4396 4397 uno::Any SAL_CALL SvxShapeText::queryAggregation( const uno::Type & rType ) 4398 throw( uno::RuntimeException ) 4399 { 4400 uno::Any aAny( SvxShape::queryAggregation( rType ) ); 4401 if( aAny.hasValue() ) 4402 return aAny; 4403 4404 return SvxUnoTextBase::queryAggregation( rType ); 4405 } 4406 4407 //---------------------------------------------------------------------- 4408 4409 void SAL_CALL SvxShapeText::acquire() throw() 4410 { 4411 SvxShape::acquire(); 4412 } 4413 4414 //---------------------------------------------------------------------- 4415 void SAL_CALL SvxShapeText::release() throw() 4416 { 4417 SvxShape::release(); 4418 } 4419 4420 // XServiceInfo 4421 //---------------------------------------------------------------------- 4422 OUString SAL_CALL SvxShapeText::getImplementationName() throw( uno::RuntimeException ) 4423 { 4424 static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM("SvxShapeText") ); 4425 return aServiceName; 4426 } 4427 4428 //---------------------------------------------------------------------- 4429 uno::Sequence< OUString > SAL_CALL SvxShapeText::getSupportedServiceNames() throw( uno::RuntimeException ) 4430 { 4431 return SvxShape::getSupportedServiceNames(); 4432 } 4433 4434 //---------------------------------------------------------------------- 4435 sal_Bool SAL_CALL SvxShapeText::supportsService( const OUString& ServiceName ) throw ( uno::RuntimeException ) 4436 { 4437 return SvxShape::supportsService(ServiceName); 4438 } 4439 4440 // XTypeProvider 4441 //---------------------------------------------------------------------- 4442 uno::Sequence< uno::Type > SAL_CALL SvxShapeText::getTypes() 4443 throw( uno::RuntimeException ) 4444 { 4445 return SvxShape::getTypes(); 4446 } 4447 4448 sal_Int64 SAL_CALL SvxShapeText::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw(::com::sun::star::uno::RuntimeException) \ 4449 { 4450 const sal_Int64 nReturn = SvxShape::getSomething( rId ); 4451 if( nReturn ) 4452 return nReturn; 4453 4454 return SvxUnoTextBase::getSomething( rId ); 4455 } 4456 4457 //---------------------------------------------------------------------- 4458 uno::Sequence< sal_Int8 > SAL_CALL SvxShapeText::getImplementationId() 4459 throw( uno::RuntimeException ) 4460 { 4461 static ::cppu::OImplementationId* pID = NULL ; 4462 4463 if ( pID == NULL ) 4464 { 4465 // Ready for multithreading; get global mutex for first call of this method only! see before 4466 MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; 4467 4468 // Control these pointer again ... it can be, that another instance will be faster then these! 4469 if ( pID == NULL ) 4470 { 4471 // Create a new static ID ... 4472 static ::cppu::OImplementationId aID( sal_False ) ; 4473 // ... and set his address to static pointer! 4474 pID = &aID ; 4475 } 4476 } 4477 4478 return pID->getImplementationId() ; 4479 } 4480 4481 //---------------------------------------------------------------------- 4482 4483 /** called from the XActionLockable interface methods on initial locking */ 4484 void SvxShapeText::lock() 4485 { 4486 SvxTextEditSource* pEditSource = (SvxTextEditSource*)GetEditSource(); 4487 if( pEditSource ) 4488 pEditSource->lock(); 4489 } 4490 4491 //---------------------------------------------------------------------- 4492 4493 /** called from the XActionLockable interface methods on final unlock */ 4494 void SvxShapeText::unlock() 4495 { 4496 SvxTextEditSource* pEditSource = (SvxTextEditSource*)GetEditSource(); 4497 if( pEditSource ) 4498 pEditSource->unlock(); 4499 } 4500 4501 // ::com::sun::star::text::XTextRange 4502 uno::Reference< text::XTextRange > SAL_CALL SvxShapeText::getStart() throw(uno::RuntimeException) 4503 { 4504 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 4505 SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL; 4506 if( pForwarder ) 4507 ::GetSelection( maSelection, pForwarder ); 4508 return SvxUnoTextBase::getStart(); 4509 4510 } 4511 4512 uno::Reference< text::XTextRange > SAL_CALL SvxShapeText::getEnd() throw(uno::RuntimeException) 4513 { 4514 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 4515 SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL; 4516 if( pForwarder ) 4517 ::GetSelection( maSelection, pForwarder ); 4518 return SvxUnoTextBase::getEnd(); 4519 } 4520 4521 OUString SAL_CALL SvxShapeText::getString() throw(uno::RuntimeException) 4522 { 4523 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 4524 SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL; 4525 if( pForwarder ) 4526 ::GetSelection( maSelection, pForwarder ); 4527 return SvxUnoTextBase::getString(); 4528 } 4529 4530 4531 void SAL_CALL SvxShapeText::setString( const OUString& aString ) throw(uno::RuntimeException) 4532 { 4533 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 4534 SvxTextForwarder* pForwarder = mpEditSource ? mpEditSource->GetTextForwarder() : NULL; 4535 if( pForwarder ) 4536 ::GetSelection( maSelection, pForwarder ); 4537 SvxUnoTextBase::setString( aString ); 4538 } 4539 4540 // overide these for special property handling in subcasses. Return true if property is handled 4541 bool SvxShapeText::setPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 4542 { 4543 // HACK-fix #99090# 4544 // since SdrTextObj::SetVerticalWriting exchanges 4545 // SDRATTR_TEXT_AUTOGROWWIDTH and SDRATTR_TEXT_AUTOGROWHEIGHT, 4546 // we have to set the textdirection here 4547 4548 if( pProperty->nWID == SDRATTR_TEXTDIRECTION ) 4549 { 4550 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObj.get() ); 4551 if( pTextObj ) 4552 { 4553 com::sun::star::text::WritingMode eMode; 4554 if( rValue >>= eMode ) 4555 { 4556 pTextObj->SetVerticalWriting( eMode == com::sun::star::text::WritingMode_TB_RL ); 4557 } 4558 } 4559 return true; 4560 } 4561 return SvxShape::setPropertyValueImpl( rName, pProperty, rValue ); 4562 } 4563 4564 bool SvxShapeText::getPropertyValueImpl( const ::rtl::OUString& rName, const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 4565 { 4566 if( pProperty->nWID == SDRATTR_TEXTDIRECTION ) 4567 { 4568 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObj.get() ); 4569 if( pTextObj && pTextObj->IsVerticalWriting() ) 4570 rValue <<= com::sun::star::text::WritingMode_TB_RL; 4571 else 4572 rValue <<= com::sun::star::text::WritingMode_LR_TB; 4573 return true; 4574 } 4575 4576 return SvxShape::getPropertyValueImpl( rName, pProperty, rValue ); 4577 } 4578 4579 bool SvxShapeText::getPropertyStateImpl( const SfxItemPropertySimpleEntry* pProperty, ::com::sun::star::beans::PropertyState& rState ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException) 4580 { 4581 return SvxShape::getPropertyStateImpl( pProperty, rState ); 4582 } 4583 4584 bool SvxShapeText::setPropertyToDefaultImpl( const SfxItemPropertySimpleEntry* pProperty ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException) 4585 { 4586 return SvxShape::setPropertyToDefaultImpl( pProperty ); 4587 } 4588 4589 /*********************************************************************** 4590 * class SvxShapeRect * 4591 ***********************************************************************/ 4592 DBG_NAME(SvxShapeRect) 4593 SvxShapeRect::SvxShapeRect( SdrObject* pObj ) throw() 4594 : SvxShapeText( pObj, aSvxMapProvider.GetMap(SVXMAP_SHAPE), aSvxMapProvider.GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool())) 4595 { 4596 DBG_CTOR(SvxShapeRect,NULL); 4597 } 4598 4599 SvxShapeRect::~SvxShapeRect() throw() 4600 { 4601 DBG_DTOR(SvxShapeRect,NULL); 4602 } 4603 4604 uno::Any SAL_CALL SvxShapeRect::queryInterface( const uno::Type & rType ) throw(uno::RuntimeException) 4605 { 4606 return SvxShapeText::queryInterface( rType ); 4607 } 4608 4609 uno::Any SAL_CALL SvxShapeRect::queryAggregation( const uno::Type & rType ) throw(uno::RuntimeException) 4610 { 4611 return SvxShapeText::queryAggregation( rType ); 4612 } 4613 4614 void SAL_CALL SvxShapeRect::acquire() throw() 4615 { 4616 OWeakAggObject::acquire(); 4617 } 4618 4619 void SAL_CALL SvxShapeRect::release() throw() 4620 { 4621 OWeakAggObject::release(); 4622 } 4623 //---------------------------------------------------------------------- 4624 // XServiceInfo 4625 //---------------------------------------------------------------------- 4626 uno::Sequence< OUString > SvxShapeRect::getSupportedServiceNames(void) throw( uno::RuntimeException ) 4627 { 4628 return SvxShape::getSupportedServiceNames(); 4629 } 4630 4631 /** returns a StarOffice API wrapper for the given SdrObject */ 4632 uno::Reference< drawing::XShape > GetXShapeForSdrObject( SdrObject* pObj ) throw () 4633 { 4634 uno::Reference< drawing::XShape > xShape( pObj->getUnoShape(), uno::UNO_QUERY ); 4635 return xShape; 4636 } 4637 4638 /** returns the SdrObject from the given StarOffice API wrapper */ 4639 SdrObject* GetSdrObjectFromXShape( uno::Reference< drawing::XShape > xShape ) throw() 4640 { 4641 SvxShape* pShape = SvxShape::getImplementation( xShape ); 4642 return pShape ? pShape->GetSdrObject() : 0; 4643 } 4644 4645 //---------------------------------------------------------------------- 4646 4647 SdrObject* SdrObject::getSdrObjectFromXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInt ) 4648 { 4649 SvxShape* pSvxShape = SvxShape::getImplementation( xInt ); 4650 return pSvxShape ? pSvxShape->GetSdrObject() : 0; 4651 } 4652 4653 uno::Any SvxItemPropertySet_getPropertyValue( const SvxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry* pMap, const SfxItemSet& rSet ) 4654 { 4655 if(!pMap || !pMap->nWID) 4656 return uno::Any(); 4657 4658 // Check is for items that store either metric values if thei are positiv or percentage if thei are negativ. 4659 bool bDontConvertNegativeValues = ( pMap->nWID == XATTR_FILLBMP_SIZEX || pMap->nWID == XATTR_FILLBMP_SIZEY ); 4660 return rPropSet.getPropertyValue( pMap, rSet, (pMap->nWID != SDRATTR_XMLATTRIBUTES), bDontConvertNegativeValues ); 4661 } 4662 4663 void SvxItemPropertySet_setPropertyValue( const SvxItemPropertySet& rPropSet, const SfxItemPropertySimpleEntry* pMap, const uno::Any& rVal, SfxItemSet& rSet ) 4664 { 4665 if(!pMap || !pMap->nWID) 4666 return; 4667 4668 bool bDontConvertNegativeValues = ( pMap->nWID == XATTR_FILLBMP_SIZEX || pMap->nWID == XATTR_FILLBMP_SIZEY ); 4669 rPropSet.setPropertyValue( pMap, rVal, rSet, bDontConvertNegativeValues ); 4670 } 4671