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 #include <algorithm> 28 29 #include "unogaltheme.hxx" 30 #include "unogalitem.hxx" 31 #include "svx/galtheme.hxx" 32 #include "svx/gallery1.hxx" 33 #include "svx/galmisc.hxx" 34 #include <svx/fmmodel.hxx> 35 #include <svx/svdpage.hxx> 36 #include <svx/unopage.hxx> 37 #include <svl/itempool.hxx> 38 #include <rtl/uuid.h> 39 #include <vos/mutex.hxx> 40 #ifndef _SV_SVAPP_HXX_ 41 #include <vcl/svapp.hxx> 42 #endif 43 #include <unotools/pathoptions.hxx> 44 45 using namespace ::com::sun::star; 46 47 namespace unogallery { 48 49 // ----------------- 50 // - GalleryTheme - 51 // ----------------- 52 53 GalleryTheme::GalleryTheme( const ::rtl::OUString& rThemeName ) 54 { 55 mpGallery = ::Gallery::GetGalleryInstance(); 56 mpTheme = ( mpGallery ? mpGallery->AcquireTheme( rThemeName, *this ) : NULL ); 57 58 if( mpGallery ) 59 StartListening( *mpGallery ); 60 } 61 62 // ------------------------------------------------------------------------------ 63 64 GalleryTheme::~GalleryTheme() 65 { 66 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 67 68 DBG_ASSERT( !mpTheme || mpGallery, "Theme is living without Gallery" ); 69 70 implReleaseItems( NULL ); 71 72 if( mpGallery ) 73 { 74 EndListening( *mpGallery ); 75 76 if( mpTheme ) 77 mpGallery->ReleaseTheme( mpTheme, *this ); 78 } 79 } 80 81 // ------------------------------------------------------------------------------ 82 83 ::rtl::OUString GalleryTheme::getImplementationName_Static() 84 throw() 85 { 86 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.gallery.GalleryTheme" ) ); 87 } 88 89 // ------------------------------------------------------------------------------ 90 91 uno::Sequence< ::rtl::OUString > GalleryTheme::getSupportedServiceNames_Static() 92 throw() 93 { 94 uno::Sequence< ::rtl::OUString > aSeq( 1 ); 95 96 aSeq.getArray()[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.gallery.GalleryTheme" ) ); 97 98 return aSeq; 99 } 100 101 // ------------------------------------------------------------------------------ 102 103 ::rtl::OUString SAL_CALL GalleryTheme::getImplementationName() 104 throw( uno::RuntimeException ) 105 { 106 return getImplementationName_Static(); 107 } 108 109 // ------------------------------------------------------------------------------ 110 111 sal_Bool SAL_CALL GalleryTheme::supportsService( const ::rtl::OUString& ServiceName ) 112 throw( uno::RuntimeException ) 113 { 114 uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() ); 115 const ::rtl::OUString* pArray = aSNL.getConstArray(); 116 117 for( int i = 0; i < aSNL.getLength(); i++ ) 118 if( pArray[i] == ServiceName ) 119 return true; 120 121 return false; 122 } 123 124 // ------------------------------------------------------------------------------ 125 126 uno::Sequence< ::rtl::OUString > SAL_CALL GalleryTheme::getSupportedServiceNames() 127 throw( uno::RuntimeException ) 128 { 129 return getSupportedServiceNames_Static(); 130 } 131 132 // ------------------------------------------------------------------------------ 133 134 uno::Sequence< uno::Type > SAL_CALL GalleryTheme::getTypes() 135 throw(uno::RuntimeException) 136 { 137 uno::Sequence< uno::Type > aTypes( 5 ); 138 uno::Type* pTypes = aTypes.getArray(); 139 140 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo>*)0); 141 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider>*)0); 142 *pTypes++ = ::getCppuType((const uno::Reference< container::XElementAccess>*)0); 143 *pTypes++ = ::getCppuType((const uno::Reference< container::XIndexAccess>*)0); 144 *pTypes++ = ::getCppuType((const uno::Reference< gallery::XGalleryTheme>*)0); 145 146 return aTypes; 147 } 148 149 // ------------------------------------------------------------------------------ 150 151 uno::Sequence< sal_Int8 > SAL_CALL GalleryTheme::getImplementationId() 152 throw(uno::RuntimeException) 153 { 154 const vos::OGuard aGuard( Application::GetSolarMutex() ); 155 static uno::Sequence< sal_Int8 > aId; 156 157 if( aId.getLength() == 0 ) 158 { 159 aId.realloc( 16 ); 160 rtl_createUuid( reinterpret_cast< sal_uInt8* >( aId.getArray() ), 0, sal_True ); 161 } 162 163 return aId; 164 } 165 166 // ------------------------------------------------------------------------------ 167 168 uno::Type SAL_CALL GalleryTheme::getElementType() 169 throw (uno::RuntimeException) 170 { 171 return ::getCppuType( (const uno::Reference< gallery::XGalleryItem >*) 0); 172 } 173 174 // ------------------------------------------------------------------------------ 175 176 sal_Bool SAL_CALL GalleryTheme::hasElements() 177 throw (uno::RuntimeException) 178 { 179 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 180 181 return( ( mpTheme != NULL ) && ( mpTheme->GetObjectCount() > 0 ) ); 182 } 183 184 // ------------------------------------------------------------------------------ 185 186 sal_Int32 SAL_CALL GalleryTheme::getCount() 187 throw (uno::RuntimeException) 188 { 189 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 190 191 return( mpTheme ? mpTheme->GetObjectCount() : 0 ); 192 } 193 194 // ------------------------------------------------------------------------------ 195 196 uno::Any SAL_CALL GalleryTheme::getByIndex( ::sal_Int32 nIndex ) 197 throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException) 198 { 199 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 200 uno::Any aRet; 201 202 if( mpTheme ) 203 { 204 if( ( nIndex < 0 ) || ( nIndex >= getCount() ) ) 205 { 206 throw lang::IndexOutOfBoundsException(); 207 } 208 else 209 { 210 const GalleryObject* pObj = mpTheme->ImplGetGalleryObject( nIndex ); 211 212 if( pObj ) 213 aRet = uno::makeAny( uno::Reference< gallery::XGalleryItem >( new GalleryItem( *this, *pObj ) ) ); 214 } 215 } 216 217 return aRet; 218 } 219 220 // ------------------------------------------------------------------------------ 221 222 ::rtl::OUString SAL_CALL GalleryTheme::getName( ) 223 throw (uno::RuntimeException) 224 { 225 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 226 ::rtl::OUString aRet; 227 228 if( mpTheme ) 229 aRet = mpTheme->GetName(); 230 231 return aRet; 232 } 233 234 // ------------------------------------------------------------------------------ 235 236 void SAL_CALL GalleryTheme::update( ) 237 throw (uno::RuntimeException) 238 { 239 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 240 241 if( mpTheme ) 242 { 243 const Link aDummyLink; 244 mpTheme->Actualize( aDummyLink ); 245 } 246 } 247 248 // ------------------------------------------------------------------------------ 249 250 ::sal_Int32 SAL_CALL GalleryTheme::insertURLByIndex( 251 const ::rtl::OUString& rURL, ::sal_Int32 nIndex ) 252 throw (lang::WrappedTargetException, uno::RuntimeException) 253 { 254 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 255 sal_Int32 nRet = -1; 256 257 if( mpTheme ) 258 { 259 try 260 { 261 const INetURLObject aURL( rURL ); 262 263 nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) ); 264 265 if( ( aURL.GetProtocol() != INET_PROT_NOT_VALID ) && mpTheme->InsertURL( aURL, nIndex ) ) 266 { 267 const GalleryObject* pObj = mpTheme->ImplGetGalleryObject( aURL ); 268 269 if( pObj ) 270 nRet = mpTheme->ImplGetGalleryObjectPos( pObj ); 271 } 272 } 273 catch( ... ) 274 { 275 } 276 } 277 278 return nRet; 279 } 280 281 // ------------------------------------------------------------------------------ 282 283 ::sal_Int32 SAL_CALL GalleryTheme::insertGraphicByIndex( 284 const uno::Reference< graphic::XGraphic >& rxGraphic, sal_Int32 nIndex ) 285 throw (lang::WrappedTargetException, uno::RuntimeException) 286 { 287 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 288 sal_Int32 nRet = -1; 289 290 if( mpTheme ) 291 { 292 try 293 { 294 const Graphic aGraphic( rxGraphic ); 295 296 nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) ); 297 298 if( mpTheme->InsertGraphic( aGraphic, nIndex ) ) 299 nRet = nIndex; 300 } 301 catch( ... ) 302 { 303 } 304 } 305 306 return nRet; 307 } 308 309 // ------------------------------------------------------------------------------ 310 311 ::sal_Int32 SAL_CALL GalleryTheme::insertDrawingByIndex( 312 const uno::Reference< lang::XComponent >& Drawing, sal_Int32 nIndex ) 313 throw (lang::WrappedTargetException, uno::RuntimeException) 314 { 315 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 316 sal_Int32 nRet = -1; 317 318 if( mpTheme ) 319 { 320 GalleryDrawingModel* pModel = GalleryDrawingModel::getImplementation( Drawing ); 321 322 if( pModel && pModel->GetDoc() && pModel->GetDoc()->ISA( FmFormModel ) ) 323 { 324 nIndex = ::std::max( ::std::min( nIndex, getCount() ), sal_Int32( 0 ) ); 325 326 if( mpTheme->InsertModel( *static_cast< FmFormModel* >( pModel->GetDoc() ), nIndex ) ) 327 nRet = nIndex; 328 } 329 else if (!pModel) 330 { 331 try 332 { 333 uno::Reference< drawing::XDrawPagesSupplier > xDrawPagesSupplier( Drawing, uno::UNO_QUERY_THROW ); 334 uno::Reference< drawing::XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), uno::UNO_QUERY_THROW ); 335 uno::Reference< drawing::XDrawPage > xPage( xDrawPages->getByIndex( 0 ), uno::UNO_QUERY_THROW ); 336 SvxDrawPage* pUnoPage = xPage.is() ? SvxDrawPage::getImplementation( xPage ) : NULL; 337 SdrModel* pOrigModel = pUnoPage ? pUnoPage->GetSdrPage()->GetModel() : NULL; 338 SdrPage* pOrigPage = pUnoPage ? pUnoPage->GetSdrPage() : NULL; 339 340 if (pOrigPage && pOrigModel) 341 { 342 FmFormModel* pTmpModel = new FmFormModel(&pOrigModel->GetItemPool()); 343 SdrPage* pNewPage = pOrigPage->Clone(); 344 pTmpModel->InsertPage(pNewPage, 0); 345 346 uno::Reference< lang::XComponent > xDrawing( new GalleryDrawingModel( pTmpModel ) ); 347 pTmpModel->setUnoModel( uno::Reference< uno::XInterface >::query( xDrawing ) ); 348 349 nRet = insertDrawingByIndex( xDrawing, nIndex ); 350 return nRet; 351 } 352 } 353 catch (...) 354 { 355 } 356 } 357 } 358 359 return nRet; 360 } 361 362 // ------------------------------------------------------------------------------ 363 364 void SAL_CALL GalleryTheme::removeByIndex( sal_Int32 nIndex ) 365 throw (lang::IndexOutOfBoundsException, uno::RuntimeException) 366 { 367 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 368 369 if( mpTheme ) 370 { 371 if( ( nIndex < 0 ) || ( nIndex >= getCount() ) ) 372 throw lang::IndexOutOfBoundsException(); 373 else 374 mpTheme->RemoveObject( nIndex ); 375 } 376 } 377 378 // ------------------------------------------------------------------------------ 379 380 void GalleryTheme::Notify( SfxBroadcaster&, const SfxHint& rHint ) 381 { 382 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 383 const GalleryHint& rGalleryHint = static_cast< const GalleryHint& >( rHint ); 384 385 switch( rGalleryHint.GetType() ) 386 { 387 case( GALLERY_HINT_CLOSE_THEME ): 388 { 389 DBG_ASSERT( !mpTheme || mpGallery, "Theme is living without Gallery" ); 390 391 implReleaseItems( NULL ); 392 393 if( mpGallery && mpTheme ) 394 { 395 mpGallery->ReleaseTheme( mpTheme, *this ); 396 mpTheme = NULL; 397 } 398 } 399 break; 400 401 case( GALLERY_HINT_CLOSE_OBJECT ): 402 { 403 GalleryObject* pObj = reinterpret_cast< GalleryObject* >( rGalleryHint.GetData1() ); 404 405 if( pObj ) 406 implReleaseItems( pObj ); 407 } 408 break; 409 410 default: 411 break; 412 } 413 } 414 415 // ------------------------------------------------------------------------------ 416 417 void GalleryTheme::implReleaseItems( GalleryObject* pObj ) 418 { 419 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 420 421 for( GalleryItemList::iterator aIter = maItemList.begin(); aIter != maItemList.end(); ) 422 { 423 if( !pObj || ( (*aIter)->implGetObject() == pObj ) ) 424 { 425 (*aIter)->implSetInvalid(); 426 aIter = maItemList.erase( aIter ); 427 } 428 else 429 ++aIter; 430 } 431 } 432 433 // ------------------------------------------------------------------------------ 434 435 ::GalleryTheme* GalleryTheme::implGetTheme() const 436 { 437 return mpTheme; 438 } 439 440 // ------------------------------------------------------------------------------ 441 442 void GalleryTheme::implRegisterGalleryItem( ::unogallery::GalleryItem& rItem ) 443 { 444 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 445 446 // DBG_ASSERT( maItemList.find( &rItem ) == maItemList.end(), "Item already registered" ); 447 maItemList.push_back( &rItem ); 448 } 449 450 // ------------------------------------------------------------------------------ 451 452 void GalleryTheme::implDeregisterGalleryItem( ::unogallery::GalleryItem& rItem ) 453 { 454 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 455 456 // DBG_ASSERT( maItemList.find( &rItem ) != maItemList.end(), "Item is not registered" ); 457 maItemList.remove( &rItem ); 458 } 459 460 } 461