xref: /trunk/main/svx/source/unodraw/unopage.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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 {
194     OGuard aSolarGuard( Application::GetSolarMutex() );
195 
196     // An frequently programming error is to release the last
197     // reference to this object in the disposing message.
198     // Make it rubust, hold a self Reference.
199     uno::Reference< lang::XComponent > xSelf( this );
200 
201     // Guard dispose against multible threading
202     // Remark: It is an error to call dispose more than once
203     sal_Bool bDoDispose = sal_False;
204     {
205     osl::MutexGuard aGuard( mrBHelper.rMutex );
206     if( !mrBHelper.bDisposed && !mrBHelper.bInDispose )
207     {
208         // only one call go into this section
209         mrBHelper.bInDispose = sal_True;
210         bDoDispose = sal_True;
211     }
212     }
213 
214     // Do not hold the mutex because we are broadcasting
215     if( bDoDispose )
216     {
217         // Create an event with this as sender
218         try
219         {
220             uno::Reference< uno::XInterface > xSource( uno::Reference< uno::XInterface >::query( (lang::XComponent *)this ) );
221             ::com::sun::star::document::EventObject aEvt;
222             aEvt.Source = xSource;
223             // inform all listeners to release this object
224             // The listener container are automatically cleared
225             mrBHelper.aLC.disposeAndClear( aEvt );
226             // notify subclasses to do their dispose
227             disposing();
228         }
229         catch(::com::sun::star::uno::Exception& e)
230         {
231             // catch exception and throw again but signal that
232             // the object was disposed. Dispose should be called
233             // only once.
234             mrBHelper.bDisposed = sal_True;
235             mrBHelper.bInDispose = sal_False;
236             throw e;
237         }
238 
239         // the values bDispose and bInDisposing must set in this order.
240         // No multithread call overcome the "!rBHelper.bDisposed && !rBHelper.bInDispose" guard.
241         mrBHelper.bDisposed = sal_True;
242         mrBHelper.bInDispose = sal_False;
243     }
244 
245 }
246 
247 //----------------------------------------------------------------------
248 
addEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> & aListener)249 void SAL_CALL SvxDrawPage::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener )
250 {
251     OGuard aGuard( Application::GetSolarMutex() );
252 
253     if( mpModel == 0 )
254         throw lang::DisposedException();
255 
256     mrBHelper.addListener( ::getCppuType( &aListener ) , aListener );
257 }
258 
259 //----------------------------------------------------------------------
260 
removeEventListener(const::com::sun::star::uno::Reference<::com::sun::star::lang::XEventListener> & aListener)261 void SAL_CALL SvxDrawPage::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener )
262 {
263     OGuard aGuard( Application::GetSolarMutex() );
264 
265     if( mpModel == 0 )
266         throw lang::DisposedException();
267 
268     mrBHelper.removeListener( ::getCppuType( &aListener ) , aListener );
269 }
270 
271 //----------------------------------------------------------------------
272 // SfxListener
273 //----------------------------------------------------------------------
274 
Notify(SfxBroadcaster &,const SfxHint &)275 void SvxDrawPage::Notify( SfxBroadcaster&, const SfxHint& /*rHint*/ )
276 {
277 /*
278     if( mpModel )
279     {
280         const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint );
281         if( pSdrHint )
282         {
283             switch( pSdrHint->GetKind() )
284             {
285             case HINT_MODELCLEARED:
286                 dispose();
287                 break;
288             default:
289                 break;
290             }
291         }
292     }
293 */
294 }
295 
296 //----------------------------------------------------------------------
297 // ::com::sun::star::drawing::XShapes
298 //----------------------------------------------------------------------
299 
add(const uno::Reference<drawing::XShape> & xShape)300 void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape )
301 {
302     OGuard aGuard( Application::GetSolarMutex() );
303 
304     if ( ( mpModel == NULL ) || ( mpPage == NULL ) )
305         throw lang::DisposedException();
306 
307     SvxShape* pShape = SvxShape::getImplementation( xShape );
308 
309     if( NULL == pShape )
310         return;
311 
312     SdrObject *pObj = pShape->GetSdrObject();
313 
314     if(!pObj)
315     {
316         pObj = CreateSdrObject( xShape );
317         ENSURE_OR_RETURN_VOID( pObj != NULL, "SvxDrawPage::add: no SdrObject was created!" );
318     }
319     else if ( !pObj->IsInserted() )
320     {
321         pObj->SetModel(mpModel);
322         mpPage->InsertObject( pObj );
323     }
324 
325     pShape->Create( pObj, this );
326     OSL_ENSURE( pShape->GetSdrObject() == pObj, "SvxDrawPage::add: shape does not know about its newly created SdrObject!" );
327 
328     mpModel->SetChanged();
329 }
330 
331 //----------------------------------------------------------------------
remove(const Reference<drawing::XShape> & xShape)332 void SAL_CALL SvxDrawPage::remove( const Reference< drawing::XShape >& xShape )
333 {
334     OGuard aGuard( Application::GetSolarMutex() );
335 
336     if( (mpModel == 0) || (mpPage == 0) )
337         throw lang::DisposedException();
338 
339     SvxShape* pShape = SvxShape::getImplementation( xShape );
340 
341     if(pShape)
342     {
343         SdrObject*  pObj = pShape->GetSdrObject();
344         if(pObj)
345         {
346             // SdrObject aus der Page loeschen
347             sal_uInt32 nCount = mpPage->GetObjCount();
348             for( sal_uInt32 nNum = 0; nNum < nCount; nNum++ )
349             {
350                 if(mpPage->GetObj(nNum) == pObj)
351                 {
352                     OSL_VERIFY( mpPage->RemoveObject( nNum ) == pObj );
353                     SdrObject::Free( pObj );
354                     break;
355                 }
356             }
357         }
358     }
359 
360     if( mpModel )
361         mpModel->SetChanged();
362 }
363 
364 //----------------------------------------------------------------------
365 // ::com::sun::star::container::XIndexAccess
366 //----------------------------------------------------------------------
367 
getCount()368 sal_Int32 SAL_CALL SvxDrawPage::getCount()
369 {
370     OGuard aGuard( Application::GetSolarMutex() );
371 
372     if( (mpModel == 0) || (mpPage == 0) )
373         throw lang::DisposedException();
374 
375     return( (sal_Int32) mpPage->GetObjCount() );
376 }
377 
378 //----------------------------------------------------------------------
getByIndex(sal_Int32 Index)379 uno::Any SAL_CALL SvxDrawPage::getByIndex( sal_Int32 Index )
380 {
381     OGuard aGuard( Application::GetSolarMutex() );
382 
383     if( (mpModel == 0) || (mpPage == 0) )
384         throw lang::DisposedException();
385 
386     if ( Index < 0 || Index >= (sal_Int32)mpPage->GetObjCount() )
387         throw lang::IndexOutOfBoundsException();
388 
389     SdrObject* pObj = mpPage->GetObj( Index );
390     if( pObj == NULL )
391         throw uno::RuntimeException();
392 
393 
394     return makeAny(Reference< drawing::XShape >( pObj->getUnoShape(), uno::UNO_QUERY ));
395 }
396 
397 
398 //----------------------------------------------------------------------
399 // ::com::sun::star::container::XElementAccess
400 //----------------------------------------------------------------------
401 
getElementType()402 uno::Type SAL_CALL SvxDrawPage::getElementType()
403 {
404     return INTERFACE_TYPE( drawing::XShape );
405 }
406 
407 //----------------------------------------------------------------------
hasElements()408 sal_Bool SAL_CALL SvxDrawPage::hasElements()
409 {
410     OGuard aGuard( Application::GetSolarMutex() );
411 
412     if( (mpModel == 0) || (mpPage == 0) )
413         throw lang::DisposedException();
414 
415     return mpPage && mpPage->GetObjCount()>0;
416 }
417 
418 namespace
419 {
lcl_markSdrObjectOfShape(const Reference<drawing::XShape> & _rxShape,SdrView & _rView,SdrPageView & _rPageView)420     void lcl_markSdrObjectOfShape( const Reference< drawing::XShape >& _rxShape, SdrView& _rView, SdrPageView& _rPageView )
421     {
422         SvxShape* pShape = SvxShape::getImplementation( _rxShape );
423         if ( !pShape )
424             return;
425 
426         SdrObject* pObj = pShape->GetSdrObject();
427         if ( !pObj )
428             return;
429 
430         _rView.MarkObj( pObj, &_rPageView );
431     }
432 }
433 
434 //----------------------------------------------------------------------
435 // ACHTUNG: _SelectObjectsInView selektiert die ::com::sun::star::drawing::Shapes nur in der angegebennen
436 //         SdrPageView. Dies mu� nicht die sichtbare SdrPageView sein.
437 //----------------------------------------------------------------------
_SelectObjectsInView(const Reference<drawing::XShapes> & aShapes,SdrPageView * pPageView)438 void SvxDrawPage::_SelectObjectsInView( const Reference< drawing::XShapes > & aShapes, SdrPageView* pPageView ) throw ()
439 {
440     DBG_ASSERT(pPageView,"SdrPageView ist NULL! [CL]");
441     DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
442 
443     if(pPageView!=NULL && mpView!=NULL)
444     {
445         mpView->UnmarkAllObj( pPageView );
446 
447         long nCount = aShapes->getCount();
448         for( long i = 0; i < nCount; i++ )
449         {
450             uno::Any aAny( aShapes->getByIndex(i) );
451             Reference< drawing::XShape > xShape;
452             if( aAny >>= xShape )
453                 lcl_markSdrObjectOfShape( xShape, *mpView, *pPageView );
454         }
455     }
456 }
457 
458 //----------------------------------------------------------------------
459 // ACHTUNG: _SelectObjectInView selektiert das Shape *nur* in der angegebennen
460 //         SdrPageView. Dies mu� nicht die sichtbare SdrPageView sein.
461 //----------------------------------------------------------------------
_SelectObjectInView(const Reference<drawing::XShape> & xShape,SdrPageView * pPageView)462 void SvxDrawPage::_SelectObjectInView( const Reference< drawing::XShape > & xShape, SdrPageView* pPageView ) throw()
463 {
464     DBG_ASSERT(pPageView,"SdrPageView ist NULL! [CL]");
465     DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
466 
467     if(pPageView!=NULL && mpView != NULL)
468     {
469         mpView->UnmarkAllObj( pPageView );
470         lcl_markSdrObjectOfShape( xShape, *mpView, *pPageView );
471     }
472 }
473 
474 //----------------------------------------------------------------------
group(const Reference<drawing::XShapes> & xShapes)475 Reference< drawing::XShapeGroup > SAL_CALL SvxDrawPage::group( const Reference< drawing::XShapes >& xShapes )
476 {
477     OGuard aGuard( Application::GetSolarMutex() );
478 
479     if( (mpModel == 0) || (mpPage == 0) )
480         throw lang::DisposedException();
481 
482     DBG_ASSERT(mpPage,"SdrPage ist NULL! [CL]");
483     DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
484 
485     Reference< ::com::sun::star::drawing::XShapeGroup >  xShapeGroup;
486     if(mpPage==NULL||mpView==NULL||!xShapes.is())
487         return xShapeGroup;
488 
489     SdrPageView* pPageView = mpView->ShowSdrPage( mpPage );
490 
491     _SelectObjectsInView( xShapes, pPageView );
492 
493     mpView->GroupMarked();
494 
495     mpView->AdjustMarkHdl();
496     const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
497     if( rMarkList.GetMarkCount() == 1 )
498     {
499         SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
500         if( pObj )
501              xShapeGroup = Reference< drawing::XShapeGroup >::query( pObj->getUnoShape() );
502     }
503 
504     mpView->HideSdrPage();
505 
506     if( mpModel )
507         mpModel->SetChanged();
508 
509     return xShapeGroup;
510 }
511 
512 //----------------------------------------------------------------------
ungroup(const Reference<drawing::XShapeGroup> & aGroup)513 void SAL_CALL SvxDrawPage::ungroup( const Reference< drawing::XShapeGroup >& aGroup )
514 {
515     OGuard aGuard( Application::GetSolarMutex() );
516 
517     if( (mpModel == 0) || (mpPage == 0) )
518         throw lang::DisposedException();
519 
520     DBG_ASSERT(mpPage,"SdrPage ist NULL! [CL]");
521     DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
522 
523     if(mpPage==NULL||mpView==NULL||!aGroup.is())
524         return;
525 
526     SdrPageView* pPageView = mpView->ShowSdrPage( mpPage );
527 
528     Reference< drawing::XShape > xShape( aGroup, UNO_QUERY );
529     _SelectObjectInView( xShape, pPageView );
530     mpView->UnGroupMarked();
531 
532     mpView->HideSdrPage();
533 
534     if( mpModel )
535         mpModel->SetChanged();
536 }
537 
538 //----------------------------------------------------------------------
_CreateSdrObject(const Reference<drawing::XShape> & xShape)539 SdrObject *SvxDrawPage::_CreateSdrObject( const Reference< drawing::XShape > & xShape ) throw()
540 {
541     sal_uInt16 nType;
542     sal_uInt32 nInventor;
543 
544     GetTypeAndInventor( nType, nInventor, xShape->getShapeType() );
545     SdrObject* pNewObj = 0;
546 
547     if( nType != 0 )
548     {
549         awt::Size aSize = xShape->getSize();
550         aSize.Width += 1;
551         aSize.Height += 1;
552         awt::Point aPos = xShape->getPosition();
553         Rectangle aRect( Point( aPos.X, aPos.Y ), Size( aSize.Width, aSize.Height ) );
554 
555         // special cases
556         if( nInventor == SdrInventor )
557         {
558             switch( nType )
559             {
560             case OBJ_MEASURE:
561                 {
562                     pNewObj = new SdrMeasureObj( aRect.TopLeft(), aRect.BottomRight() );
563                     break;
564                 }
565             case OBJ_LINE:
566                 {
567                     basegfx::B2DPolygon aPoly;
568                     aPoly.append(basegfx::B2DPoint(aRect.Left(), aRect.Top()));
569                     aPoly.append(basegfx::B2DPoint(aRect.Right(), aRect.Bottom()));
570                     pNewObj = new SdrPathObj(OBJ_LINE, basegfx::B2DPolyPolygon(aPoly));
571                     break;
572                 }
573             }
574         }
575 
576         if( pNewObj == NULL )
577             pNewObj = SdrObjFactory::MakeNewObject( nInventor, nType, mpPage );
578 
579         if(pNewObj)
580         {
581             pNewObj->SetSnapRect(aRect);
582 
583             if( pNewObj->ISA(E3dPolyScene))
584             {
585                 // Szene initialisieren
586                 E3dScene* pScene = (E3dScene*)pNewObj;
587 
588                 double fW = (double)aSize.Width;
589                 double fH = (double)aSize.Height;
590 
591                 Camera3D aCam(pScene->GetCamera());
592                 aCam.SetAutoAdjustProjection(sal_False);
593                 aCam.SetViewWindow(- fW / 2, - fH / 2, fW, fH);
594                 basegfx::B3DPoint aLookAt;
595                 basegfx::B3DPoint aCamPos(0.0, 0.0, 10000.0);
596                 aCam.SetPosAndLookAt(aCamPos, aLookAt);
597                 aCam.SetFocalLength(100.0);
598                 aCam.SetDefaults(aCamPos, aLookAt, 10000.0);
599                 pScene->SetCamera(aCam);
600 
601                 pScene->SetRectsDirty();
602             }
603             else if(pNewObj->ISA(E3dExtrudeObj))
604             {
605                 E3dExtrudeObj* pObj = (E3dExtrudeObj*)pNewObj;
606                 basegfx::B2DPolygon aNewPolygon;
607                 aNewPolygon.append(basegfx::B2DPoint(0.0, 0.0));
608                 aNewPolygon.append(basegfx::B2DPoint(0.0, 1.0));
609                 aNewPolygon.append(basegfx::B2DPoint(1.0, 0.0));
610                 aNewPolygon.setClosed(true);
611                 pObj->SetExtrudePolygon(basegfx::B2DPolyPolygon(aNewPolygon));
612 
613                 // #107245# pObj->SetExtrudeCharacterMode(sal_True);
614                 pObj->SetMergedItem(Svx3DCharacterModeItem(sal_True));
615             }
616             else if(pNewObj->ISA(E3dLatheObj))
617             {
618                 E3dLatheObj* pObj = (E3dLatheObj*)pNewObj;
619                 basegfx::B2DPolygon aNewPolygon;
620                 aNewPolygon.append(basegfx::B2DPoint(0.0, 0.0));
621                 aNewPolygon.append(basegfx::B2DPoint(0.0, 1.0));
622                 aNewPolygon.append(basegfx::B2DPoint(1.0, 0.0));
623                 aNewPolygon.setClosed(true);
624                 pObj->SetPolyPoly2D(basegfx::B2DPolyPolygon(aNewPolygon));
625 
626                 // #107245# pObj->SetLatheCharacterMode(sal_True);
627                 pObj->SetMergedItem(Svx3DCharacterModeItem(sal_True));
628             }
629         }
630     }
631 
632     return pNewObj;
633 }
634 
635 //----------------------------------------------------------------------
GetTypeAndInventor(sal_uInt16 & rType,sal_uInt32 & rInventor,const OUString & aName) const636 void SvxDrawPage::GetTypeAndInventor( sal_uInt16& rType, sal_uInt32& rInventor, const OUString& aName ) const throw()
637 {
638     sal_uInt32 nTempType = aSdrShapeIdentifierMap.getId( aName );
639 
640     if( nTempType == UHASHMAP_NOTFOUND )
641     {
642         if( aName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.TableShape")) ||
643             aName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.TableShape")) )
644         {
645             rInventor = SdrInventor;
646             rType = OBJ_TABLE;
647         }
648         else if( aName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.presentation.MediaShape" )) )
649         {
650             rInventor = SdrInventor;
651             rType = OBJ_MEDIA;
652         }
653     }
654     else if(nTempType & E3D_INVENTOR_FLAG)
655     {
656         rInventor = E3dInventor;
657         rType = (sal_uInt16)(nTempType & ~E3D_INVENTOR_FLAG);
658     }
659     else
660     {
661         rInventor = SdrInventor;
662         rType = (sal_uInt16)nTempType;
663 
664         switch( rType )
665         {
666             case OBJ_FRAME:
667             case OBJ_OLE2_PLUGIN:
668             case OBJ_OLE2_APPLET:
669                 rType = OBJ_OLE2;
670                 break;
671         }
672     }
673 }
674 
675 //----------------------------------------------------------------------
CreateShapeByTypeAndInventor(sal_uInt16 nType,sal_uInt32 nInventor,SdrObject * pObj,SvxDrawPage * mpPage)676 SvxShape* SvxDrawPage::CreateShapeByTypeAndInventor( sal_uInt16 nType, sal_uInt32 nInventor, SdrObject *pObj, SvxDrawPage *mpPage ) throw()
677 {
678     SvxShape* pRet = NULL;
679     switch( nInventor )
680     {
681         case E3dInventor:
682         {
683             switch( nType )
684             {
685                 case E3D_SCENE_ID :
686                 case E3D_POLYSCENE_ID :
687                     pRet = new Svx3DSceneObject( pObj, mpPage );
688                     break;
689                 case E3D_CUBEOBJ_ID :
690                     pRet = new Svx3DCubeObject( pObj );
691                     break;
692                 case E3D_SPHEREOBJ_ID :
693                     pRet = new Svx3DSphereObject( pObj );
694                     break;
695                 case E3D_LATHEOBJ_ID :
696                     pRet = new Svx3DLatheObject( pObj );
697                     break;
698                 case E3D_EXTRUDEOBJ_ID :
699                     pRet = new Svx3DExtrudeObject( pObj );
700                     break;
701                 case E3D_POLYGONOBJ_ID :
702                     pRet = new Svx3DPolygonObject( pObj );
703                     break;
704                 default: // unbekanntes 3D-Objekt auf der Page
705                     pRet = new SvxShape( pObj );
706                     break;
707             }
708             break;
709         }
710         case SdrInventor:
711         {
712             switch( nType )
713             {
714 //              case OBJ_NONE:
715 //                  break;
716                 case OBJ_GRUP:
717                     pRet = new SvxShapeGroup( pObj, mpPage );
718                     break;
719                 case OBJ_LINE:
720                     pRet = new SvxShapePolyPolygon( pObj , PolygonKind_LINE );
721                     break;
722                 case OBJ_RECT:
723                     pRet = new SvxShapeRect( pObj );
724                     break;
725                 case OBJ_CIRC:
726                 case OBJ_SECT:
727                 case OBJ_CARC:
728                 case OBJ_CCUT:
729                     pRet = new SvxShapeCircle( pObj );
730                     break;
731                 case OBJ_POLY:
732                     pRet = new SvxShapePolyPolygon( pObj , PolygonKind_POLY );
733                     break;
734                 case OBJ_PLIN:
735                     pRet = new SvxShapePolyPolygon( pObj , PolygonKind_PLIN );
736                     break;
737                 case OBJ_SPLNLINE:
738                 case OBJ_PATHLINE:
739                     pRet = new SvxShapePolyPolygonBezier( pObj , PolygonKind_PATHLINE );
740                     break;
741                 case OBJ_SPLNFILL:
742                 case OBJ_PATHFILL:
743                     pRet = new SvxShapePolyPolygonBezier( pObj , PolygonKind_PATHFILL );
744                     break;
745                 case OBJ_FREELINE:
746                     pRet = new SvxShapePolyPolygonBezier( pObj , PolygonKind_FREELINE );
747                     break;
748                 case OBJ_FREEFILL:
749                     pRet = new SvxShapePolyPolygonBezier( pObj , PolygonKind_FREEFILL );
750                     break;
751                 case OBJ_CAPTION:
752                     pRet = new SvxShapeCaption( pObj );
753                     break;
754                 case OBJ_TITLETEXT:
755                 case OBJ_OUTLINETEXT:
756                 case OBJ_TEXT:
757                     pRet = new SvxShapeText( pObj );
758                     break;
759                 case OBJ_GRAF:
760                     pRet = new SvxGraphicObject( pObj );
761                     break;
762                 case OBJ_FRAME:
763                     pRet = new SvxFrameShape( pObj );
764                     break;
765                 case OBJ_OLE2_APPLET:
766                     pRet = new SvxAppletShape( pObj );
767                     break;
768                 case OBJ_OLE2_PLUGIN:
769                     pRet = new SvxPluginShape( pObj );
770                     break;
771                  case OBJ_OLE2:
772                      {
773                         if( pObj && !pObj->IsEmptyPresObj() && mpPage )
774                         {
775                             SdrPage* pSdrPage = mpPage->GetSdrPage();
776                             if( pSdrPage )
777                             {
778                                 SdrModel* pSdrModel = pSdrPage->GetModel();
779                                 if( pSdrModel )
780                                 {
781                                     ::comphelper::IEmbeddedHelper *pPersist = pSdrModel->GetPersist();
782                                     if( pPersist )
783                                     {
784                                         uno::Reference < embed::XEmbeddedObject > xObject = pPersist->getEmbeddedObjectContainer().
785                                                 GetEmbeddedObject( static_cast< SdrOle2Obj* >( pObj )->GetPersistName() );
786 
787                                         // TODO CL->KA: Why is this not working anymore?
788                                         if( xObject.is() )
789                                         {
790                                             SvGlobalName aClassId( xObject->getClassID() );
791 
792                                             const SvGlobalName aAppletClassId( SO3_APPLET_CLASSID );
793                                             const SvGlobalName aPluginClassId( SO3_PLUGIN_CLASSID );
794                                             const SvGlobalName aIFrameClassId( SO3_IFRAME_CLASSID );
795 
796                                             if( aPluginClassId == aClassId )
797                                             {
798                                                 pRet = new SvxPluginShape( pObj );
799                                                 nType = OBJ_OLE2_PLUGIN;
800                                             }
801                                             else if( aAppletClassId == aClassId )
802                                             {
803                                                 pRet = new SvxAppletShape( pObj );
804                                                 nType = OBJ_OLE2_APPLET;
805                                             }
806                                             else if( aIFrameClassId == aClassId )
807                                             {
808                                                 pRet = new SvxFrameShape( pObj );
809                                                 nType = OBJ_FRAME;
810                                             }
811                                         }
812                                     }
813                                 }
814                             }
815                         }
816                         if( pRet == NULL )
817                         {
818                             pRet = new SvxOle2Shape( pObj, aSvxMapProvider.GetMap(SVXMAP_OLE2),  aSvxMapProvider.GetPropertySet(SVXMAP_OLE2, SdrObject::GetGlobalDrawObjectItemPool()) );
819                         }
820                      }
821                     break;
822                 case OBJ_EDGE:
823                     pRet = new SvxShapeConnector( pObj );
824                     break;
825                 case OBJ_PATHPOLY:
826                     pRet = new SvxShapePolyPolygon( pObj , PolygonKind_PATHPOLY );
827                     break;
828                 case OBJ_PATHPLIN:
829                     pRet = new SvxShapePolyPolygon( pObj , PolygonKind_PATHPLIN );
830                     break;
831                 case OBJ_PAGE:
832                     pRet = new SvxShape( pObj, aSvxMapProvider.GetMap(SVXMAP_PAGE),  aSvxMapProvider.GetPropertySet(SVXMAP_PAGE, SdrObject::GetGlobalDrawObjectItemPool()) );
833                     break;
834                 case OBJ_MEASURE:
835                     pRet = new SvxShapeDimensioning( pObj );
836                     break;
837 //              case OBJ_DUMMY:
838 //                  break;
839                 case OBJ_UNO:
840                     pRet = new SvxShapeControl( pObj );
841                     break;
842                 case OBJ_CUSTOMSHAPE:
843                     pRet = new SvxCustomShape( pObj );
844                     break;
845                 case OBJ_MEDIA:
846                     pRet = new SvxMediaShape( pObj );
847                     break;
848                 case OBJ_TABLE:
849                     pRet = new SvxTableShape( pObj );
850                     break;
851                 default: // unbekanntes 2D-Objekt auf der Page
852                     DBG_ERROR("Nicht implementierter Starone-Shape erzeugt! [CL]");
853                     pRet = new SvxShapeText( pObj );
854                     break;
855             }
856             break;
857         }
858         default: // Unbekannter Inventor
859         {
860             DBG_ERROR("AW: Unknown Inventor in SvxDrawPage::_CreateShape()");
861             break;
862         }
863     }
864 
865     if(pRet)
866     {
867         sal_uInt32 nObjId = nType;
868 
869         if( nInventor == E3dInventor )
870             nObjId |= E3D_INVENTOR_FLAG;
871 
872         switch(nObjId)
873         {
874         case OBJ_CCUT:          // Kreisabschnitt
875         case OBJ_CARC:          // Kreisbogen
876         case OBJ_SECT:          // Kreissektor
877             nObjId = OBJ_CIRC;
878             break;
879 
880         case E3D_SCENE_ID | E3D_INVENTOR_FLAG:
881             nObjId = E3D_POLYSCENE_ID | E3D_INVENTOR_FLAG;
882             break;
883 
884         case OBJ_TITLETEXT:
885         case OBJ_OUTLINETEXT:
886             nObjId = OBJ_TEXT;
887             break;
888         }
889 
890         pRet->setShapeKind(nObjId);
891     }
892 
893     return pRet;
894 }
895 
896 //----------------------------------------------------------------------
_CreateShape(SdrObject * pObj) const897 Reference< drawing::XShape >  SvxDrawPage::_CreateShape( SdrObject *pObj ) const throw()
898 {
899     Reference< drawing::XShape > xShape( CreateShapeByTypeAndInventor(pObj->GetObjIdentifier(),
900                                               pObj->GetObjInventor(),
901                                               pObj,
902                                               (SvxDrawPage*)this));
903     return xShape;
904 }
905 
906 //----------------------------------------------------------------------
CreateSdrObject(const Reference<drawing::XShape> & xShape)907 SdrObject *SvxDrawPage::CreateSdrObject( const Reference< drawing::XShape > & xShape ) throw()
908 {
909     SdrObject* pObj = _CreateSdrObject( xShape );
910     if( pObj && !pObj->IsInserted() )
911         mpPage->InsertObject( pObj );
912 
913     return pObj;
914 }
915 
916 //----------------------------------------------------------------------
917 // ::com::sun::star::lang::XServiceInfo
918 //----------------------------------------------------------------------
getImplementationName()919 OUString SAL_CALL SvxDrawPage::getImplementationName()
920 {
921     return OUString( RTL_CONSTASCII_USTRINGPARAM("SvxDrawPage"));
922 }
923 
supportsService(const OUString & ServiceName)924 sal_Bool SAL_CALL SvxDrawPage::supportsService( const OUString& ServiceName )
925 {
926     return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
927 }
928 
getSupportedServiceNames()929 uno::Sequence< OUString > SAL_CALL SvxDrawPage::getSupportedServiceNames()
930 {
931     uno::Sequence< OUString > aSeq( 1 );
932     aSeq.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.ShapeCollection" ));
933     return aSeq;
934 }
935 
CreateSvxShapeByTypeAndInventor(sal_uInt16 nType,sal_uInt32 nInventor)936 SvxShape* CreateSvxShapeByTypeAndInventor( sal_uInt16 nType, sal_uInt32 nInventor ) throw()
937 {
938     return SvxDrawPage::CreateShapeByTypeAndInventor( nType, nInventor );
939 }
940 
ChangeModel(SdrModel * pNewModel)941 void SvxDrawPage::ChangeModel( SdrModel* pNewModel )
942 {
943     if( pNewModel != mpModel )
944     {
945         if( mpModel )
946             EndListening( *mpModel );
947 
948         if( pNewModel )
949             StartListening( *pNewModel );
950 
951         mpModel = pNewModel;
952 
953         if( mpView )
954         {
955             delete mpView;
956             mpView = new SdrView( mpModel );
957             if( mpView )
958                 mpView->SetDesignMode(sal_True);
959         }
960     }
961 }
962 
963 /** returns a StarOffice API wrapper for the given SdrPage */
GetXDrawPageForSdrPage(SdrPage * pPage)964 uno::Reference< drawing::XDrawPage > GetXDrawPageForSdrPage( SdrPage* pPage ) throw ()
965 {
966     if(pPage)
967     {
968         uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
969 
970         return xDrawPage;
971     }
972 
973     return uno::Reference< drawing::XDrawPage >();
974 }
975 
976 /** returns the SdrObject from the given StarOffice API wrapper */
GetSdrPageFromXDrawPage(uno::Reference<drawing::XDrawPage> xDrawPage)977 SdrPage* GetSdrPageFromXDrawPage( uno::Reference< drawing::XDrawPage > xDrawPage ) throw()
978 {
979     if(xDrawPage.is())
980     {
981         SvxDrawPage* pDrawPage = SvxDrawPage::getImplementation( xDrawPage );
982 
983         if(pDrawPage)
984         {
985             return pDrawPage->GetSdrPage();
986         }
987     }
988 
989     return NULL;
990 }
991 
992 // eof
993