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_sw.hxx" 26 27 #include <swtypes.hxx> 28 #include <cmdid.h> 29 30 #include <unomid.h> 31 #include <unodraw.hxx> 32 #include <unocoll.hxx> 33 #include <unoframe.hxx> 34 #include <unoparagraph.hxx> 35 #include <unotextrange.hxx> 36 #include <unoprnms.hxx> 37 #include <editeng/unoprnms.hxx> 38 #include <svx/svditer.hxx> 39 #include <swunohelper.hxx> 40 #include <doc.hxx> 41 #include <IDocumentUndoRedo.hxx> 42 #include <fmtcntnt.hxx> 43 #include <fmtflcnt.hxx> 44 #include <txtatr.hxx> 45 #include <docsh.hxx> 46 #include <unomap.hxx> 47 #include <unoport.hxx> 48 #include <unocrsr.hxx> 49 #include <TextCursorHelper.hxx> 50 #include <swundo.hxx> 51 #include <dflyobj.hxx> 52 #include <ndtxt.hxx> 53 #include <svx/svdview.hxx> 54 #include <svx/unoshape.hxx> 55 #include <dcontact.hxx> 56 #include <svx/fmglob.hxx> 57 #include <fmtornt.hxx> 58 #include <fmtanchr.hxx> 59 #include <fmtsrnd.hxx> 60 #include <fmtfollowtextflow.hxx> 61 #include <rootfrm.hxx> 62 #include <editeng/lrspitem.hxx> 63 #include <editeng/ulspitem.hxx> 64 #include <svx/shapepropertynotifier.hxx> 65 #include <crstate.hxx> 66 #include <vos/mutex.hxx> 67 #include <comphelper/extract.hxx> 68 #include <comphelper/stl_types.hxx> 69 #include <comphelper/makesequence.hxx> 70 #include <svx/scene3d.hxx> 71 #include <com/sun/star/beans/PropertyAttribute.hpp> 72 #include <com/sun/star/drawing/XDrawPageSupplier.hpp> 73 #include <com/sun/star/text/HoriOrientation.hpp> 74 #include <com/sun/star/text/VertOrientation.hpp> 75 #include <basegfx/numeric/ftools.hxx> 76 #include <algorithm> 77 #include <fmtwrapinfluenceonobjpos.hxx> 78 #include <com/sun/star/text/TextContentAnchorType.hpp> 79 #include <basegfx/matrix/b2dhommatrix.hxx> 80 #include <basegfx/matrix/b2dhommatrixtools.hxx> 81 #include <com/sun/star/drawing/PointSequence.hpp> 82 #include <vcl/svapp.hxx> 83 #include <list> 84 #include <iterator> 85 #include <switerator.hxx> 86 87 using ::rtl::OUString; 88 using namespace ::com::sun::star; 89 90 DECLARE_STL_USTRINGACCESS_MAP( uno::Sequence< sal_Int8 > *, SwShapeImplementationIdMap ); 91 92 static SwShapeImplementationIdMap aImplementationIdMap; 93 94 class SwShapeDescriptor_Impl 95 { 96 SwFmtHoriOrient* pHOrient; 97 SwFmtVertOrient* pVOrient; 98 SwFmtAnchor* pAnchor; 99 SwFmtSurround* pSurround; 100 SvxULSpaceItem* pULSpace; 101 SvxLRSpaceItem* pLRSpace; 102 sal_Bool bOpaque; 103 uno::Reference< text::XTextRange > xTextRange; 104 // OD 2004-04-21 #i26791# 105 SwFmtFollowTextFlow* mpFollowTextFlow; 106 // OD 2004-05-05 #i28701# - add property 'WrapInfluenceOnObjPos' 107 SwFmtWrapInfluenceOnObjPos* pWrapInfluenceOnObjPos; 108 // --> OD 2004-08-06 #i28749# 109 sal_Int16 mnPositionLayoutDir; 110 // <-- 111 112 public: 113 bool bInitializedPropertyNotifier; 114 115 public: 116 SwShapeDescriptor_Impl() : 117 // --> OD 2004-08-18 #i32349# - no defaults, in order to determine on 118 // adding a shape, if positioning attributes are set or not. 119 pHOrient( 0L ), 120 pVOrient( 0L ), 121 // <-- 122 pAnchor(0), 123 pSurround(0), 124 pULSpace(0), 125 pLRSpace(0), 126 bOpaque(sal_False), 127 // OD 2004-04-21 #i26791# 128 mpFollowTextFlow( new SwFmtFollowTextFlow( sal_False ) ), 129 // OD 2004-05-05 #i28701# 130 // --> OD 2004-10-18 #i35017# - constant name has changed 131 pWrapInfluenceOnObjPos( new SwFmtWrapInfluenceOnObjPos( 132 text::WrapInfluenceOnPosition::ONCE_CONCURRENT ) ), 133 // <-- 134 // --> OD 2004-08-06 #i28749# 135 mnPositionLayoutDir( text::PositionLayoutDir::PositionInLayoutDirOfAnchor ), 136 bInitializedPropertyNotifier(false) 137 {} 138 139 ~SwShapeDescriptor_Impl() 140 { 141 delete pHOrient; 142 delete pVOrient; 143 delete pAnchor; 144 delete pSurround; 145 delete pULSpace; 146 delete pLRSpace; 147 // OD 2004-04-22 #i26791# 148 delete mpFollowTextFlow; 149 // OD 2004-05-05 #i28701# 150 delete pWrapInfluenceOnObjPos; 151 } 152 SwFmtAnchor* GetAnchor(sal_Bool bCreate = sal_False) 153 { 154 if(bCreate && !pAnchor) 155 { 156 pAnchor = new SwFmtAnchor(FLY_AS_CHAR); 157 } 158 return pAnchor; 159 } 160 SwFmtHoriOrient* GetHOrient(sal_Bool bCreate = sal_False) 161 { 162 if (bCreate && !pHOrient) 163 { 164 // OD 2004-06-03 #i26791# - change default 165 pHOrient = new SwFmtHoriOrient( 0, text::HoriOrientation::NONE, text::RelOrientation::FRAME ); 166 } 167 return pHOrient; 168 } 169 SwFmtVertOrient* GetVOrient(sal_Bool bCreate = sal_False) 170 { 171 if(bCreate && !pVOrient) 172 { 173 // OD 2004-04-21 #i26791# - change default 174 pVOrient = new SwFmtVertOrient( 0, text::VertOrientation::NONE, text::RelOrientation::FRAME ); 175 } 176 return pVOrient; 177 } 178 179 SwFmtSurround* GetSurround(sal_Bool bCreate = sal_False) 180 { 181 if(bCreate && !pSurround) 182 pSurround = new SwFmtSurround(); 183 return pSurround; 184 } 185 SvxLRSpaceItem* GetLRSpace(sal_Bool bCreate = sal_False) 186 { 187 if(bCreate && !pLRSpace) 188 pLRSpace = new SvxLRSpaceItem(RES_LR_SPACE); 189 return pLRSpace; 190 } 191 SvxULSpaceItem* GetULSpace(sal_Bool bCreate = sal_False) 192 { 193 if(bCreate && !pULSpace) 194 pULSpace = new SvxULSpaceItem(RES_UL_SPACE); 195 return pULSpace; 196 } 197 uno::Reference< text::XTextRange > & GetTextRange() 198 { 199 return xTextRange; 200 } 201 sal_Bool IsOpaque() 202 { 203 return bOpaque; 204 } 205 const sal_Bool& GetOpaque() 206 { 207 return bOpaque; 208 } 209 void RemoveHOrient(){DELETEZ(pHOrient);} 210 void RemoveVOrient(){DELETEZ(pVOrient);} 211 void RemoveAnchor(){DELETEZ(pAnchor);} 212 void RemoveSurround(){DELETEZ(pSurround);} 213 void RemoveULSpace(){DELETEZ(pULSpace);} 214 void RemoveLRSpace(){DELETEZ(pLRSpace);} 215 void SetOpaque(sal_Bool bSet){bOpaque = bSet;} 216 217 // OD 2004-04-21 #i26791# 218 SwFmtFollowTextFlow* GetFollowTextFlow( sal_Bool _bCreate = sal_False ) 219 { 220 if ( _bCreate && !mpFollowTextFlow ) 221 mpFollowTextFlow = new SwFmtFollowTextFlow( sal_False ); 222 return mpFollowTextFlow; 223 } 224 void RemoveFollowTextFlow() 225 { 226 DELETEZ(mpFollowTextFlow); 227 } 228 229 // --> OD 2004-08-06 #i28749# 230 sal_Int16 GetPositionLayoutDir() const 231 { 232 return mnPositionLayoutDir; 233 } 234 void SetPositionLayoutDir( sal_Int16 _nPositionLayoutDir ) 235 { 236 switch ( _nPositionLayoutDir ) 237 { 238 case text::PositionLayoutDir::PositionInHoriL2R: 239 case text::PositionLayoutDir::PositionInLayoutDirOfAnchor: 240 { 241 mnPositionLayoutDir = _nPositionLayoutDir; 242 } 243 break; 244 default: 245 { 246 ASSERT( false, 247 "<SwShapeDescriptor_Impl::SetPositionLayoutDir(..)> - invalid attribute value." ); 248 } 249 } 250 } 251 void RemovePositionLayoutDir() 252 { 253 mnPositionLayoutDir = text::PositionLayoutDir::PositionInLayoutDirOfAnchor; 254 } 255 // <-- 256 257 // OD 2004-05-05 #i28701# 258 inline SwFmtWrapInfluenceOnObjPos* GetWrapInfluenceOnObjPos( 259 const sal_Bool _bCreate = sal_False ) 260 { 261 if ( _bCreate && !pWrapInfluenceOnObjPos ) 262 { 263 pWrapInfluenceOnObjPos = new SwFmtWrapInfluenceOnObjPos( 264 // --> OD 2004-10-18 #i35017# - constant name has changed 265 text::WrapInfluenceOnPosition::ONCE_CONCURRENT ); 266 // <-- 267 } 268 return pWrapInfluenceOnObjPos; 269 } 270 inline void RemoveWrapInfluenceOnObjPos() 271 { 272 DELETEZ(pWrapInfluenceOnObjPos); 273 } 274 }; 275 /**************************************************************************** 276 class SwFmDrawPage 277 ****************************************************************************/ 278 279 SwFmDrawPage::SwFmDrawPage( SdrPage* pPage ) : 280 SvxFmDrawPage( pPage ), pPageView(0) 281 { 282 } 283 284 SwFmDrawPage::~SwFmDrawPage() throw () 285 { 286 RemovePageView(); 287 } 288 289 const SdrMarkList& SwFmDrawPage::PreGroup(const uno::Reference< drawing::XShapes > & xShapes) 290 { 291 _SelectObjectsInView( xShapes, GetPageView() ); 292 const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); 293 return rMarkList; 294 } 295 296 void SwFmDrawPage::PreUnGroup(const uno::Reference< drawing::XShapeGroup > xShapeGroup) 297 { 298 uno::Reference< drawing::XShape > xShape( xShapeGroup, uno::UNO_QUERY); 299 _SelectObjectInView( xShape, GetPageView() ); 300 } 301 302 SdrPageView* SwFmDrawPage::GetPageView() 303 { 304 if(!pPageView) 305 pPageView = mpView->ShowSdrPage( mpPage ); 306 return pPageView; 307 } 308 309 void SwFmDrawPage::RemovePageView() 310 { 311 if(pPageView && mpView) 312 mpView->HideSdrPage(); 313 pPageView = 0; 314 } 315 316 uno::Reference< uno::XInterface > SwFmDrawPage::GetInterface( SdrObject* pObj ) 317 { 318 uno::Reference< XInterface > xShape; 319 if( pObj ) 320 { 321 SwFrmFmt* pFmt = ::FindFrmFmt( pObj ); 322 SwXShape* pxShape = SwIterator<SwXShape,SwFmt>::FirstElement( *pFmt ); 323 if(pxShape) 324 { 325 xShape = *(cppu::OWeakObject*)pxShape; 326 } 327 else 328 xShape = pObj->getUnoShape(); 329 } 330 return xShape; 331 } 332 333 SdrObject* SwFmDrawPage::_CreateSdrObject( const uno::Reference< drawing::XShape > & xShape ) throw () 334 { 335 //TODO: stimmt das so - kann die Methode weg? 336 return SvxFmDrawPage::_CreateSdrObject( xShape ); 337 } 338 339 uno::Reference< drawing::XShape > SwFmDrawPage::_CreateShape( SdrObject *pObj ) const throw () 340 { 341 uno::Reference< drawing::XShape > xRet; 342 if(pObj->ISA(SwVirtFlyDrawObj) || pObj->GetObjInventor() == SWGInventor) 343 { 344 SwFlyDrawContact* pFlyContact = (SwFlyDrawContact*)pObj->GetUserCall(); 345 if(pFlyContact) 346 { 347 FlyCntType eType = FLYCNTTYPE_ALL; 348 SwFrmFmt* pFlyFmt = pFlyContact->GetFmt(); 349 SwDoc* pDoc = pFlyFmt->GetDoc(); 350 const SwNodeIndex* pIdx; 351 if( RES_FLYFRMFMT == pFlyFmt->Which() 352 && 0 != ( pIdx = pFlyFmt->GetCntnt().GetCntntIdx() ) 353 && pIdx->GetNodes().IsDocNodes() 354 ) 355 { 356 const SwNode* pNd = pDoc->GetNodes()[ pIdx->GetIndex() + 1 ]; 357 if(!pNd->IsNoTxtNode()) 358 eType = FLYCNTTYPE_FRM; 359 else if( pNd->IsGrfNode() ) 360 eType = FLYCNTTYPE_GRF; 361 else if( pNd->IsOLENode() ) 362 eType = FLYCNTTYPE_OLE; 363 } 364 else 365 { 366 ASSERT( false, 367 "<SwFmDrawPage::_CreateShape(..)> - could not retrieve type. Thus, no shape created." ); 368 return xRet; 369 } 370 DBG_ASSERT( eType != FLYCNTTYPE_ALL, "unexpected FlyCntType value for eType" ); 371 xRet = SwXFrames::GetObject( *pFlyFmt, eType ); 372 } 373 } 374 else 375 { 376 // own block - temporary object has to be destroyed before 377 // the delegator is set #81670# 378 { 379 xRet = SvxFmDrawPage::_CreateShape( pObj ); 380 } 381 uno::Reference< XUnoTunnel > xShapeTunnel(xRet, uno::UNO_QUERY); 382 //don't create an SwXShape if it already exists 383 SwXShape* pShape = 0; 384 if(xShapeTunnel.is()) 385 pShape = reinterpret_cast< SwXShape * >( 386 sal::static_int_cast< sal_IntPtr >( xShapeTunnel->getSomething(SwXShape::getUnoTunnelId()) )); 387 if(!pShape) 388 { 389 xShapeTunnel = 0; 390 uno::Reference< uno::XInterface > xCreate(xRet, uno::UNO_QUERY); 391 xRet = 0; 392 uno::Reference< beans::XPropertySet > xPrSet; 393 if ( pObj->IsGroupObject() && (!pObj->Is3DObj() || ( PTR_CAST(E3dScene,pObj ) != NULL ) ) ) 394 xPrSet = new SwXGroupShape( xCreate ); 395 else 396 xPrSet = new SwXShape( xCreate ); 397 xRet = uno::Reference< drawing::XShape >(xPrSet, uno::UNO_QUERY); 398 } 399 } 400 return xRet; 401 } 402 403 /**************************************************************************** 404 class SwXShapesEnumeration 405 ****************************************************************************/ 406 namespace 407 { 408 class SwXShapesEnumeration 409 : public SwSimpleEnumeration_Base 410 { 411 private: 412 typedef ::std::list< ::com::sun::star::uno::Any > shapescontainer_t; 413 shapescontainer_t m_aShapes; 414 protected: 415 virtual ~SwXShapesEnumeration() {}; 416 public: 417 SwXShapesEnumeration(SwXDrawPage* const pDrawPage); 418 419 //XEnumeration 420 virtual sal_Bool SAL_CALL hasMoreElements(void) throw(uno::RuntimeException); 421 virtual uno::Any SAL_CALL nextElement(void) throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException); 422 423 //XServiceInfo 424 virtual OUString SAL_CALL getImplementationName(void) throw(uno::RuntimeException); 425 virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw(uno::RuntimeException); 426 virtual uno::Sequence<OUString> SAL_CALL getSupportedServiceNames(void) throw(uno::RuntimeException); 427 }; 428 } 429 430 SwXShapesEnumeration::SwXShapesEnumeration(SwXDrawPage* const pDrawPage) 431 : m_aShapes() 432 { 433 vos::OGuard aGuard(Application::GetSolarMutex()); 434 ::std::insert_iterator<shapescontainer_t> pInserter = ::std::insert_iterator<shapescontainer_t>(m_aShapes, m_aShapes.begin()); 435 sal_Int32 nCount = pDrawPage->getCount(); 436 for(sal_Int32 nIdx = 0; nIdx < nCount; nIdx++) 437 { 438 uno::Reference<drawing::XShape> xShape = uno::Reference<drawing::XShape>(pDrawPage->getByIndex(nIdx), uno::UNO_QUERY); 439 *pInserter++ = uno::makeAny(xShape); 440 } 441 } 442 443 sal_Bool SwXShapesEnumeration::hasMoreElements(void) throw(uno::RuntimeException) 444 { 445 vos::OGuard aGuard(Application::GetSolarMutex()); 446 return !m_aShapes.empty(); 447 } 448 449 uno::Any SwXShapesEnumeration::nextElement(void) throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) 450 { 451 vos::OGuard aGuard(Application::GetSolarMutex()); 452 if(m_aShapes.empty()) 453 throw container::NoSuchElementException(); 454 uno::Any aResult = *m_aShapes.begin(); 455 m_aShapes.pop_front(); 456 return aResult; 457 } 458 459 OUString SwXShapesEnumeration::getImplementationName(void) throw(uno::RuntimeException) 460 { 461 return C2U("SwXShapeEnumeration"); 462 } 463 464 sal_Bool SwXShapesEnumeration::supportsService(const OUString& ServiceName) throw(uno::RuntimeException) 465 { 466 return C2U("com.sun.star.container.XEnumeration") == ServiceName; 467 } 468 469 uno::Sequence< OUString > SwXShapesEnumeration::getSupportedServiceNames(void) throw(uno::RuntimeException) 470 { 471 return ::comphelper::makeSequence(C2U("com.sun.star.container.XEnumeration")); 472 } 473 /**************************************************************************** 474 class SwXDrawPage 475 ****************************************************************************/ 476 uno::Reference< container::XEnumeration > SwXDrawPage::createEnumeration(void) throw( uno::RuntimeException ) 477 { 478 vos::OGuard aGuard(Application::GetSolarMutex()); 479 return uno::Reference< container::XEnumeration >( 480 new SwXShapesEnumeration(this)); 481 } 482 483 rtl::OUString SwXDrawPage::getImplementationName(void) throw( uno::RuntimeException ) 484 { 485 return C2U("SwXDrawPage"); 486 } 487 488 sal_Bool SwXDrawPage::supportsService(const rtl::OUString& rServiceName) throw( uno::RuntimeException ) 489 { 490 return C2U("com.sun.star.drawing.GenericDrawPage") == rServiceName; 491 } 492 493 uno::Sequence< rtl::OUString > SwXDrawPage::getSupportedServiceNames(void) throw( uno::RuntimeException ) 494 { 495 uno::Sequence< rtl::OUString > aRet(1); 496 rtl::OUString* pArray = aRet.getArray(); 497 pArray[0] = C2U("com.sun.star.drawing.GenericDrawPage"); 498 return aRet; 499 } 500 501 SwXDrawPage::SwXDrawPage(SwDoc* pDc) : 502 pDoc(pDc), 503 pDrawPage(0) 504 { 505 } 506 507 SwXDrawPage::~SwXDrawPage() 508 { 509 if(xPageAgg.is()) 510 { 511 uno::Reference< uno::XInterface > xInt; 512 xPageAgg->setDelegator(xInt); 513 } 514 } 515 516 uno::Any SwXDrawPage::queryInterface( const uno::Type& aType ) 517 throw( uno::RuntimeException ) 518 { 519 uno::Any aRet = SwXDrawPageBaseClass::queryInterface(aType); 520 if(!aRet.hasValue()) 521 { 522 // secure with checking if page exists. This may not be the case 523 // either for new SW docs with no yet graphics usage or when 524 // the doc is closed and someone else still holds a UNO reference 525 // to the XDrawPage (in that case, pDoc is set to 0) 526 SwFmDrawPage* pPage = GetSvxPage(); 527 528 if(pPage) 529 { 530 aRet = pPage->queryAggregation(aType); 531 } 532 } 533 return aRet; 534 } 535 536 uno::Sequence< uno::Type > SwXDrawPage::getTypes() throw( uno::RuntimeException ) 537 { 538 uno::Sequence< uno::Type > aPageTypes = SwXDrawPageBaseClass::getTypes(); 539 uno::Sequence< uno::Type > aSvxTypes = GetSvxPage()->getTypes(); 540 541 long nIndex = aPageTypes.getLength(); 542 aPageTypes.realloc(aPageTypes.getLength() + aSvxTypes.getLength() + 1); 543 544 uno::Type* pPageTypes = aPageTypes.getArray(); 545 const uno::Type* pSvxTypes = aSvxTypes.getConstArray(); 546 long nPos; 547 for(nPos = 0; nPos < aSvxTypes.getLength(); nPos++) 548 { 549 pPageTypes[nIndex++] = pSvxTypes[nPos]; 550 } 551 pPageTypes[nIndex] = ::getCppuType((uno::Reference<form::XFormsSupplier2>*)0); 552 return aPageTypes; 553 } 554 555 sal_Int32 SwXDrawPage::getCount(void) throw( uno::RuntimeException ) 556 { 557 vos::OGuard aGuard(Application::GetSolarMutex()); 558 if(!pDoc) 559 throw uno::RuntimeException(); 560 if(!pDoc->GetDrawModel()) 561 return 0; 562 else 563 { 564 ((SwXDrawPage*)this)->GetSvxPage(); 565 return pDrawPage->getCount(); 566 } 567 } 568 569 uno::Any SwXDrawPage::getByIndex(sal_Int32 nIndex) 570 throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, 571 uno::RuntimeException ) 572 { 573 vos::OGuard aGuard(Application::GetSolarMutex()); 574 if(!pDoc) 575 throw uno::RuntimeException(); 576 if(!pDoc->GetDrawModel()) 577 throw lang::IndexOutOfBoundsException(); 578 579 ((SwXDrawPage*)this)->GetSvxPage(); 580 return pDrawPage->getByIndex( nIndex ); 581 } 582 583 uno::Type SwXDrawPage::getElementType(void) throw( uno::RuntimeException ) 584 { 585 return ::getCppuType((const uno::Reference<drawing::XShape>*)0); 586 } 587 588 sal_Bool SwXDrawPage::hasElements(void) throw( uno::RuntimeException ) 589 { 590 vos::OGuard aGuard(Application::GetSolarMutex()); 591 if(!pDoc) 592 throw uno::RuntimeException(); 593 if(!pDoc->GetDrawModel()) 594 return sal_False; 595 else 596 return ((SwXDrawPage*)this)->GetSvxPage()->hasElements(); 597 } 598 599 void SwXDrawPage::add(const uno::Reference< drawing::XShape > & xShape) 600 throw( uno::RuntimeException ) 601 { 602 vos::OGuard aGuard(Application::GetSolarMutex()); 603 if(!pDoc) 604 throw uno::RuntimeException(); 605 uno::Reference< lang::XUnoTunnel > xShapeTunnel(xShape, uno::UNO_QUERY); 606 SwXShape* pShape = 0; 607 SvxShape* pSvxShape = 0; 608 if(xShapeTunnel.is()) 609 { 610 pShape = reinterpret_cast< SwXShape * >( 611 sal::static_int_cast< sal_IntPtr >( xShapeTunnel->getSomething(SwXShape::getUnoTunnelId()) )); 612 pSvxShape = reinterpret_cast< SvxShape * >( 613 sal::static_int_cast< sal_IntPtr >( xShapeTunnel->getSomething(SvxShape::getUnoTunnelId()) )); 614 } 615 616 if(!pShape || pShape->GetRegisteredIn() || !pShape->m_bDescriptor ) 617 { 618 uno::RuntimeException aExcept; 619 if(pShape) 620 aExcept.Message = C2U("object already inserted"); 621 else 622 aExcept.Message = C2U("illegal object"); 623 throw aExcept; 624 } 625 626 // --> OD, HB 627 if ( pSvxShape->GetSdrObject() ) 628 { 629 if ( pSvxShape->GetSdrObject()->IsInserted() ) 630 { 631 return; 632 } 633 } 634 // <-- 635 GetSvxPage()->add(xShape); 636 637 uno::Reference< uno::XAggregation > xAgg = pShape->GetAggregationInterface(); 638 639 DBG_ASSERT(pSvxShape, "warum gibt es hier kein SvxShape?"); 640 //diese Position ist auf jeden Fall in 1/100 mm 641 awt::Point aMM100Pos(pSvxShape->getPosition()); 642 643 //jetzt noch die Properties aus dem SwShapeDescriptor_Impl auswerten 644 SwShapeDescriptor_Impl* pDesc = pShape->GetDescImpl(); 645 646 SfxItemSet aSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN, 647 RES_FRMATR_END-1 ); 648 SwFmtAnchor aAnchor( FLY_AS_CHAR ); 649 sal_Bool bOpaque = sal_False; 650 if( pDesc ) 651 { 652 if(pDesc->GetSurround()) 653 aSet.Put( *pDesc->GetSurround()); 654 //die Items sind schon in Twip gesetzt 655 if(pDesc->GetLRSpace()) 656 { 657 aSet.Put(*pDesc->GetLRSpace()); 658 } 659 if(pDesc->GetULSpace()) 660 { 661 aSet.Put(*pDesc->GetULSpace()); 662 } 663 if(pDesc->GetAnchor()) 664 aAnchor = *pDesc->GetAnchor(); 665 666 // --> OD 2004-08-18 #i32349# - if no horizontal position exists, create one 667 if ( !pDesc->GetHOrient() ) 668 { 669 SwFmtHoriOrient* pHori = pDesc->GetHOrient( sal_True ); 670 SwTwips nHoriPos = MM100_TO_TWIP(aMM100Pos.X); 671 pHori->SetPos( nHoriPos ); 672 } 673 // <-- 674 { 675 if(pDesc->GetHOrient()->GetHoriOrient() == text::HoriOrientation::NONE) 676 aMM100Pos.X = TWIP_TO_MM100(pDesc->GetHOrient()->GetPos()); 677 aSet.Put( *pDesc->GetHOrient() ); 678 } 679 // --> OD 2004-08-18 #i32349# - if no vertical position exists, create one 680 if ( !pDesc->GetVOrient() ) 681 { 682 SwFmtVertOrient* pVert = pDesc->GetVOrient( sal_True ); 683 SwTwips nVertPos = MM100_TO_TWIP(aMM100Pos.Y); 684 pVert->SetPos( nVertPos ); 685 } 686 // <-- 687 { 688 if(pDesc->GetVOrient()->GetVertOrient() == text::VertOrientation::NONE) 689 aMM100Pos.Y = TWIP_TO_MM100(pDesc->GetVOrient()->GetPos()); 690 aSet.Put( *pDesc->GetVOrient() ); 691 } 692 693 if(pDesc->GetSurround()) 694 aSet.Put( *pDesc->GetSurround()); 695 bOpaque = pDesc->IsOpaque(); 696 697 // OD 2004-04-22 #i26791# 698 if ( pDesc->GetFollowTextFlow() ) 699 { 700 aSet.Put( *pDesc->GetFollowTextFlow() ); 701 } 702 703 // OD 2004-05-05 #i28701# 704 if ( pDesc->GetWrapInfluenceOnObjPos() ) 705 { 706 aSet.Put( *pDesc->GetWrapInfluenceOnObjPos() ); 707 } 708 } 709 710 pSvxShape->setPosition(aMM100Pos); 711 SdrObject* pObj = pSvxShape->GetSdrObject(); 712 // OD 25.06.2003 #108784# - set layer of new drawing object to corresponding 713 // invisible layer. 714 if(FmFormInventor != pObj->GetObjInventor()) 715 pObj->SetLayer( bOpaque ? pDoc->GetInvisibleHeavenId() : pDoc->GetInvisibleHellId() ); 716 else 717 pObj->SetLayer(pDoc->GetInvisibleControlsId()); 718 719 SwPaM* pPam = new SwPaM(pDoc->GetNodes().GetEndOfContent()); 720 SwUnoInternalPaM* pInternalPam = 0; 721 uno::Reference< text::XTextRange > xRg; 722 if( pDesc && (xRg = pDesc->GetTextRange()).is() ) 723 { 724 pInternalPam = new SwUnoInternalPaM(*pDoc); 725 if (::sw::XTextRangeToSwPaM(*pInternalPam, xRg)) 726 { 727 if(FLY_AT_FLY == aAnchor.GetAnchorId() && 728 !pInternalPam->GetNode()->FindFlyStartNode()) 729 { 730 aAnchor.SetType(FLY_AS_CHAR); 731 } 732 else if (FLY_AT_PAGE == aAnchor.GetAnchorId()) 733 { 734 aAnchor.SetAnchor(pInternalPam->Start()); 735 } 736 } 737 else 738 throw uno::RuntimeException(); 739 } 740 else if ((aAnchor.GetAnchorId() != FLY_AT_PAGE) && pDoc->GetCurrentLayout()) 741 { 742 SwCrsrMoveState aState( MV_SETONLYTEXT ); 743 Point aTmp(MM100_TO_TWIP(aMM100Pos.X), MM100_TO_TWIP(aMM100Pos.Y)); 744 pDoc->GetCurrentLayout()->GetCrsrOfst( pPam->GetPoint(), aTmp, &aState ); //swmod 080218 745 aAnchor.SetAnchor( pPam->GetPoint() ); 746 747 // --> OD 2004-08-18 #i32349# - adjustment of vertical positioning 748 // attributes no longer needed, because its already got a default. 749 } 750 else 751 { 752 aAnchor.SetType(FLY_AT_PAGE); 753 754 // --> OD 2004-08-18 #i32349# - adjustment of vertical positioning 755 // attributes no longer needed, because its already got a default. 756 } 757 aSet.Put(aAnchor); 758 SwPaM* pTemp = pInternalPam; 759 if ( !pTemp ) 760 pTemp = pPam; 761 UnoActionContext aAction(pDoc); 762 pDoc->InsertDrawObj( *pTemp, *pObj, aSet ); 763 SwFrmFmt* pFmt = ::FindFrmFmt( pObj ); 764 if(pFmt) 765 pFmt->Add(pShape); 766 pShape->m_bDescriptor = sal_False; 767 768 delete pPam; 769 delete pInternalPam; 770 } 771 772 void SwXDrawPage::remove(const uno::Reference< drawing::XShape > & xShape) throw( uno::RuntimeException ) 773 { 774 vos::OGuard aGuard(Application::GetSolarMutex()); 775 if(!pDoc) 776 throw uno::RuntimeException(); 777 uno::Reference<lang::XComponent> xComp(xShape, uno::UNO_QUERY); 778 xComp->dispose(); 779 } 780 781 uno::Reference< drawing::XShapeGroup > SwXDrawPage::group(const uno::Reference< drawing::XShapes > & xShapes) throw( uno::RuntimeException ) 782 { 783 vos::OGuard aGuard(Application::GetSolarMutex()); 784 if(!pDoc || !xShapes.is()) 785 throw uno::RuntimeException(); 786 uno::Reference< drawing::XShapeGroup > xRet; 787 if(xPageAgg.is()) 788 { 789 790 SwFmDrawPage* pPage = GetSvxPage(); 791 if(pPage)//kann das auch Null sein? 792 { 793 //markieren und MarkList zurueckgeben 794 const SdrMarkList& rMarkList = pPage->PreGroup(xShapes); 795 if ( rMarkList.GetMarkCount() > 1 ) 796 { 797 sal_Bool bFlyInCnt = sal_False; 798 for ( sal_uInt16 i = 0; !bFlyInCnt && i < rMarkList.GetMarkCount(); ++i ) 799 { 800 const SdrObject *pObj = rMarkList.GetMark( i )->GetMarkedSdrObj(); 801 if (FLY_AS_CHAR == ::FindFrmFmt(const_cast<SdrObject*>( 802 pObj))->GetAnchor().GetAnchorId()) 803 { 804 bFlyInCnt = sal_True; 805 } 806 } 807 if( bFlyInCnt ) 808 throw uno::RuntimeException(); 809 if( !bFlyInCnt ) 810 { 811 UnoActionContext aContext(pDoc); 812 pDoc->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL ); 813 814 SwDrawContact* pContact = pDoc->GroupSelection( *pPage->GetDrawView() ); 815 pDoc->ChgAnchor( 816 pPage->GetDrawView()->GetMarkedObjectList(), 817 FLY_AT_PARA/*int eAnchorId*/, 818 sal_True, sal_False ); 819 820 pPage->GetDrawView()->UnmarkAll(); 821 if(pContact) 822 { 823 uno::Reference< uno::XInterface > xInt = pPage->GetInterface( pContact->GetMaster() ); 824 xRet = uno::Reference< drawing::XShapeGroup >(xInt, uno::UNO_QUERY); 825 } 826 pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL ); 827 } 828 } 829 pPage->RemovePageView(); 830 } 831 } 832 return xRet; 833 } 834 835 void SwXDrawPage::ungroup(const uno::Reference< drawing::XShapeGroup > & xShapeGroup) throw( uno::RuntimeException ) 836 { 837 vos::OGuard aGuard(Application::GetSolarMutex()); 838 if(!pDoc) 839 throw uno::RuntimeException(); 840 if(xPageAgg.is()) 841 { 842 SwFmDrawPage* pPage = GetSvxPage(); 843 if(pPage)//kann das auch Null sein? 844 { 845 pPage->PreUnGroup(xShapeGroup); 846 UnoActionContext aContext(pDoc); 847 pDoc->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL ); 848 849 pDoc->UnGroupSelection( *pPage->GetDrawView() ); 850 pDoc->ChgAnchor( pPage->GetDrawView()->GetMarkedObjectList(), 851 FLY_AT_PARA/*int eAnchorId*/, 852 sal_True, sal_False ); 853 pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL ); 854 } 855 pPage->RemovePageView(); 856 } 857 } 858 859 SwFmDrawPage* SwXDrawPage::GetSvxPage() 860 { 861 if(!xPageAgg.is() && pDoc) 862 { 863 vos::OGuard aGuard(Application::GetSolarMutex()); 864 // --> OD 2005-08-08 #i52858# - method name changed 865 SdrModel* pModel = pDoc->GetOrCreateDrawModel(); 866 // <-- 867 SdrPage* pPage = pModel->GetPage( 0 ); 868 869 { 870 // waehrend des queryInterface braucht man ein Ref auf das 871 // Objekt, sonst wird es geloescht. 872 pDrawPage = new SwFmDrawPage(pPage); 873 uno::Reference< drawing::XDrawPage > xPage = pDrawPage; 874 uno::Any aAgg = xPage->queryInterface(::getCppuType((uno::Reference< uno::XAggregation >*)0)); 875 if(aAgg.getValueType() == ::getCppuType((uno::Reference< uno::XAggregation >*)0)) 876 xPageAgg = *(uno::Reference< uno::XAggregation >*)aAgg.getValue(); 877 } 878 if( xPageAgg.is() ) 879 xPageAgg->setDelegator( (cppu::OWeakObject*)this ); 880 } 881 return pDrawPage; 882 } 883 884 // renamed and outlined to detect where it's called 885 void SwXDrawPage::InvalidateSwDoc() 886 { 887 pDoc = 0; 888 } 889 890 /**************************************************************************** 891 892 ****************************************************************************/ 893 TYPEINIT1(SwXShape, SwClient); 894 895 const uno::Sequence< sal_Int8 > & SwXShape::getUnoTunnelId() 896 { 897 static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId(); 898 return aSeq; 899 } 900 901 sal_Int64 SAL_CALL SwXShape::getSomething( const uno::Sequence< sal_Int8 >& rId ) 902 throw(uno::RuntimeException) 903 { 904 if( rId.getLength() == 16 905 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), 906 rId.getConstArray(), 16 ) ) 907 { 908 return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) ); 909 } 910 911 if( xShapeAgg.is() ) 912 { 913 const uno::Type& rTunnelType = ::getCppuType((uno::Reference<lang::XUnoTunnel>*)0 ); 914 uno::Any aAgg = xShapeAgg->queryAggregation( rTunnelType ); 915 if(aAgg.getValueType() == rTunnelType) 916 { 917 uno::Reference<lang::XUnoTunnel> xAggTunnel = 918 *(uno::Reference<lang::XUnoTunnel>*)aAgg.getValue(); 919 if(xAggTunnel.is()) 920 return xAggTunnel->getSomething(rId); 921 } 922 } 923 return 0; 924 } 925 namespace 926 { 927 static void lcl_addShapePropertyEventFactories( SdrObject& _rObj, SwXShape& _rShape ) 928 { 929 ::svx::PPropertyValueProvider pProvider( new ::svx::PropertyValueProvider( _rShape, "AnchorType" ) ); 930 _rObj.getShapePropertyChangeNotifier().registerProvider( ::svx::eTextShapeAnchorType, pProvider ); 931 } 932 } 933 934 935 SwXShape::SwXShape(uno::Reference< uno::XInterface > & xShape) : 936 m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_SHAPE)), 937 m_pPropertyMapEntries(aSwMapProvider.GetPropertyMapEntries(PROPERTY_MAP_TEXT_SHAPE)), 938 pImplementationId(0), 939 pImpl(new SwShapeDescriptor_Impl()), 940 m_bDescriptor(sal_True) 941 { 942 if(xShape.is()) // default Ctor 943 { 944 const uno::Type& rAggType = ::getCppuType((const uno::Reference< uno::XAggregation >*)0); 945 //aAgg contains a reference of the SvxShape! 946 { 947 uno::Any aAgg = xShape->queryInterface(rAggType); 948 if(aAgg.getValueType() == rAggType) 949 xShapeAgg = *(uno::Reference< uno::XAggregation >*)aAgg.getValue(); 950 // --> OD 2004-07-23 #i31698# 951 if ( xShapeAgg.is() ) 952 { 953 xShapeAgg->queryAggregation( ::getCppuType((uno::Reference< drawing::XShape >*)0) ) >>= mxShape; 954 ASSERT( mxShape.is(), 955 "<SwXShape::SwXShape(..)> - no XShape found at <xShapeAgg>" ); 956 } 957 // <-- 958 } 959 xShape = 0; 960 m_refCount++; 961 if( xShapeAgg.is() ) 962 xShapeAgg->setDelegator( (cppu::OWeakObject*)this ); 963 m_refCount--; 964 965 uno::Reference< lang::XUnoTunnel > xShapeTunnel(xShapeAgg, uno::UNO_QUERY); 966 SvxShape* pShape = 0; 967 if(xShapeTunnel.is()) 968 pShape = reinterpret_cast< SvxShape * >( 969 sal::static_int_cast< sal_IntPtr >( xShapeTunnel->getSomething(SvxShape::getUnoTunnelId()) )); 970 971 SdrObject* pObj = pShape ? pShape->GetSdrObject() : 0; 972 if(pObj) 973 { 974 SwFrmFmt* pFmt = ::FindFrmFmt( pObj ); 975 if(pFmt) 976 pFmt->Add(this); 977 978 lcl_addShapePropertyEventFactories( *pObj, *this ); 979 pImpl->bInitializedPropertyNotifier = true; 980 } 981 } 982 } 983 984 void SwXShape::AddExistingShapeToFmt( SdrObject& _rObj ) 985 { 986 SdrObjListIter aIter( _rObj, IM_DEEPNOGROUPS ); 987 while ( aIter.IsMore() ) 988 { 989 SdrObject* pCurrent = aIter.Next(); 990 OSL_ENSURE( pCurrent, "SwXShape::AddExistingShapeToFmt: invalid object list element!" ); 991 if ( !pCurrent ) 992 continue; 993 994 SwXShape* pSwShape = NULL; 995 uno::Reference< lang::XUnoTunnel > xShapeTunnel( pCurrent->getWeakUnoShape(), uno::UNO_QUERY ); 996 if ( xShapeTunnel.is() ) 997 pSwShape = reinterpret_cast< SwXShape * >( 998 sal::static_int_cast< sal_IntPtr >( xShapeTunnel->getSomething( SwXShape::getUnoTunnelId() ) ) ); 999 if ( pSwShape ) 1000 { 1001 if ( pSwShape->m_bDescriptor ) 1002 { 1003 SwFrmFmt* pFmt = ::FindFrmFmt( const_cast< SdrObject* >( pCurrent ) ); 1004 if ( pFmt ) 1005 pFmt->Add( pSwShape ); 1006 pSwShape->m_bDescriptor = sal_False; 1007 } 1008 1009 if ( !pSwShape->pImpl->bInitializedPropertyNotifier ) 1010 { 1011 lcl_addShapePropertyEventFactories( *pCurrent, *pSwShape ); 1012 pSwShape->pImpl->bInitializedPropertyNotifier = true; 1013 } 1014 } 1015 } 1016 } 1017 1018 1019 SwXShape::~SwXShape() 1020 { 1021 if (xShapeAgg.is()) 1022 { 1023 uno::Reference< uno::XInterface > xRef; 1024 xShapeAgg->setDelegator(xRef); 1025 } 1026 delete pImpl; 1027 } 1028 1029 uno::Any SwXShape::queryInterface( const uno::Type& aType ) throw( uno::RuntimeException ) 1030 { 1031 uno::Any aRet = SwXShapeBaseClass::queryInterface(aType); 1032 // --> OD 2005-08-15 #i53320# - follow-up of #i31698# 1033 // interface drawing::XShape is overloaded. Thus, provide 1034 // correct object instance. 1035 if(!aRet.hasValue() && xShapeAgg.is()) 1036 { 1037 if(aType == ::getCppuType((uno::Reference<XShape>*)0)) 1038 aRet <<= uno::Reference<XShape>(this); 1039 else 1040 aRet = xShapeAgg->queryAggregation(aType); 1041 } 1042 // <-- 1043 return aRet; 1044 } 1045 1046 uno::Sequence< uno::Type > SwXShape::getTypes( ) throw(uno::RuntimeException) 1047 { 1048 uno::Sequence< uno::Type > aRet = SwXShapeBaseClass::getTypes(); 1049 if(xShapeAgg.is()) 1050 { 1051 uno::Any aProv = xShapeAgg->queryAggregation(::getCppuType((uno::Reference< XTypeProvider >*)0)); 1052 if(aProv.hasValue()) 1053 { 1054 uno::Reference< XTypeProvider > xAggProv; 1055 aProv >>= xAggProv; 1056 uno::Sequence< uno::Type > aAggTypes = xAggProv->getTypes(); 1057 const uno::Type* pAggTypes = aAggTypes.getConstArray(); 1058 long nIndex = aRet.getLength(); 1059 1060 aRet.realloc(nIndex + aAggTypes.getLength()); 1061 uno::Type* pBaseTypes = aRet.getArray(); 1062 1063 for(long i = 0; i < aAggTypes.getLength(); i++) 1064 pBaseTypes[nIndex++] = pAggTypes[i]; 1065 } 1066 } 1067 return aRet; 1068 } 1069 1070 uno::Sequence< sal_Int8 > SwXShape::getImplementationId( ) throw(uno::RuntimeException) 1071 { 1072 vos::OGuard aGuard( Application::GetSolarMutex() ); 1073 // do we need to compute the implementation id for this instance? 1074 if( !pImplementationId && xShapeAgg.is()) 1075 { 1076 uno::Reference< XShape > xAggShape; 1077 xShapeAgg->queryAggregation( ::getCppuType((uno::Reference< XShape >*)0) ) >>= xAggShape; 1078 1079 if( xAggShape.is() ) 1080 { 1081 const rtl::OUString aShapeType( xAggShape->getShapeType() ); 1082 // did we already compute an implementation id for the agregated shape type? 1083 SwShapeImplementationIdMap::iterator aIter( aImplementationIdMap.find(aShapeType ) ); 1084 if( aIter == aImplementationIdMap.end() ) 1085 { 1086 // we need to create a new implementation id for this 1087 // note: this memory is not free'd until application exists 1088 // but since we have a fixed set of shapetypes and the 1089 // memory will be reused this is ok. 1090 pImplementationId = new uno::Sequence< sal_Int8 >( 16 ); 1091 rtl_createUuid( (sal_uInt8 *) pImplementationId->getArray(), 0, sal_True ); 1092 aImplementationIdMap[ aShapeType ] = pImplementationId; 1093 } 1094 else 1095 { 1096 // use the already computed implementation id 1097 pImplementationId = (*aIter).second; 1098 } 1099 } 1100 } 1101 if( NULL == pImplementationId ) 1102 { 1103 DBG_ERROR( "Could not create an implementation id for a SwXShape!" ); 1104 return uno::Sequence< sal_Int8 > (); 1105 } 1106 else 1107 { 1108 return *pImplementationId; 1109 } 1110 } 1111 1112 uno::Reference< beans::XPropertySetInfo > SwXShape::getPropertySetInfo(void) throw( uno::RuntimeException ) 1113 { 1114 vos::OGuard aGuard(Application::GetSolarMutex()); 1115 uno::Reference< beans::XPropertySetInfo > aRet; 1116 if(xShapeAgg.is()) 1117 { 1118 const uno::Type& rPropSetType = ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 1119 uno::Any aPSet = xShapeAgg->queryAggregation( rPropSetType ); 1120 if(aPSet.getValueType() == rPropSetType && aPSet.getValue()) 1121 { 1122 uno::Reference< beans::XPropertySet > xPrSet = 1123 *(uno::Reference< beans::XPropertySet >*)aPSet.getValue(); 1124 uno::Reference< beans::XPropertySetInfo > xInfo = xPrSet->getPropertySetInfo(); 1125 // PropertySetInfo verlaengern! 1126 const uno::Sequence<beans::Property> aPropSeq = xInfo->getProperties(); 1127 aRet = new SfxExtItemPropertySetInfo( m_pPropertyMapEntries, aPropSeq ); 1128 } 1129 } 1130 if(!aRet.is()) 1131 aRet = m_pPropSet->getPropertySetInfo(); 1132 return aRet; 1133 } 1134 1135 void SwXShape::setPropertyValue(const rtl::OUString& rPropertyName, const uno::Any& aValue) 1136 throw( beans::UnknownPropertyException, beans::PropertyVetoException, 1137 lang::IllegalArgumentException, lang::WrappedTargetException, 1138 uno::RuntimeException) 1139 { 1140 vos::OGuard aGuard(Application::GetSolarMutex()); 1141 SwFrmFmt* pFmt = GetFrmFmt(); 1142 const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName( rPropertyName ); 1143 if(xShapeAgg.is()) 1144 { 1145 if(pEntry) 1146 { 1147 if ( pEntry->nFlags & beans::PropertyAttribute::READONLY) 1148 throw beans::PropertyVetoException ( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) ); 1149 //mit Layout kann der Anker umgesetzt werden, ohne dass sich die Position aendert 1150 if(pFmt) 1151 { 1152 SwAttrSet aSet(pFmt->GetAttrSet()); 1153 SwDoc* pDoc = pFmt->GetDoc(); 1154 if(RES_ANCHOR == pEntry->nWID && MID_ANCHOR_ANCHORFRAME == pEntry->nMemberId) 1155 { 1156 sal_Bool bDone = sal_True; 1157 uno::Reference<text::XTextFrame> xFrame; 1158 if(aValue >>= xFrame) 1159 { 1160 uno::Reference<lang::XUnoTunnel> xTunnel(xFrame, uno::UNO_QUERY); 1161 SwXFrame* pFrame = xTunnel.is() ? 1162 reinterpret_cast< SwXFrame * >( 1163 sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething(SwXFrame::getUnoTunnelId()) )) 1164 : 0; 1165 if(pFrame && pFrame->GetFrmFmt() && 1166 pFrame->GetFrmFmt()->GetDoc() == pDoc) 1167 { 1168 UnoActionContext aCtx(pDoc); 1169 SfxItemSet aItemSet( pDoc->GetAttrPool(), 1170 RES_FRMATR_BEGIN, RES_FRMATR_END - 1 ); 1171 aItemSet.SetParent(&pFmt->GetAttrSet()); 1172 SwFmtAnchor aAnchor = (const SwFmtAnchor&)aItemSet.Get(pEntry->nWID); 1173 SwPosition aPos(*pFrame->GetFrmFmt()->GetCntnt().GetCntntIdx()); 1174 aAnchor.SetAnchor(&aPos); 1175 aAnchor.SetType(FLY_AT_FLY); 1176 aItemSet.Put(aAnchor); 1177 pFmt->SetFmtAttr(aItemSet); 1178 bDone = sal_True; 1179 } 1180 } 1181 if(!bDone) 1182 throw lang::IllegalArgumentException(); 1183 } 1184 else if(RES_OPAQUE == pEntry->nWID) 1185 { 1186 SvxShape* pSvxShape = GetSvxShape(); 1187 DBG_ASSERT(pSvxShape, "No SvxShape found!"); 1188 if(pSvxShape) 1189 { 1190 SdrObject* pObj = pSvxShape->GetSdrObject(); 1191 // OD 25.06.2003 #108784# - set layer of new drawing 1192 // object to corresponding invisible layer. 1193 bool bIsVisible = pDoc->IsVisibleLayerId( pObj->GetLayer() ); 1194 if(FmFormInventor != pObj->GetObjInventor()) 1195 { 1196 pObj->SetLayer( *(sal_Bool*)aValue.getValue() 1197 ? ( bIsVisible ? pDoc->GetHeavenId() : pDoc->GetInvisibleHeavenId() ) 1198 : ( bIsVisible ? pDoc->GetHellId() : pDoc->GetInvisibleHellId() )); 1199 } 1200 else 1201 { 1202 pObj->SetLayer( bIsVisible ? pDoc->GetControlsId() : pDoc->GetInvisibleControlsId()); 1203 } 1204 1205 } 1206 1207 } 1208 // OD 2004-04-22 #i26791# - special handling for property FN_TEXT_RANGE 1209 else if ( FN_TEXT_RANGE == pEntry->nWID ) 1210 { 1211 SwFmtAnchor aAnchor( static_cast<const SwFmtAnchor&>(aSet.Get( RES_ANCHOR )) ); 1212 if (aAnchor.GetAnchorId() == FLY_AT_PAGE) 1213 { 1214 // set property <TextRange> not valid for to-page anchored shapes 1215 throw lang::IllegalArgumentException(); 1216 } 1217 else 1218 { 1219 SwUnoInternalPaM* pInternalPam = 1220 new SwUnoInternalPaM( *(pFmt->GetDoc()) ); 1221 uno::Reference< text::XTextRange > xRg; 1222 aValue >>= xRg; 1223 if (::sw::XTextRangeToSwPaM(*pInternalPam, xRg) ) 1224 { 1225 if (aAnchor.GetAnchorId() == FLY_AS_CHAR) 1226 { 1227 //delete old SwFmtFlyCnt 1228 //With AnchorAsCharacter the current TxtAttribute has to be deleted. 1229 //Tbis removes the frame format too. 1230 //To prevent this the connection between format and attribute has to be broken before. 1231 const SwPosition *pPos = aAnchor.GetCntntAnchor(); 1232 SwTxtNode *pTxtNode = pPos->nNode.GetNode().GetTxtNode(); 1233 ASSERT( pTxtNode->HasHints(), "Missing FlyInCnt-Hint." ); 1234 const xub_StrLen nIdx = pPos->nContent.GetIndex(); 1235 SwTxtAttr * const pHnt = 1236 pTxtNode->GetTxtAttrForCharAt( 1237 nIdx, RES_TXTATR_FLYCNT ); 1238 DBG_ASSERT( pHnt && pHnt->Which() == RES_TXTATR_FLYCNT, 1239 "Missing FlyInCnt-Hint." ); 1240 DBG_ASSERT( pHnt && pHnt->GetFlyCnt().GetFrmFmt() == pFmt, 1241 "Wrong TxtFlyCnt-Hint." ); 1242 const_cast<SwFmtFlyCnt&>(pHnt->GetFlyCnt()) 1243 .SetFlyFmt(); 1244 1245 //The connection is removed now the attribute can be deleted. 1246 pTxtNode->DeleteAttributes( RES_TXTATR_FLYCNT, nIdx ); 1247 //create a new one 1248 SwTxtNode *pNd = pInternalPam->GetNode()->GetTxtNode(); 1249 DBG_ASSERT( pNd, "Cursor not at TxtNode." ); 1250 SwFmtFlyCnt aFmt( pFmt ); 1251 pNd->InsertItem(aFmt, pInternalPam->GetPoint() 1252 ->nContent.GetIndex(), 0 ); 1253 } 1254 else 1255 { 1256 aAnchor.SetAnchor( pInternalPam->GetPoint() ); 1257 aSet.Put(aAnchor); 1258 pFmt->SetFmtAttr(aSet); 1259 } 1260 } 1261 else 1262 { 1263 throw uno::RuntimeException(); 1264 } 1265 delete pInternalPam; 1266 } 1267 } 1268 // --> OD 2004-08-06 #i28749# 1269 else if ( FN_SHAPE_POSITION_LAYOUT_DIR == pEntry->nWID ) 1270 { 1271 sal_Int16 nPositionLayoutDir = 0; 1272 aValue >>= nPositionLayoutDir; 1273 pFmt->SetPositionLayoutDir( nPositionLayoutDir ); 1274 } 1275 // <-- 1276 else if( pDoc->GetCurrentLayout()) //swmod 080218 1277 { 1278 UnoActionContext aCtx(pDoc); 1279 if(RES_ANCHOR == pEntry->nWID && MID_ANCHOR_ANCHORTYPE == pEntry->nMemberId) 1280 { 1281 SdrObject* pObj = pFmt->FindSdrObject(); 1282 SdrMarkList aList; 1283 SdrMark aMark(pObj); 1284 aList.InsertEntry(aMark); 1285 sal_Int32 nAnchor = 0; 1286 cppu::enum2int( nAnchor, aValue ); 1287 pDoc->ChgAnchor( aList, (RndStdIds)nAnchor, 1288 sal_False, sal_True ); 1289 } 1290 else 1291 { 1292 m_pPropSet->setPropertyValue(*pEntry, aValue, aSet); 1293 pFmt->SetFmtAttr(aSet); 1294 } 1295 } 1296 else 1297 { 1298 m_pPropSet->setPropertyValue( *pEntry, aValue, aSet ); 1299 1300 if(RES_ANCHOR == pEntry->nWID && MID_ANCHOR_ANCHORTYPE == pEntry->nMemberId) 1301 { 1302 bool bSetAttr = true; 1303 sal_Int32 eNewAnchor = SWUnoHelper::GetEnumAsInt32( aValue ); 1304 1305 //if old anchor was in_cntnt the related text attribute has to be removed 1306 const SwFmtAnchor& rOldAnchor = pFmt->GetAnchor(); 1307 RndStdIds eOldAnchorId = rOldAnchor.GetAnchorId(); 1308 SdrObject* pObj = pFmt->FindSdrObject(); 1309 SwFrmFmt *pFlyFmt = FindFrmFmt( pObj ); 1310 pFlyFmt->DelFrms(); 1311 if( text::TextContentAnchorType_AS_CHARACTER != eNewAnchor && 1312 (FLY_AS_CHAR == eOldAnchorId)) 1313 { 1314 //With AnchorAsCharacter the current TxtAttribute has to be deleted. 1315 //Tbis removes the frame format too. 1316 //To prevent this the connection between format and attribute has to be broken before. 1317 const SwPosition *pPos = rOldAnchor.GetCntntAnchor(); 1318 SwTxtNode *pTxtNode = pPos->nNode.GetNode().GetTxtNode(); 1319 ASSERT( pTxtNode->HasHints(), "Missing FlyInCnt-Hint." ); 1320 const xub_StrLen nIdx = pPos->nContent.GetIndex(); 1321 SwTxtAttr * const pHnt = 1322 pTxtNode->GetTxtAttrForCharAt( 1323 nIdx, RES_TXTATR_FLYCNT ); 1324 DBG_ASSERT( pHnt && pHnt->Which() == RES_TXTATR_FLYCNT, 1325 "Missing FlyInCnt-Hint." ); 1326 DBG_ASSERT( pHnt && pHnt->GetFlyCnt().GetFrmFmt() == pFlyFmt, 1327 "Wrong TxtFlyCnt-Hint." ); 1328 const_cast<SwFmtFlyCnt&>(pHnt->GetFlyCnt()) 1329 .SetFlyFmt(); 1330 1331 //The connection is removed now the attribute can be deleted. 1332 pTxtNode->DeleteAttributes(RES_TXTATR_FLYCNT, nIdx); 1333 } 1334 else if( text::TextContentAnchorType_AT_PAGE != eNewAnchor && 1335 (FLY_AT_PAGE == eOldAnchorId)) 1336 { 1337 SwFmtAnchor aNewAnchor( dynamic_cast< const SwFmtAnchor& >( aSet.Get( RES_ANCHOR ) ) ); 1338 //if the fly has been anchored at page then it needs to be connected 1339 //to the content position 1340 SwPaM aPam(pDoc->GetNodes().GetEndOfContent()); 1341 if( pDoc->GetCurrentLayout() ) 1342 { 1343 SwCrsrMoveState aState( MV_SETONLYTEXT ); 1344 Point aTmp( pObj->GetSnapRect().TopLeft() ); 1345 pDoc->GetCurrentLayout()->GetCrsrOfst( aPam.GetPoint(), aTmp, &aState ); 1346 } 1347 else 1348 { 1349 //without access to the layout the last node of the body will be used as anchor position 1350 aPam.Move( fnMoveBackward, fnGoDoc ); 1351 } 1352 //anchor position has to be inserted after the text attribute has been inserted 1353 aNewAnchor.SetAnchor( aPam.GetPoint() ); 1354 aSet.Put( aNewAnchor ); 1355 pFmt->SetFmtAttr(aSet); 1356 bSetAttr = false; 1357 if( text::TextContentAnchorType_AS_CHARACTER == eNewAnchor && 1358 (FLY_AS_CHAR != eOldAnchorId)) 1359 { 1360 //the RES_TXTATR_FLYCNT needs to be added now 1361 SwTxtNode *pNd = aPam.GetNode()->GetTxtNode(); 1362 DBG_ASSERT( pNd, "Crsr is not in a TxtNode." ); 1363 SwFmtFlyCnt aFmt( pFlyFmt ); 1364 pNd->InsertItem(aFmt, 1365 aPam.GetPoint()->nContent.GetIndex(), 0 ); 1366 //aPam.GetPoint()->nContent--; 1367 1368 } 1369 } 1370 if( bSetAttr ) 1371 pFmt->SetFmtAttr(aSet); 1372 } 1373 else 1374 pFmt->SetFmtAttr(aSet); 1375 } 1376 } 1377 else 1378 { 1379 SfxPoolItem* pItem = 0; 1380 switch(pEntry->nWID) 1381 { 1382 case RES_ANCHOR: 1383 pItem = pImpl->GetAnchor(sal_True); 1384 break; 1385 case RES_HORI_ORIENT: 1386 pItem = pImpl->GetHOrient(sal_True); 1387 break; 1388 case RES_VERT_ORIENT: 1389 pItem = pImpl->GetVOrient(sal_True); 1390 break; 1391 case RES_LR_SPACE: 1392 pItem = pImpl->GetLRSpace(sal_True); 1393 break; 1394 case RES_UL_SPACE: 1395 pItem = pImpl->GetULSpace(sal_True); 1396 break; 1397 case RES_SURROUND: 1398 pItem = pImpl->GetSurround(sal_True); 1399 break; 1400 case FN_TEXT_RANGE: 1401 { 1402 const uno::Type rTextRangeType = 1403 ::getCppuType((uno::Reference< text::XTextRange>*)0); 1404 if(aValue.getValueType() == rTextRangeType) 1405 { 1406 uno::Reference< text::XTextRange > & rRange = pImpl->GetTextRange(); 1407 rRange = *(uno::Reference< text::XTextRange > *)aValue.getValue(); 1408 } 1409 } 1410 break; 1411 case RES_OPAQUE : 1412 pImpl->SetOpaque(*(sal_Bool*)aValue.getValue()); 1413 break; 1414 // OD 2004-04-22 #i26791# 1415 case RES_FOLLOW_TEXT_FLOW: 1416 { 1417 pItem = pImpl->GetFollowTextFlow( sal_True ); 1418 } 1419 break; 1420 // OD 2004-05-05 #i28701# 1421 case RES_WRAP_INFLUENCE_ON_OBJPOS: 1422 { 1423 pItem = pImpl->GetWrapInfluenceOnObjPos( sal_True ); 1424 } 1425 break; 1426 // --> OD 2004-08-06 #i28749# 1427 case FN_SHAPE_POSITION_LAYOUT_DIR : 1428 { 1429 sal_Int16 nPositionLayoutDir = 0; 1430 aValue >>= nPositionLayoutDir; 1431 pImpl->SetPositionLayoutDir( nPositionLayoutDir ); 1432 } 1433 break; 1434 // <-- 1435 } 1436 if(pItem) 1437 ((SfxPoolItem*)pItem)->PutValue(aValue, pEntry->nMemberId); 1438 } 1439 } 1440 else 1441 { 1442 uno::Reference< beans::XPropertySet > xPrSet; 1443 const uno::Type& rPSetType = 1444 ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 1445 uno::Any aPSet = xShapeAgg->queryAggregation(rPSetType); 1446 if(aPSet.getValueType() != rPSetType || !aPSet.getValue()) 1447 throw uno::RuntimeException(); 1448 xPrSet = *(uno::Reference< beans::XPropertySet >*)aPSet.getValue(); 1449 // --> OD 2004-08-05 #i31698# - setting the caption point of a 1450 // caption object doesn't have to change the object position. 1451 // Thus, keep the position, before the caption point is set and 1452 // restore it afterwards. 1453 awt::Point aKeepedPosition( 0, 0 ); 1454 if ( rPropertyName.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CaptionPoint"))) && 1455 getShapeType().equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.CaptionShape"))) ) 1456 { 1457 aKeepedPosition = getPosition(); 1458 } 1459 // <-- 1460 if( pFmt && pFmt->GetDoc()->GetCurrentViewShell() ) //swmod 071108//swmod 071225 1461 { 1462 UnoActionContext aCtx(pFmt->GetDoc()); 1463 xPrSet->setPropertyValue(rPropertyName, aValue); 1464 } 1465 else 1466 xPrSet->setPropertyValue(rPropertyName, aValue); 1467 // --> OD 2004-11-11 #i35007# - adjustment of the position 1468 // attributes, if the transformation is set, causes wrong alignments 1469 // and is no longer needed. 1470 // The position attributes are set, if the drawing object is added 1471 // to the draw page - see <SwXDrawPage::add(..)> - and on its first 1472 // positioning - see <SwAnchoredDrawObject::MakeObjPos(). 1473 // // --> OD 2004-07-28 #i31698# - additionally adjust the position 1474 // // properties of the shape, if the transformation is set and 1475 // // the shape isn't a group member. 1476 // if ( rPropertyName.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation"))) && 1477 // !_GetTopGroupObj() ) 1478 // { 1479 // drawing::HomogenMatrix3 aMatrix; 1480 // aValue >>= aMatrix; 1481 // awt::Point aNewPos( basegfx::fround( aMatrix.Line1.Column3 ), 1482 // basegfx::fround( aMatrix.Line2.Column3 ) ); 1483 // _AdjustPositionProperties( aNewPos ); 1484 // } 1485 // --> OD 2004-08-05 #i31698# - restore object position, if caption 1486 // point is set. 1487 if ( rPropertyName.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CaptionPoint"))) && 1488 getShapeType().equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.CaptionShape"))) ) 1489 { 1490 setPosition( aKeepedPosition ); 1491 } 1492 } 1493 } 1494 } 1495 1496 uno::Any SwXShape::getPropertyValue(const rtl::OUString& rPropertyName) 1497 throw( beans::UnknownPropertyException, lang::WrappedTargetException, 1498 uno::RuntimeException ) 1499 { 1500 vos::OGuard aGuard(Application::GetSolarMutex()); 1501 uno::Any aRet; 1502 SwFrmFmt* pFmt = GetFrmFmt(); 1503 if(xShapeAgg.is()) 1504 { 1505 const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName( rPropertyName ); 1506 if(pEntry) 1507 { 1508 if(pFmt) 1509 { 1510 if(RES_OPAQUE == pEntry->nWID) 1511 { 1512 SvxShape* pSvxShape = GetSvxShape(); 1513 DBG_ASSERT(pSvxShape, "No SvxShape found!"); 1514 if(pSvxShape) 1515 { 1516 SdrObject* pObj = pSvxShape->GetSdrObject(); 1517 // OD 02.07.2003 #108784# - consider invisible layers 1518 sal_Bool bOpaque = 1519 ( pObj->GetLayer() != pFmt->GetDoc()->GetHellId() && 1520 pObj->GetLayer() != pFmt->GetDoc()->GetInvisibleHellId() ); 1521 aRet.setValue(&bOpaque, ::getBooleanCppuType()); 1522 } 1523 } 1524 else if(FN_ANCHOR_POSITION == pEntry->nWID) 1525 { 1526 SvxShape* pSvxShape = GetSvxShape(); 1527 DBG_ASSERT(pSvxShape, "No SvxShape found!"); 1528 if(pSvxShape) 1529 { 1530 SdrObject* pObj = pSvxShape->GetSdrObject(); 1531 Point aPt = pObj->GetAnchorPos(); 1532 awt::Point aPoint( TWIP_TO_MM100( aPt.X() ), 1533 TWIP_TO_MM100( aPt.Y() ) ); 1534 aRet.setValue(&aPoint, ::getCppuType( (awt::Point*)0 )); 1535 } 1536 } 1537 // OD 2004-04-22 #i26791# - special handling for FN_TEXT_RANGE 1538 else if ( FN_TEXT_RANGE == pEntry->nWID ) 1539 { 1540 const SwFmtAnchor aAnchor = pFmt->GetAnchor(); 1541 if (aAnchor.GetAnchorId() == FLY_AT_PAGE) 1542 { 1543 // return nothing, because property <TextRange> isn't 1544 // valid for to-page anchored shapes 1545 uno::Any aAny; 1546 aRet = aAny; 1547 } 1548 else 1549 { 1550 if ( aAnchor.GetCntntAnchor() ) 1551 { 1552 const uno::Reference< text::XTextRange > xTextRange 1553 = SwXTextRange::CreateXTextRange( 1554 *pFmt->GetDoc(), 1555 *aAnchor.GetCntntAnchor(), 1556 0L ); 1557 aRet.setValue(&xTextRange, ::getCppuType((uno::Reference<text::XTextRange>*)0)); 1558 } 1559 else 1560 { 1561 // return nothing 1562 uno::Any aAny; 1563 aRet = aAny; 1564 } 1565 } 1566 } 1567 // --> OD 2004-08-06 #i28749# 1568 else if ( FN_SHAPE_TRANSFORMATION_IN_HORI_L2R == pEntry->nWID ) 1569 { 1570 // get property <::drawing::Shape::Transformation> 1571 // without conversion to layout direction as below 1572 aRet = _getPropAtAggrObj( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation")) ); 1573 } 1574 else if ( FN_SHAPE_POSITION_LAYOUT_DIR == pEntry->nWID ) 1575 { 1576 aRet <<= pFmt->GetPositionLayoutDir(); 1577 } 1578 // <-- 1579 // --> OD 2004-10-28 #i36248# 1580 else if ( FN_SHAPE_STARTPOSITION_IN_HORI_L2R == pEntry->nWID ) 1581 { 1582 // get property <::drawing::Shape::StartPosition> 1583 // without conversion to layout direction as below 1584 aRet = _getPropAtAggrObj( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")) ); 1585 } 1586 else if ( FN_SHAPE_ENDPOSITION_IN_HORI_L2R == pEntry->nWID ) 1587 { 1588 // get property <::drawing::Shape::EndPosition> 1589 // without conversion to layout direction as below 1590 aRet = _getPropAtAggrObj( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")) ); 1591 } 1592 // <-- 1593 else 1594 { 1595 const SwAttrSet& rSet = pFmt->GetAttrSet(); 1596 m_pPropSet->getPropertyValue(*pEntry, rSet, aRet); 1597 } 1598 } 1599 else 1600 { 1601 SfxPoolItem* pItem = 0; 1602 switch(pEntry->nWID) 1603 { 1604 case RES_ANCHOR: 1605 pItem = pImpl->GetAnchor(); 1606 break; 1607 case RES_HORI_ORIENT: 1608 pItem = pImpl->GetHOrient(); 1609 break; 1610 case RES_VERT_ORIENT: 1611 pItem = pImpl->GetVOrient(); 1612 break; 1613 case RES_LR_SPACE: 1614 pItem = pImpl->GetLRSpace(); 1615 break; 1616 case RES_UL_SPACE: 1617 pItem = pImpl->GetULSpace(); 1618 break; 1619 case RES_SURROUND: 1620 pItem = pImpl->GetSurround(); 1621 break; 1622 case FN_TEXT_RANGE : 1623 aRet.setValue(&pImpl->GetTextRange(), ::getCppuType((uno::Reference<text::XTextRange>*)0)); 1624 break; 1625 case RES_OPAQUE : 1626 aRet.setValue(&pImpl->GetOpaque(), ::getBooleanCppuType()); 1627 break; 1628 case FN_ANCHOR_POSITION : 1629 { 1630 awt::Point aPoint; 1631 aRet.setValue(&aPoint, ::getCppuType( (awt::Point*)0 )); 1632 } 1633 break; 1634 // OD 2004-04-22 #i26791# 1635 case RES_FOLLOW_TEXT_FLOW : 1636 { 1637 pItem = pImpl->GetFollowTextFlow(); 1638 } 1639 break; 1640 // OD 2004-05-05 #i28701# 1641 case RES_WRAP_INFLUENCE_ON_OBJPOS: 1642 { 1643 pItem = pImpl->GetWrapInfluenceOnObjPos(); 1644 } 1645 break; 1646 // --> OD 2004-08-06 #i28749# 1647 case FN_SHAPE_TRANSFORMATION_IN_HORI_L2R: 1648 { 1649 // get property <::drawing::Shape::Transformation> 1650 // without conversion to layout direction as below 1651 aRet = _getPropAtAggrObj( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation")) ); 1652 } 1653 break; 1654 case FN_SHAPE_POSITION_LAYOUT_DIR: 1655 { 1656 aRet <<= pImpl->GetPositionLayoutDir(); 1657 } 1658 break; 1659 // <-- 1660 // --> OD 2004-08-06 #i36248# 1661 case FN_SHAPE_STARTPOSITION_IN_HORI_L2R: 1662 { 1663 // get property <::drawing::Shape::StartPosition> 1664 // without conversion to layout direction as below 1665 aRet = _getPropAtAggrObj( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")) ); 1666 } 1667 break; 1668 case FN_SHAPE_ENDPOSITION_IN_HORI_L2R: 1669 { 1670 // get property <::drawing::Shape::StartPosition> 1671 // without conversion to layout direction as below 1672 aRet = _getPropAtAggrObj( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")) ); 1673 } 1674 break; 1675 // <-- 1676 } 1677 if(pItem) 1678 pItem->QueryValue(aRet, pEntry->nMemberId); 1679 } 1680 } 1681 else 1682 { 1683 aRet = _getPropAtAggrObj( rPropertyName ); 1684 1685 // --> OD 2004-07-28 #i31698# - convert the position (translation) 1686 // of the drawing object in the transformation 1687 if ( rPropertyName.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation"))) ) 1688 { 1689 drawing::HomogenMatrix3 aMatrix; 1690 aRet >>= aMatrix; 1691 aRet <<= _ConvertTransformationToLayoutDir( aMatrix ); 1692 } 1693 // <-- 1694 // --> OD 2004-10-28 #i36248# 1695 else if ( rPropertyName.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition"))) ) 1696 { 1697 awt::Point aStartPos; 1698 aRet >>= aStartPos; 1699 // --> OD 2009-01-12 #i59051# 1700 aRet <<= _ConvertStartOrEndPosToLayoutDir( aStartPos ); 1701 // <-- 1702 } 1703 else if ( rPropertyName.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition"))) ) 1704 { 1705 awt::Point aEndPos; 1706 aRet >>= aEndPos; 1707 // --> OD 2009-01-12 #i59051# 1708 aRet <<= _ConvertStartOrEndPosToLayoutDir( aEndPos ); 1709 // <-- 1710 } 1711 // --> OD 2009-01-16 #i59051# 1712 else if ( rPropertyName.equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PolyPolygonBezier"))) ) 1713 { 1714 drawing::PolyPolygonBezierCoords aPath; 1715 aRet >>= aPath; 1716 aRet <<= _ConvertPolyPolygonBezierToLayoutDir( aPath ); 1717 // <-- 1718 } 1719 // <-- 1720 } 1721 } 1722 return aRet; 1723 } 1724 1725 uno::Any SwXShape::_getPropAtAggrObj( const ::rtl::OUString& _rPropertyName ) 1726 throw( beans::UnknownPropertyException, lang::WrappedTargetException, 1727 uno::RuntimeException ) 1728 { 1729 uno::Any aRet; 1730 1731 uno::Reference< beans::XPropertySet > xPrSet; 1732 const uno::Type& rPSetType = 1733 ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); 1734 uno::Any aPSet = xShapeAgg->queryAggregation(rPSetType); 1735 if ( aPSet.getValueType() != rPSetType || !aPSet.getValue() ) 1736 { 1737 throw uno::RuntimeException(); 1738 } 1739 xPrSet = *(uno::Reference< beans::XPropertySet >*)aPSet.getValue(); 1740 aRet = xPrSet->getPropertyValue( _rPropertyName ); 1741 1742 return aRet; 1743 } 1744 1745 1746 beans::PropertyState SwXShape::getPropertyState( const rtl::OUString& rPropertyName ) 1747 throw(beans::UnknownPropertyException, uno::RuntimeException) 1748 { 1749 vos::OGuard aGuard(Application::GetSolarMutex()); 1750 uno::Sequence< rtl::OUString > aNames(1); 1751 rtl::OUString* pStrings = aNames.getArray(); 1752 pStrings[0] = rPropertyName; 1753 uno::Sequence< beans::PropertyState > aStates = getPropertyStates(aNames); 1754 return aStates.getConstArray()[0]; 1755 } 1756 1757 uno::Sequence< beans::PropertyState > SwXShape::getPropertyStates( 1758 const uno::Sequence< rtl::OUString >& aPropertyNames ) 1759 throw(beans::UnknownPropertyException, uno::RuntimeException) 1760 { 1761 vos::OGuard aGuard(Application::GetSolarMutex()); 1762 SwFrmFmt* pFmt = GetFrmFmt(); 1763 uno::Sequence< beans::PropertyState > aRet(aPropertyNames.getLength()); 1764 if(xShapeAgg.is()) 1765 { 1766 SvxShape* pSvxShape = GetSvxShape(); 1767 sal_Bool bGroupMember = sal_False; 1768 sal_Bool bFormControl = sal_False; 1769 SdrObject* pObject = pSvxShape->GetSdrObject(); 1770 if(pObject) 1771 { 1772 bGroupMember = pObject->GetUpGroup() != 0; 1773 bFormControl = pObject->GetObjInventor() == FmFormInventor; 1774 } 1775 const rtl::OUString* pNames = aPropertyNames.getConstArray(); 1776 beans::PropertyState* pRet = aRet.getArray(); 1777 uno::Reference< XPropertyState > xShapePrState; 1778 for(sal_Int32 nProperty = 0; nProperty < aPropertyNames.getLength(); nProperty++) 1779 { 1780 const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName( pNames[nProperty] ); 1781 if(pEntry) 1782 { 1783 if(RES_OPAQUE == pEntry->nWID) 1784 pRet[nProperty] = bFormControl ? 1785 beans::PropertyState_DEFAULT_VALUE : beans::PropertyState_DIRECT_VALUE; 1786 else if(FN_ANCHOR_POSITION == pEntry->nWID) 1787 pRet[nProperty] = beans::PropertyState_DIRECT_VALUE; 1788 else if(FN_TEXT_RANGE == pEntry->nWID) 1789 pRet[nProperty] = beans::PropertyState_DIRECT_VALUE; 1790 else if(bGroupMember) 1791 pRet[nProperty] = beans::PropertyState_DEFAULT_VALUE; 1792 else if(pFmt) 1793 { 1794 const SwAttrSet& rSet = pFmt->GetAttrSet(); 1795 SfxItemState eItemState = rSet.GetItemState(pEntry->nWID, sal_False); 1796 1797 if(SFX_ITEM_SET == eItemState) 1798 pRet[nProperty] = beans::PropertyState_DIRECT_VALUE; 1799 else if(SFX_ITEM_DEFAULT == eItemState) 1800 pRet[nProperty] = beans::PropertyState_DEFAULT_VALUE; 1801 else 1802 pRet[nProperty] = beans::PropertyState_AMBIGUOUS_VALUE; 1803 } 1804 else 1805 { 1806 SfxPoolItem* pItem = 0; 1807 switch(pEntry->nWID) 1808 { 1809 case RES_ANCHOR: 1810 pItem = pImpl->GetAnchor(); 1811 break; 1812 case RES_HORI_ORIENT: 1813 pItem = pImpl->GetHOrient(); 1814 break; 1815 case RES_VERT_ORIENT: 1816 pItem = pImpl->GetVOrient(); 1817 break; 1818 case RES_LR_SPACE: 1819 pItem = pImpl->GetLRSpace(); 1820 break; 1821 case RES_UL_SPACE: 1822 pItem = pImpl->GetULSpace(); 1823 break; 1824 case RES_SURROUND: 1825 pItem = pImpl->GetSurround(); 1826 break; 1827 // OD 2004-05-05 #i28701# 1828 case RES_WRAP_INFLUENCE_ON_OBJPOS: 1829 { 1830 pItem = pImpl->GetWrapInfluenceOnObjPos(); 1831 } 1832 break; 1833 } 1834 if(pItem) 1835 pRet[nProperty] = beans::PropertyState_DIRECT_VALUE; 1836 else 1837 pRet[nProperty] = beans::PropertyState_DEFAULT_VALUE; 1838 } 1839 } 1840 else 1841 { 1842 if(!xShapePrState.is()) 1843 { 1844 const uno::Type& rPStateType = ::getCppuType((uno::Reference< XPropertyState >*)0); 1845 uno::Any aPState = xShapeAgg->queryAggregation(rPStateType); 1846 if(aPState.getValueType() != rPStateType || !aPState.getValue()) 1847 throw uno::RuntimeException(); 1848 xShapePrState = *(uno::Reference< XPropertyState >*)aPState.getValue(); 1849 } 1850 pRet[nProperty] = xShapePrState->getPropertyState(pNames[nProperty]); 1851 } 1852 } 1853 } 1854 else 1855 throw uno::RuntimeException(); 1856 return aRet; 1857 } 1858 1859 void SwXShape::setPropertyToDefault( const rtl::OUString& rPropertyName ) 1860 throw(beans::UnknownPropertyException, uno::RuntimeException) 1861 { 1862 vos::OGuard aGuard(Application::GetSolarMutex()); 1863 SwFrmFmt* pFmt = GetFrmFmt(); 1864 if(xShapeAgg.is()) 1865 { 1866 const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName( rPropertyName ); 1867 if(pEntry) 1868 { 1869 if ( pEntry->nFlags & beans::PropertyAttribute::READONLY) 1870 throw uno::RuntimeException( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) ); 1871 if(pFmt) 1872 { 1873 const SfxItemSet& rSet = pFmt->GetAttrSet(); 1874 SfxItemSet aSet(pFmt->GetDoc()->GetAttrPool(), pEntry->nWID, pEntry->nWID); 1875 aSet.SetParent(&rSet); 1876 aSet.ClearItem(pEntry->nWID); 1877 pFmt->GetDoc()->SetAttr(aSet, *pFmt); 1878 } 1879 else 1880 { 1881 switch(pEntry->nWID) 1882 { 1883 case RES_ANCHOR: pImpl->RemoveAnchor(); break; 1884 case RES_HORI_ORIENT: pImpl->RemoveHOrient(); break; 1885 case RES_VERT_ORIENT: pImpl->RemoveVOrient(); break; 1886 case RES_LR_SPACE: pImpl->RemoveLRSpace(); break; 1887 case RES_UL_SPACE: pImpl->RemoveULSpace(); break; 1888 case RES_SURROUND: pImpl->RemoveSurround();break; 1889 case RES_OPAQUE : pImpl->SetOpaque(sal_False); break; 1890 case FN_TEXT_RANGE : 1891 break; 1892 // OD 2004-04-22 #i26791# 1893 case RES_FOLLOW_TEXT_FLOW: 1894 { 1895 pImpl->RemoveFollowTextFlow(); 1896 } 1897 break; 1898 // OD 2004-05-05 #i28701# 1899 case RES_WRAP_INFLUENCE_ON_OBJPOS: 1900 { 1901 pImpl->RemoveWrapInfluenceOnObjPos(); 1902 } 1903 break; 1904 } 1905 } 1906 } 1907 else 1908 { 1909 const uno::Type& rPStateType = ::getCppuType((uno::Reference< XPropertyState >*)0); 1910 uno::Any aPState = xShapeAgg->queryAggregation(rPStateType); 1911 if(aPState.getValueType() != rPStateType || !aPState.getValue()) 1912 throw uno::RuntimeException(); 1913 uno::Reference< XPropertyState > xShapePrState = *(uno::Reference< XPropertyState >*)aPState.getValue(); 1914 xShapePrState->setPropertyToDefault( rPropertyName ); 1915 } 1916 } 1917 else 1918 throw uno::RuntimeException(); 1919 } 1920 1921 uno::Any SwXShape::getPropertyDefault( const rtl::OUString& rPropertyName ) 1922 throw( beans::UnknownPropertyException, lang::WrappedTargetException, 1923 uno::RuntimeException ) 1924 { 1925 vos::OGuard aGuard(Application::GetSolarMutex()); 1926 SwFrmFmt* pFmt = GetFrmFmt(); 1927 uno::Any aRet; 1928 if(xShapeAgg.is()) 1929 { 1930 const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName( rPropertyName ); 1931 if(pEntry) 1932 { 1933 if(pEntry->nWID < RES_FRMATR_END && pFmt) 1934 { 1935 const SfxPoolItem& rDefItem = 1936 pFmt->GetDoc()->GetAttrPool().GetDefaultItem(pEntry->nWID); 1937 rDefItem.QueryValue(aRet, pEntry->nMemberId); 1938 } 1939 else 1940 throw uno::RuntimeException(); 1941 } 1942 else 1943 { 1944 const uno::Type& rPStateType = ::getCppuType((uno::Reference< XPropertyState >*)0); 1945 uno::Any aPState = xShapeAgg->queryAggregation(rPStateType); 1946 if(aPState.getValueType() != rPStateType || !aPState.getValue()) 1947 throw uno::RuntimeException(); 1948 uno::Reference< XPropertyState > xShapePrState = *(uno::Reference< XPropertyState >*)aPState.getValue(); 1949 xShapePrState->getPropertyDefault( rPropertyName ); 1950 } 1951 } 1952 else 1953 throw uno::RuntimeException(); 1954 return aRet; 1955 } 1956 1957 void SwXShape::addPropertyChangeListener( 1958 const rtl::OUString& _propertyName, 1959 const uno::Reference< beans::XPropertyChangeListener > & _listener ) 1960 throw( beans::UnknownPropertyException, lang::WrappedTargetException, 1961 uno::RuntimeException ) 1962 { 1963 if ( !xShapeAgg.is() ) 1964 throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no shape aggregate" ) ), *this ); 1965 1966 // must be handled by the aggregate 1967 uno::Reference< beans::XPropertySet > xShapeProps; 1968 if ( xShapeAgg->queryAggregation( beans::XPropertySet::static_type() ) >>= xShapeProps ) 1969 xShapeProps->addPropertyChangeListener( _propertyName, _listener ); 1970 } 1971 1972 void SwXShape::removePropertyChangeListener( 1973 const rtl::OUString& _propertyName, 1974 const uno::Reference< beans::XPropertyChangeListener > & _listener) 1975 throw( beans::UnknownPropertyException, lang::WrappedTargetException, 1976 uno::RuntimeException ) 1977 { 1978 if ( !xShapeAgg.is() ) 1979 throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no shape aggregate" ) ), *this ); 1980 1981 // must be handled by the aggregate 1982 uno::Reference< beans::XPropertySet > xShapeProps; 1983 if ( xShapeAgg->queryAggregation( beans::XPropertySet::static_type() ) >>= xShapeProps ) 1984 xShapeProps->removePropertyChangeListener( _propertyName, _listener ); 1985 } 1986 1987 void SwXShape::addVetoableChangeListener( 1988 const rtl::OUString& /*PropertyName*/, 1989 const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/ ) 1990 throw( beans::UnknownPropertyException, lang::WrappedTargetException, 1991 uno::RuntimeException ) 1992 { 1993 DBG_WARNING("not implemented"); 1994 } 1995 1996 void SwXShape::removeVetoableChangeListener( 1997 const rtl::OUString& /*PropertyName*/, 1998 const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) 1999 throw( beans::UnknownPropertyException, lang::WrappedTargetException, 2000 uno::RuntimeException ) 2001 { 2002 DBG_WARNING("not implemented"); 2003 } 2004 2005 void SwXShape::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) 2006 { 2007 ClientModify(this, pOld, pNew); 2008 } 2009 2010 void SwXShape::attach(const uno::Reference< text::XTextRange > & xTextRange) 2011 throw( lang::IllegalArgumentException, uno::RuntimeException ) 2012 { 2013 vos::OGuard aGuard(Application::GetSolarMutex()); 2014 2015 // get access to SwDoc 2016 // (see also SwXTextRange::XTextRangeToSwPaM) 2017 SwDoc* pDoc = 0; 2018 uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY); 2019 if(xRangeTunnel.is()) 2020 { 2021 SwXTextRange* pRange = 0; 2022 OTextCursorHelper* pCursor = 0; 2023 SwXTextPortion* pPortion = 0; 2024 SwXText* pText = 0; 2025 SwXParagraph* pParagraph = 0; 2026 2027 pRange = reinterpret_cast< SwXTextRange * >( 2028 sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) )); 2029 pText = reinterpret_cast< SwXText * >( 2030 sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXText::getUnoTunnelId()) )); 2031 pCursor = reinterpret_cast< OTextCursorHelper * >( 2032 sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) )); 2033 pPortion = reinterpret_cast< SwXTextPortion * >( 2034 sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextPortion::getUnoTunnelId()) )); 2035 pParagraph = reinterpret_cast< SwXParagraph * >( 2036 sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXParagraph::getUnoTunnelId( ) ) ) ); 2037 2038 if (pRange) 2039 pDoc = pRange->GetDoc(); 2040 else if (!pDoc && pText) 2041 pDoc = pText->GetDoc(); 2042 else if (!pDoc && pCursor) 2043 pDoc = pCursor->GetDoc(); 2044 else if ( !pDoc && pPortion && pPortion->GetCursor() ) 2045 { 2046 pDoc = pPortion->GetCursor()->GetDoc(); 2047 } 2048 else if ( !pDoc && pParagraph && pParagraph->GetTxtNode( ) ) 2049 { 2050 pDoc = const_cast<SwDoc*>(pParagraph->GetTxtNode()->GetDoc()); 2051 } 2052 2053 } 2054 2055 if(!pDoc) 2056 throw uno::RuntimeException(); 2057 SwDocShell *pDocSh = pDoc->GetDocShell(); 2058 if (pDocSh) 2059 { 2060 uno::Reference< frame::XModel > xModel; 2061 xModel = pDocSh->GetModel(); 2062 uno::Reference< drawing::XDrawPageSupplier > xDPS(xModel, uno::UNO_QUERY); 2063 if (xDPS.is()) 2064 { 2065 uno::Reference< drawing::XDrawPage > xDP( xDPS->getDrawPage() ); 2066 if (xDP.is()) 2067 { 2068 uno::Any aPos; 2069 aPos <<= xTextRange; 2070 setPropertyValue( C2U("TextRange"), aPos); 2071 uno::Reference< drawing::XShape > xTemp( (cppu::OWeakObject*) this, uno::UNO_QUERY ); 2072 xDP->add( xTemp ); 2073 } 2074 } 2075 } 2076 } 2077 2078 uno::Reference< text::XTextRange > SwXShape::getAnchor(void) throw( uno::RuntimeException ) 2079 { 2080 vos::OGuard aGuard(Application::GetSolarMutex()); 2081 uno::Reference< text::XTextRange > aRef; 2082 SwFrmFmt* pFmt = GetFrmFmt(); 2083 if(pFmt) 2084 { 2085 const SwFmtAnchor& rAnchor = pFmt->GetAnchor(); 2086 // return an anchor for non-page bound frames 2087 // and for page bound frames that have a page no == NULL and a content position 2088 if ((rAnchor.GetAnchorId() != FLY_AT_PAGE) || 2089 (rAnchor.GetCntntAnchor() && !rAnchor.GetPageNum())) 2090 { 2091 const SwPosition &rPos = *(pFmt->GetAnchor().GetCntntAnchor()); 2092 aRef = SwXTextRange::CreateXTextRange(*pFmt->GetDoc(), rPos, 0); 2093 } 2094 } 2095 else 2096 aRef = pImpl->GetTextRange(); 2097 return aRef; 2098 } 2099 2100 void SwXShape::dispose(void) throw( uno::RuntimeException ) 2101 { 2102 vos::OGuard aGuard(Application::GetSolarMutex()); 2103 SwFrmFmt* pFmt = GetFrmFmt(); 2104 if(pFmt) 2105 { 2106 // OD 10.07.2003 #110742# - determine correct <SdrObject> 2107 //SdrObject* pObj = pFmt->FindSdrObject(); 2108 SdrObject* pObj = GetSvxShape()->GetSdrObject(); 2109 // OD 10.07.2003 #110742# - safety assertion: 2110 // <pObj> must be the same as <pFmt->FindSdrObject()>, if <pObj> isn't 2111 // a 'virtual' drawing object. 2112 // OD 25.08.2003 #111713# - refine assertion for safety reason. 2113 // --> OD 2005-02-02 #119236# - correct assertion and refine it. 2114 ASSERT( !pObj || 2115 pObj->ISA(SwDrawVirtObj) || 2116 pObj->GetUpGroup() || 2117 pObj == pFmt->FindSdrObject(), 2118 "<SwXShape::dispose(..) - different 'master' drawing objects!!" ); 2119 // <-- 2120 // OD 10.07.2003 #110742# - perform delete of draw frame format *not* 2121 // for 'virtual' drawing objects. 2122 // --> OD 2005-02-02 #119236# - no delete of draw format for members 2123 // of a group 2124 if ( pObj && 2125 !pObj->ISA(SwDrawVirtObj) && 2126 !pObj->GetUpGroup() && 2127 pObj->IsInserted() ) 2128 // <-- 2129 { 2130 if (pFmt->GetAnchor().GetAnchorId() == FLY_AS_CHAR) 2131 { 2132 const SwPosition &rPos = *(pFmt->GetAnchor().GetCntntAnchor()); 2133 SwTxtNode *pTxtNode = rPos.nNode.GetNode().GetTxtNode(); 2134 const xub_StrLen nIdx = rPos.nContent.GetIndex(); 2135 pTxtNode->DeleteAttributes( RES_TXTATR_FLYCNT, nIdx ); 2136 } 2137 else 2138 pFmt->GetDoc()->DelLayoutFmt( pFmt ); 2139 } 2140 } 2141 if(xShapeAgg.is()) 2142 { 2143 uno::Any aAgg(xShapeAgg->queryAggregation( ::getCppuType((uno::Reference<XComponent>*)0))); 2144 uno::Reference<XComponent> xComp; 2145 aAgg >>= xComp; 2146 if(xComp.is()) 2147 xComp->dispose(); 2148 } 2149 } 2150 2151 void SwXShape::addEventListener( 2152 const uno::Reference< lang::XEventListener > & aListener) 2153 throw( uno::RuntimeException ) 2154 { 2155 uno::Reference< lang::XUnoTunnel > xShapeTunnel(xShapeAgg, uno::UNO_QUERY); 2156 SvxShape* pSvxShape = GetSvxShape(); 2157 if(pSvxShape) 2158 pSvxShape->addEventListener(aListener); 2159 } 2160 2161 void SwXShape::removeEventListener( 2162 const uno::Reference< lang::XEventListener > & aListener) 2163 throw( uno::RuntimeException ) 2164 { 2165 SvxShape* pSvxShape = GetSvxShape(); 2166 if(pSvxShape) 2167 pSvxShape->removeEventListener(aListener); 2168 } 2169 2170 rtl::OUString SwXShape::getImplementationName(void) throw( uno::RuntimeException ) 2171 { 2172 return C2U("SwXShape"); 2173 } 2174 2175 sal_Bool SwXShape::supportsService(const rtl::OUString& rServiceName) throw( uno::RuntimeException ) 2176 { 2177 sal_Bool bRet = sal_False; 2178 if(COMPARE_EQUAL == rServiceName.compareToAscii("com.sun.star.drawing.Shape")) 2179 bRet = sal_True; 2180 else if(xShapeAgg.is()) 2181 { 2182 uno::Reference< lang::XUnoTunnel > xShapeTunnel(xShapeAgg, uno::UNO_QUERY); 2183 SvxShape* pSvxShape = GetSvxShape(); 2184 bRet = pSvxShape->supportsService(rServiceName); 2185 } 2186 return bRet; 2187 } 2188 2189 uno::Sequence< rtl::OUString > SwXShape::getSupportedServiceNames(void) throw( uno::RuntimeException ) 2190 { 2191 uno::Sequence< rtl::OUString > aSeq; 2192 if(xShapeAgg.is()) 2193 { 2194 uno::Reference< lang::XUnoTunnel > xShapeTunnel(xShapeAgg, uno::UNO_QUERY); 2195 SvxShape* pSvxShape = GetSvxShape(); 2196 if(pSvxShape) 2197 aSeq = pSvxShape->getSupportedServiceNames(); 2198 } 2199 else 2200 { 2201 aSeq.realloc(1); 2202 aSeq.getArray()[0] = C2U("com.sun.star.drawing.Shape"); 2203 } 2204 return aSeq; 2205 } 2206 2207 SvxShape* SwXShape::GetSvxShape() 2208 { 2209 SvxShape* pSvxShape = 0; 2210 if(xShapeAgg.is()) 2211 { 2212 uno::Reference< lang::XUnoTunnel > xShapeTunnel(xShapeAgg, uno::UNO_QUERY); 2213 if(xShapeTunnel.is()) 2214 pSvxShape = reinterpret_cast< SvxShape * >( 2215 sal::static_int_cast< sal_IntPtr >( xShapeTunnel->getSomething(SvxShape::getUnoTunnelId()) )); 2216 } 2217 return pSvxShape; 2218 } 2219 2220 // --> OD 2004-07-22 #i31698# - 2221 // implementation of virtual methods from drawing::XShape 2222 awt::Point SAL_CALL SwXShape::getPosition() throw ( uno::RuntimeException ) 2223 { 2224 awt::Point aPos( _GetAttrPosition() ); 2225 2226 // handle group members 2227 SvxShape* pSvxShape = GetSvxShape(); 2228 if ( pSvxShape ) 2229 { 2230 SdrObject* pTopGroupObj = _GetTopGroupObj( pSvxShape ); 2231 if ( pTopGroupObj ) 2232 { 2233 // --> OD 2004-10-01 #i34750# - get attribute position of top group 2234 // shape and add offset between top group object and group member 2235 uno::Reference< drawing::XShape > xGroupShape = 2236 uno::Reference< drawing::XShape >( pTopGroupObj->getUnoShape(), 2237 uno::UNO_QUERY ); 2238 aPos = xGroupShape->getPosition(); 2239 // add offset between top group object and group member 2240 // to the determined attribute position 2241 // --> OD 2004-10-01 #i34750# - correction: 2242 // consider the layout direction 2243 const Rectangle aMemberObjRect = GetSvxShape()->GetSdrObject()->GetSnapRect(); 2244 const Rectangle aGroupObjRect = pTopGroupObj->GetSnapRect(); 2245 // --> OD 2005-08-16 #i53320# - relative position of group member and 2246 // top group object is always given in horizontal left-to-right layout. 2247 // const SwFrmFmt::tLayoutDir eLayoutDir = GetFrmFmt() 2248 // ? GetFrmFmt()->GetLayoutDir() 2249 // : SwFrmFmt::HORI_L2R; 2250 awt::Point aOffset( 0, 0 ); 2251 // switch ( eLayoutDir ) 2252 // { 2253 // case SwFrmFmt::HORI_L2R: 2254 { 2255 aOffset.X = ( aMemberObjRect.Left() - aGroupObjRect.Left() ); 2256 aOffset.Y = ( aMemberObjRect.Top() - aGroupObjRect.Top() ); 2257 } 2258 // break; 2259 // case SwFrmFmt::HORI_R2L: 2260 // { 2261 // aOffset.X = ( aGroupObjRect.Right() - aMemberObjRect.Right() ); 2262 // aOffset.Y = ( aMemberObjRect.Top() - aGroupObjRect.Top() ); 2263 // } 2264 // break; 2265 // case SwFrmFmt::VERT_R2L: 2266 // { 2267 // aOffset.X = ( aMemberObjRect.Top() - aGroupObjRect.Top() ); 2268 // aOffset.Y = ( aGroupObjRect.Right() - aMemberObjRect.Right() ); 2269 // } 2270 // break; 2271 // default: 2272 // { 2273 // ASSERT( false, 2274 // "<SwXShape::getPosition()> - unsupported layout direction" ); 2275 // } 2276 // } 2277 // <-- 2278 aOffset.X = TWIP_TO_MM100(aOffset.X); 2279 aOffset.Y = TWIP_TO_MM100(aOffset.Y); 2280 aPos.X += aOffset.X; 2281 aPos.Y += aOffset.Y; 2282 // <-- 2283 } 2284 } 2285 2286 return aPos; 2287 } 2288 void SAL_CALL SwXShape::setPosition( const awt::Point& aPosition ) 2289 throw ( uno::RuntimeException ) 2290 { 2291 SdrObject* pTopGroupObj = _GetTopGroupObj(); 2292 if ( !pTopGroupObj ) 2293 { 2294 // --> OD 2005-02-10 #i37877# - no adjustment of position attributes, 2295 // if the position also has to be applied at the drawing object and 2296 // a contact object is already registered at the drawing object. 2297 bool bApplyPosAtDrawObj(false); 2298 bool bNoAdjustOfPosProp(false); 2299 // --> OD 2004-10-19 #i35798# - apply position also to drawing object, 2300 // if drawing object has no anchor position set. 2301 if ( mxShape.is() ) 2302 { 2303 SvxShape* pSvxShape = GetSvxShape(); 2304 if ( pSvxShape ) 2305 { 2306 const SdrObject* pObj = pSvxShape->GetSdrObject(); 2307 if ( pObj && 2308 pObj->GetAnchorPos().X() == 0 && 2309 pObj->GetAnchorPos().Y() == 0 ) 2310 { 2311 bApplyPosAtDrawObj = true; 2312 if ( pObj->GetUserCall() && 2313 pObj->GetUserCall()->ISA(SwDrawContact) ) 2314 { 2315 bNoAdjustOfPosProp = true; 2316 } 2317 } 2318 } 2319 } 2320 // <-- 2321 // shape isn't a group member. Thus, set positioning attributes 2322 if ( !bNoAdjustOfPosProp ) 2323 { 2324 _AdjustPositionProperties( aPosition ); 2325 } 2326 if ( bApplyPosAtDrawObj ) 2327 { 2328 mxShape->setPosition( aPosition ); 2329 } 2330 // <-- 2331 } 2332 else if ( mxShape.is() ) 2333 { 2334 // shape is a member of a group. Thus, set its position. 2335 awt::Point aNewPos( aPosition ); 2336 // The given position is given in the according layout direction. Thus, 2337 // it has to be converted to a position in horizontal left-to-right 2338 // layout. 2339 // convert given absolute attribute position in layout direction into 2340 // position in horizontal left-to-right layout. 2341 { 2342 aNewPos = _ConvertPositionToHoriL2R( aNewPos, getSize() ); 2343 } 2344 // Convert given absolute position in horizontal left-to-right 2345 // layout into relative position in horizontal left-to-right layout. 2346 uno::Reference< drawing::XShape > xGroupShape = 2347 uno::Reference< drawing::XShape >( pTopGroupObj->getUnoShape(), 2348 uno::UNO_QUERY ); 2349 { 2350 // --> OD 2004-09-29 #i34750# - correction: 2351 // use method <xGroupShape->getPosition()> to get the correct 2352 // position of the top group object. 2353 awt::Point aAttrPosInHoriL2R( 2354 _ConvertPositionToHoriL2R( xGroupShape->getPosition(), 2355 xGroupShape->getSize() ) ); 2356 // <-- 2357 aNewPos.X -= aAttrPosInHoriL2R.X; 2358 aNewPos.Y -= aAttrPosInHoriL2R.Y; 2359 } 2360 // convert relative position in horizontal left-to-right layout into 2361 // absolute position in horizontal left-to-right layout 2362 { 2363 // --> OD 2004-10-01 #i34750# - correction: 2364 // use method <SvxShape->getPosition()> to get the correct 2365 // 'Drawing layer' position of the top group shape. 2366 uno::Reference< lang::XUnoTunnel > xGrpShapeTunnel( 2367 pTopGroupObj->getUnoShape(), 2368 uno::UNO_QUERY ); 2369 SvxShape* pSvxGroupShape = reinterpret_cast< SvxShape * >( 2370 sal::static_int_cast< sal_IntPtr >( xGrpShapeTunnel->getSomething(SvxShape::getUnoTunnelId()) )); 2371 const awt::Point aGroupPos = pSvxGroupShape->getPosition(); 2372 aNewPos.X += aGroupPos.X; 2373 aNewPos.Y += aGroupPos.Y; 2374 // <-- 2375 } 2376 // set position 2377 mxShape->setPosition( aNewPos ); 2378 } 2379 } 2380 awt::Size SAL_CALL SwXShape::getSize() throw ( uno::RuntimeException ) 2381 { 2382 awt::Size aSize; 2383 if ( mxShape.is() ) 2384 { 2385 aSize = mxShape->getSize(); 2386 } 2387 return aSize; 2388 } 2389 void SAL_CALL SwXShape::setSize( const awt::Size& aSize ) 2390 throw ( beans::PropertyVetoException, 2391 uno::RuntimeException ) 2392 { 2393 if ( mxShape.is() ) 2394 { 2395 mxShape->setSize( aSize ); 2396 } 2397 } 2398 // <-- 2399 // --> OD 2004-07-22 #i31698# - 2400 // implementation of virtual methods from drawing::XShapeDescriptor 2401 ::rtl::OUString SAL_CALL SwXShape::getShapeType() throw ( uno::RuntimeException ) 2402 { 2403 ::rtl::OUString aType; 2404 if ( mxShape.is() ) 2405 { 2406 aType = mxShape->getShapeType(); 2407 } 2408 return aType; 2409 } 2410 // <-- 2411 /** method to determine top group object 2412 2413 OD 2004-08-03 #i31698# 2414 2415 @author OD 2416 */ 2417 SdrObject* SwXShape::_GetTopGroupObj( SvxShape* _pSvxShape ) 2418 { 2419 SdrObject* pTopGroupObj( 0L ); 2420 2421 SvxShape* pSvxShape = _pSvxShape ? _pSvxShape : GetSvxShape(); 2422 if ( pSvxShape ) 2423 { 2424 SdrObject* pSdrObj = pSvxShape->GetSdrObject(); 2425 if ( pSdrObj && pSdrObj->GetUpGroup() ) 2426 { 2427 pTopGroupObj = pSdrObj->GetUpGroup(); 2428 while ( pTopGroupObj->GetUpGroup() ) 2429 { 2430 pTopGroupObj = pTopGroupObj->GetUpGroup(); 2431 } 2432 } 2433 } 2434 2435 return pTopGroupObj; 2436 } 2437 2438 /** method to determine position according to the positioning attributes 2439 2440 OD 2004-08-03 #i31698# 2441 2442 @author OD 2443 */ 2444 awt::Point SwXShape::_GetAttrPosition() 2445 { 2446 awt::Point aAttrPos; 2447 2448 uno::Any aHoriPos( getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HoriOrientPosition")) ) ); 2449 aHoriPos >>= aAttrPos.X; 2450 uno::Any aVertPos( getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VertOrientPosition")) ) ); 2451 aVertPos >>= aAttrPos.Y; 2452 // --> OD 2004-10-19 #i35798# - fallback, if attribute position is (0,0) 2453 // and no anchor position is applied to the drawing object 2454 SvxShape* pSvxShape = GetSvxShape(); 2455 if ( pSvxShape ) 2456 { 2457 const SdrObject* pObj = pSvxShape->GetSdrObject(); 2458 if ( pObj && 2459 pObj->GetAnchorPos().X() == 0 && 2460 pObj->GetAnchorPos().Y() == 0 && 2461 aAttrPos.X == 0 && aAttrPos.Y == 0 ) 2462 { 2463 const Rectangle aObjRect = pObj->GetSnapRect(); 2464 aAttrPos.X = TWIP_TO_MM100(aObjRect.Left()); 2465 aAttrPos.Y = TWIP_TO_MM100(aObjRect.Top()); 2466 } 2467 } 2468 // <-- 2469 // --> OD 2004-11-10 #i35007# - If drawing object is anchored as-character, 2470 // it's x-position isn't sensible. Thus, return the x-position as zero in this case. 2471 text::TextContentAnchorType eTextAnchorType = 2472 text::TextContentAnchorType_AT_PARAGRAPH; 2473 { 2474 rtl::OUString sAnchorType( RTL_CONSTASCII_USTRINGPARAM( "AnchorType" ) ); 2475 uno::Any aAny = getPropertyValue( sAnchorType ); 2476 aAny >>= eTextAnchorType; 2477 } 2478 if ( eTextAnchorType == text::TextContentAnchorType_AS_CHARACTER ) 2479 { 2480 aAttrPos.X = 0; 2481 } 2482 // <-- 2483 2484 return aAttrPos; 2485 } 2486 2487 /** method to convert the position (translation) of the drawing object to 2488 the layout direction horizontal left-to-right. 2489 2490 OD 2004-07-27 #i31698# 2491 2492 @author OD 2493 */ 2494 awt::Point SwXShape::_ConvertPositionToHoriL2R( const awt::Point _aObjPos, 2495 const awt::Size _aObjSize ) 2496 { 2497 awt::Point aObjPosInHoriL2R( _aObjPos ); 2498 2499 SwFrmFmt* pFrmFmt = GetFrmFmt(); 2500 if ( pFrmFmt ) 2501 { 2502 SwFrmFmt::tLayoutDir eLayoutDir = pFrmFmt->GetLayoutDir(); 2503 switch ( eLayoutDir ) 2504 { 2505 case SwFrmFmt::HORI_L2R: 2506 { 2507 // nothing to do 2508 } 2509 break; 2510 case SwFrmFmt::HORI_R2L: 2511 { 2512 aObjPosInHoriL2R.X = -_aObjPos.X - _aObjSize.Width; 2513 } 2514 break; 2515 case SwFrmFmt::VERT_R2L: 2516 { 2517 aObjPosInHoriL2R.X = -_aObjPos.Y - _aObjSize.Width; 2518 aObjPosInHoriL2R.Y = _aObjPos.X; 2519 } 2520 break; 2521 default: 2522 { 2523 ASSERT( false, 2524 "<SwXShape::_ConvertPositionToHoriL2R(..)> - unsupported layout direction" ); 2525 } 2526 } 2527 } 2528 2529 return aObjPosInHoriL2R; 2530 } 2531 /** method to convert the transformation of the drawing object to the layout 2532 direction, the drawing object is in 2533 2534 OD 2004-07-27 #i31698# 2535 2536 @author OD 2537 */ 2538 drawing::HomogenMatrix3 SwXShape::_ConvertTransformationToLayoutDir( 2539 drawing::HomogenMatrix3 _aMatrixInHoriL2R ) 2540 { 2541 drawing::HomogenMatrix3 aMatrix( _aMatrixInHoriL2R ); 2542 2543 // --> OD 2005-03-10 #i44334#, #i44681# - direct manipulation of the 2544 // tranformation structure isn't valid, if it contains rotation. 2545 SvxShape* pSvxShape = GetSvxShape(); 2546 ASSERT( pSvxShape, 2547 "<SwXShape::_ConvertTransformationToLayoutDir(..)> - no SvxShape found!") 2548 if ( pSvxShape ) 2549 { 2550 const SdrObject* pObj = pSvxShape->GetSdrObject(); 2551 ASSERT( pObj, 2552 "<SwXShape::_ConvertTransformationToLayoutDir(..)> - no SdrObject found!") 2553 if ( pObj ) 2554 { 2555 // get position of object in Writer coordinate system. 2556 awt::Point aPos( getPosition() ); 2557 // get position of object in Drawing layer coordinate system 2558 const Point aTmpObjPos( pObj->GetSnapRect().TopLeft() ); 2559 const awt::Point aObjPos( 2560 TWIP_TO_MM100( aTmpObjPos.X() - pObj->GetAnchorPos().X() ), 2561 TWIP_TO_MM100( aTmpObjPos.Y() - pObj->GetAnchorPos().Y() ) ); 2562 // determine difference between these positions according to the 2563 // Writer coordinate system 2564 const awt::Point aTranslateDiff( aPos.X - aObjPos.X, 2565 aPos.Y - aObjPos.Y ); 2566 // apply translation difference to transformation matrix. 2567 if ( aTranslateDiff.X != 0 || aTranslateDiff.Y != 0 ) 2568 { 2569 // --> OD 2007-01-03 #i73079# - use correct matrix type 2570 ::basegfx::B2DHomMatrix aTempMatrix; 2571 // <-- 2572 2573 aTempMatrix.set(0, 0, aMatrix.Line1.Column1 ); 2574 aTempMatrix.set(0, 1, aMatrix.Line1.Column2 ); 2575 aTempMatrix.set(0, 2, aMatrix.Line1.Column3 ); 2576 aTempMatrix.set(1, 0, aMatrix.Line2.Column1 ); 2577 aTempMatrix.set(1, 1, aMatrix.Line2.Column2 ); 2578 aTempMatrix.set(1, 2, aMatrix.Line2.Column3 ); 2579 aTempMatrix.set(2, 0, aMatrix.Line3.Column1 ); 2580 aTempMatrix.set(2, 1, aMatrix.Line3.Column2 ); 2581 aTempMatrix.set(2, 2, aMatrix.Line3.Column3 ); 2582 2583 // --> OD 2007-01-03 #i73079# 2584 aTempMatrix.translate( aTranslateDiff.X, aTranslateDiff.Y ); 2585 // <-- 2586 2587 aMatrix.Line1.Column1 = aTempMatrix.get(0, 0); 2588 aMatrix.Line1.Column2 = aTempMatrix.get(0, 1); 2589 aMatrix.Line1.Column3 = aTempMatrix.get(0, 2); 2590 aMatrix.Line2.Column1 = aTempMatrix.get(1, 0); 2591 aMatrix.Line2.Column2 = aTempMatrix.get(1, 1); 2592 aMatrix.Line2.Column3 = aTempMatrix.get(1, 2); 2593 aMatrix.Line3.Column1 = aTempMatrix.get(2, 0); 2594 aMatrix.Line3.Column2 = aTempMatrix.get(2, 1); 2595 aMatrix.Line3.Column3 = aTempMatrix.get(2, 2); 2596 } 2597 } 2598 } 2599 // <-- 2600 2601 return aMatrix; 2602 } 2603 2604 /** method to adjust the positioning properties 2605 2606 OD 2004-08-02 #i31698# 2607 2608 @author OD 2609 */ 2610 void SwXShape::_AdjustPositionProperties( const awt::Point _aPosition ) 2611 { 2612 // handle x-position 2613 // --> OD 2004-11-10 #i35007# - no handling of x-position, if drawing 2614 // object is anchored as-character, because it doesn't make sense. 2615 text::TextContentAnchorType eTextAnchorType = 2616 text::TextContentAnchorType_AT_PARAGRAPH; 2617 { 2618 rtl::OUString sAnchorType( RTL_CONSTASCII_USTRINGPARAM( "AnchorType" ) ); 2619 uno::Any aAny = getPropertyValue( sAnchorType ); 2620 aAny >>= eTextAnchorType; 2621 } 2622 if ( eTextAnchorType != text::TextContentAnchorType_AS_CHARACTER ) 2623 // <-- 2624 { 2625 // determine current x-postion 2626 rtl::OUString aHoriPosPropStr( RTL_CONSTASCII_USTRINGPARAM("HoriOrientPosition") ); 2627 uno::Any aHoriPos( getPropertyValue( aHoriPosPropStr ) ); 2628 sal_Int32 dCurrX = 0; 2629 aHoriPos >>= dCurrX; 2630 // change x-position attribute, if needed 2631 if ( dCurrX != _aPosition.X ) 2632 { 2633 // adjust x-position orientation to text::HoriOrientation::NONE, if needed 2634 // Note: has to be done before setting x-position attribute 2635 rtl::OUString aHoriOrientPropStr( RTL_CONSTASCII_USTRINGPARAM("HoriOrient") ); 2636 uno::Any aHoriOrient( getPropertyValue( aHoriOrientPropStr ) ); 2637 sal_Int16 eHoriOrient; 2638 if (aHoriOrient >>= eHoriOrient) // may be void 2639 { 2640 if ( eHoriOrient != text::HoriOrientation::NONE ) 2641 { 2642 eHoriOrient = text::HoriOrientation::NONE; 2643 aHoriOrient <<= eHoriOrient; 2644 setPropertyValue( aHoriOrientPropStr, aHoriOrient ); 2645 } 2646 } 2647 // set x-position attribute 2648 aHoriPos <<= _aPosition.X; 2649 setPropertyValue( aHoriPosPropStr, aHoriPos ); 2650 } 2651 } 2652 2653 // handle y-position 2654 { 2655 // determine current y-postion 2656 rtl::OUString aVertPosPropStr( RTL_CONSTASCII_USTRINGPARAM("VertOrientPosition") ); 2657 uno::Any aVertPos( getPropertyValue( aVertPosPropStr ) ); 2658 sal_Int32 dCurrY = 0; 2659 aVertPos >>= dCurrY; 2660 // change y-position attribute, if needed 2661 if ( dCurrY != _aPosition.Y ) 2662 { 2663 // adjust y-position orientation to text::VertOrientation::NONE, if needed 2664 // Note: has to be done before setting y-position attribute 2665 rtl::OUString aVertOrientPropStr( RTL_CONSTASCII_USTRINGPARAM("VertOrient") ); 2666 uno::Any aVertOrient( getPropertyValue( aVertOrientPropStr ) ); 2667 sal_Int16 eVertOrient; 2668 if (aVertOrient >>= eVertOrient) // may be void 2669 { 2670 if ( eVertOrient != text::VertOrientation::NONE ) 2671 { 2672 eVertOrient = text::VertOrientation::NONE; 2673 aVertOrient <<= eVertOrient; 2674 setPropertyValue( aVertOrientPropStr, aVertOrient ); 2675 } 2676 } 2677 // set y-position attribute 2678 aVertPos <<= _aPosition.Y; 2679 setPropertyValue( aVertPosPropStr, aVertPos ); 2680 } 2681 } 2682 } 2683 2684 /** method to convert start or end position of the drawing object to the 2685 Writer specific position, which is the attribute position in layout direction 2686 2687 OD 2009-01-12 #i59051# 2688 2689 @author OD 2690 */ 2691 ::com::sun::star::awt::Point SwXShape::_ConvertStartOrEndPosToLayoutDir( 2692 const ::com::sun::star::awt::Point& aStartOrEndPos ) 2693 { 2694 awt::Point aConvertedPos( aStartOrEndPos ); 2695 2696 SvxShape* pSvxShape = GetSvxShape(); 2697 ASSERT( pSvxShape, 2698 "<SwXShape::_ConvertStartOrEndPosToLayoutDir(..)> - no SvxShape found!") 2699 if ( pSvxShape ) 2700 { 2701 const SdrObject* pObj = pSvxShape->GetSdrObject(); 2702 ASSERT( pObj, 2703 "<SwXShape::_ConvertStartOrEndPosToLayoutDir(..)> - no SdrObject found!") 2704 if ( pObj ) 2705 { 2706 // get position of object in Writer coordinate system. 2707 awt::Point aPos( getPosition() ); 2708 // get position of object in Drawing layer coordinate system 2709 const Point aTmpObjPos( pObj->GetSnapRect().TopLeft() ); 2710 const awt::Point aObjPos( 2711 TWIP_TO_MM100( aTmpObjPos.X() - pObj->GetAnchorPos().X() ), 2712 TWIP_TO_MM100( aTmpObjPos.Y() - pObj->GetAnchorPos().Y() ) ); 2713 // determine difference between these positions according to the 2714 // Writer coordinate system 2715 const awt::Point aTranslateDiff( aPos.X - aObjPos.X, 2716 aPos.Y - aObjPos.Y ); 2717 // apply translation difference to transformation matrix. 2718 if ( aTranslateDiff.X != 0 || aTranslateDiff.Y != 0 ) 2719 { 2720 aConvertedPos.X = aConvertedPos.X + aTranslateDiff.X; 2721 aConvertedPos.Y = aConvertedPos.Y + aTranslateDiff.Y; 2722 } 2723 } 2724 } 2725 2726 return aConvertedPos; 2727 } 2728 2729 ::com::sun::star::drawing::PolyPolygonBezierCoords SwXShape::_ConvertPolyPolygonBezierToLayoutDir( 2730 const ::com::sun::star::drawing::PolyPolygonBezierCoords& aPath ) 2731 { 2732 drawing::PolyPolygonBezierCoords aConvertedPath( aPath ); 2733 2734 SvxShape* pSvxShape = GetSvxShape(); 2735 ASSERT( pSvxShape, 2736 "<SwXShape::_ConvertStartOrEndPosToLayoutDir(..)> - no SvxShape found!") 2737 if ( pSvxShape ) 2738 { 2739 const SdrObject* pObj = pSvxShape->GetSdrObject(); 2740 ASSERT( pObj, 2741 "<SwXShape::_ConvertStartOrEndPosToLayoutDir(..)> - no SdrObject found!") 2742 if ( pObj ) 2743 { 2744 // get position of object in Writer coordinate system. 2745 awt::Point aPos( getPosition() ); 2746 // get position of object in Drawing layer coordinate system 2747 const Point aTmpObjPos( pObj->GetSnapRect().TopLeft() ); 2748 const awt::Point aObjPos( 2749 TWIP_TO_MM100( aTmpObjPos.X() - pObj->GetAnchorPos().X() ), 2750 TWIP_TO_MM100( aTmpObjPos.Y() - pObj->GetAnchorPos().Y() ) ); 2751 // determine difference between these positions according to the 2752 // Writer coordinate system 2753 const awt::Point aTranslateDiff( aPos.X - aObjPos.X, 2754 aPos.Y - aObjPos.Y ); 2755 // apply translation difference to PolyPolygonBezier. 2756 if ( aTranslateDiff.X != 0 || aTranslateDiff.Y != 0 ) 2757 { 2758 const basegfx::B2DHomMatrix aMatrix(basegfx::tools::createTranslateB2DHomMatrix( 2759 aTranslateDiff.X, aTranslateDiff.Y)); 2760 2761 const sal_Int32 nOuterSequenceCount(aConvertedPath.Coordinates.getLength()); 2762 drawing::PointSequence* pInnerSequence = aConvertedPath.Coordinates.getArray(); 2763 for(sal_Int32 a(0); a < nOuterSequenceCount; a++) 2764 { 2765 const sal_Int32 nInnerSequenceCount(pInnerSequence->getLength()); 2766 awt::Point* pArray = pInnerSequence->getArray(); 2767 2768 for(sal_Int32 b(0); b < nInnerSequenceCount; b++) 2769 { 2770 basegfx::B2DPoint aNewCoordinatePair(pArray->X, pArray->Y); 2771 aNewCoordinatePair *= aMatrix; 2772 pArray->X = basegfx::fround(aNewCoordinatePair.getX()); 2773 pArray->Y = basegfx::fround(aNewCoordinatePair.getY()); 2774 pArray++; 2775 } 2776 } 2777 } 2778 } 2779 } 2780 2781 return aConvertedPath; 2782 } 2783 2784 2785 SwXGroupShape::SwXGroupShape(uno::Reference< XInterface > & xShape) : 2786 SwXShape(xShape) 2787 { 2788 #ifdef DBG_UTIL 2789 uno::Reference<XShapes> xShapes(xShapeAgg, uno::UNO_QUERY); 2790 DBG_ASSERT(xShapes.is(), "no SvxShape found or shape is not a group shape"); 2791 #endif 2792 } 2793 2794 2795 SwXGroupShape::~SwXGroupShape() 2796 { 2797 } 2798 2799 uno::Any SwXGroupShape::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException) 2800 { 2801 uno::Any aRet; 2802 if(rType == ::getCppuType((uno::Reference<XShapes>*)0)) 2803 aRet <<= uno::Reference<XShapes>(this); 2804 else 2805 aRet = SwXShape::queryInterface(rType); 2806 return aRet; 2807 } 2808 2809 void SwXGroupShape::acquire( ) throw() 2810 { 2811 SwXShape::acquire(); 2812 } 2813 2814 void SwXGroupShape::release( ) throw() 2815 { 2816 SwXShape::release(); 2817 } 2818 2819 void SwXGroupShape::add( const uno::Reference< XShape >& xShape ) throw (uno::RuntimeException) 2820 { 2821 vos::OGuard aGuard(Application::GetSolarMutex()); 2822 SvxShape* pSvxShape = GetSvxShape(); 2823 SwFrmFmt* pFmt = GetFrmFmt(); 2824 if(pSvxShape && pFmt) 2825 { 2826 uno::Reference<XShapes> xShapes; 2827 if( xShapeAgg.is() ) 2828 { 2829 const uno::Type& rType = ::getCppuType((uno::Reference<XShapes>*)0 ); 2830 uno::Any aAgg = xShapeAgg->queryAggregation( rType ); 2831 aAgg >>= xShapes; 2832 } 2833 if(xShapes.is()) 2834 xShapes->add(xShape); 2835 else 2836 throw uno::RuntimeException(); 2837 2838 uno::Reference<lang::XUnoTunnel> xTunnel(xShape, uno::UNO_QUERY); 2839 SwXShape* pSwShape = 0; 2840 if(xShape.is()) 2841 pSwShape = reinterpret_cast< SwXShape * >( 2842 sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething(SwXShape::getUnoTunnelId()) )); 2843 if(pSwShape && pSwShape->m_bDescriptor) 2844 { 2845 SvxShape* pAddShape = reinterpret_cast< SvxShape * >( 2846 sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething(SvxShape::getUnoTunnelId()) )); 2847 if(pAddShape) 2848 { 2849 SdrObject* pObj = pAddShape->GetSdrObject(); 2850 if(pObj) 2851 { 2852 SwDoc* pDoc = pFmt->GetDoc(); 2853 // OD 25.06.2003 #108784# - set layer of new drawing 2854 // object to corresponding invisible layer. 2855 if( FmFormInventor != pObj->GetObjInventor()) 2856 { 2857 pObj->SetLayer( pSwShape->pImpl->GetOpaque() 2858 ? pDoc->GetInvisibleHeavenId() 2859 : pDoc->GetInvisibleHellId() ); 2860 } 2861 else 2862 { 2863 pObj->SetLayer(pDoc->GetInvisibleControlsId()); 2864 } 2865 } 2866 } 2867 pSwShape->m_bDescriptor = sal_False; 2868 //add the group member to the format of the group 2869 SwFrmFmt* pShapeFmt = ::FindFrmFmt( pSvxShape->GetSdrObject() ); 2870 if(pShapeFmt) 2871 pFmt->Add(pSwShape); 2872 } 2873 } 2874 else 2875 throw uno::RuntimeException(); 2876 } 2877 2878 void SwXGroupShape::remove( const uno::Reference< XShape >& xShape ) throw (uno::RuntimeException) 2879 { 2880 vos::OGuard aGuard(Application::GetSolarMutex()); 2881 uno::Reference<XShapes> xShapes; 2882 if( xShapeAgg.is() ) 2883 { 2884 const uno::Type& rType = ::getCppuType((uno::Reference<XShapes>*)0 ); 2885 uno::Any aAgg = xShapeAgg->queryAggregation( rType ); 2886 aAgg >>= xShapes; 2887 } 2888 if(!xShapes.is()) 2889 throw uno::RuntimeException(); 2890 xShapes->remove(xShape); 2891 } 2892 2893 sal_Int32 SwXGroupShape::getCount(void) throw( uno::RuntimeException ) 2894 { 2895 vos::OGuard aGuard(Application::GetSolarMutex()); 2896 uno::Reference<XIndexAccess> xAcc; 2897 if( xShapeAgg.is() ) 2898 { 2899 const uno::Type& rType = ::getCppuType((uno::Reference<XIndexAccess>*)0 ); 2900 uno::Any aAgg = xShapeAgg->queryAggregation( rType ); 2901 aAgg >>= xAcc; 2902 } 2903 if(!xAcc.is()) 2904 throw uno::RuntimeException(); 2905 return xAcc->getCount(); 2906 } 2907 2908 uno::Any SwXGroupShape::getByIndex(sal_Int32 nIndex) 2909 throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, 2910 uno::RuntimeException ) 2911 { 2912 vos::OGuard aGuard(Application::GetSolarMutex()); 2913 uno::Reference<XIndexAccess> xAcc; 2914 if( xShapeAgg.is() ) 2915 { 2916 const uno::Type& rType = ::getCppuType((uno::Reference<XIndexAccess>*)0 ); 2917 uno::Any aAgg = xShapeAgg->queryAggregation( rType ); 2918 aAgg >>= xAcc; 2919 } 2920 if(!xAcc.is()) 2921 throw uno::RuntimeException(); 2922 return xAcc->getByIndex(nIndex); 2923 } 2924 2925 uno::Type SwXGroupShape::getElementType( ) throw(uno::RuntimeException) 2926 { 2927 vos::OGuard aGuard(Application::GetSolarMutex()); 2928 uno::Reference<XIndexAccess> xAcc; 2929 if( xShapeAgg.is() ) 2930 { 2931 const uno::Type& rType = ::getCppuType((uno::Reference<XIndexAccess>*)0 ); 2932 uno::Any aAgg = xShapeAgg->queryAggregation( rType ); 2933 aAgg >>= xAcc; 2934 } 2935 if(!xAcc.is()) 2936 throw uno::RuntimeException(); 2937 return xAcc->getElementType(); 2938 } 2939 2940 sal_Bool SwXGroupShape::hasElements( ) throw(uno::RuntimeException) 2941 { 2942 vos::OGuard aGuard(Application::GetSolarMutex()); 2943 uno::Reference<XIndexAccess> xAcc; 2944 if( xShapeAgg.is() ) 2945 { 2946 const uno::Type& rType = ::getCppuType((uno::Reference<XIndexAccess>*)0 ); 2947 uno::Any aAgg = xShapeAgg->queryAggregation( rType ); 2948 aAgg >>= xAcc; 2949 } 2950 if(!xAcc.is()) 2951 throw uno::RuntimeException(); 2952 return xAcc->hasElements(); 2953 } 2954 2955 2956