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 ) throw(::com::sun::star::uno::RuntimeException); 94 virtual void SAL_CALL remove( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& xPage ) throw(::com::sun::star::uno::RuntimeException); 95 96 // XIndexAccess 97 virtual sal_Int32 SAL_CALL getCount() throw(::com::sun::star::uno::RuntimeException) ; 98 virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) throw(::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 99 100 // XElementAccess 101 virtual ::com::sun::star::uno::Type SAL_CALL getElementType() throw(::com::sun::star::uno::RuntimeException); 102 virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException); 103 104 // XServiceInfo 105 virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException); 106 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException); 107 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException); 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 throw( uno::Exception, uno::RuntimeException ) 186 { 187 const OUString aDrawingPrefix( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.") ); 188 189 if( ServiceSpecifier.compareTo( aDrawingPrefix, aDrawingPrefix.getLength() ) == 0 ) 190 { 191 sal_uInt32 nType = aSdrShapeIdentifierMap.getId( ServiceSpecifier ); 192 if( nType != UHASHMAP_NOTFOUND ) 193 { 194 sal_uInt16 nT = (sal_uInt16)(nType & ~E3D_INVENTOR_FLAG); 195 sal_uInt32 nI = (nType & E3D_INVENTOR_FLAG)?E3dInventor:SdrInventor; 196 197 return uno::Reference< uno::XInterface >( (drawing::XShape*) SvxDrawPage::CreateShapeByTypeAndInventor( nT, nI ) ); 198 } 199 } 200 201 uno::Reference< uno::XInterface > xRet( createTextField( ServiceSpecifier ) ); 202 if( !xRet.is() ) 203 throw lang::ServiceNotRegisteredException(); 204 205 return xRet; 206 } 207 208 uno::Reference< uno::XInterface > SAL_CALL SvxUnoDrawMSFactory::createTextField( const ::rtl::OUString& ServiceSpecifier ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) 209 { 210 return SvxUnoTextCreateTextField( ServiceSpecifier ); 211 } 212 213 uno::Reference< uno::XInterface > SAL_CALL SvxUnoDrawMSFactory::createInstanceWithArguments( const OUString&, const uno::Sequence< ::com::sun::star::uno::Any >& ) 214 throw( uno::Exception, uno::RuntimeException ) 215 { 216 throw lang::NoSupportException(); 217 } 218 219 uno::Sequence< OUString > SAL_CALL SvxUnoDrawMSFactory::getAvailableServiceNames() 220 throw( uno::RuntimeException ) 221 { 222 UHashMapEntry* pMap = pSdrShapeIdentifierMap; 223 224 sal_uInt32 nCount = 0; 225 while (pMap->aIdentifier.getLength()) 226 { 227 pMap++; 228 nCount++; 229 } 230 231 uno::Sequence< OUString > aSeq( nCount ); 232 OUString* pStrings = aSeq.getArray(); 233 234 pMap = pSdrShapeIdentifierMap; 235 sal_uInt32 nIdx = 0; 236 while(pMap->aIdentifier.getLength()) 237 { 238 pStrings[nIdx] = pMap->aIdentifier; 239 pMap++; 240 nIdx++; 241 } 242 243 return aSeq; 244 } 245 246 uno::Sequence< OUString > SvxUnoDrawMSFactory::concatServiceNames( uno::Sequence< OUString >& rServices1, uno::Sequence< OUString >& rServices2 ) throw() 247 { 248 const sal_Int32 nLen1 = rServices1.getLength(); 249 const sal_Int32 nLen2 = rServices2.getLength(); 250 251 uno::Sequence< OUString > aSeq( nLen1+nLen2 ); 252 OUString* pStrings = aSeq.getArray(); 253 254 sal_Int32 nIdx; 255 OUString* pStringDst = pStrings; 256 const OUString* pStringSrc = rServices1.getArray(); 257 258 for( nIdx = 0; nIdx < nLen1; nIdx++ ) 259 *pStringDst++ = *pStringSrc++; 260 261 pStringSrc = rServices2.getArray(); 262 263 for( nIdx = 0; nIdx < nLen2; nIdx++ ) 264 *pStringDst++ = *pStringSrc++; 265 266 return aSeq; 267 } 268 269 270 #ifndef SVX_LIGHT 271 272 /// 273 SvxUnoDrawingModel::SvxUnoDrawingModel( SdrModel* pDoc ) throw() 274 : mpDoc( pDoc ) 275 { 276 } 277 278 SvxUnoDrawingModel::~SvxUnoDrawingModel() throw() 279 { 280 } 281 282 uno::Any SAL_CALL SvxUnoDrawingModel::queryInterface( const uno::Type & rType ) throw(uno::RuntimeException) 283 { 284 uno::Any aAny; 285 286 QUERYINT(lang::XServiceInfo); 287 else QUERYINT(lang::XMultiServiceFactory); 288 else QUERYINT(drawing::XDrawPagesSupplier); 289 else QUERYINT(com::sun::star::ucb::XAnyCompareFactory); 290 else 291 return SfxBaseModel::queryInterface( rType ); 292 293 return aAny; 294 } 295 296 void SAL_CALL SvxUnoDrawingModel::acquire() throw ( ) 297 { 298 SfxBaseModel::acquire(); 299 } 300 301 void SAL_CALL SvxUnoDrawingModel::release() throw ( ) 302 { 303 SfxBaseModel::release(); 304 } 305 306 // XTypeProvider 307 uno::Sequence< uno::Type > SAL_CALL SvxUnoDrawingModel::getTypes( ) throw(uno::RuntimeException) 308 { 309 if( maTypeSequence.getLength() == 0 ) 310 { 311 const uno::Sequence< uno::Type > aBaseTypes( SfxBaseModel::getTypes() ); 312 const sal_Int32 nBaseTypes = aBaseTypes.getLength(); 313 const uno::Type* pBaseTypes = aBaseTypes.getConstArray(); 314 315 const sal_Int32 nOwnTypes = 4; // !DANGER! Keep this updated! 316 317 maTypeSequence.realloc( nBaseTypes + nOwnTypes ); 318 uno::Type* pTypes = maTypeSequence.getArray(); 319 320 *pTypes++ = ITYPE(lang::XServiceInfo); 321 *pTypes++ = ITYPE(lang::XMultiServiceFactory); 322 *pTypes++ = ITYPE(drawing::XDrawPagesSupplier); 323 *pTypes++ = ITYPE(com::sun::star::ucb::XAnyCompareFactory); 324 325 for( sal_Int32 nType = 0; nType < nBaseTypes; nType++ ) 326 *pTypes++ = *pBaseTypes++; 327 } 328 329 return maTypeSequence; 330 } 331 332 uno::Sequence< sal_Int8 > SAL_CALL SvxUnoDrawingModel::getImplementationId( ) throw(uno::RuntimeException) 333 { 334 static uno::Sequence< sal_Int8 > aId; 335 if( aId.getLength() == 0 ) 336 { 337 aId.realloc( 16 ); 338 rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True ); 339 } 340 return aId; 341 } 342 343 void SAL_CALL SvxUnoDrawingModel::lockControllers( ) 344 throw(uno::RuntimeException) 345 { 346 if( mpDoc ) 347 mpDoc->setLock( sal_True ); 348 } 349 350 void SAL_CALL SvxUnoDrawingModel::unlockControllers( ) 351 throw(uno::RuntimeException) 352 { 353 if( mpDoc && mpDoc->isLocked() ) 354 { 355 mpDoc->setLock( sal_False ); 356 } 357 } 358 359 sal_Bool SAL_CALL SvxUnoDrawingModel::hasControllersLocked( ) 360 throw(uno::RuntimeException) 361 { 362 return mpDoc && mpDoc->isLocked(); 363 } 364 365 // XDrawPagesSupplier 366 uno::Reference< drawing::XDrawPages > SAL_CALL SvxUnoDrawingModel::getDrawPages() 367 throw(uno::RuntimeException) 368 { 369 OGuard aGuard( Application::GetSolarMutex() ); 370 371 uno::Reference< drawing::XDrawPages > xDrawPages( mxDrawPagesAccess ); 372 373 if( !xDrawPages.is() ) 374 mxDrawPagesAccess = xDrawPages = (drawing::XDrawPages*)new SvxUnoDrawPagesAccess(*this); 375 376 return xDrawPages; 377 } 378 379 // XMultiServiceFactory ( SvxFmMSFactory ) 380 uno::Reference< uno::XInterface > SAL_CALL SvxUnoDrawingModel::createInstance( const OUString& aServiceSpecifier ) 381 throw(uno::Exception, uno::RuntimeException) 382 { 383 OGuard aGuard( Application::GetSolarMutex() ); 384 385 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.DashTable") ) ) 386 { 387 if( !mxDashTable.is() ) 388 mxDashTable = SvxUnoDashTable_createInstance( mpDoc ); 389 return mxDashTable; 390 } 391 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.GradientTable") ) ) 392 { 393 if( !mxGradientTable.is() ) 394 mxGradientTable = SvxUnoGradientTable_createInstance( mpDoc ); 395 return mxGradientTable; 396 } 397 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.HatchTable") ) ) 398 { 399 if( !mxHatchTable.is() ) 400 mxHatchTable = SvxUnoHatchTable_createInstance( mpDoc ); 401 return mxHatchTable; 402 } 403 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.BitmapTable") ) ) 404 { 405 if( !mxBitmapTable.is() ) 406 mxBitmapTable = SvxUnoBitmapTable_createInstance( mpDoc ); 407 return mxBitmapTable; 408 } 409 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.TransparencyGradientTable") ) ) 410 { 411 if( !mxTransGradientTable.is() ) 412 mxTransGradientTable = SvxUnoTransGradientTable_createInstance( mpDoc ); 413 return mxTransGradientTable; 414 } 415 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.MarkerTable") ) ) 416 { 417 if( !mxMarkerTable.is() ) 418 mxMarkerTable = SvxUnoMarkerTable_createInstance( mpDoc ); 419 return mxMarkerTable; 420 } 421 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.NumberingRules" ) ) ) 422 { 423 return uno::Reference< uno::XInterface >( SvxCreateNumRule( mpDoc ), uno::UNO_QUERY ); 424 } 425 426 if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.image.ImageMapRectangleObject") ) ) 427 { 428 return SvUnoImageMapRectangleObject_createInstance( ImplGetSupportedMacroItems() ); 429 } 430 431 if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.image.ImageMapCircleObject") ) ) 432 { 433 return SvUnoImageMapCircleObject_createInstance( ImplGetSupportedMacroItems() ); 434 } 435 436 if( aServiceSpecifier.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.image.ImageMapPolygonObject") ) ) 437 { 438 return SvUnoImageMapPolygonObject_createInstance( ImplGetSupportedMacroItems() ); 439 } 440 441 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextField.DateTime") ) ) 442 { 443 return (::cppu::OWeakObject * )new SvxUnoTextField( ID_EXT_DATEFIELD ); 444 } 445 446 uno::Reference< uno::XInterface > xRet; 447 448 const String aType( aServiceSpecifier ); 449 if( aType.EqualsAscii( "com.sun.star.presentation.", 0, 26 ) ) 450 { 451 SvxShape* pShape = NULL; 452 453 sal_uInt16 nType = OBJ_TEXT; 454 // create a shape wrapper 455 if( aType.EqualsAscii( "TitleTextShape", 26, 14 ) ) 456 { 457 nType = OBJ_TEXT; 458 } 459 else if( aType.EqualsAscii( "OutlinerShape", 26, 13 ) ) 460 { 461 nType = OBJ_TEXT; 462 } 463 else if( aType.EqualsAscii( "SubtitleShape", 26, 13 ) ) 464 { 465 nType = OBJ_TEXT; 466 } 467 else if( aType.EqualsAscii( "GraphicObjectShape", 26, 18 ) ) 468 { 469 nType = OBJ_GRAF; 470 } 471 else if( aType.EqualsAscii( "PageShape", 26, 9 ) ) 472 { 473 nType = OBJ_PAGE; 474 } 475 else if( aType.EqualsAscii( "OLE2Shape", 26, 9 ) ) 476 { 477 nType = OBJ_OLE2; 478 } 479 else if( aType.EqualsAscii( "ChartShape", 26, 10 ) ) 480 { 481 nType = OBJ_OLE2; 482 } 483 else if( aType.EqualsAscii( "TableShape", 26, 10 ) ) 484 { 485 nType = OBJ_OLE2; 486 } 487 else if( aType.EqualsAscii( "OrgChartShape", 26, 13 ) ) 488 { 489 nType = OBJ_OLE2; 490 } 491 else if( aType.EqualsAscii( "NotesShape", 26, 10 ) ) 492 { 493 nType = OBJ_TEXT; 494 } 495 else if( aType.EqualsAscii( "HandoutShape", 26, 12 ) ) 496 { 497 nType = OBJ_PAGE; 498 } 499 else if( aType.EqualsAscii( "FooterShape", 26, 12 ) ) 500 { 501 nType = OBJ_TEXT; 502 } 503 else if( aType.EqualsAscii( "HeaderShape", 26, 12 ) ) 504 { 505 nType = OBJ_TEXT; 506 } 507 else if( aType.EqualsAscii( "SlideNumberShape", 26, 17 ) ) 508 { 509 nType = OBJ_TEXT; 510 } 511 else if( aType.EqualsAscii( "DateTimeShape", 26, 17 ) ) 512 { 513 nType = OBJ_TEXT; 514 } 515 else if( aType.EqualsAscii( "TableShape", 26, 10 ) ) 516 { 517 nType = OBJ_TABLE; 518 } 519 else 520 { 521 throw lang::ServiceNotRegisteredException(); 522 } 523 524 // create the API wrapper 525 pShape = CreateSvxShapeByTypeAndInventor( nType, SdrInventor ); 526 527 // set shape type 528 if( pShape ) 529 pShape->SetShapeType(aServiceSpecifier); 530 531 xRet = (uno::XWeak*)pShape; 532 } 533 else 534 { 535 xRet = SvxFmMSFactory::createInstance( aServiceSpecifier ); 536 } 537 538 return xRet; 539 } 540 541 uno::Sequence< OUString > SAL_CALL SvxUnoDrawingModel::getAvailableServiceNames() 542 throw(uno::RuntimeException) 543 { 544 const uno::Sequence< OUString > aSNS_ORG( SvxFmMSFactory::getAvailableServiceNames() ); 545 546 uno::Sequence< OUString > aSNS( 21 ); 547 548 sal_uInt16 i = 0; 549 550 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DashTable")); 551 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.GradientTable")); 552 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.HatchTable")); 553 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.BitmapTable")); 554 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.TransparencyGradientTable")); 555 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.MarkerTable")); 556 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.NumberingRules")); 557 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.image.ImageMapRectangleObject")); 558 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.image.ImageMapCircleObject")); 559 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.image.ImageMapPolygonObject")); 560 561 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TitleTextShape")); 562 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OutlinerShape")); 563 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.SubtitleShape")); 564 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.GraphicObjectShape")); 565 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.ChartShape")); 566 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PageShape")); 567 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OLE2Shape")); 568 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TableShape")); 569 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OrgChartShape")); 570 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.NotesShape")); 571 aSNS[i++] = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.HandoutShape")); 572 573 DBG_ASSERT( i == aSNS.getLength(), "Sequence overrun!" ); 574 575 return comphelper::concatSequences( aSNS_ORG, aSNS ); 576 } 577 578 // lang::XServiceInfo 579 OUString SAL_CALL SvxUnoDrawingModel::getImplementationName() 580 throw(uno::RuntimeException) 581 { 582 return OUString( RTL_CONSTASCII_USTRINGPARAM("SvxUnoDrawingModel")); 583 } 584 585 sal_Bool SAL_CALL SvxUnoDrawingModel::supportsService( const OUString& ServiceName ) 586 throw(uno::RuntimeException) 587 { 588 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() ); 589 } 590 591 uno::Sequence< OUString > SAL_CALL SvxUnoDrawingModel::getSupportedServiceNames() throw(uno::RuntimeException) 592 { 593 OUString aSN( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DrawingDocument")); 594 uno::Sequence< OUString > aSeq( &aSN, 1 ); 595 return aSeq; 596 } 597 598 // XAnyCompareFactory 599 uno::Reference< com::sun::star::ucb::XAnyCompare > SAL_CALL SvxUnoDrawingModel::createAnyCompareByName( const OUString& ) 600 throw(uno::RuntimeException) 601 { 602 return SvxCreateNumRuleCompare(); 603 } 604 605 //============================================================================= 606 // class SvxUnoDrawPagesAccess 607 //============================================================================= 608 609 SvxUnoDrawPagesAccess::SvxUnoDrawPagesAccess( SvxUnoDrawingModel& rMyModel ) throw() 610 : mrModel(rMyModel) 611 { 612 } 613 614 SvxUnoDrawPagesAccess::~SvxUnoDrawPagesAccess() throw() 615 { 616 } 617 618 // XIndexAccess 619 sal_Int32 SAL_CALL SvxUnoDrawPagesAccess::getCount() 620 throw(uno::RuntimeException) 621 { 622 OGuard aGuard( Application::GetSolarMutex() ); 623 624 sal_Int32 nCount = 0; 625 626 if( mrModel.mpDoc ) 627 nCount = mrModel.mpDoc->GetPageCount(); 628 629 return( nCount ); 630 } 631 632 uno::Any SAL_CALL SvxUnoDrawPagesAccess::getByIndex( sal_Int32 Index ) 633 throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException) 634 { 635 OGuard aGuard( Application::GetSolarMutex() ); 636 637 uno::Any aAny; 638 639 if( mrModel.mpDoc ) 640 { 641 if( (Index < 0) || (Index >= mrModel.mpDoc->GetPageCount() ) ) 642 throw lang::IndexOutOfBoundsException(); 643 644 SdrPage* pPage = mrModel.mpDoc->GetPage( (sal_uInt16)Index ); 645 if( pPage ) 646 { 647 uno::Reference< uno::XInterface > xPage( pPage->mxUnoPage ); 648 649 if( !xPage.is() ) 650 { 651 if( PTR_CAST( FmFormModel, mrModel.mpDoc ) ) 652 xPage = (drawing::XDrawPage*)new SvxFmDrawPage( pPage ); 653 else 654 xPage = (drawing::XDrawPage*)new SvxDrawPage( pPage ); 655 656 pPage->mxUnoPage = xPage; 657 } 658 659 aAny <<= xPage; 660 } 661 } 662 return aAny; 663 } 664 665 // XElementAccess 666 uno::Type SAL_CALL SvxUnoDrawPagesAccess::getElementType() 667 throw(uno::RuntimeException) 668 { 669 return ITYPE( drawing::XDrawPage ); 670 } 671 672 sal_Bool SAL_CALL SvxUnoDrawPagesAccess::hasElements() 673 throw(uno::RuntimeException) 674 { 675 return getCount() > 0; 676 } 677 678 // XDrawPages 679 680 /****************************************************************************** 681 * Erzeugt eine neue Seite mit Model an der angegebennen Position und gibt die * 682 * dazugehoerige SdDrawPage zurueck. * 683 ******************************************************************************/ 684 uno::Reference< drawing::XDrawPage > SAL_CALL SvxUnoDrawPagesAccess::insertNewByIndex( sal_Int32 nIndex ) 685 throw(uno::RuntimeException) 686 { 687 OGuard aGuard( Application::GetSolarMutex() ); 688 689 uno::Reference< drawing::XDrawPage > xDrawPage; 690 691 if( mrModel.mpDoc ) 692 { 693 SdrPage* pPage; 694 695 if( PTR_CAST( FmFormModel, mrModel.mpDoc ) ) 696 pPage = new FmFormPage(*(FmFormModel*)mrModel.mpDoc, NULL); 697 else 698 pPage = new SdrPage(*mrModel.mpDoc); 699 700 mrModel.mpDoc->InsertPage( pPage, (sal_uInt16)nIndex ); 701 xDrawPage = uno::Reference< drawing::XDrawPage >::query( pPage->getUnoPage() ); 702 } 703 704 return xDrawPage; 705 } 706 707 void SAL_CALL SvxUnoDrawPagesAccess::remove( const uno::Reference< drawing::XDrawPage >& xPage ) 708 throw(uno::RuntimeException) 709 { 710 OGuard aGuard( Application::GetSolarMutex() ); 711 712 sal_uInt16 nPageCount = mrModel.mpDoc->GetPageCount(); 713 if( nPageCount > 1 ) 714 { 715 // pPage von xPage besorgen und dann die Id (nPos )ermitteln 716 SvxDrawPage* pSvxPage = SvxDrawPage::getImplementation( xPage ); 717 if( pSvxPage ) 718 { 719 SdrPage* pPage = pSvxPage->GetSdrPage(); 720 if(pPage) 721 { 722 sal_uInt16 nPage = pPage->GetPageNum(); 723 mrModel.mpDoc->DeletePage( nPage ); 724 } 725 } 726 } 727 } 728 729 // XServiceInfo 730 sal_Char pSvxUnoDrawPagesAccessService[sizeof("com.sun.star.drawing.DrawPages")] = "com.sun.star.drawing.DrawPages"; 731 732 OUString SAL_CALL SvxUnoDrawPagesAccess::getImplementationName( ) throw(uno::RuntimeException) 733 { 734 return OUString( RTL_CONSTASCII_USTRINGPARAM( "SvxUnoDrawPagesAccess" ) ); 735 } 736 737 sal_Bool SAL_CALL SvxUnoDrawPagesAccess::supportsService( const OUString& ServiceName ) throw(uno::RuntimeException) 738 { 739 return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( pSvxUnoDrawPagesAccessService ) ); 740 } 741 742 uno::Sequence< OUString > SAL_CALL SvxUnoDrawPagesAccess::getSupportedServiceNames( ) throw(uno::RuntimeException) 743 { 744 OUString aService( RTL_CONSTASCII_USTRINGPARAM( pSvxUnoDrawPagesAccessService ) ); 745 uno::Sequence< OUString > aSeq( &aService, 1 ); 746 return aSeq; 747 } 748 #include <editeng/unonrule.hxx> 749 com::sun::star::uno::Reference< com::sun::star::container::XIndexReplace > SvxCreateNumRule( SdrModel* pModel ) throw() 750 { 751 SvxNumRule* pDefaultRule = NULL; 752 if( pModel ) 753 { 754 SvxNumBulletItem* pItem = (SvxNumBulletItem*) pModel->GetItemPool().GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET); 755 if( pItem ) 756 { 757 pDefaultRule = pItem->GetNumRule(); 758 } 759 } 760 761 if( pDefaultRule ) 762 { 763 return SvxCreateNumRule( pDefaultRule ); 764 } 765 else 766 { 767 SvxNumRule aTempRule( 0, 10, false ); 768 return SvxCreateNumRule( &aTempRule ); 769 } 770 } 771 772 /////////////////////////////////////////////////////////////////////// 773 774 #endif 775