1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26
27 #define _SVX_USE_UNOGLOBALS_
28 #include <com/sun/star/document/EventObject.hpp>
29 #include <com/sun/star/lang/DisposedException.hpp>
30 #include <vos/mutex.hxx>
31 #include <osl/mutex.hxx>
32 #include <sfx2/dispatch.hxx>
33 #include <sot/clsids.hxx>
34 #include <comphelper/serviceinfohelper.hxx>
35
36 #include <rtl/uuid.h>
37 #include <rtl/memory.h>
38 #include <sfx2/objsh.hxx>
39 #include <svx/svdpool.hxx>
40 #include <svx/svdobj.hxx>
41 #include <svx/svdoole2.hxx>
42 #include <svx/svdpage.hxx>
43 #include <svx/svdmodel.hxx>
44 #include <svx/svdview.hxx>
45 #include <svx/svdpagv.hxx>
46 #include <svx/unopage.hxx>
47 #include "shapeimpl.hxx"
48 #include "svx/globl3d.hxx"
49 #include <svx/polysc3d.hxx>
50 #include <svx/unoprov.hxx>
51 #include <svx/svdopath.hxx>
52 #include "svx/unoapi.hxx"
53 #include <svx/svdomeas.hxx>
54 #include <svx/extrud3d.hxx>
55 #include <svx/lathe3d.hxx>
56 #include <vcl/svapp.hxx>
57 #include <tools/diagnose_ex.h>
58
59 using ::rtl::OUString;
60 using namespace ::vos;
61 using namespace ::cppu;
62 using namespace ::com::sun::star;
63 using namespace ::com::sun::star::uno;
64 using namespace ::com::sun::star::lang;
65 using namespace ::com::sun::star::container;
66 using namespace ::com::sun::star::drawing;
67
68 #define INTERFACE_TYPE( xint ) \
69 ::getCppuType((const Reference< xint >*)0)
70
71 #define QUERYINT( xint ) \
72 if( rType == ::getCppuType((const Reference< xint >*)0) ) \
73 aAny <<= Reference< xint >(this)
74
75 DECLARE_LIST( SvxDrawPageList, SvxDrawPage * )
76
77
78 /**********************************************************************
79 * class SvxDrawPage *
80 **********************************************************************/
81
82 UNO3_GETIMPLEMENTATION_IMPL( SvxDrawPage );
DBG_NAME(SvxDrawPage)83 DBG_NAME(SvxDrawPage)
84 SvxDrawPage::SvxDrawPage( SdrPage* pInPage ) throw()
85 : mrBHelper( getMutex() )
86 , mpPage( pInPage )
87 , mpModel( 0 )
88 {
89 DBG_CTOR(SvxDrawPage,NULL);
90 // Am Broadcaster anmelden
91 if( mpPage )
92 mpModel = mpPage->GetModel();
93 if( mpModel )
94 StartListening( *mpModel );
95
96
97 // Erzeugen der (hidden) ::com::sun::star::sdbcx::View
98 mpView = new SdrView( mpModel );
99 if( mpView )
100 mpView->SetDesignMode(sal_True);
101 }
102
103 //----------------------------------------------------------------------
104 // Ctor fuer SvxDrawPage_NewInstance()
105 //----------------------------------------------------------------------
SvxDrawPage()106 SvxDrawPage::SvxDrawPage() throw()
107 : mrBHelper( getMutex() )
108 , mpPage( NULL )
109 , mpModel( NULL )
110 , mpView( NULL )
111 {
112 DBG_CTOR(SvxDrawPage,NULL);
113 }
114
115 //----------------------------------------------------------------------
~SvxDrawPage()116 SvxDrawPage::~SvxDrawPage() throw()
117 {
118 DBG_ASSERT( mrBHelper.bDisposed, "SvxDrawPage must be disposed!" );
119 if( !mrBHelper.bDisposed )
120 {
121 acquire();
122 dispose();
123 }
124 DBG_DTOR(SvxDrawPage,NULL);
125 }
126
127 //----------------------------------------------------------------------
128
129 // XInterface
release()130 void SvxDrawPage::release() throw()
131 {
132 /*
133 uno::Reference< uno::XInterface > x( xDelegator );
134 if (! x.is())
135 {
136 if (osl_decrementInterlockedCount( &m_refCount ) == 0)
137 {
138 if (! mrBHelper.bDisposed)
139 {
140 uno::Reference< uno::XInterface > xHoldAlive( (uno::XWeak*)this );
141 // First dispose
142 try
143 {
144 dispose();
145 }
146 catch(::com::sun::star::uno::Exception&)
147 {
148 // release should not throw exceptions
149 }
150
151 // only the alive ref holds the object
152 OSL_ASSERT( m_refCount == 1 );
153 // destroy the object if xHoldAlive decrement the refcount to 0
154 return;
155 }
156 }
157 // restore the reference count
158 osl_incrementInterlockedCount( &m_refCount );
159 }
160 */
161 OWeakAggObject::release();
162 }
163
164 //----------------------------------------------------------------------
165
GetPageForSdrPage(SdrPage * mpPage)166 SvxDrawPage* SvxDrawPage::GetPageForSdrPage( SdrPage* mpPage ) throw()
167 {
168 return getImplementation( mpPage->getUnoPage() );
169 }
170
171 // XComponent
disposing()172 void SvxDrawPage::disposing() throw()
173 {
174 if( mpModel )
175 {
176 EndListening( *mpModel );
177 mpModel = NULL;
178 }
179
180 if( mpView )
181 {
182 delete mpView;
183 mpView = NULL;
184 }
185 mpPage = 0;
186 }
187
188 //----------------------------------------------------------------------
189 // XComponent
190 //----------------------------------------------------------------------
191
dispose()192 void SvxDrawPage::dispose()
193 throw(::com::sun::star::uno::RuntimeException)
194 {
195 OGuard aSolarGuard( Application::GetSolarMutex() );
196
197 // An frequently programming error is to release the last
198 // reference to this object in the disposing message.
199 // Make it rubust, hold a self Reference.
200 uno::Reference< lang::XComponent > xSelf( this );
201
202 // Guard dispose against multible threading
203 // Remark: It is an error to call dispose more than once
204 sal_Bool bDoDispose = sal_False;
205 {
206 osl::MutexGuard aGuard( mrBHelper.rMutex );
207 if( !mrBHelper.bDisposed && !mrBHelper.bInDispose )
208 {
209 // only one call go into this section
210 mrBHelper.bInDispose = sal_True;
211 bDoDispose = sal_True;
212 }
213 }
214
215 // Do not hold the mutex because we are broadcasting
216 if( bDoDispose )
217 {
218 // Create an event with this as sender
219 try
220 {
221 uno::Reference< uno::XInterface > xSource( uno::Reference< uno::XInterface >::query( (lang::XComponent *)this ) );
222 ::com::sun::star::document::EventObject aEvt;
223 aEvt.Source = xSource;
224 // inform all listeners to release this object
225 // The listener container are automatically cleared
226 mrBHelper.aLC.disposeAndClear( aEvt );
227 // notify subclasses to do their dispose
228 disposing();
229 }
230 catch(::com::sun::star::uno::Exception& e)
231 {
232 // catch exception and throw again but signal that
233 // the object was disposed. Dispose should be called
234 // only once.
235 mrBHelper.bDisposed = sal_True;
236 mrBHelper.bInDispose = sal_False;
237 throw e;
238 }
239
240 // the values bDispose and bInDisposing must set in this order.
241 // No multithread call overcome the "!rBHelper.bDisposed && !rBHelper.bInDispose" guard.
242 mrBHelper.bDisposed = sal_True;
243 mrBHelper.bInDispose = sal_False;
244 }
245
246 }
247
248 //----------------------------------------------------------------------
249
addEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> & aListener)250 void SAL_CALL SvxDrawPage::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw(::com::sun::star::uno::RuntimeException)
251 {
252 OGuard aGuard( Application::GetSolarMutex() );
253
254 if( mpModel == 0 )
255 throw lang::DisposedException();
256
257 mrBHelper.addListener( ::getCppuType( &aListener ) , aListener );
258 }
259
260 //----------------------------------------------------------------------
261
removeEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> & aListener)262 void SAL_CALL SvxDrawPage::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw(::com::sun::star::uno::RuntimeException)
263 {
264 OGuard aGuard( Application::GetSolarMutex() );
265
266 if( mpModel == 0 )
267 throw lang::DisposedException();
268
269 mrBHelper.removeListener( ::getCppuType( &aListener ) , aListener );
270 }
271
272 //----------------------------------------------------------------------
273 // SfxListener
274 //----------------------------------------------------------------------
275
Notify(SfxBroadcaster &,const SfxHint &)276 void SvxDrawPage::Notify( SfxBroadcaster&, const SfxHint& /*rHint*/ )
277 {
278 /*
279 if( mpModel )
280 {
281 const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint );
282 if( pSdrHint )
283 {
284 switch( pSdrHint->GetKind() )
285 {
286 case HINT_MODELCLEARED:
287 dispose();
288 break;
289 default:
290 break;
291 }
292 }
293 }
294 */
295 }
296
297 //----------------------------------------------------------------------
298 // ::com::sun::star::drawing::XShapes
299 //----------------------------------------------------------------------
300
add(const uno::Reference<drawing::XShape> & xShape)301 void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape )
302 throw( uno::RuntimeException )
303 {
304 OGuard aGuard( Application::GetSolarMutex() );
305
306 if ( ( mpModel == NULL ) || ( mpPage == NULL ) )
307 throw lang::DisposedException();
308
309 SvxShape* pShape = SvxShape::getImplementation( xShape );
310
311 if( NULL == pShape )
312 return;
313
314 SdrObject *pObj = pShape->GetSdrObject();
315
316 if(!pObj)
317 {
318 pObj = CreateSdrObject( xShape );
319 ENSURE_OR_RETURN_VOID( pObj != NULL, "SvxDrawPage::add: no SdrObject was created!" );
320 }
321 else if ( !pObj->IsInserted() )
322 {
323 pObj->SetModel(mpModel);
324 mpPage->InsertObject( pObj );
325 }
326
327 pShape->Create( pObj, this );
328 OSL_ENSURE( pShape->GetSdrObject() == pObj, "SvxDrawPage::add: shape does not know about its newly created SdrObject!" );
329
330 mpModel->SetChanged();
331 }
332
333 //----------------------------------------------------------------------
remove(const Reference<drawing::XShape> & xShape)334 void SAL_CALL SvxDrawPage::remove( const Reference< drawing::XShape >& xShape )
335 throw( uno::RuntimeException )
336 {
337 OGuard aGuard( Application::GetSolarMutex() );
338
339 if( (mpModel == 0) || (mpPage == 0) )
340 throw lang::DisposedException();
341
342 SvxShape* pShape = SvxShape::getImplementation( xShape );
343
344 if(pShape)
345 {
346 SdrObject* pObj = pShape->GetSdrObject();
347 if(pObj)
348 {
349 // SdrObject aus der Page loeschen
350 sal_uInt32 nCount = mpPage->GetObjCount();
351 for( sal_uInt32 nNum = 0; nNum < nCount; nNum++ )
352 {
353 if(mpPage->GetObj(nNum) == pObj)
354 {
355 OSL_VERIFY( mpPage->RemoveObject( nNum ) == pObj );
356 SdrObject::Free( pObj );
357 break;
358 }
359 }
360 }
361 }
362
363 if( mpModel )
364 mpModel->SetChanged();
365 }
366
367 //----------------------------------------------------------------------
368 // ::com::sun::star::container::XIndexAccess
369 //----------------------------------------------------------------------
370
getCount()371 sal_Int32 SAL_CALL SvxDrawPage::getCount()
372 throw( uno::RuntimeException )
373 {
374 OGuard aGuard( Application::GetSolarMutex() );
375
376 if( (mpModel == 0) || (mpPage == 0) )
377 throw lang::DisposedException();
378
379 return( (sal_Int32) mpPage->GetObjCount() );
380 }
381
382 //----------------------------------------------------------------------
getByIndex(sal_Int32 Index)383 uno::Any SAL_CALL SvxDrawPage::getByIndex( sal_Int32 Index )
384 throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
385 {
386 OGuard aGuard( Application::GetSolarMutex() );
387
388 if( (mpModel == 0) || (mpPage == 0) )
389 throw lang::DisposedException();
390
391 if ( Index < 0 || Index >= (sal_Int32)mpPage->GetObjCount() )
392 throw lang::IndexOutOfBoundsException();
393
394 SdrObject* pObj = mpPage->GetObj( Index );
395 if( pObj == NULL )
396 throw uno::RuntimeException();
397
398
399 return makeAny(Reference< drawing::XShape >( pObj->getUnoShape(), uno::UNO_QUERY ));
400 }
401
402
403 //----------------------------------------------------------------------
404 // ::com::sun::star::container::XElementAccess
405 //----------------------------------------------------------------------
406
getElementType()407 uno::Type SAL_CALL SvxDrawPage::getElementType()
408 throw( uno::RuntimeException )
409 {
410 return INTERFACE_TYPE( drawing::XShape );
411 }
412
413 //----------------------------------------------------------------------
hasElements()414 sal_Bool SAL_CALL SvxDrawPage::hasElements()
415 throw( uno::RuntimeException )
416 {
417 OGuard aGuard( Application::GetSolarMutex() );
418
419 if( (mpModel == 0) || (mpPage == 0) )
420 throw lang::DisposedException();
421
422 return mpPage && mpPage->GetObjCount()>0;
423 }
424
425 namespace
426 {
lcl_markSdrObjectOfShape(const Reference<drawing::XShape> & _rxShape,SdrView & _rView,SdrPageView & _rPageView)427 void lcl_markSdrObjectOfShape( const Reference< drawing::XShape >& _rxShape, SdrView& _rView, SdrPageView& _rPageView )
428 {
429 SvxShape* pShape = SvxShape::getImplementation( _rxShape );
430 if ( !pShape )
431 return;
432
433 SdrObject* pObj = pShape->GetSdrObject();
434 if ( !pObj )
435 return;
436
437 _rView.MarkObj( pObj, &_rPageView );
438 }
439 }
440
441 //----------------------------------------------------------------------
442 // ACHTUNG: _SelectObjectsInView selektiert die ::com::sun::star::drawing::Shapes nur in der angegebennen
443 // SdrPageView. Dies mu� nicht die sichtbare SdrPageView sein.
444 //----------------------------------------------------------------------
_SelectObjectsInView(const Reference<drawing::XShapes> & aShapes,SdrPageView * pPageView)445 void SvxDrawPage::_SelectObjectsInView( const Reference< drawing::XShapes > & aShapes, SdrPageView* pPageView ) throw ()
446 {
447 DBG_ASSERT(pPageView,"SdrPageView ist NULL! [CL]");
448 DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
449
450 if(pPageView!=NULL && mpView!=NULL)
451 {
452 mpView->UnmarkAllObj( pPageView );
453
454 long nCount = aShapes->getCount();
455 for( long i = 0; i < nCount; i++ )
456 {
457 uno::Any aAny( aShapes->getByIndex(i) );
458 Reference< drawing::XShape > xShape;
459 if( aAny >>= xShape )
460 lcl_markSdrObjectOfShape( xShape, *mpView, *pPageView );
461 }
462 }
463 }
464
465 //----------------------------------------------------------------------
466 // ACHTUNG: _SelectObjectInView selektiert das Shape *nur* in der angegebennen
467 // SdrPageView. Dies mu� nicht die sichtbare SdrPageView sein.
468 //----------------------------------------------------------------------
_SelectObjectInView(const Reference<drawing::XShape> & xShape,SdrPageView * pPageView)469 void SvxDrawPage::_SelectObjectInView( const Reference< drawing::XShape > & xShape, SdrPageView* pPageView ) throw()
470 {
471 DBG_ASSERT(pPageView,"SdrPageView ist NULL! [CL]");
472 DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
473
474 if(pPageView!=NULL && mpView != NULL)
475 {
476 mpView->UnmarkAllObj( pPageView );
477 lcl_markSdrObjectOfShape( xShape, *mpView, *pPageView );
478 }
479 }
480
481 //----------------------------------------------------------------------
group(const Reference<drawing::XShapes> & xShapes)482 Reference< drawing::XShapeGroup > SAL_CALL SvxDrawPage::group( const Reference< drawing::XShapes >& xShapes )
483 throw( uno::RuntimeException )
484 {
485 OGuard aGuard( Application::GetSolarMutex() );
486
487 if( (mpModel == 0) || (mpPage == 0) )
488 throw lang::DisposedException();
489
490 DBG_ASSERT(mpPage,"SdrPage ist NULL! [CL]");
491 DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
492
493 Reference< ::com::sun::star::drawing::XShapeGroup > xShapeGroup;
494 if(mpPage==NULL||mpView==NULL||!xShapes.is())
495 return xShapeGroup;
496
497 SdrPageView* pPageView = mpView->ShowSdrPage( mpPage );
498
499 _SelectObjectsInView( xShapes, pPageView );
500
501 mpView->GroupMarked();
502
503 mpView->AdjustMarkHdl();
504 const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
505 if( rMarkList.GetMarkCount() == 1 )
506 {
507 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
508 if( pObj )
509 xShapeGroup = Reference< drawing::XShapeGroup >::query( pObj->getUnoShape() );
510 }
511
512 mpView->HideSdrPage();
513
514 if( mpModel )
515 mpModel->SetChanged();
516
517 return xShapeGroup;
518 }
519
520 //----------------------------------------------------------------------
ungroup(const Reference<drawing::XShapeGroup> & aGroup)521 void SAL_CALL SvxDrawPage::ungroup( const Reference< drawing::XShapeGroup >& aGroup )
522 throw( uno::RuntimeException )
523 {
524 OGuard aGuard( Application::GetSolarMutex() );
525
526 if( (mpModel == 0) || (mpPage == 0) )
527 throw lang::DisposedException();
528
529 DBG_ASSERT(mpPage,"SdrPage ist NULL! [CL]");
530 DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
531
532 if(mpPage==NULL||mpView==NULL||!aGroup.is())
533 return;
534
535 SdrPageView* pPageView = mpView->ShowSdrPage( mpPage );
536
537 Reference< drawing::XShape > xShape( aGroup, UNO_QUERY );
538 _SelectObjectInView( xShape, pPageView );
539 mpView->UnGroupMarked();
540
541 mpView->HideSdrPage();
542
543 if( mpModel )
544 mpModel->SetChanged();
545 }
546
547 //----------------------------------------------------------------------
_CreateSdrObject(const Reference<drawing::XShape> & xShape)548 SdrObject *SvxDrawPage::_CreateSdrObject( const Reference< drawing::XShape > & xShape ) throw()
549 {
550 sal_uInt16 nType;
551 sal_uInt32 nInventor;
552
553 GetTypeAndInventor( nType, nInventor, xShape->getShapeType() );
554 SdrObject* pNewObj = 0;
555
556 if( nType != 0 )
557 {
558 awt::Size aSize = xShape->getSize();
559 aSize.Width += 1;
560 aSize.Height += 1;
561 awt::Point aPos = xShape->getPosition();
562 Rectangle aRect( Point( aPos.X, aPos.Y ), Size( aSize.Width, aSize.Height ) );
563
564 // special cases
565 if( nInventor == SdrInventor )
566 {
567 switch( nType )
568 {
569 case OBJ_MEASURE:
570 {
571 pNewObj = new SdrMeasureObj( aRect.TopLeft(), aRect.BottomRight() );
572 break;
573 }
574 case OBJ_LINE:
575 {
576 basegfx::B2DPolygon aPoly;
577 aPoly.append(basegfx::B2DPoint(aRect.Left(), aRect.Top()));
578 aPoly.append(basegfx::B2DPoint(aRect.Right(), aRect.Bottom()));
579 pNewObj = new SdrPathObj(OBJ_LINE, basegfx::B2DPolyPolygon(aPoly));
580 break;
581 }
582 }
583 }
584
585 if( pNewObj == NULL )
586 pNewObj = SdrObjFactory::MakeNewObject( nInventor, nType, mpPage );
587
588 if(pNewObj)
589 {
590 pNewObj->SetSnapRect(aRect);
591
592 if( pNewObj->ISA(E3dPolyScene))
593 {
594 // Szene initialisieren
595 E3dScene* pScene = (E3dScene*)pNewObj;
596
597 double fW = (double)aSize.Width;
598 double fH = (double)aSize.Height;
599
600 Camera3D aCam(pScene->GetCamera());
601 aCam.SetAutoAdjustProjection(sal_False);
602 aCam.SetViewWindow(- fW / 2, - fH / 2, fW, fH);
603 basegfx::B3DPoint aLookAt;
604 basegfx::B3DPoint aCamPos(0.0, 0.0, 10000.0);
605 aCam.SetPosAndLookAt(aCamPos, aLookAt);
606 aCam.SetFocalLength(100.0);
607 aCam.SetDefaults(aCamPos, aLookAt, 10000.0);
608 pScene->SetCamera(aCam);
609
610 pScene->SetRectsDirty();
611 }
612 else if(pNewObj->ISA(E3dExtrudeObj))
613 {
614 E3dExtrudeObj* pObj = (E3dExtrudeObj*)pNewObj;
615 basegfx::B2DPolygon aNewPolygon;
616 aNewPolygon.append(basegfx::B2DPoint(0.0, 0.0));
617 aNewPolygon.append(basegfx::B2DPoint(0.0, 1.0));
618 aNewPolygon.append(basegfx::B2DPoint(1.0, 0.0));
619 aNewPolygon.setClosed(true);
620 pObj->SetExtrudePolygon(basegfx::B2DPolyPolygon(aNewPolygon));
621
622 // #107245# pObj->SetExtrudeCharacterMode(sal_True);
623 pObj->SetMergedItem(Svx3DCharacterModeItem(sal_True));
624 }
625 else if(pNewObj->ISA(E3dLatheObj))
626 {
627 E3dLatheObj* pObj = (E3dLatheObj*)pNewObj;
628 basegfx::B2DPolygon aNewPolygon;
629 aNewPolygon.append(basegfx::B2DPoint(0.0, 0.0));
630 aNewPolygon.append(basegfx::B2DPoint(0.0, 1.0));
631 aNewPolygon.append(basegfx::B2DPoint(1.0, 0.0));
632 aNewPolygon.setClosed(true);
633 pObj->SetPolyPoly2D(basegfx::B2DPolyPolygon(aNewPolygon));
634
635 // #107245# pObj->SetLatheCharacterMode(sal_True);
636 pObj->SetMergedItem(Svx3DCharacterModeItem(sal_True));
637 }
638 }
639 }
640
641 return pNewObj;
642 }
643
644 //----------------------------------------------------------------------
GetTypeAndInventor(sal_uInt16 & rType,sal_uInt32 & rInventor,const OUString & aName) const645 void SvxDrawPage::GetTypeAndInventor( sal_uInt16& rType, sal_uInt32& rInventor, const OUString& aName ) const throw()
646 {
647 sal_uInt32 nTempType = aSdrShapeIdentifierMap.getId( aName );
648
649 if( nTempType == UHASHMAP_NOTFOUND )
650 {
651 if( aName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.TableShape")) ||
652 aName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.TableShape")) )
653 {
654 rInventor = SdrInventor;
655 rType = OBJ_TABLE;
656 }
657 else if( aName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.MediaShape" )) )
658 {
659 rInventor = SdrInventor;
660 rType = OBJ_MEDIA;
661 }
662 }
663 else if(nTempType & E3D_INVENTOR_FLAG)
664 {
665 rInventor = E3dInventor;
666 rType = (sal_uInt16)(nTempType & ~E3D_INVENTOR_FLAG);
667 }
668 else
669 {
670 rInventor = SdrInventor;
671 rType = (sal_uInt16)nTempType;
672
673 switch( rType )
674 {
675 case OBJ_FRAME:
676 case OBJ_OLE2_PLUGIN:
677 case OBJ_OLE2_APPLET:
678 rType = OBJ_OLE2;
679 break;
680 }
681 }
682 }
683
684 //----------------------------------------------------------------------
CreateShapeByTypeAndInventor(sal_uInt16 nType,sal_uInt32 nInventor,SdrObject * pObj,SvxDrawPage * mpPage)685 SvxShape* SvxDrawPage::CreateShapeByTypeAndInventor( sal_uInt16 nType, sal_uInt32 nInventor, SdrObject *pObj, SvxDrawPage *mpPage ) throw()
686 {
687 SvxShape* pRet = NULL;
688 switch( nInventor )
689 {
690 case E3dInventor:
691 {
692 switch( nType )
693 {
694 case E3D_SCENE_ID :
695 case E3D_POLYSCENE_ID :
696 pRet = new Svx3DSceneObject( pObj, mpPage );
697 break;
698 case E3D_CUBEOBJ_ID :
699 pRet = new Svx3DCubeObject( pObj );
700 break;
701 case E3D_SPHEREOBJ_ID :
702 pRet = new Svx3DSphereObject( pObj );
703 break;
704 case E3D_LATHEOBJ_ID :
705 pRet = new Svx3DLatheObject( pObj );
706 break;
707 case E3D_EXTRUDEOBJ_ID :
708 pRet = new Svx3DExtrudeObject( pObj );
709 break;
710 case E3D_POLYGONOBJ_ID :
711 pRet = new Svx3DPolygonObject( pObj );
712 break;
713 default: // unbekanntes 3D-Objekt auf der Page
714 pRet = new SvxShape( pObj );
715 break;
716 }
717 break;
718 }
719 case SdrInventor:
720 {
721 switch( nType )
722 {
723 // case OBJ_NONE:
724 // break;
725 case OBJ_GRUP:
726 pRet = new SvxShapeGroup( pObj, mpPage );
727 break;
728 case OBJ_LINE:
729 pRet = new SvxShapePolyPolygon( pObj , PolygonKind_LINE );
730 break;
731 case OBJ_RECT:
732 pRet = new SvxShapeRect( pObj );
733 break;
734 case OBJ_CIRC:
735 case OBJ_SECT:
736 case OBJ_CARC:
737 case OBJ_CCUT:
738 pRet = new SvxShapeCircle( pObj );
739 break;
740 case OBJ_POLY:
741 pRet = new SvxShapePolyPolygon( pObj , PolygonKind_POLY );
742 break;
743 case OBJ_PLIN:
744 pRet = new SvxShapePolyPolygon( pObj , PolygonKind_PLIN );
745 break;
746 case OBJ_SPLNLINE:
747 case OBJ_PATHLINE:
748 pRet = new SvxShapePolyPolygonBezier( pObj , PolygonKind_PATHLINE );
749 break;
750 case OBJ_SPLNFILL:
751 case OBJ_PATHFILL:
752 pRet = new SvxShapePolyPolygonBezier( pObj , PolygonKind_PATHFILL );
753 break;
754 case OBJ_FREELINE:
755 pRet = new SvxShapePolyPolygonBezier( pObj , PolygonKind_FREELINE );
756 break;
757 case OBJ_FREEFILL:
758 pRet = new SvxShapePolyPolygonBezier( pObj , PolygonKind_FREEFILL );
759 break;
760 case OBJ_CAPTION:
761 pRet = new SvxShapeCaption( pObj );
762 break;
763 case OBJ_TITLETEXT:
764 case OBJ_OUTLINETEXT:
765 case OBJ_TEXT:
766 pRet = new SvxShapeText( pObj );
767 break;
768 case OBJ_GRAF:
769 pRet = new SvxGraphicObject( pObj );
770 break;
771 case OBJ_FRAME:
772 pRet = new SvxFrameShape( pObj );
773 break;
774 case OBJ_OLE2_APPLET:
775 pRet = new SvxAppletShape( pObj );
776 break;
777 case OBJ_OLE2_PLUGIN:
778 pRet = new SvxPluginShape( pObj );
779 break;
780 case OBJ_OLE2:
781 {
782 if( pObj && !pObj->IsEmptyPresObj() && mpPage )
783 {
784 SdrPage* pSdrPage = mpPage->GetSdrPage();
785 if( pSdrPage )
786 {
787 SdrModel* pSdrModel = pSdrPage->GetModel();
788 if( pSdrModel )
789 {
790 ::comphelper::IEmbeddedHelper *pPersist = pSdrModel->GetPersist();
791 if( pPersist )
792 {
793 uno::Reference < embed::XEmbeddedObject > xObject = pPersist->getEmbeddedObjectContainer().
794 GetEmbeddedObject( static_cast< SdrOle2Obj* >( pObj )->GetPersistName() );
795
796 // TODO CL->KA: Why is this not working anymore?
797 if( xObject.is() )
798 {
799 SvGlobalName aClassId( xObject->getClassID() );
800
801 const SvGlobalName aAppletClassId( SO3_APPLET_CLASSID );
802 const SvGlobalName aPluginClassId( SO3_PLUGIN_CLASSID );
803 const SvGlobalName aIFrameClassId( SO3_IFRAME_CLASSID );
804
805 if( aPluginClassId == aClassId )
806 {
807 pRet = new SvxPluginShape( pObj );
808 nType = OBJ_OLE2_PLUGIN;
809 }
810 else if( aAppletClassId == aClassId )
811 {
812 pRet = new SvxAppletShape( pObj );
813 nType = OBJ_OLE2_APPLET;
814 }
815 else if( aIFrameClassId == aClassId )
816 {
817 pRet = new SvxFrameShape( pObj );
818 nType = OBJ_FRAME;
819 }
820 }
821 }
822 }
823 }
824 }
825 if( pRet == NULL )
826 {
827 pRet = new SvxOle2Shape( pObj, aSvxMapProvider.GetMap(SVXMAP_OLE2), aSvxMapProvider.GetPropertySet(SVXMAP_OLE2, SdrObject::GetGlobalDrawObjectItemPool()) );
828 }
829 }
830 break;
831 case OBJ_EDGE:
832 pRet = new SvxShapeConnector( pObj );
833 break;
834 case OBJ_PATHPOLY:
835 pRet = new SvxShapePolyPolygon( pObj , PolygonKind_PATHPOLY );
836 break;
837 case OBJ_PATHPLIN:
838 pRet = new SvxShapePolyPolygon( pObj , PolygonKind_PATHPLIN );
839 break;
840 case OBJ_PAGE:
841 pRet = new SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_PAGE), aSvxMapProvider.GetPropertySet(SVXMAP_PAGE, SdrObject::GetGlobalDrawObjectItemPool()) );
842 break;
843 case OBJ_MEASURE:
844 pRet = new SvxShapeDimensioning( pObj );
845 break;
846 // case OBJ_DUMMY:
847 // break;
848 case OBJ_UNO:
849 pRet = new SvxShapeControl( pObj );
850 break;
851 case OBJ_CUSTOMSHAPE:
852 pRet = new SvxCustomShape( pObj );
853 break;
854 case OBJ_MEDIA:
855 pRet = new SvxMediaShape( pObj );
856 break;
857 case OBJ_TABLE:
858 pRet = new SvxTableShape( pObj );
859 break;
860 default: // unbekanntes 2D-Objekt auf der Page
861 DBG_ERROR("Nicht implementierter Starone-Shape erzeugt! [CL]");
862 pRet = new SvxShapeText( pObj );
863 break;
864 }
865 break;
866 }
867 default: // Unbekannter Inventor
868 {
869 DBG_ERROR("AW: Unknown Inventor in SvxDrawPage::_CreateShape()");
870 break;
871 }
872 }
873
874 if(pRet)
875 {
876 sal_uInt32 nObjId = nType;
877
878 if( nInventor == E3dInventor )
879 nObjId |= E3D_INVENTOR_FLAG;
880
881 switch(nObjId)
882 {
883 case OBJ_CCUT: // Kreisabschnitt
884 case OBJ_CARC: // Kreisbogen
885 case OBJ_SECT: // Kreissektor
886 nObjId = OBJ_CIRC;
887 break;
888
889 case E3D_SCENE_ID | E3D_INVENTOR_FLAG:
890 nObjId = E3D_POLYSCENE_ID | E3D_INVENTOR_FLAG;
891 break;
892
893 case OBJ_TITLETEXT:
894 case OBJ_OUTLINETEXT:
895 nObjId = OBJ_TEXT;
896 break;
897 }
898
899 pRet->setShapeKind(nObjId);
900 }
901
902 return pRet;
903 }
904
905 //----------------------------------------------------------------------
_CreateShape(SdrObject * pObj) const906 Reference< drawing::XShape > SvxDrawPage::_CreateShape( SdrObject *pObj ) const throw()
907 {
908 Reference< drawing::XShape > xShape( CreateShapeByTypeAndInventor(pObj->GetObjIdentifier(),
909 pObj->GetObjInventor(),
910 pObj,
911 (SvxDrawPage*)this));
912 return xShape;
913 }
914
915 //----------------------------------------------------------------------
CreateSdrObject(const Reference<drawing::XShape> & xShape)916 SdrObject *SvxDrawPage::CreateSdrObject( const Reference< drawing::XShape > & xShape ) throw()
917 {
918 SdrObject* pObj = _CreateSdrObject( xShape );
919 if( pObj && !pObj->IsInserted() )
920 mpPage->InsertObject( pObj );
921
922 return pObj;
923 }
924
925 //----------------------------------------------------------------------
926 // ::com::sun::star::lang::XServiceInfo
927 //----------------------------------------------------------------------
getImplementationName()928 OUString SAL_CALL SvxDrawPage::getImplementationName() throw( uno::RuntimeException )
929 {
930 return OUString( RTL_CONSTASCII_USTRINGPARAM("SvxDrawPage"));
931 }
932
supportsService(const OUString & ServiceName)933 sal_Bool SAL_CALL SvxDrawPage::supportsService( const OUString& ServiceName )
934 throw(::com::sun::star::uno::RuntimeException)
935 {
936 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
937 }
938
getSupportedServiceNames()939 uno::Sequence< OUString > SAL_CALL SvxDrawPage::getSupportedServiceNames() throw( uno::RuntimeException )
940 {
941 uno::Sequence< OUString > aSeq( 1 );
942 aSeq.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.ShapeCollection" ));
943 return aSeq;
944 }
945
CreateSvxShapeByTypeAndInventor(sal_uInt16 nType,sal_uInt32 nInventor)946 SvxShape* CreateSvxShapeByTypeAndInventor( sal_uInt16 nType, sal_uInt32 nInventor ) throw()
947 {
948 return SvxDrawPage::CreateShapeByTypeAndInventor( nType, nInventor );
949 }
950
ChangeModel(SdrModel * pNewModel)951 void SvxDrawPage::ChangeModel( SdrModel* pNewModel )
952 {
953 if( pNewModel != mpModel )
954 {
955 if( mpModel )
956 EndListening( *mpModel );
957
958 if( pNewModel )
959 StartListening( *pNewModel );
960
961 mpModel = pNewModel;
962
963 if( mpView )
964 {
965 delete mpView;
966 mpView = new SdrView( mpModel );
967 if( mpView )
968 mpView->SetDesignMode(sal_True);
969 }
970 }
971 }
972
973 /** returns a StarOffice API wrapper for the given SdrPage */
GetXDrawPageForSdrPage(SdrPage * pPage)974 uno::Reference< drawing::XDrawPage > GetXDrawPageForSdrPage( SdrPage* pPage ) throw ()
975 {
976 if(pPage)
977 {
978 uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
979
980 return xDrawPage;
981 }
982
983 return uno::Reference< drawing::XDrawPage >();
984 }
985
986 /** returns the SdrObject from the given StarOffice API wrapper */
GetSdrPageFromXDrawPage(uno::Reference<drawing::XDrawPage> xDrawPage)987 SdrPage* GetSdrPageFromXDrawPage( uno::Reference< drawing::XDrawPage > xDrawPage ) throw()
988 {
989 if(xDrawPage.is())
990 {
991 SvxDrawPage* pDrawPage = SvxDrawPage::getImplementation( xDrawPage );
992
993 if(pDrawPage)
994 {
995 return pDrawPage->GetSdrPage();
996 }
997 }
998
999 return NULL;
1000 }
1001
1002 // eof
1003