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:
SwShapeDescriptor_Impl()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
~SwShapeDescriptor_Impl()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 }
GetAnchor(sal_Bool bCreate=sal_False)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 }
GetHOrient(sal_Bool bCreate=sal_False)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 }
GetVOrient(sal_Bool bCreate=sal_False)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
GetSurround(sal_Bool bCreate=sal_False)179 SwFmtSurround* GetSurround(sal_Bool bCreate = sal_False)
180 {
181 if(bCreate && !pSurround)
182 pSurround = new SwFmtSurround();
183 return pSurround;
184 }
GetLRSpace(sal_Bool bCreate=sal_False)185 SvxLRSpaceItem* GetLRSpace(sal_Bool bCreate = sal_False)
186 {
187 if(bCreate && !pLRSpace)
188 pLRSpace = new SvxLRSpaceItem(RES_LR_SPACE);
189 return pLRSpace;
190 }
GetULSpace(sal_Bool bCreate=sal_False)191 SvxULSpaceItem* GetULSpace(sal_Bool bCreate = sal_False)
192 {
193 if(bCreate && !pULSpace)
194 pULSpace = new SvxULSpaceItem(RES_UL_SPACE);
195 return pULSpace;
196 }
GetTextRange()197 uno::Reference< text::XTextRange > & GetTextRange()
198 {
199 return xTextRange;
200 }
IsOpaque()201 sal_Bool IsOpaque()
202 {
203 return bOpaque;
204 }
GetOpaque()205 const sal_Bool& GetOpaque()
206 {
207 return bOpaque;
208 }
RemoveHOrient()209 void RemoveHOrient(){DELETEZ(pHOrient);}
RemoveVOrient()210 void RemoveVOrient(){DELETEZ(pVOrient);}
RemoveAnchor()211 void RemoveAnchor(){DELETEZ(pAnchor);}
RemoveSurround()212 void RemoveSurround(){DELETEZ(pSurround);}
RemoveULSpace()213 void RemoveULSpace(){DELETEZ(pULSpace);}
RemoveLRSpace()214 void RemoveLRSpace(){DELETEZ(pLRSpace);}
SetOpaque(sal_Bool bSet)215 void SetOpaque(sal_Bool bSet){bOpaque = bSet;}
216
217 // OD 2004-04-21 #i26791#
GetFollowTextFlow(sal_Bool _bCreate=sal_False)218 SwFmtFollowTextFlow* GetFollowTextFlow( sal_Bool _bCreate = sal_False )
219 {
220 if ( _bCreate && !mpFollowTextFlow )
221 mpFollowTextFlow = new SwFmtFollowTextFlow( sal_False );
222 return mpFollowTextFlow;
223 }
RemoveFollowTextFlow()224 void RemoveFollowTextFlow()
225 {
226 DELETEZ(mpFollowTextFlow);
227 }
228
229 // --> OD 2004-08-06 #i28749#
GetPositionLayoutDir() const230 sal_Int16 GetPositionLayoutDir() const
231 {
232 return mnPositionLayoutDir;
233 }
SetPositionLayoutDir(sal_Int16 _nPositionLayoutDir)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 }
RemovePositionLayoutDir()251 void RemovePositionLayoutDir()
252 {
253 mnPositionLayoutDir = text::PositionLayoutDir::PositionInLayoutDirOfAnchor;
254 }
255 // <--
256
257 // OD 2004-05-05 #i28701#
GetWrapInfluenceOnObjPos(const sal_Bool _bCreate=sal_False)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 }
RemoveWrapInfluenceOnObjPos()270 inline void RemoveWrapInfluenceOnObjPos()
271 {
272 DELETEZ(pWrapInfluenceOnObjPos);
273 }
274 };
275 /****************************************************************************
276 class SwFmDrawPage
277 ****************************************************************************/
278
SwFmDrawPage(SdrPage * pPage)279 SwFmDrawPage::SwFmDrawPage( SdrPage* pPage ) :
280 SvxFmDrawPage( pPage ), pPageView(0)
281 {
282 }
283
~SwFmDrawPage()284 SwFmDrawPage::~SwFmDrawPage() throw ()
285 {
286 RemovePageView();
287 }
288
PreGroup(const uno::Reference<drawing::XShapes> & xShapes)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
PreUnGroup(const uno::Reference<drawing::XShapeGroup> xShapeGroup)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
GetPageView()302 SdrPageView* SwFmDrawPage::GetPageView()
303 {
304 if(!pPageView)
305 pPageView = mpView->ShowSdrPage( mpPage );
306 return pPageView;
307 }
308
RemovePageView()309 void SwFmDrawPage::RemovePageView()
310 {
311 if(pPageView && mpView)
312 mpView->HideSdrPage();
313 pPageView = 0;
314 }
315
GetInterface(SdrObject * pObj)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
_CreateSdrObject(const uno::Reference<drawing::XShape> & xShape)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
_CreateShape(SdrObject * pObj) const339 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:
~SwXShapesEnumeration()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
SwXShapesEnumeration(SwXDrawPage * const pDrawPage)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
hasMoreElements(void)443 sal_Bool SwXShapesEnumeration::hasMoreElements(void) throw(uno::RuntimeException)
444 {
445 vos::OGuard aGuard(Application::GetSolarMutex());
446 return !m_aShapes.empty();
447 }
448
nextElement(void)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
getImplementationName(void)459 OUString SwXShapesEnumeration::getImplementationName(void) throw(uno::RuntimeException)
460 {
461 return C2U("SwXShapeEnumeration");
462 }
463
supportsService(const OUString & ServiceName)464 sal_Bool SwXShapesEnumeration::supportsService(const OUString& ServiceName) throw(uno::RuntimeException)
465 {
466 return C2U("com.sun.star.container.XEnumeration") == ServiceName;
467 }
468
getSupportedServiceNames(void)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 ****************************************************************************/
createEnumeration(void)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
getImplementationName(void)483 rtl::OUString SwXDrawPage::getImplementationName(void) throw( uno::RuntimeException )
484 {
485 return C2U("SwXDrawPage");
486 }
487
supportsService(const rtl::OUString & rServiceName)488 sal_Bool SwXDrawPage::supportsService(const rtl::OUString& rServiceName) throw( uno::RuntimeException )
489 {
490 return C2U("com.sun.star.drawing.GenericDrawPage") == rServiceName;
491 }
492
getSupportedServiceNames(void)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
SwXDrawPage(SwDoc * pDc)501 SwXDrawPage::SwXDrawPage(SwDoc* pDc) :
502 pDoc(pDc),
503 pDrawPage(0)
504 {
505 }
506
~SwXDrawPage()507 SwXDrawPage::~SwXDrawPage()
508 {
509 if(xPageAgg.is())
510 {
511 uno::Reference< uno::XInterface > xInt;
512 xPageAgg->setDelegator(xInt);
513 }
514 }
515
queryInterface(const uno::Type & aType)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
getTypes()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
getCount(void)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
getByIndex(sal_Int32 nIndex)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
getElementType(void)583 uno::Type SwXDrawPage::getElementType(void) throw( uno::RuntimeException )
584 {
585 return ::getCppuType((const uno::Reference<drawing::XShape>*)0);
586 }
587
hasElements(void)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
add(const uno::Reference<drawing::XShape> & xShape)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
remove(const uno::Reference<drawing::XShape> & xShape)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
group(const uno::Reference<drawing::XShapes> & xShapes)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
ungroup(const uno::Reference<drawing::XShapeGroup> & xShapeGroup)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
GetSvxPage()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
InvalidateSwDoc()885 void SwXDrawPage::InvalidateSwDoc()
886 {
887 pDoc = 0;
888 }
889
890 /****************************************************************************
891
892 ****************************************************************************/
893 TYPEINIT1(SwXShape, SwClient);
894
getUnoTunnelId()895 const uno::Sequence< sal_Int8 > & SwXShape::getUnoTunnelId()
896 {
897 static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
898 return aSeq;
899 }
900
getSomething(const uno::Sequence<sal_Int8> & rId)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 {
lcl_addShapePropertyEventFactories(SdrObject & _rObj,SwXShape & _rShape)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
SwXShape(uno::Reference<uno::XInterface> & xShape)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
AddExistingShapeToFmt(SdrObject & _rObj)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
~SwXShape()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
queryInterface(const uno::Type & aType)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
getTypes()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
getImplementationId()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
getPropertySetInfo(void)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
setPropertyValue(const rtl::OUString & rPropertyName,const uno::Any & aValue)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
getPropertyValue(const rtl::OUString & rPropertyName)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
_getPropAtAggrObj(const::rtl::OUString & _rPropertyName)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
getPropertyState(const rtl::OUString & rPropertyName)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
getPropertyStates(const uno::Sequence<rtl::OUString> & aPropertyNames)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
setPropertyToDefault(const rtl::OUString & rPropertyName)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
getPropertyDefault(const rtl::OUString & rPropertyName)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
addPropertyChangeListener(const rtl::OUString & _propertyName,const uno::Reference<beans::XPropertyChangeListener> & _listener)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
removePropertyChangeListener(const rtl::OUString & _propertyName,const uno::Reference<beans::XPropertyChangeListener> & _listener)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
addVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)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
removeVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)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
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)2005 void SwXShape::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
2006 {
2007 ClientModify(this, pOld, pNew);
2008 }
2009
attach(const uno::Reference<text::XTextRange> & xTextRange)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
getAnchor(void)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
dispose(void)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
addEventListener(const uno::Reference<lang::XEventListener> & aListener)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
removeEventListener(const uno::Reference<lang::XEventListener> & aListener)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
getImplementationName(void)2170 rtl::OUString SwXShape::getImplementationName(void) throw( uno::RuntimeException )
2171 {
2172 return C2U("SwXShape");
2173 }
2174
supportsService(const rtl::OUString & rServiceName)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
getSupportedServiceNames(void)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
GetSvxShape()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
getPosition()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 }
setPosition(const awt::Point & aPosition)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 }
getSize()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 }
setSize(const awt::Size & aSize)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
getShapeType()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 */
_GetTopGroupObj(SvxShape * _pSvxShape)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 */
_GetAttrPosition()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 */
_ConvertPositionToHoriL2R(const awt::Point _aObjPos,const awt::Size _aObjSize)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 */
_ConvertTransformationToLayoutDir(drawing::HomogenMatrix3 _aMatrixInHoriL2R)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 */
_AdjustPositionProperties(const awt::Point _aPosition)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 */
_ConvertStartOrEndPosToLayoutDir(const::com::sun::star::awt::Point & aStartOrEndPos)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
_ConvertPolyPolygonBezierToLayoutDir(const::com::sun::star::drawing::PolyPolygonBezierCoords & aPath)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
SwXGroupShape(uno::Reference<XInterface> & xShape)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
~SwXGroupShape()2795 SwXGroupShape::~SwXGroupShape()
2796 {
2797 }
2798
queryInterface(const uno::Type & rType)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
acquire()2809 void SwXGroupShape::acquire( ) throw()
2810 {
2811 SwXShape::acquire();
2812 }
2813
release()2814 void SwXGroupShape::release( ) throw()
2815 {
2816 SwXShape::release();
2817 }
2818
add(const uno::Reference<XShape> & xShape)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
remove(const uno::Reference<XShape> & xShape)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
getCount(void)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
getByIndex(sal_Int32 nIndex)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
getElementType()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
hasElements()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