xref: /trunk/main/framework/source/fwe/classes/actiontriggerpropertyset.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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_framework.hxx"
26 
27 #include <classes/actiontriggerpropertyset.hxx>
28 #include <com/sun/star/beans/PropertyAttribute.hpp>
29 #include <cppuhelper/proptypehlp.hxx>
30 #include <cppuhelper/typeprovider.hxx>
31 #include <vcl/svapp.hxx>
32 
33 
34 using namespace cppu;
35 using namespace com::sun::star::uno;
36 using namespace com::sun::star::beans;
37 using namespace com::sun::star::lang;
38 using namespace com::sun::star::awt;
39 
40 //struct SAL_DLLPUBLIC_IMPORT ::cppu::OBroadcastHelperVar< OMultiTypeInterfaceContainerHelper, OMultiTypeInterfaceContainerHelper::keyType >;
41 
42 // Handles for properties
43 // (PLEASE SORT THIS FIELD, IF YOU ADD NEW PROPERTIES!)
44 // We use an enum to define these handles, to use all numbers from 0 to nn and
45 // if you add someone, you don't must control this!
46 // But don't forget to change values of follow defines, if you do something with this enum!
47 enum EPROPERTIES
48 {
49     HANDLE_COMMANDURL,
50     HANDLE_HELPURL,
51     HANDLE_IMAGE,
52     HANDLE_SUBCONTAINER,
53     HANDLE_TEXT,
54     PROPERTYCOUNT
55 };
56 
57 namespace framework
58 {
59 
ActionTriggerPropertySet(const Reference<XMultiServiceFactory> &)60 ActionTriggerPropertySet::ActionTriggerPropertySet( const Reference< XMultiServiceFactory >& /*xServiceManager*/ )
61     : ThreadHelpBase           ( &Application::GetSolarMutex()               )
62     , OBroadcastHelper         ( m_aLock.getShareableOslMutex()              )
63     ,   OPropertySetHelper       ( *SAL_STATIC_CAST( OBroadcastHelper *, this ))
64     , OWeakObject              ()
65     , m_xBitmap                ( 0 )
66     , m_xActionTriggerContainer( 0 )
67 {
68 }
69 
~ActionTriggerPropertySet()70 ActionTriggerPropertySet::~ActionTriggerPropertySet()
71 {
72 }
73 
74 // XInterface
queryInterface(const Type & aType)75 Any SAL_CALL ActionTriggerPropertySet::queryInterface( const Type& aType )
76 {
77     Any a = ::cppu::queryInterface(
78                 aType ,
79                 SAL_STATIC_CAST( XServiceInfo*, this ),
80                 SAL_STATIC_CAST( XTypeProvider*,  this ));
81 
82     if( a.hasValue() )
83         return a;
84     else
85     {
86         a = OPropertySetHelper::queryInterface( aType );
87 
88         if( a.hasValue() )
89             return a;
90     }
91 
92     return OWeakObject::queryInterface( aType );
93 }
94 
acquire()95 void SAL_CALL ActionTriggerPropertySet::acquire() throw ()
96 {
97     OWeakObject::acquire();
98 }
99 
release()100 void SAL_CALL ActionTriggerPropertySet::release() throw ()
101 {
102     OWeakObject::release();
103 }
104 
105 
106 // XServiceInfo
getImplementationName()107 ::rtl::OUString SAL_CALL ActionTriggerPropertySet::getImplementationName()
108 {
109     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLEMENTATIONNAME_ACTIONTRIGGER ));
110 }
111 
supportsService(const::rtl::OUString & ServiceName)112 sal_Bool SAL_CALL ActionTriggerPropertySet::supportsService( const ::rtl::OUString& ServiceName )
113 {
114     if ( ServiceName.equalsAscii( SERVICENAME_ACTIONTRIGGER ))
115         return sal_True;
116 
117     return sal_False;
118 }
119 
getSupportedServiceNames()120 Sequence< ::rtl::OUString > SAL_CALL ActionTriggerPropertySet::getSupportedServiceNames()
121 {
122     Sequence< ::rtl::OUString > seqServiceNames( 1 );
123     seqServiceNames[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME_ACTIONTRIGGER ));
124     return seqServiceNames;
125 }
126 
127 // XTypeProvider
getTypes()128 Sequence< Type > SAL_CALL ActionTriggerPropertySet::getTypes()
129 {
130     // Optimize this method !
131     // We initialize a static variable only one time. And we don't must use a mutex at every call!
132     // For the first call; pTypeCollection is NULL - for the second call pTypeCollection is different from NULL!
133     static ::cppu::OTypeCollection* pTypeCollection = NULL ;
134 
135     if ( pTypeCollection == NULL )
136     {
137         // Ready for multithreading; get global mutex for first call of this method only! see before
138         osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
139 
140         // Control these pointer again ... it can be, that another instance will be faster then these!
141         if ( pTypeCollection == NULL )
142         {
143             // Create a static typecollection ...
144             static ::cppu::OTypeCollection aTypeCollection(
145                         ::getCppuType(( const Reference< XPropertySet           >*)NULL ) ,
146                         ::getCppuType(( const Reference< XFastPropertySet       >*)NULL ) ,
147                         ::getCppuType(( const Reference< XMultiPropertySet      >*)NULL ) ,
148                         ::getCppuType(( const Reference< XServiceInfo           >*)NULL ) ,
149                         ::getCppuType(( const Reference< XTypeProvider          >*)NULL ) ) ;
150 
151             // ... and set his address to static pointer!
152             pTypeCollection = &aTypeCollection ;
153         }
154     }
155 
156     return pTypeCollection->getTypes() ;
157 }
158 
getImplementationId()159 Sequence< sal_Int8 > SAL_CALL ActionTriggerPropertySet::getImplementationId()
160 {
161     // Create one Id for all instances of this class.
162     // Use ethernet address to do this! (sal_True)
163 
164     // Optimize this method
165     // We initialize a static variable only one time. And we don't must use a mutex at every call!
166     // For the first call; pID is NULL - for the second call pID is different from NULL!
167     static ::cppu::OImplementationId* pID = NULL ;
168 
169     if ( pID == NULL )
170     {
171         // Ready for multithreading; get global mutex for first call of this method only! see before
172         osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
173 
174         // Control these pointer again ... it can be, that another instance will be faster then these!
175         if ( pID == NULL )
176         {
177             // Create a new static ID ...
178             static ::cppu::OImplementationId aID( sal_False ) ;
179             // ... and set his address to static pointer!
180             pID = &aID ;
181         }
182     }
183 
184     return pID->getImplementationId() ;
185 }
186 
187 //---------------------------------------------------------------------------------------------------------
188 //  OPropertySetHelper implementation
189 //---------------------------------------------------------------------------------------------------------
190 
convertFastPropertyValue(Any & aConvertedValue,Any & aOldValue,sal_Int32 nHandle,const Any & aValue)191 sal_Bool SAL_CALL ActionTriggerPropertySet::convertFastPropertyValue(
192     Any&        aConvertedValue,
193     Any&        aOldValue,
194     sal_Int32   nHandle,
195     const Any&  aValue  )
196 {
197     //  Check, if value of property will changed in method "setFastPropertyValue_NoBroadcast()".
198     //  Return sal_True, if changed - else return sal_False.
199     //  Attention: Method "impl_tryToChangeProperty()" can throw the IllegalArgumentException !!!
200     //  Initialize return value with sal_False !!!
201     //  (Handle can be invalid)
202     sal_Bool bReturn = sal_False;
203 
204     switch( nHandle )
205     {
206         case HANDLE_COMMANDURL:
207             bReturn = impl_tryToChangeProperty( m_aCommandURL, aValue, aOldValue, aConvertedValue );
208             break;
209 
210         case HANDLE_HELPURL:
211             bReturn = impl_tryToChangeProperty( m_aHelpURL, aValue, aOldValue, aConvertedValue ) ;
212             break;
213 
214         case HANDLE_IMAGE:
215             bReturn = impl_tryToChangeProperty( m_xBitmap, aValue, aOldValue, aConvertedValue ) ;
216             break;
217 
218         case HANDLE_SUBCONTAINER:
219             bReturn = impl_tryToChangeProperty( m_xActionTriggerContainer, aValue, aOldValue, aConvertedValue );
220             break;
221 
222         case HANDLE_TEXT:
223             bReturn = impl_tryToChangeProperty( m_aText, aValue, aOldValue, aConvertedValue ) ;
224             break;
225     }
226 
227     // Return state of operation.
228     return bReturn;
229 }
230 
231 
setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any & aValue)232 void SAL_CALL ActionTriggerPropertySet::setFastPropertyValue_NoBroadcast(
233     sal_Int32 nHandle, const Any& aValue )
234 {
235     ::osl::MutexGuard aGuard( LockHelper::getGlobalLock().getShareableOslMutex() );
236 
237     // Search for right handle ... and try to set property value.
238     switch( nHandle )
239     {
240         case HANDLE_COMMANDURL:
241             aValue >>= m_aCommandURL;
242             break;
243 
244         case HANDLE_HELPURL:
245             aValue >>= m_aHelpURL;
246             break;
247 
248         case HANDLE_IMAGE:
249             aValue >>= m_xBitmap;
250             break;
251 
252         case HANDLE_SUBCONTAINER:
253             aValue >>= m_xActionTriggerContainer;
254             break;
255 
256         case HANDLE_TEXT:
257             aValue >>= m_aText;
258             break;
259     }
260 }
261 
getFastPropertyValue(Any & aValue,sal_Int32 nHandle) const262 void SAL_CALL ActionTriggerPropertySet::getFastPropertyValue(
263     Any& aValue, sal_Int32 nHandle ) const
264 {
265     ::osl::MutexGuard aGuard( LockHelper::getGlobalLock().getShareableOslMutex() );
266 
267     // Search for right handle ... and try to get property value.
268     switch( nHandle )
269     {
270         case HANDLE_COMMANDURL:
271             aValue <<= m_aCommandURL;
272             break;
273 
274         case HANDLE_HELPURL:
275             aValue <<= m_aHelpURL;
276             break;
277 
278         case HANDLE_IMAGE:
279             aValue <<= m_xBitmap;
280             break;
281 
282         case HANDLE_SUBCONTAINER:
283             aValue <<= m_xActionTriggerContainer;
284             break;
285 
286         case HANDLE_TEXT:
287             aValue <<= m_aText;
288             break;
289     }
290 }
291 
getInfoHelper()292 ::cppu::IPropertyArrayHelper& SAL_CALL ActionTriggerPropertySet::getInfoHelper()
293 {
294     // Optimize this method !
295     // We initialize a static variable only one time. And we don't must use a mutex at every call!
296     // For the first call; pInfoHelper is NULL - for the second call pInfoHelper is different from NULL!
297     static OPropertyArrayHelper* pInfoHelper = NULL;
298 
299     if( pInfoHelper == NULL )
300     {
301         // Ready for multithreading
302         ::osl::MutexGuard aGuard( LockHelper::getGlobalLock().getShareableOslMutex() );
303         // Control this pointer again, another instance can be faster then these!
304         if( pInfoHelper == NULL )
305         {
306             // Define static member to give structure of properties to baseclass "OPropertySetHelper".
307             // "impl_getStaticPropertyDescriptor" is a non exported and static function, who will define a static propertytable.
308             // "sal_True" say: Table is sorted by name.
309             static OPropertyArrayHelper aInfoHelper( impl_getStaticPropertyDescriptor(), sal_True );
310             pInfoHelper = &aInfoHelper;
311         }
312     }
313 
314     return (*pInfoHelper);
315 }
316 
getPropertySetInfo()317 Reference< XPropertySetInfo > SAL_CALL ActionTriggerPropertySet::getPropertySetInfo()
318 {
319     // Optimize this method !
320     // We initialize a static variable only one time. And we don't must use a mutex at every call!
321     // For the first call; pInfo is NULL - for the second call pInfo is different from NULL!
322     static Reference< XPropertySetInfo >* pInfo = NULL ;
323 
324     if( pInfo == NULL )
325     {
326         // Ready for multithreading
327         ::osl::MutexGuard aGuard( LockHelper::getGlobalLock().getShareableOslMutex() );
328         // Control this pointer again, another instance can be faster then these!
329         if( pInfo == NULL )
330         {
331             // Create structure of propertysetinfo for baseclass "OPropertySetHelper".
332             // (Use method "getInfoHelper()".)
333             static Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
334             pInfo = &xInfo;
335         }
336     }
337 
338     return (*pInfo);
339 }
340 
impl_getStaticPropertyDescriptor()341 const Sequence< Property > ActionTriggerPropertySet::impl_getStaticPropertyDescriptor()
342 {
343     static const Property pActionTriggerPropertys[] =
344     {
345         Property( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CommandURL"    )), HANDLE_COMMANDURL   , ::getCppuType((::rtl::OUString*)0)                , PropertyAttribute::TRANSIENT  ),
346         Property( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "HelpURL"       )), HANDLE_HELPURL      , ::getCppuType((::rtl::OUString*)0)                , PropertyAttribute::TRANSIENT  ),
347         Property( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Image"        )), HANDLE_IMAGE     , ::getCppuType((Reference<XBitmap>*)0)     , PropertyAttribute::TRANSIENT  ),
348         Property( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "SubContainer"  )), HANDLE_SUBCONTAINER , ::getCppuType((::rtl::OUString*)0)                , PropertyAttribute::TRANSIENT  ),
349         Property( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Text"          )), HANDLE_TEXT         , ::getCppuType((Reference<XInterface>*)0)  , PropertyAttribute::TRANSIENT  )
350     };
351 
352     // Use it to initialize sequence!
353     static const Sequence< Property > seqActionTriggerPropertyDescriptor( pActionTriggerPropertys, PROPERTYCOUNT );
354 
355     // Return static "PropertyDescriptor"
356     return seqActionTriggerPropertyDescriptor ;
357 }
358 
359 
360 //******************************************************************************************************************************
361 //  private method
362 //******************************************************************************************************************************
impl_tryToChangeProperty(const::rtl::OUString & sCurrentValue,const Any & aNewValue,Any & aOldValue,Any & aConvertedValue)363 sal_Bool ActionTriggerPropertySet::impl_tryToChangeProperty(
364     const   ::rtl::OUString&    sCurrentValue   ,
365     const   Any&        aNewValue       ,
366     Any&        aOldValue       ,
367     Any&        aConvertedValue )
368 {
369     // Set default return value if method failed.
370     sal_Bool bReturn = sal_False;
371     // Get new value from any.
372     // IllegalArgumentException() can be thrown!
373     ::rtl::OUString sValue ;
374     convertPropertyValue( sValue, aNewValue );
375 
376     // If value change ...
377     if( sValue != sCurrentValue )
378     {
379         // ... set information of change.
380         aOldValue       <<= sCurrentValue   ;
381         aConvertedValue <<= sValue          ;
382         // Return OK - "value will be change ..."
383         bReturn = sal_True;
384     }
385     else
386     {
387         // ... clear information of return parameter!
388         aOldValue.clear         () ;
389         aConvertedValue.clear   () ;
390         // Return NOTHING - "value will not be change ..."
391         bReturn = sal_False;
392     }
393 
394     return bReturn;
395 }
396 
397 
impl_tryToChangeProperty(const Reference<XBitmap> aCurrentValue,const Any & aNewValue,Any & aOldValue,Any & aConvertedValue)398 sal_Bool ActionTriggerPropertySet::impl_tryToChangeProperty(
399     const Reference< XBitmap >  aCurrentValue   ,
400     const Any&                  aNewValue       ,
401     Any&                        aOldValue       ,
402     Any&                        aConvertedValue )
403 {
404     // Set default return value if method failed.
405     sal_Bool bReturn = sal_False;
406     // Get new value from any.
407     // IllegalArgumentException() can be thrown!
408     Reference< XBitmap > aValue ;
409     convertPropertyValue( aValue, aNewValue );
410 
411     // If value change ...
412     if( aValue != aCurrentValue )
413     {
414         // ... set information of change.
415         aOldValue       <<= aCurrentValue   ;
416         aConvertedValue <<= aValue          ;
417         // Return OK - "value will be change ..."
418         bReturn = sal_True;
419     }
420     else
421     {
422         // ... clear information of return parameter!
423         aOldValue.clear         () ;
424         aConvertedValue.clear   () ;
425         // Return NOTHING - "value will not be change ..."
426         bReturn = sal_False;
427     }
428 
429     return bReturn;
430 }
431 
impl_tryToChangeProperty(const Reference<XInterface> aCurrentValue,const Any & aNewValue,Any & aOldValue,Any & aConvertedValue)432 sal_Bool ActionTriggerPropertySet::impl_tryToChangeProperty(
433     const Reference< XInterface >   aCurrentValue   ,
434     const Any&                      aNewValue       ,
435     Any&                            aOldValue       ,
436     Any&                            aConvertedValue )
437 {
438     // Set default return value if method failed.
439     sal_Bool bReturn = sal_False;
440     // Get new value from any.
441     // IllegalArgumentException() can be thrown!
442     Reference< XInterface > aValue ;
443     convertPropertyValue( aValue, aNewValue );
444 
445     // If value change ...
446     if( aValue != aCurrentValue )
447     {
448         // ... set information of change.
449         aOldValue       <<= aCurrentValue   ;
450         aConvertedValue <<= aValue          ;
451         // Return OK - "value will be change ..."
452         bReturn = sal_True;
453     }
454     else
455     {
456         // ... clear information of return parameter!
457         aOldValue.clear         () ;
458         aConvertedValue.clear   () ;
459         // Return NOTHING - "value will not be change ..."
460         bReturn = sal_False;
461     }
462 
463     return bReturn;
464 }
465 
466 }
467