xref: /trunk/main/svx/source/gallery2/galexpl.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 #include <unotools/pathoptions.hxx>
32 #include <sfx2/viewfrm.hxx>
33 #include "svx/gallery1.hxx"
34 #include "svx/galtheme.hxx"
35 #include "svx/galbrws.hxx"
36 #include "svx/gallery.hxx"
37 #include "galobj.hxx"
38 
39 // -----------
40 // - Statics -
41 // -----------
42 
43 static SfxListener aLockListener;
44 
45 // -------------------
46 // - GalleryExplorer -
47 // -------------------
48 
49 Gallery* GalleryExplorer::ImplGetGallery()
50 {
51     static Gallery* pGallery = NULL;
52 
53     ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
54 
55     if( !pGallery )
56         pGallery = Gallery::GetGalleryInstance();
57 
58     return pGallery;
59 }
60 
61 // ------------------------------------------------------------------------
62 
63 GalleryExplorer* GalleryExplorer::GetGallery()
64 {
65     static GalleryExplorer* pThis = NULL;
66 
67     ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
68 
69     // only create a dummy object which can be accessed
70     if( !pThis )
71         pThis = new GalleryExplorer;
72 
73     return pThis;
74 }
75 
76 // ------------------------------------------------------------------------
77 
78 INetURLObject GalleryExplorer::GetURL() const
79 {
80     return GALLERYBROWSER()->GetURL();
81 }
82 
83 String GalleryExplorer::GetFilterName() const
84 {
85     return GALLERYBROWSER()->GetFilterName();
86 }
87 
88 // ------------------------------------------------------------------------
89 
90 Graphic GalleryExplorer::GetGraphic() const
91 {
92     return GALLERYBROWSER()->GetGraphic();
93 }
94 
95 // ------------------------------------------------------------------------
96 
97 sal_Bool GalleryExplorer::GetVCDrawModel( FmFormModel& rModel ) const
98 {
99     return GALLERYBROWSER()->GetVCDrawModel( rModel );
100 }
101 
102 // ------------------------------------------------------------------------
103 
104 sal_Bool GalleryExplorer::IsLinkage() const
105 {
106     return GALLERYBROWSER()->IsLinkage();
107 }
108 
109 // ------------------------------------------------------------------------
110 
111 sal_Bool GalleryExplorer::FillThemeList( List& rThemeList )
112 {
113     Gallery* pGal = ImplGetGallery();
114 
115     if( pGal )
116     {
117         for( sal_uIntPtr i = 0, nCount = pGal->GetThemeCount(); i < nCount; i++ )
118         {
119             const GalleryThemeEntry* pEntry = pGal->GetThemeInfo( i );
120 
121             if( pEntry && !pEntry->IsReadOnly() && !pEntry->IsHidden() )
122                 rThemeList.Insert( new String( pEntry->GetThemeName() ), LIST_APPEND );
123         }
124     }
125 
126     return( rThemeList.Count() > 0 );
127 }
128 
129 // ------------------------------------------------------------------------
130 
131 sal_Bool GalleryExplorer::FillObjList( const String& rThemeName, List& rObjList )
132 {
133     Gallery* pGal = ImplGetGallery();
134 
135     if( pGal )
136     {
137         SfxListener     aListener;
138         GalleryTheme*   pTheme = pGal->AcquireTheme( rThemeName, aListener );
139 
140         if( pTheme )
141         {
142             for( sal_uIntPtr i = 0, nCount = pTheme->GetObjectCount(); i < nCount; i++ )
143                 rObjList.Insert( new String( pTheme->GetObjectURL( i ).GetMainURL( INetURLObject::NO_DECODE ) ), LIST_APPEND );
144 
145             pGal->ReleaseTheme( pTheme, aListener );
146         }
147     }
148 
149     return( rObjList.Count() > 0 );
150 }
151 
152 // ------------------------------------------------------------------------
153 
154 sal_Bool GalleryExplorer::FillObjList( sal_uIntPtr nThemeId, List& rObjList )
155 {
156     Gallery* pGal = ImplGetGallery();
157     return( pGal ? FillObjList( pGal->GetThemeName( nThemeId ), rObjList ) : sal_False );
158 }
159 
160 // ------------------------------------------------------------------------
161 
162 sal_Bool GalleryExplorer::FillObjListTitle( const sal_uInt32 nThemeId, std::vector< rtl::OUString >& rList )
163 {
164     Gallery* pGal = ImplGetGallery();
165     if( pGal )
166     {
167         SfxListener     aListener;
168         GalleryTheme*   pTheme = pGal->AcquireTheme( pGal->GetThemeName( nThemeId ), aListener );
169 
170         if( pTheme )
171         {
172             for( sal_uIntPtr i = 0, nCount = pTheme->GetObjectCount(); i < nCount; i++ )
173             {
174                 SgaObject*  pObj = pTheme->AcquireObject( i );
175                 if ( pObj )
176                 {
177                     rtl::OUString aTitle( pObj->GetTitle() );
178                     rList.push_back( aTitle );
179                     pTheme->ReleaseObject( pObj );
180                 }
181             }
182             pGal->ReleaseTheme( pTheme, aListener );
183         }
184     }
185     return( rList.size() > 0 );
186 }
187 
188 // ------------------------------------------------------------------------
189 
190 sal_Bool GalleryExplorer::InsertURL( const String& rThemeName, const String& rURL )
191 {
192     return InsertURL( rThemeName, rURL, SGA_FORMAT_ALL );
193 }
194 
195 // ------------------------------------------------------------------------
196 
197 sal_Bool GalleryExplorer::InsertURL( sal_uIntPtr nThemeId, const String& rURL )
198 {
199     return InsertURL( nThemeId, rURL, SGA_FORMAT_ALL );
200 }
201 
202 // ------------------------------------------------------------------------
203 
204 sal_Bool GalleryExplorer::InsertURL( const String& rThemeName, const String& rURL, const sal_uIntPtr )
205 {
206     Gallery*    pGal = ImplGetGallery();
207     sal_Bool        bRet = sal_False;
208 
209     if( pGal )
210     {
211         SfxListener   aListener;
212         GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aListener );
213 
214         if( pTheme )
215         {
216             INetURLObject aURL( rURL );
217             DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
218             bRet = pTheme->InsertURL( aURL );
219             pGal->ReleaseTheme( pTheme, aListener );
220         }
221     }
222 
223     return bRet;
224 }
225 
226 // ------------------------------------------------------------------------
227 
228 sal_Bool GalleryExplorer::InsertURL( sal_uIntPtr nThemeId, const String& rURL, const sal_uIntPtr nSgaFormat )
229 {
230     Gallery* pGal = ImplGetGallery();
231     return( pGal ? InsertURL( pGal->GetThemeName( nThemeId ), rURL, nSgaFormat ) : sal_False );
232 }
233 
234 // ------------------------------------------------------------------------
235 
236 sal_uIntPtr GalleryExplorer::GetObjCount( const String& rThemeName )
237 {
238     Gallery*    pGal = ImplGetGallery();
239     sal_uIntPtr     nRet = 0;
240 
241     if( pGal )
242     {
243         SfxListener     aListener;
244         GalleryTheme*   pTheme = pGal->AcquireTheme( rThemeName, aListener );
245 
246         if( pTheme )
247         {
248             nRet = pTheme->GetObjectCount();
249             pGal->ReleaseTheme( pTheme, aListener );
250         }
251     }
252 
253     return nRet;
254 }
255 
256 // ------------------------------------------------------------------------
257 
258 sal_uIntPtr GalleryExplorer::GetObjCount( sal_uIntPtr nThemeId )
259 {
260     Gallery* pGal = ImplGetGallery();
261     return( pGal ? GetObjCount( pGal->GetThemeName( nThemeId ) ) : sal_False );
262 }
263 
264 // ------------------------------------------------------------------------
265 
266 sal_Bool GalleryExplorer::GetGraphicObj( const String& rThemeName, sal_uIntPtr nPos,
267                                      Graphic* pGraphic, Bitmap* pThumb,
268                                      sal_Bool bProgress )
269 {
270     Gallery*    pGal = ImplGetGallery();
271     sal_Bool        bRet = sal_False;
272 
273     if( pGal )
274     {
275         SfxListener     aListener;
276         GalleryTheme*   pTheme = pGal->AcquireTheme( rThemeName, aListener );
277 
278         if( pTheme )
279         {
280             if( pGraphic )
281                 bRet = bRet || pTheme->GetGraphic( nPos, *pGraphic, bProgress );
282 
283             if( pThumb )
284                 bRet = bRet || pTheme->GetThumb( nPos, *pThumb, bProgress );
285 
286             pGal->ReleaseTheme( pTheme, aListener );
287         }
288     }
289 
290     return bRet;
291 }
292 
293 // ------------------------------------------------------------------------
294 
295 sal_Bool GalleryExplorer::GetGraphicObj( sal_uIntPtr nThemeId, sal_uIntPtr nPos,
296                                      Graphic* pGraphic, Bitmap* pThumb,
297                                      sal_Bool bProgress )
298 {
299     Gallery* pGal = ImplGetGallery();
300     return( pGal ? GetGraphicObj( pGal->GetThemeName( nThemeId ), nPos, pGraphic, pThumb, bProgress ) : sal_False );
301 }
302 
303 // ------------------------------------------------------------------------
304 
305 sal_Bool GalleryExplorer::InsertGraphicObj( const String& rThemeName, const Graphic& rGraphic )
306 {
307     Gallery*    pGal = ImplGetGallery();
308     sal_Bool        bRet = sal_False;
309 
310     if( pGal )
311     {
312         SfxListener     aListener;
313         GalleryTheme*   pTheme = pGal->AcquireTheme( rThemeName, aListener );
314 
315         if( pTheme )
316         {
317             bRet = pTheme->InsertGraphic( rGraphic );
318             pGal->ReleaseTheme( pTheme, aListener );
319         }
320     }
321 
322     return bRet;
323 }
324 
325 // ------------------------------------------------------------------------
326 
327 sal_Bool GalleryExplorer::InsertGraphicObj( sal_uIntPtr nThemeId, const Graphic& rGraphic )
328 {
329     Gallery* pGal = ImplGetGallery();
330     return( pGal ? InsertGraphicObj( pGal->GetThemeName( nThemeId ), rGraphic ) : sal_False );
331 }
332 
333 // ------------------------------------------------------------------------
334 
335 sal_uIntPtr GalleryExplorer::GetSdrObjCount( const String& rThemeName )
336 {
337     Gallery*    pGal = ImplGetGallery();
338     sal_uIntPtr     nRet = 0;
339 
340     if( pGal )
341     {
342         SfxListener     aListener;
343         GalleryTheme*   pTheme = pGal->AcquireTheme( rThemeName, aListener );
344 
345         if( pTheme )
346         {
347             for( sal_uIntPtr i = 0, nCount = pTheme->GetObjectCount(); i < nCount; i++ )
348                 if( SGA_OBJ_SVDRAW == pTheme->GetObjectKind( i ) )
349                     nRet++;
350 
351             pGal->ReleaseTheme( pTheme, aListener );
352         }
353     }
354 
355     return nRet;
356 }
357 
358 // ------------------------------------------------------------------------
359 
360 sal_uIntPtr GalleryExplorer::GetSdrObjCount( sal_uIntPtr nThemeId  )
361 {
362     Gallery* pGal = ImplGetGallery();
363     return( pGal ? GetSdrObjCount( pGal->GetThemeName( nThemeId ) ) : sal_False );
364 }
365 
366 // ------------------------------------------------------------------------
367 
368 sal_Bool GalleryExplorer::GetSdrObj( const String& rThemeName, sal_uIntPtr nSdrModelPos,
369                                  SdrModel* pModel, Bitmap* pThumb )
370 {
371     Gallery*    pGal = ImplGetGallery();
372     sal_Bool        bRet = sal_False;
373 
374     if( pGal )
375     {
376         SfxListener     aListener;
377         GalleryTheme*   pTheme = pGal->AcquireTheme( rThemeName, aListener );
378 
379         if( pTheme )
380         {
381             for( sal_uIntPtr i = 0, nCount = pTheme->GetObjectCount(), nActPos = 0; ( i < nCount ) && !bRet; i++ )
382             {
383                 if( SGA_OBJ_SVDRAW == pTheme->GetObjectKind( i ) )
384                 {
385                     if( nActPos++ == nSdrModelPos )
386                     {
387                         if( pModel )
388                             bRet = bRet || pTheme->GetModel( i, *pModel, sal_False );
389 
390                         if( pThumb )
391                             bRet = bRet || pTheme->GetThumb( i, *pThumb );
392                     }
393                 }
394             }
395 
396             pGal->ReleaseTheme( pTheme, aListener );
397         }
398     }
399 
400     return bRet;
401 }
402 
403 // ------------------------------------------------------------------------
404 
405 sal_Bool GalleryExplorer::GetSdrObj( sal_uIntPtr nThemeId, sal_uIntPtr nSdrModelPos,
406                                  SdrModel* pModel, Bitmap* pThumb )
407 {
408     Gallery* pGal = ImplGetGallery();
409     return( pGal ? GetSdrObj( pGal->GetThemeName( nThemeId ), nSdrModelPos, pModel, pThumb ) : sal_False );
410 }
411 
412 // ------------------------------------------------------------------------
413 
414 sal_Bool GalleryExplorer::InsertSdrObj( const String& rThemeName, FmFormModel& rModel )
415 {
416     Gallery*    pGal = ImplGetGallery();
417     sal_Bool        bRet = sal_False;
418 
419     if( pGal )
420     {
421         SfxListener     aListener;
422         GalleryTheme*   pTheme = pGal->AcquireTheme( rThemeName, aListener );
423 
424         if( pTheme )
425         {
426             bRet = pTheme->InsertModel( rModel );
427             pGal->ReleaseTheme( pTheme, aListener );
428         }
429     }
430 
431     return bRet;
432 }
433 
434 // ------------------------------------------------------------------------
435 
436 sal_Bool GalleryExplorer::InsertSdrObj( sal_uIntPtr nThemeId, FmFormModel& rModel )
437 {
438     Gallery* pGal = ImplGetGallery();
439     return( pGal ? InsertSdrObj( pGal->GetThemeName( nThemeId ), rModel ) : sal_False );
440 }
441 
442 // -----------------------------------------------------------------------------
443 
444 sal_Bool GalleryExplorer::BeginLocking( const String& rThemeName )
445 {
446     Gallery*    pGal = ImplGetGallery();
447     sal_Bool        bRet = sal_False;
448 
449     if( pGal )
450     {
451         GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aLockListener );
452 
453         if( pTheme )
454         {
455             pTheme->LockTheme();
456             bRet = sal_True;
457         }
458     }
459 
460     return bRet;
461 }
462 
463 // -----------------------------------------------------------------------------
464 
465 sal_Bool GalleryExplorer::BeginLocking( sal_uIntPtr nThemeId )
466 {
467     Gallery* pGal = ImplGetGallery();
468     return( pGal ? BeginLocking( pGal->GetThemeName( nThemeId ) ) : sal_False );
469 }
470 
471 // -----------------------------------------------------------------------------
472 
473 sal_Bool GalleryExplorer::EndLocking( const String& rThemeName )
474 {
475     Gallery*    pGal = ImplGetGallery();
476     sal_Bool        bRet = sal_False;
477 
478     if( pGal )
479     {
480         SfxListener   aListener;
481         GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aListener );
482 
483         if( pTheme )
484         {
485             const sal_Bool bReleaseLockedTheme = pTheme->UnlockTheme();
486 
487             // release acquired theme
488             pGal->ReleaseTheme( pTheme, aListener );
489 
490             if( bReleaseLockedTheme )
491             {
492                 // release locked theme
493                 pGal->ReleaseTheme( pTheme, aLockListener );
494                 bRet = sal_True;
495             }
496         }
497     }
498 
499     return bRet;
500 }
501 
502 // -----------------------------------------------------------------------------
503 
504 sal_Bool GalleryExplorer::EndLocking( sal_uIntPtr nThemeId )
505 {
506     Gallery* pGal = ImplGetGallery();
507     return( pGal ? EndLocking( pGal->GetThemeName( nThemeId ) ) : sal_False );
508 }
509 
510 // -----------------------------------------------------------------------------
511 
512 sal_Bool GalleryExplorer::DrawCentered( OutputDevice* pOut, const FmFormModel& rModel )
513 {
514     return SgaObjectSvDraw::DrawCentered( pOut, rModel );
515 }
516