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