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 "unogalthemeprovider.hxx"
28 #include "unogaltheme.hxx"
29 #include "svx/gallery1.hxx"
30 #include <rtl/uuid.h>
31 #include <vos/mutex.hxx>
32 #ifndef _SV_SVAPP_HXX_
33 #include <vcl/svapp.hxx>
34 #endif
35 #include <unotools/pathoptions.hxx>
36 #include <com/sun/star/gallery/XGalleryTheme.hpp>
37 #include <com/sun/star/beans/PropertyValue.hpp>
38
39 using namespace ::com::sun::star;
40
41 namespace unogallery {
42
43 // --------------------
44 // - Helper functions -
45 // --------------------
46
GalleryThemeProvider_createInstance(const uno::Reference<lang::XMultiServiceFactory> &)47 uno::Reference< uno::XInterface > SAL_CALL GalleryThemeProvider_createInstance(
48 const uno::Reference< lang::XMultiServiceFactory > & )
49 throw( uno::Exception )
50 {
51 return *( new GalleryThemeProvider() );
52 }
53
54 // -----------------------------------------------------------------------------
55
GalleryThemeProvider_getSupportedServiceNames()56 uno::Sequence< ::rtl::OUString > SAL_CALL GalleryThemeProvider_getSupportedServiceNames()
57 throw()
58 {
59 return GalleryThemeProvider::getSupportedServiceNames_Static();
60 }
61
62 // -----------------------------------------------------------------------------
63
GalleryThemeProvider_getImplementationName()64 ::rtl::OUString SAL_CALL GalleryThemeProvider_getImplementationName()
65 throw()
66 {
67 return GalleryThemeProvider::getImplementationName_Static();
68 }
69
70 // -----------------
71 // - GalleryThemeProvider -
72 // -----------------
73
GalleryThemeProvider()74 GalleryThemeProvider::GalleryThemeProvider() :
75 mbHiddenThemes( sal_False )
76 {
77 mpGallery = ::Gallery::GetGalleryInstance();
78 }
79
80 // ------------------------------------------------------------------------------
81
~GalleryThemeProvider()82 GalleryThemeProvider::~GalleryThemeProvider()
83 {
84 }
85
86 // ------------------------------------------------------------------------------
87
getImplementationName_Static()88 SVX_DLLPUBLIC ::rtl::OUString GalleryThemeProvider::getImplementationName_Static()
89 throw()
90 {
91 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.gallery.GalleryThemeProvider" ) );
92 }
93
94 // ------------------------------------------------------------------------------
95
getSupportedServiceNames_Static()96 SVX_DLLPUBLIC uno::Sequence< ::rtl::OUString > GalleryThemeProvider::getSupportedServiceNames_Static()
97 throw()
98 {
99 uno::Sequence< ::rtl::OUString > aSeq( 1 );
100
101 aSeq.getArray()[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.gallery.GalleryThemeProvider" ) );
102
103 return aSeq;
104 }
105
106 // ------------------------------------------------------------------------------
107
getImplementationName()108 ::rtl::OUString SAL_CALL GalleryThemeProvider::getImplementationName()
109 throw( uno::RuntimeException )
110 {
111 return getImplementationName_Static();
112 }
113
114 // ------------------------------------------------------------------------------
115
supportsService(const::rtl::OUString & ServiceName)116 sal_Bool SAL_CALL GalleryThemeProvider::supportsService( const ::rtl::OUString& ServiceName )
117 throw( uno::RuntimeException )
118 {
119 uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() );
120 const ::rtl::OUString* pArray = aSNL.getConstArray();
121
122 for( int i = 0; i < aSNL.getLength(); i++ )
123 if( pArray[i] == ServiceName )
124 return true;
125
126 return false;
127 }
128
129 // ------------------------------------------------------------------------------
130
getSupportedServiceNames()131 uno::Sequence< ::rtl::OUString > SAL_CALL GalleryThemeProvider::getSupportedServiceNames()
132 throw( uno::RuntimeException )
133 {
134 return getSupportedServiceNames_Static();
135 }
136
137 // ------------------------------------------------------------------------------
138
getTypes()139 uno::Sequence< uno::Type > SAL_CALL GalleryThemeProvider::getTypes()
140 throw(uno::RuntimeException)
141 {
142 uno::Sequence< uno::Type > aTypes( 6 );
143 uno::Type* pTypes = aTypes.getArray();
144
145 *pTypes++ = ::getCppuType((const uno::Reference< lang::XServiceInfo>*)0);
146 *pTypes++ = ::getCppuType((const uno::Reference< lang::XTypeProvider>*)0);
147 *pTypes++ = ::getCppuType((const uno::Reference< lang::XInitialization>*)0);
148 *pTypes++ = ::getCppuType((const uno::Reference< container::XElementAccess>*)0);
149 *pTypes++ = ::getCppuType((const uno::Reference< container::XNameAccess>*)0);
150 *pTypes++ = ::getCppuType((const uno::Reference< gallery::XGalleryThemeProvider>*)0);
151
152 return aTypes;
153 }
154
155 // ------------------------------------------------------------------------------
156
getImplementationId()157 uno::Sequence< sal_Int8 > SAL_CALL GalleryThemeProvider::getImplementationId()
158 throw(uno::RuntimeException)
159 {
160 const vos::OGuard aGuard( Application::GetSolarMutex() );
161 static uno::Sequence< sal_Int8 > aId;
162
163 if( aId.getLength() == 0 )
164 {
165 aId.realloc( 16 );
166 rtl_createUuid( reinterpret_cast< sal_uInt8* >( aId.getArray() ), 0, sal_True );
167 }
168
169 return aId;
170 }
171
172 // ------------------------------------------------------------------------------
173
initialize(const uno::Sequence<uno::Any> & rArguments)174 void SAL_CALL GalleryThemeProvider::initialize( const uno::Sequence< uno::Any >& rArguments )
175 throw ( uno::Exception, uno::RuntimeException )
176 {
177 uno::Sequence< beans::PropertyValue > aParams;
178 sal_Int32 i;
179
180 for( i = 0; i < rArguments.getLength(); ++i )
181 {
182 if( rArguments[ i ] >>= aParams )
183 break;
184 }
185
186 for( i = 0; i < aParams.getLength(); ++i )
187 {
188 const beans::PropertyValue& rProp = aParams[ i ];
189
190 if( rProp.Name.equalsAscii( "ProvideHiddenThemes" ) )
191 rProp.Value >>= mbHiddenThemes;
192 }
193 }
194
195 // ------------------------------------------------------------------------------
196
getElementType()197 uno::Type SAL_CALL GalleryThemeProvider::getElementType()
198 throw (uno::RuntimeException)
199 {
200 return ::getCppuType( (const uno::Reference< gallery::XGalleryTheme >*) 0);
201 }
202
203 // ------------------------------------------------------------------------------
204
hasElements()205 sal_Bool SAL_CALL GalleryThemeProvider::hasElements()
206 throw (uno::RuntimeException)
207 {
208 const ::vos::OGuard aGuard( Application::GetSolarMutex() );
209
210 return( ( mpGallery != NULL ) && ( mpGallery->GetThemeCount() > 0 ) );
211 }
212
213 // ------------------------------------------------------------------------------
214
getByName(const::rtl::OUString & rName)215 uno::Any SAL_CALL GalleryThemeProvider::getByName( const ::rtl::OUString& rName )
216 throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
217 {
218 const ::vos::OGuard aGuard( Application::GetSolarMutex() );
219 uno::Any aRet;
220
221 if( !mpGallery || !mpGallery->HasTheme( rName ) )
222 {
223 throw container::NoSuchElementException();
224 }
225 else
226 {
227 aRet = uno::makeAny( uno::Reference< gallery::XGalleryTheme >( new ::unogallery::GalleryTheme( rName ) ) );
228 }
229
230 return aRet;
231 }
232
233 // ------------------------------------------------------------------------------
234
getElementNames()235 uno::Sequence< ::rtl::OUString > SAL_CALL GalleryThemeProvider::getElementNames()
236 throw (uno::RuntimeException)
237 {
238 const ::vos::OGuard aGuard( Application::GetSolarMutex() );
239 sal_uInt32 i = 0, nCount = ( mpGallery ? mpGallery->GetThemeCount() : 0 ), nRealCount = 0;
240 uno::Sequence< ::rtl::OUString > aSeq( nCount );
241
242 for( ; i < nCount; ++i )
243 {
244 const GalleryThemeEntry* pEntry = mpGallery->GetThemeInfo( i );
245
246 if( mbHiddenThemes || !pEntry->IsHidden() )
247 aSeq[ nRealCount++ ] = pEntry->GetThemeName();
248 }
249
250 aSeq.realloc( nRealCount );
251
252 return aSeq;
253 }
254
255 // ------------------------------------------------------------------------------
256
hasByName(const::rtl::OUString & rName)257 sal_Bool SAL_CALL GalleryThemeProvider::hasByName( const ::rtl::OUString& rName )
258 throw (uno::RuntimeException)
259 {
260 const ::vos::OGuard aGuard( Application::GetSolarMutex() );
261
262 sal_Bool bRet = sal_False;
263
264 if( mpGallery && mpGallery->HasTheme( rName ) )
265 bRet = ( mbHiddenThemes || !mpGallery->GetThemeInfo( rName )->IsHidden() );
266
267 return( bRet );
268 }
269
270 // ------------------------------------------------------------------------------
271
insertNewByName(const::rtl::OUString & rThemeName)272 uno::Reference< gallery::XGalleryTheme > SAL_CALL GalleryThemeProvider::insertNewByName( const ::rtl::OUString& rThemeName )
273 throw (container::ElementExistException, uno::RuntimeException)
274 {
275 const ::vos::OGuard aGuard( Application::GetSolarMutex() );
276 uno::Reference< gallery::XGalleryTheme > xRet;
277
278 if( mpGallery )
279 {
280 if( mpGallery->HasTheme( rThemeName ) )
281 {
282 throw container::ElementExistException();
283 }
284 else if( mpGallery->CreateTheme( rThemeName ) )
285 {
286 xRet = new ::unogallery::GalleryTheme( rThemeName );
287 }
288 }
289
290 return xRet;
291 }
292
293 // ------------------------------------------------------------------------------
294
removeByName(const::rtl::OUString & rName)295 void SAL_CALL GalleryThemeProvider::removeByName( const ::rtl::OUString& rName )
296 throw (container::NoSuchElementException, uno::RuntimeException)
297 {
298 const ::vos::OGuard aGuard( Application::GetSolarMutex() );
299
300 if( !mpGallery ||
301 !mpGallery->HasTheme( rName ) ||
302 ( !mbHiddenThemes && mpGallery->GetThemeInfo( rName )->IsHidden() ) )
303 {
304 throw container::NoSuchElementException();
305 }
306 else
307 {
308 mpGallery->RemoveTheme( rName );
309 }
310 }
311
312 }
313