xref: /trunk/main/svx/source/unodraw/unomod.cxx (revision 45c5a00162811bd03b87fcb4fe9996782f2b59ec)
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/lang/ServiceNotRegisteredException.hpp>
29 #include <com/sun/star/lang/NoSupportException.hpp>
30 #include <com/sun/star/drawing/XShape.hpp>
31 #include <vos/mutex.hxx>
32 #include <vcl/svapp.hxx>
33 #include <tools/list.hxx>
34 #include <svl/itemprop.hxx>
35 #include <svtools/unoevent.hxx>
36 #include <comphelper/sequence.hxx>
37 #include <comphelper/serviceinfohelper.hxx>
38 
39 #include <cppuhelper/implbase2.hxx>
40 #include <svx/unofill.hxx>
41 #include <editeng/unonrule.hxx>
42 #include <svtools/unoimap.hxx>
43 #include <svx/fmdpage.hxx>
44 #include <svx/fmmodel.hxx>
45 #include <svx/fmpage.hxx>
46 #include <sfx2/sfx.hrc>
47 #include <svx/unoapi.hxx>
48 
49 #include <svx/svdmodel.hxx>
50 #include "svx/globl3d.hxx"
51 #include <svx/svdtypes.hxx>
52 #include <svx/unoprov.hxx>
53 #include <svx/unopage.hxx>
54 #include <editeng/unofield.hxx>
55 #include <svx/unomod.hxx>
56 #include <svx/unomodel.hxx>
57 #include <svx/svdobj.hxx>
58 #include <svx/svdpage.hxx>
59 #include <svx/unoshape.hxx>
60 
61 extern UHashMapEntry pSdrShapeIdentifierMap[];
62 
63 //-////////////////////////////////////////////////////////////////////
64 
65 using namespace ::rtl;
66 using namespace ::osl;
67 using namespace ::vos;
68 using namespace ::com::sun::star;
69 
70 //-////////////////////////////////////////////////////////////////////
71 
72 #define QUERYINT( xint ) \
73     if( rType == ::getCppuType((const uno::Reference< xint >*)0) ) \
74         aAny <<= uno::Reference< xint >(this)
75 
76 #define ITYPE( xint ) \
77     ::getCppuType((const uno::Reference< xint >*)0)
78 
79 //-////////////////////////////////////////////////////////////////////
80 
81 #ifndef SVX_LIGHT
82 
83 class SvxUnoDrawPagesAccess : public ::cppu::WeakImplHelper2< ::com::sun::star::drawing::XDrawPages, ::com::sun::star::lang::XServiceInfo >
84 {
85 private:
86     SvxUnoDrawingModel& mrModel;
87 
88 public:
89     SvxUnoDrawPagesAccess( SvxUnoDrawingModel& rMyModel ) throw();
90     virtual ~SvxUnoDrawPagesAccess() throw();
91 
92     // XDrawPages
93     virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > SAL_CALL insertNewByIndex( sal_Int32 nIndex );
94     virtual void SAL_CALL remove( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& xPage );
95 
96     // XIndexAccess
97     virtual sal_Int32 SAL_CALL getCount() ;
98     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index );
99 
100     // XElementAccess
101     virtual ::com::sun::star::uno::Type SAL_CALL getElementType();
102     virtual sal_Bool SAL_CALL hasElements();
103 
104     // XServiceInfo
105     virtual ::rtl::OUString SAL_CALL getImplementationName(  );
106     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
107     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  );
108 };
109 #endif
110 //-////////////////////////////////////////////////////////////////////
111 
112 #ifndef SVX_LIGHT
113 const SvEventDescription* ImplGetSupportedMacroItems()
114 {
115     static const SvEventDescription aMacroDescriptionsImpl[] =
116     {
117         { SFX_EVENT_MOUSEOVER_OBJECT, "OnMouseOver" },
118         { SFX_EVENT_MOUSEOUT_OBJECT, "OnMouseOut" },
119         { 0, NULL }
120     };
121 
122     return aMacroDescriptionsImpl;
123 }
124 #endif
125 
126 //-////////////////////////////////////////////////////////////////////
127 
128 /** fills the given EventObject from the given SdrHint.
129     @returns
130         true    if the SdrHint could be translated to an EventObject<br>
131         false   if not
132 */
133 sal_Bool SvxUnoDrawMSFactory::createEvent( const SdrModel* pDoc, const SdrHint* pSdrHint, ::com::sun::star::document::EventObject& aEvent )
134 {
135     const SdrObject* pObj = NULL;
136     const SdrPage* pPage = NULL;
137 
138     switch( pSdrHint->GetKind() )
139     {
140 //              case HINT_LAYERCHG:             // Layerdefinition geaendert
141 //              case HINT_LAYERORDERCHG:        // Layerreihenfolge geaendert (Insert/Remove/ChangePos)
142 //              case HINT_LAYERSETCHG:          // Layerset geaendert
143 //              case HINT_LAYERSETORDERCHG:     // Layersetreihenfolge geaendert (Insert/Remove/ChangePos)
144 
145 // #115423#
146 //      case HINT_PAGECHG:              // Page geaendert
147 //          aEvent.EventName = OUString( RTL_CONSTASCII_USTRINGPARAM( "PageModified" ) );
148 //          pPage = pSdrHint->GetPage();
149 //          break;
150         case HINT_PAGEORDERCHG:         // Reihenfolge der Seiten (Zeichenseiten oder Masterpages) geaendert (Insert/Remove/ChangePos)
151             aEvent.EventName = OUString( RTL_CONSTASCII_USTRINGPARAM( "PageOrderModified" ) );
152             pPage = pSdrHint->GetPage();
153             break;
154         case HINT_OBJCHG:               // Objekt geaendert
155             aEvent.EventName = OUString( RTL_CONSTASCII_USTRINGPARAM( "ShapeModified" ) );
156             pObj = pSdrHint->GetObject();
157             break;
158         case HINT_OBJINSERTED:          // Neues Zeichenobjekt eingefuegt
159             aEvent.EventName = OUString( RTL_CONSTASCII_USTRINGPARAM( "ShapeInserted" ) );
160             pObj = pSdrHint->GetObject();
161             break;
162         case HINT_OBJREMOVED:           // Zeichenobjekt aus Liste entfernt
163             aEvent.EventName = OUString( RTL_CONSTASCII_USTRINGPARAM( "ShapeRemoved" ) );
164             pObj = pSdrHint->GetObject();
165             break;
166 //                HINT_DEFAULTTABCHG,   // Default Tabulatorweite geaendert
167 //                HINT_DEFFONTHGTCHG,   // Default FontHeight geaendert
168 //                HINT_SWITCHTOPAGE,    // #94278# UNDO/REDO at an object evtl. on another page
169 //                HINT_OBJLISTCLEAR     // Is called before an SdrObjList will be cleared
170         default:
171             return sal_False;
172     }
173 
174     if( pObj )
175         aEvent.Source = const_cast<SdrObject*>(pObj)->getUnoShape();
176     else if( pPage )
177         aEvent.Source = const_cast<SdrPage*>(pPage)->getUnoPage();
178     else
179         aEvent.Source = (const_cast<SdrModel*>(pDoc))->getUnoModel();
180 
181     return sal_True;
182 }
183 
184 uno::Reference< uno::XInterface > SAL_CALL SvxUnoDrawMSFactory::createInstance( const OUString& ServiceSpecifier )
185 {
186     const OUString aDrawingPrefix( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.") );
187 
188     if( ServiceSpecifier.compareTo( aDrawingPrefix, aDrawingPrefix.getLength() ) == 0 )
189     {
190         sal_uInt32 nType = aSdrShapeIdentifierMap.getId( ServiceSpecifier );
191         if( nType != UHASHMAP_NOTFOUND )
192         {
193             sal_uInt16 nT = (sal_uInt16)(nType & ~E3D_INVENTOR_FLAG);
194             sal_uInt32 nI = (nType & E3D_INVENTOR_FLAG)?E3dInventor:SdrInventor;
195 
196             return uno::Reference< uno::XInterface >( (drawing::XShape*) SvxDrawPage::CreateShapeByTypeAndInventor( nT, nI ) );
197         }
198     }
199 
200     uno::Reference< uno::XInterface > xRet( createTextField( ServiceSpecifier ) );
201     if( !xRet.is() )
202         throw lang::ServiceNotRegisteredException();
203 
204     return xRet;
205 }
206 
207 uno::Reference< uno::XInterface > SAL_CALL SvxUnoDrawMSFactory::createTextField( const ::rtl::OUString& ServiceSpecifier )
208 {
209     return SvxUnoTextCreateTextField( ServiceSpecifier );
210 }
211 
212 uno::Reference< uno::XInterface > SAL_CALL SvxUnoDrawMSFactory::createInstanceWithArguments( const OUString&, const uno::Sequence< ::com::sun::star::uno::Any >& )
213 {
214     throw lang::NoSupportException();
215 }
216 
217 uno::Sequence< OUString > SAL_CALL SvxUnoDrawMSFactory::getAvailableServiceNames()
218 {
219     UHashMapEntry* pMap = pSdrShapeIdentifierMap;
220 
221     sal_uInt32 nCount = 0;
222     while (pMap->aIdentifier.getLength())
223     {
224         pMap++;
225         nCount++;
226     }
227 
228     uno::Sequence< OUString > aSeq( nCount );
229     OUString* pStrings = aSeq.getArray();
230 
231     pMap = pSdrShapeIdentifierMap;
232     sal_uInt32 nIdx = 0;
233     while(pMap->aIdentifier.getLength())
234     {
235         pStrings[nIdx] = pMap->aIdentifier;
236         pMap++;
237         nIdx++;
238     }
239 
240     return aSeq;
241 }
242 
243 uno::Sequence< OUString > SvxUnoDrawMSFactory::concatServiceNames( uno::Sequence< OUString >& rServices1, uno::Sequence< OUString >& rServices2 ) throw()
244 {
245     const sal_Int32 nLen1 = rServices1.getLength();
246     const sal_Int32 nLen2 = rServices2.getLength();
247 
248     uno::Sequence< OUString > aSeq( nLen1+nLen2 );
249     OUString* pStrings = aSeq.getArray();
250 
251     sal_Int32 nIdx;
252     OUString* pStringDst = pStrings;
253     const OUString* pStringSrc = rServices1.getArray();
254 
255     for( nIdx = 0; nIdx < nLen1; nIdx++ )
256         *pStringDst++ = *pStringSrc++;
257 
258     pStringSrc = rServices2.getArray();
259 
260     for( nIdx = 0; nIdx < nLen2; nIdx++ )
261         *pStringDst++ = *pStringSrc++;
262 
263     return aSeq;
264 }
265 
266 
267 #ifndef SVX_LIGHT
268 
269 ///
270 SvxUnoDrawingModel::SvxUnoDrawingModel( SdrModel* pDoc ) throw()
271 : mpDoc( pDoc )
272 {
273 }
274 
275 SvxUnoDrawingModel::~SvxUnoDrawingModel() throw()
276 {
277 }
278 
279 uno::Any SAL_CALL SvxUnoDrawingModel::queryInterface( const uno::Type & rType )
280 {
281     uno::Any aAny;
282 
283     QUERYINT(lang::XServiceInfo);
284     else QUERYINT(lang::XMultiServiceFactory);
285     else QUERYINT(drawing::XDrawPagesSupplier);
286     else QUERYINT(com::sun::star::ucb::XAnyCompareFactory);
287     else
288         return SfxBaseModel::queryInterface( rType );
289 
290     return aAny;
291 }
292 
293 void SAL_CALL SvxUnoDrawingModel::acquire() throw ( )
294 {
295     SfxBaseModel::acquire();
296 }
297 
298 void SAL_CALL SvxUnoDrawingModel::release() throw ( )
299 {
300     SfxBaseModel::release();
301 }
302 
303 // XTypeProvider
304 uno::Sequence< uno::Type > SAL_CALL SvxUnoDrawingModel::getTypes(  )
305 {
306     if( maTypeSequence.getLength() == 0 )
307     {
308         const uno::Sequence< uno::Type > aBaseTypes( SfxBaseModel::getTypes() );
309         const sal_Int32 nBaseTypes = aBaseTypes.getLength();
310         const uno::Type* pBaseTypes = aBaseTypes.getConstArray();
311 
312         const sal_Int32 nOwnTypes = 4;      // !DANGER! Keep this updated!
313 
314         maTypeSequence.realloc(  nBaseTypes + nOwnTypes );
315         uno::Type* pTypes = maTypeSequence.getArray();
316 
317         *pTypes++ = ITYPE(lang::XServiceInfo);
318         *pTypes++ = ITYPE(lang::XMultiServiceFactory);
319         *pTypes++ = ITYPE(drawing::XDrawPagesSupplier);
320         *pTypes++ = ITYPE(com::sun::star::ucb::XAnyCompareFactory);
321 
322         for( sal_Int32 nType = 0; nType < nBaseTypes; nType++ )
323             *pTypes++ = *pBaseTypes++;
324     }
325 
326     return maTypeSequence;
327 }
328 
329 uno::Sequence< sal_Int8 > SAL_CALL SvxUnoDrawingModel::getImplementationId(  )
330 {
331     static uno::Sequence< sal_Int8 > aId;
332     if( aId.getLength() == 0 )
333     {
334         aId.realloc( 16 );
335         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
336     }
337     return aId;
338 }
339 
340 void SAL_CALL SvxUnoDrawingModel::lockControllers(  )
341 {
342     if( mpDoc )
343         mpDoc->setLock( sal_True );
344 }
345 
346 void SAL_CALL SvxUnoDrawingModel::unlockControllers(  )
347 {
348     if( mpDoc && mpDoc->isLocked() )
349     {
350         mpDoc->setLock( sal_False );
351     }
352 }
353 
354 sal_Bool SAL_CALL SvxUnoDrawingModel::hasControllersLocked(  )
355 {
356     return mpDoc && mpDoc->isLocked();
357 }
358 
359 // XDrawPagesSupplier
360 uno::Reference< drawing::XDrawPages > SAL_CALL SvxUnoDrawingModel::getDrawPages()
361 {
362     OGuard aGuard( Application::GetSolarMutex() );
363 
364     uno::Reference< drawing::XDrawPages >  xDrawPages( mxDrawPagesAccess );
365 
366     if( !xDrawPages.is() )
367         mxDrawPagesAccess = xDrawPages = (drawing::XDrawPages*)new SvxUnoDrawPagesAccess(*this);
368 
369     return xDrawPages;
370 }
371 
372 // XMultiServiceFactory ( SvxFmMSFactory )
373 uno::Reference< uno::XInterface > SAL_CALL SvxUnoDrawingModel::createInstance( const OUString& aServiceSpecifier )
374 {
375     OGuard aGuard( Application::GetSolarMutex() );
376 
377     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.DashTable") ) )
378     {
379         if( !mxDashTable.is() )
380             mxDashTable = SvxUnoDashTable_createInstance( mpDoc );
381         return mxDashTable;
382     }
383     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.GradientTable") ) )
384     {
385         if( !mxGradientTable.is() )
386             mxGradientTable = SvxUnoGradientTable_createInstance( mpDoc );
387         return mxGradientTable;
388     }
389     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.HatchTable") ) )
390     {
391         if( !mxHatchTable.is() )
392             mxHatchTable = SvxUnoHatchTable_createInstance( mpDoc );
393         return mxHatchTable;
394     }
395     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.BitmapTable") ) )
396     {
397         if( !mxBitmapTable.is() )
398             mxBitmapTable = SvxUnoBitmapTable_createInstance( mpDoc );
399         return mxBitmapTable;
400     }
401     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.TransparencyGradientTable") ) )
402     {
403         if( !mxTransGradientTable.is() )
404             mxTransGradientTable = SvxUnoTransGradientTable_createInstance( mpDoc );
405         return mxTransGradientTable;
406     }
407     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.MarkerTable") ) )
408     {
409         if( !mxMarkerTable.is() )
410             mxMarkerTable = SvxUnoMarkerTable_createInstance( mpDoc );
411         return mxMarkerTable;
412     }
413     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.NumberingRules" ) ) )
414     {
415         return uno::Reference< uno::XInterface >( SvxCreateNumRule( mpDoc ), uno::UNO_QUERY );
416     }
417 
418     if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.image.ImageMapRectangleObject") ) )
419     {
420         return SvUnoImageMapRectangleObject_createInstance( ImplGetSupportedMacroItems() );
421     }
422 
423     if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.image.ImageMapCircleObject") ) )
424     {
425         return SvUnoImageMapCircleObject_createInstance( ImplGetSupportedMacroItems() );
426     }
427 
428     if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.image.ImageMapPolygonObject") ) )
429     {
430         return SvUnoImageMapPolygonObject_createInstance( ImplGetSupportedMacroItems() );
431     }
432 
433     if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextField.DateTime") ) )
434     {
435         return (::cppu::OWeakObject * )new SvxUnoTextField( ID_EXT_DATEFIELD );
436     }
437 
438     uno::Reference< uno::XInterface > xRet;
439 
440     const String aType( aServiceSpecifier );
441     if( aType.EqualsAscii( "com.sun.star.presentation.", 0, 26 ) )
442     {
443         SvxShape* pShape = NULL;
444 
445         sal_uInt16 nType = OBJ_TEXT;
446         // create a shape wrapper
447         if( aType.EqualsAscii( "TitleTextShape", 26, 14 ) )
448         {
449             nType = OBJ_TEXT;
450         }
451         else if( aType.EqualsAscii( "OutlinerShape", 26, 13 ) )
452         {
453             nType = OBJ_TEXT;
454         }
455         else if( aType.EqualsAscii( "SubtitleShape", 26, 13 ) )
456         {
457             nType = OBJ_TEXT;
458         }
459         else if( aType.EqualsAscii( "GraphicObjectShape", 26, 18 ) )
460         {
461             nType = OBJ_GRAF;
462         }
463         else if( aType.EqualsAscii( "PageShape", 26, 9 ) )
464         {
465             nType = OBJ_PAGE;
466         }
467         else if( aType.EqualsAscii( "OLE2Shape", 26, 9 ) )
468         {
469             nType = OBJ_OLE2;
470         }
471         else if( aType.EqualsAscii( "ChartShape", 26, 10 ) )
472         {
473             nType = OBJ_OLE2;
474         }
475         else if( aType.EqualsAscii( "TableShape", 26, 10 ) )
476         {
477             nType = OBJ_OLE2;
478         }
479         else if( aType.EqualsAscii( "OrgChartShape", 26, 13 ) )
480         {
481             nType = OBJ_OLE2;
482         }
483         else if( aType.EqualsAscii( "NotesShape", 26, 10 ) )
484         {
485             nType = OBJ_TEXT;
486         }
487         else if( aType.EqualsAscii( "HandoutShape", 26, 12 ) )
488         {
489             nType = OBJ_PAGE;
490         }
491         else if( aType.EqualsAscii( "FooterShape", 26, 12 ) )
492         {
493             nType = OBJ_TEXT;
494         }
495         else if( aType.EqualsAscii( "HeaderShape", 26, 12 ) )
496         {
497             nType = OBJ_TEXT;
498         }
499         else if( aType.EqualsAscii( "SlideNumberShape", 26, 17 ) )
500         {
501             nType = OBJ_TEXT;
502         }
503         else if( aType.EqualsAscii( "DateTimeShape", 26, 17 ) )
504         {
505             nType = OBJ_TEXT;
506         }
507         else if( aType.EqualsAscii( "TableShape", 26, 10 ) )
508         {
509             nType = OBJ_TABLE;
510         }
511         else
512         {
513             throw lang::ServiceNotRegisteredException();
514         }
515 
516         // create the API wrapper
517         pShape = CreateSvxShapeByTypeAndInventor( nType, SdrInventor );
518 
519         // set shape type
520         if( pShape )
521             pShape->SetShapeType(aServiceSpecifier);
522 
523         xRet = (uno::XWeak*)pShape;
524     }
525     else
526     {
527         xRet = SvxFmMSFactory::createInstance( aServiceSpecifier );
528     }
529 
530     return xRet;
531 }
532 
533 uno::Sequence< OUString > SAL_CALL SvxUnoDrawingModel::getAvailableServiceNames()
534 {
535     const uno::Sequence< OUString > aSNS_ORG( SvxFmMSFactory::getAvailableServiceNames() );
536 
537     uno::Sequence< OUString > aSNS( 21 );
538 
539     sal_uInt16 i = 0;
540 
541     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DashTable"));
542     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.GradientTable"));
543     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.HatchTable"));
544     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.BitmapTable"));
545     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.TransparencyGradientTable"));
546     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.MarkerTable"));
547     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.NumberingRules"));
548     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.image.ImageMapRectangleObject"));
549     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.image.ImageMapCircleObject"));
550     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.image.ImageMapPolygonObject"));
551 
552     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TitleTextShape"));
553     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OutlinerShape"));
554     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.SubtitleShape"));
555     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.GraphicObjectShape"));
556     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.ChartShape"));
557     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PageShape"));
558     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OLE2Shape"));
559     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TableShape"));
560     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OrgChartShape"));
561     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.NotesShape"));
562     aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.HandoutShape"));
563 
564     DBG_ASSERT( i == aSNS.getLength(), "Sequence overrun!" );
565 
566     return comphelper::concatSequences( aSNS_ORG, aSNS );
567 }
568 
569 // lang::XServiceInfo
570 OUString SAL_CALL SvxUnoDrawingModel::getImplementationName()
571 {
572     return OUString( RTL_CONSTASCII_USTRINGPARAM("SvxUnoDrawingModel"));
573 }
574 
575 sal_Bool SAL_CALL SvxUnoDrawingModel::supportsService( const OUString& ServiceName )
576 {
577     return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
578 }
579 
580 uno::Sequence< OUString > SAL_CALL SvxUnoDrawingModel::getSupportedServiceNames()
581 {
582     OUString aSN( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DrawingDocument"));
583     uno::Sequence< OUString > aSeq( &aSN, 1 );
584     return aSeq;
585 }
586 
587 // XAnyCompareFactory
588 uno::Reference< com::sun::star::ucb::XAnyCompare > SAL_CALL SvxUnoDrawingModel::createAnyCompareByName( const OUString& )
589 {
590     return SvxCreateNumRuleCompare();
591 }
592 
593 //=============================================================================
594 // class SvxUnoDrawPagesAccess
595 //=============================================================================
596 
597 SvxUnoDrawPagesAccess::SvxUnoDrawPagesAccess( SvxUnoDrawingModel& rMyModel )  throw()
598 :   mrModel(rMyModel)
599 {
600 }
601 
602 SvxUnoDrawPagesAccess::~SvxUnoDrawPagesAccess() throw()
603 {
604 }
605 
606 // XIndexAccess
607 sal_Int32 SAL_CALL SvxUnoDrawPagesAccess::getCount()
608 {
609     OGuard aGuard( Application::GetSolarMutex() );
610 
611     sal_Int32 nCount = 0;
612 
613     if( mrModel.mpDoc )
614         nCount = mrModel.mpDoc->GetPageCount();
615 
616     return( nCount );
617 }
618 
619 uno::Any SAL_CALL SvxUnoDrawPagesAccess::getByIndex( sal_Int32 Index )
620 {
621     OGuard aGuard( Application::GetSolarMutex() );
622 
623     uno::Any aAny;
624 
625     if( mrModel.mpDoc )
626     {
627         if( (Index < 0) || (Index >= mrModel.mpDoc->GetPageCount() ) )
628             throw lang::IndexOutOfBoundsException();
629 
630         SdrPage* pPage = mrModel.mpDoc->GetPage( (sal_uInt16)Index );
631         if( pPage )
632         {
633             uno::Reference< uno::XInterface > xPage( pPage->mxUnoPage );
634 
635             if( !xPage.is() )
636             {
637                 if( PTR_CAST( FmFormModel, mrModel.mpDoc ) )
638                     xPage = (drawing::XDrawPage*)new SvxFmDrawPage( pPage );
639                 else
640                     xPage = (drawing::XDrawPage*)new SvxDrawPage( pPage );
641 
642                 pPage->mxUnoPage = xPage;
643             }
644 
645             aAny <<= xPage;
646         }
647     }
648     return aAny;
649 }
650 
651 // XElementAccess
652 uno::Type SAL_CALL SvxUnoDrawPagesAccess::getElementType()
653 {
654     return ITYPE( drawing::XDrawPage );
655 }
656 
657 sal_Bool SAL_CALL SvxUnoDrawPagesAccess::hasElements()
658 {
659     return getCount() > 0;
660 }
661 
662 // XDrawPages
663 
664 /******************************************************************************
665 * Erzeugt eine neue Seite mit Model an der angegebennen Position und gibt die *
666 * dazugehoerige SdDrawPage zurueck.                                           *
667 ******************************************************************************/
668 uno::Reference< drawing::XDrawPage > SAL_CALL SvxUnoDrawPagesAccess::insertNewByIndex( sal_Int32 nIndex )
669 {
670     OGuard aGuard( Application::GetSolarMutex() );
671 
672     uno::Reference< drawing::XDrawPage > xDrawPage;
673 
674     if( mrModel.mpDoc )
675     {
676         SdrPage* pPage;
677 
678         if( PTR_CAST( FmFormModel, mrModel.mpDoc ) )
679             pPage = new FmFormPage(*(FmFormModel*)mrModel.mpDoc, NULL);
680         else
681             pPage = new SdrPage(*mrModel.mpDoc);
682 
683         mrModel.mpDoc->InsertPage( pPage, (sal_uInt16)nIndex );
684         xDrawPage = uno::Reference< drawing::XDrawPage >::query( pPage->getUnoPage() );
685     }
686 
687     return xDrawPage;
688 }
689 
690 void SAL_CALL SvxUnoDrawPagesAccess::remove( const uno::Reference< drawing::XDrawPage >& xPage )
691 {
692     OGuard aGuard( Application::GetSolarMutex() );
693 
694     sal_uInt16 nPageCount = mrModel.mpDoc->GetPageCount();
695     if( nPageCount > 1 )
696     {
697         // pPage von xPage besorgen und dann die Id (nPos )ermitteln
698         SvxDrawPage* pSvxPage = SvxDrawPage::getImplementation( xPage );
699         if( pSvxPage )
700         {
701             SdrPage* pPage = pSvxPage->GetSdrPage();
702             if(pPage)
703             {
704                 sal_uInt16 nPage = pPage->GetPageNum();
705                 mrModel.mpDoc->DeletePage( nPage );
706             }
707         }
708     }
709 }
710 
711 // XServiceInfo
712 sal_Char pSvxUnoDrawPagesAccessService[sizeof("com.sun.star.drawing.DrawPages")] = "com.sun.star.drawing.DrawPages";
713 
714 OUString SAL_CALL SvxUnoDrawPagesAccess::getImplementationName(  )
715 {
716     return OUString( RTL_CONSTASCII_USTRINGPARAM( "SvxUnoDrawPagesAccess" ) );
717 }
718 
719 sal_Bool SAL_CALL SvxUnoDrawPagesAccess::supportsService( const OUString& ServiceName )
720 {
721     return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( pSvxUnoDrawPagesAccessService ) );
722 }
723 
724 uno::Sequence< OUString > SAL_CALL SvxUnoDrawPagesAccess::getSupportedServiceNames(  )
725 {
726     OUString aService( RTL_CONSTASCII_USTRINGPARAM( pSvxUnoDrawPagesAccessService ) );
727     uno::Sequence< OUString > aSeq( &aService, 1 );
728     return aSeq;
729 }
730 #include <editeng/unonrule.hxx>
731 com::sun::star::uno::Reference< com::sun::star::container::XIndexReplace > SvxCreateNumRule( SdrModel* pModel ) throw()
732 {
733     SvxNumRule* pDefaultRule = NULL;
734     if( pModel )
735     {
736         SvxNumBulletItem* pItem = (SvxNumBulletItem*) pModel->GetItemPool().GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET);
737         if( pItem )
738         {
739             pDefaultRule = pItem->GetNumRule();
740         }
741     }
742 
743     if( pDefaultRule )
744     {
745         return SvxCreateNumRule( pDefaultRule );
746     }
747     else
748     {
749         SvxNumRule aTempRule( 0, 10, false );
750         return SvxCreateNumRule( &aTempRule );
751     }
752 }
753 
754 ///////////////////////////////////////////////////////////////////////
755 
756 #endif
757