Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <unotools/pathoptions.hxx>
22 : #include <rtl/instance.hxx>
23 : #include <sfx2/viewfrm.hxx>
24 : #include "svx/gallery1.hxx"
25 : #include "svx/galtheme.hxx"
26 : #include "svx/galbrws.hxx"
27 : #include "svx/gallery.hxx"
28 : #include "galobj.hxx"
29 :
30 : namespace
31 : {
32 : class theLockListener : public rtl::Static< SfxListener, theLockListener > {};
33 : }
34 :
35 : // -------------------
36 : // - GalleryExplorer -
37 : // -------------------
38 :
39 0 : Gallery* GalleryExplorer::ImplGetGallery()
40 : {
41 : static Gallery* pGallery = NULL;
42 :
43 0 : ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
44 :
45 0 : if( !pGallery )
46 0 : pGallery = Gallery::GetGalleryInstance();
47 :
48 0 : return pGallery;
49 : }
50 :
51 : // ------------------------------------------------------------------------
52 :
53 0 : GalleryExplorer* GalleryExplorer::GetGallery()
54 : {
55 : static GalleryExplorer* pThis = NULL;
56 :
57 0 : ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
58 :
59 : // only create a dummy object which can be accessed
60 0 : if( !pThis )
61 0 : pThis = new GalleryExplorer;
62 :
63 0 : return pThis;
64 : }
65 :
66 : // ------------------------------------------------------------------------
67 :
68 0 : INetURLObject GalleryExplorer::GetURL() const
69 : {
70 0 : return GALLERYBROWSER()->GetURL();
71 : }
72 :
73 0 : String GalleryExplorer::GetFilterName() const
74 : {
75 0 : return GALLERYBROWSER()->GetFilterName();
76 : }
77 :
78 : // ------------------------------------------------------------------------
79 :
80 0 : Graphic GalleryExplorer::GetGraphic() const
81 : {
82 0 : return GALLERYBROWSER()->GetGraphic();
83 : }
84 :
85 : // ------------------------------------------------------------------------
86 :
87 0 : sal_Bool GalleryExplorer::IsLinkage() const
88 : {
89 0 : return GALLERYBROWSER()->IsLinkage();
90 : }
91 :
92 : // ------------------------------------------------------------------------
93 :
94 0 : bool GalleryExplorer::FillThemeList( std::vector<String>& rThemeList )
95 : {
96 0 : Gallery* pGal = ImplGetGallery();
97 :
98 0 : if( pGal )
99 : {
100 0 : for( sal_uIntPtr i = 0, nCount = pGal->GetThemeCount(); i < nCount; i++ )
101 : {
102 0 : const GalleryThemeEntry* pEntry = pGal->GetThemeInfo( i );
103 :
104 0 : if( pEntry && !pEntry->IsReadOnly() && !pEntry->IsHidden() )
105 0 : rThemeList.push_back(pEntry->GetThemeName());
106 : }
107 : }
108 :
109 0 : return !rThemeList.empty();
110 : }
111 :
112 : // ------------------------------------------------------------------------
113 :
114 0 : sal_Bool GalleryExplorer::FillObjList( const String& rThemeName, std::vector<String> &rObjList )
115 : {
116 0 : Gallery* pGal = ImplGetGallery();
117 :
118 0 : if( pGal )
119 : {
120 0 : SfxListener aListener;
121 0 : GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aListener );
122 :
123 0 : if( pTheme )
124 : {
125 0 : for( sal_uInt32 i = 0, nCount = pTheme->GetObjectCount(); i < nCount; i++ )
126 0 : rObjList.push_back( pTheme->GetObjectURL( i ).GetMainURL( INetURLObject::NO_DECODE ) );
127 :
128 0 : pGal->ReleaseTheme( pTheme, aListener );
129 0 : }
130 : }
131 :
132 0 : return !rObjList.empty();
133 : }
134 :
135 : // ------------------------------------------------------------------------
136 :
137 0 : sal_Bool GalleryExplorer::FillObjList( const sal_uInt32 nThemeId, std::vector<String> &rObjList )
138 : {
139 0 : Gallery* pGal = ImplGetGallery();
140 :
141 0 : if (!pGal)
142 0 : return false;
143 :
144 0 : return FillObjList( pGal->GetThemeName( nThemeId ), rObjList );
145 : }
146 :
147 0 : bool GalleryExplorer::FillObjList( const sal_uInt32 nThemeId, std::vector<rtl::OUString> &rObjList )
148 : {
149 0 : std::vector<String> aObjList;
150 0 : if (!FillObjList(nThemeId, aObjList))
151 0 : return false;
152 :
153 : // Convert UniString to rtl::OUString.
154 0 : std::vector<rtl::OUString> aList;
155 0 : aList.reserve(aObjList.size());
156 0 : std::vector<String>::const_iterator it = aObjList.begin(), itEnd = aObjList.end();
157 0 : for (; it != itEnd; ++it)
158 0 : aList.push_back(*it);
159 :
160 0 : rObjList.swap(aList);
161 0 : return true;
162 : }
163 :
164 : // ------------------------------------------------------------------------
165 :
166 0 : sal_Bool GalleryExplorer::FillObjListTitle( const sal_uInt32 nThemeId, std::vector< rtl::OUString >& rList )
167 : {
168 0 : Gallery* pGal = ImplGetGallery();
169 0 : if( pGal )
170 : {
171 0 : SfxListener aListener;
172 0 : GalleryTheme* pTheme = pGal->AcquireTheme( pGal->GetThemeName( nThemeId ), aListener );
173 :
174 0 : if( pTheme )
175 : {
176 0 : for( sal_uIntPtr i = 0, nCount = pTheme->GetObjectCount(); i < nCount; i++ )
177 : {
178 0 : SgaObject* pObj = pTheme->AcquireObject( i );
179 0 : if ( pObj )
180 : {
181 0 : rtl::OUString aTitle( pObj->GetTitle() );
182 0 : rList.push_back( aTitle );
183 0 : pTheme->ReleaseObject( pObj );
184 : }
185 : }
186 0 : pGal->ReleaseTheme( pTheme, aListener );
187 0 : }
188 : }
189 0 : return !rList.empty();
190 : }
191 :
192 : // ------------------------------------------------------------------------
193 :
194 0 : sal_Bool GalleryExplorer::InsertURL( const String& rThemeName, const String& rURL )
195 : {
196 0 : return InsertURL( rThemeName, rURL, SGA_FORMAT_ALL );
197 : }
198 :
199 : // ------------------------------------------------------------------------
200 :
201 0 : sal_Bool GalleryExplorer::InsertURL( sal_uIntPtr nThemeId, const String& rURL )
202 : {
203 0 : return InsertURL( nThemeId, rURL, SGA_FORMAT_ALL );
204 : }
205 :
206 : // ------------------------------------------------------------------------
207 :
208 0 : sal_Bool GalleryExplorer::InsertURL( const String& rThemeName, const String& rURL, const sal_uIntPtr )
209 : {
210 0 : Gallery* pGal = ImplGetGallery();
211 0 : sal_Bool bRet = sal_False;
212 :
213 0 : if( pGal )
214 : {
215 0 : SfxListener aListener;
216 0 : GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aListener );
217 :
218 0 : if( pTheme )
219 : {
220 0 : INetURLObject aURL( rURL );
221 : DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
222 0 : bRet = pTheme->InsertURL( aURL );
223 0 : pGal->ReleaseTheme( pTheme, aListener );
224 0 : }
225 : }
226 :
227 0 : return bRet;
228 : }
229 :
230 : // ------------------------------------------------------------------------
231 :
232 0 : sal_Bool GalleryExplorer::InsertURL( sal_uIntPtr nThemeId, const String& rURL, const sal_uIntPtr nSgaFormat )
233 : {
234 0 : Gallery* pGal = ImplGetGallery();
235 0 : return( pGal ? InsertURL( pGal->GetThemeName( nThemeId ), rURL, nSgaFormat ) : sal_False );
236 : }
237 :
238 : // ------------------------------------------------------------------------
239 :
240 0 : sal_Bool GalleryExplorer::GetGraphicObj( const String& rThemeName, sal_uIntPtr nPos,
241 : Graphic* pGraphic, Bitmap* pThumb,
242 : sal_Bool bProgress )
243 : {
244 0 : Gallery* pGal = ImplGetGallery();
245 0 : sal_Bool bRet = sal_False;
246 :
247 0 : if( pGal )
248 : {
249 0 : SfxListener aListener;
250 0 : GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aListener );
251 :
252 0 : if( pTheme )
253 : {
254 0 : if( pGraphic )
255 0 : bRet = bRet || pTheme->GetGraphic( nPos, *pGraphic, bProgress );
256 :
257 0 : if( pThumb )
258 0 : bRet = bRet || pTheme->GetThumb( nPos, *pThumb, bProgress );
259 :
260 0 : pGal->ReleaseTheme( pTheme, aListener );
261 0 : }
262 : }
263 :
264 0 : return bRet;
265 : }
266 :
267 : // ------------------------------------------------------------------------
268 :
269 0 : sal_Bool GalleryExplorer::GetGraphicObj( sal_uIntPtr nThemeId, sal_uIntPtr nPos,
270 : Graphic* pGraphic, Bitmap* pThumb,
271 : sal_Bool bProgress )
272 : {
273 0 : Gallery* pGal = ImplGetGallery();
274 0 : return( pGal ? GetGraphicObj( pGal->GetThemeName( nThemeId ), nPos, pGraphic, pThumb, bProgress ) : sal_False );
275 : }
276 :
277 : // ------------------------------------------------------------------------
278 :
279 0 : sal_uIntPtr GalleryExplorer::GetSdrObjCount( const String& rThemeName )
280 : {
281 0 : Gallery* pGal = ImplGetGallery();
282 0 : sal_uIntPtr nRet = 0;
283 :
284 0 : if( pGal )
285 : {
286 0 : SfxListener aListener;
287 0 : GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aListener );
288 :
289 0 : if( pTheme )
290 : {
291 0 : for( sal_uIntPtr i = 0, nCount = pTheme->GetObjectCount(); i < nCount; i++ )
292 0 : if( SGA_OBJ_SVDRAW == pTheme->GetObjectKind( i ) )
293 0 : nRet++;
294 :
295 0 : pGal->ReleaseTheme( pTheme, aListener );
296 0 : }
297 : }
298 :
299 0 : return nRet;
300 : }
301 :
302 : // ------------------------------------------------------------------------
303 :
304 0 : sal_uIntPtr GalleryExplorer::GetSdrObjCount( sal_uIntPtr nThemeId )
305 : {
306 0 : Gallery* pGal = ImplGetGallery();
307 0 : return( pGal ? GetSdrObjCount( pGal->GetThemeName( nThemeId ) ) : sal_False );
308 : }
309 :
310 : // ------------------------------------------------------------------------
311 :
312 0 : sal_Bool GalleryExplorer::GetSdrObj( const String& rThemeName, sal_uIntPtr nSdrModelPos,
313 : SdrModel* pModel, Bitmap* pThumb )
314 : {
315 0 : Gallery* pGal = ImplGetGallery();
316 0 : sal_Bool bRet = sal_False;
317 :
318 0 : if( pGal )
319 : {
320 0 : SfxListener aListener;
321 0 : GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aListener );
322 :
323 0 : if( pTheme )
324 : {
325 0 : for( sal_uIntPtr i = 0, nCount = pTheme->GetObjectCount(), nActPos = 0; ( i < nCount ) && !bRet; i++ )
326 : {
327 0 : if( SGA_OBJ_SVDRAW == pTheme->GetObjectKind( i ) )
328 : {
329 0 : if( nActPos++ == nSdrModelPos )
330 : {
331 0 : if( pModel )
332 0 : bRet = bRet || pTheme->GetModel( i, *pModel, sal_False );
333 :
334 0 : if( pThumb )
335 0 : bRet = bRet || pTheme->GetThumb( i, *pThumb );
336 : }
337 : }
338 : }
339 :
340 0 : pGal->ReleaseTheme( pTheme, aListener );
341 0 : }
342 : }
343 :
344 0 : return bRet;
345 : }
346 :
347 : // ------------------------------------------------------------------------
348 :
349 0 : sal_Bool GalleryExplorer::GetSdrObj( sal_uIntPtr nThemeId, sal_uIntPtr nSdrModelPos,
350 : SdrModel* pModel, Bitmap* pThumb )
351 : {
352 0 : Gallery* pGal = ImplGetGallery();
353 0 : return( pGal ? GetSdrObj( pGal->GetThemeName( nThemeId ), nSdrModelPos, pModel, pThumb ) : sal_False );
354 : }
355 :
356 : // -----------------------------------------------------------------------------
357 :
358 0 : sal_Bool GalleryExplorer::BeginLocking( const String& rThemeName )
359 : {
360 0 : Gallery* pGal = ImplGetGallery();
361 0 : sal_Bool bRet = sal_False;
362 :
363 0 : if( pGal )
364 : {
365 0 : GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, theLockListener::get() );
366 :
367 0 : if( pTheme )
368 : {
369 0 : pTheme->LockTheme();
370 0 : bRet = sal_True;
371 : }
372 : }
373 :
374 0 : return bRet;
375 : }
376 :
377 : // -----------------------------------------------------------------------------
378 :
379 0 : sal_Bool GalleryExplorer::BeginLocking( sal_uIntPtr nThemeId )
380 : {
381 0 : Gallery* pGal = ImplGetGallery();
382 0 : return( pGal ? BeginLocking( pGal->GetThemeName( nThemeId ) ) : sal_False );
383 : }
384 :
385 : // -----------------------------------------------------------------------------
386 :
387 0 : sal_Bool GalleryExplorer::EndLocking( const String& rThemeName )
388 : {
389 0 : Gallery* pGal = ImplGetGallery();
390 0 : sal_Bool bRet = sal_False;
391 :
392 0 : if( pGal )
393 : {
394 0 : SfxListener aListener;
395 0 : GalleryTheme* pTheme = pGal->AcquireTheme( rThemeName, aListener );
396 :
397 0 : if( pTheme )
398 : {
399 0 : const sal_Bool bReleaseLockedTheme = pTheme->UnlockTheme();
400 :
401 : // release acquired theme
402 0 : pGal->ReleaseTheme( pTheme, aListener );
403 :
404 0 : if( bReleaseLockedTheme )
405 : {
406 : // release locked theme
407 0 : pGal->ReleaseTheme( pTheme, theLockListener::get() );
408 0 : bRet = sal_True;
409 : }
410 0 : }
411 : }
412 :
413 0 : return bRet;
414 : }
415 :
416 : // -----------------------------------------------------------------------------
417 :
418 0 : sal_Bool GalleryExplorer::EndLocking( sal_uIntPtr nThemeId )
419 : {
420 0 : Gallery* pGal = ImplGetGallery();
421 0 : return( pGal ? EndLocking( pGal->GetThemeName( nThemeId ) ) : sal_False );
422 : }
423 :
424 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|