xref: /trunk/main/comphelper/inc/comphelper/property.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
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 #ifndef _COMPHELPER_PROPERTY_HXX_
25 #define _COMPHELPER_PROPERTY_HXX_
26 
27 #include <cppuhelper/proptypehlp.hxx>
28 #include <comphelper/extract.hxx>
29 #include <com/sun/star/beans/Property.hpp>
30 #include <com/sun/star/beans/XPropertySet.hpp>
31 #include <functional>
32 #include "comphelper/comphelperdllapi.h"
33 #include "cppu/unotype.hxx"
34 
35 //=========================================================================
36 //= property helper classes
37 //=========================================================================
38 
39 //... namespace comphelper .......................................................
40 namespace comphelper
41 {
42 //.........................................................................
43 
44     namespace starbeans = ::com::sun::star::beans;
45     namespace staruno   = ::com::sun::star::uno;
46 
47 /** compare two properties by name
48 */
49     struct PropertyStringLessFunctor : ::std::binary_function< ::com::sun::star::beans::Property, ::rtl::OUString, bool >
50     {
51         // ................................................................
operator ()comphelper::PropertyStringLessFunctor52         inline bool operator()( const ::com::sun::star::beans::Property& lhs, const ::rtl::OUString& rhs ) const
53         {
54             return lhs.Name.compareTo(rhs) < 0;
55         }
56         // ................................................................
operator ()comphelper::PropertyStringLessFunctor57         inline bool operator()( const ::rtl::OUString& lhs, const ::com::sun::star::beans::Property& rhs ) const
58         {
59             return lhs.compareTo(rhs.Name) < 0;
60         }
61     };
62     //--------------------------------------------------------------------------
63     // comparing two property instances
64     struct PropertyCompareByName : public ::std::binary_function< ::com::sun::star::beans::Property, ::com::sun::star::beans::Property, bool >
65     {
operator ()comphelper::PropertyCompareByName66         bool operator() (const ::com::sun::star::beans::Property& x, const ::com::sun::star::beans::Property& y) const
67         {
68             return x.Name.compareTo(y.Name) < 0;// ? true : false;
69         }
70     };
71 
72     //--------------------------------------------------------------------------
73     /** compare two properties by name
74      */
75     struct PropertyStringEqualFunctor : ::std::binary_function< ::com::sun::star::beans::Property, ::rtl::OUString, bool >
76     {
77         // ................................................................
operator ()comphelper::PropertyStringEqualFunctor78         inline bool operator()( const ::com::sun::star::beans::Property& lhs, const ::rtl::OUString& rhs ) const
79         {
80             return lhs.Name.compareTo(rhs) == 0;
81         }
82         // ................................................................
operator ()comphelper::PropertyStringEqualFunctor83         inline bool operator()( const ::rtl::OUString& lhs, const ::com::sun::star::beans::Property& rhs ) const
84         {
85             return lhs.compareTo(rhs.Name) == 0;
86         }
87     };
88     //--------------------------------------------------------------------------
89     // comparing two property instances
90     struct PropertyEqualByName : public ::std::binary_function< ::com::sun::star::beans::Property, ::com::sun::star::beans::Property, bool >
91     {
operator ()comphelper::PropertyEqualByName92         bool operator() (const ::com::sun::star::beans::Property& x, const ::com::sun::star::beans::Property& y) const
93         {
94             return x.Name.compareTo(y.Name) == 0;
95         }
96     };
97 
98 //------------------------------------------------------------------
99 /** find property with given name
100 
101     @param o_rProp
102     Output parameter receiving the property, if found
103 
104     @param i_rPropName
105     Name of the property to find
106 
107     @return false, if property was not found
108  */
109 COMPHELPER_DLLPUBLIC bool findProperty(starbeans::Property& o_rProp, staruno::Sequence<starbeans::Property>& i_seqProps, const ::rtl::OUString& i_rPropName);
110 
111 //------------------------------------------------------------------
112 /// remove the property with the given name from the given sequence
113 COMPHELPER_DLLPUBLIC void RemoveProperty(staruno::Sequence<starbeans::Property>& seqProps, const ::rtl::OUString& _rPropName);
114 
115 //------------------------------------------------------------------
116 /** within the given property sequence, modify attributes of a special property
117     @param  _rProps         the sequence of properties to search in
118     @param  _sPropName      the name of the property which's attributes should be modified
119     @param  _nAddAttrib     the attributes which should be added
120     @param  _nRemoveAttrib  the attributes which should be removed
121 */
122 COMPHELPER_DLLPUBLIC void ModifyPropertyAttributes(staruno::Sequence<starbeans::Property>& _rProps, const ::rtl::OUString& _sPropName, sal_Int16 _nAddAttrib, sal_Int16 _nRemoveAttrib);
123 
124 //------------------------------------------------------------------
125 /** check if the given set has the given property.
126 */
127 COMPHELPER_DLLPUBLIC sal_Bool hasProperty(const rtl::OUString& _rName, const staruno::Reference<starbeans::XPropertySet>& _rxSet);
128 
129 //------------------------------------------------------------------
130 /** copy properties between property sets, in compliance with the property
131     attributes of the target object
132 */
133 COMPHELPER_DLLPUBLIC void copyProperties(const staruno::Reference<starbeans::XPropertySet>& _rxSource,
134                     const staruno::Reference<starbeans::XPropertySet>& _rxDest);
135 
136 //==================================================================
137 //= property conversion helpers
138 //==================================================================
139 
140 /** helper for implementing ::cppu::OPropertySetHelper::convertFastPropertyValue
141     @param          _rConvertedValue    the conversion result (if successful)
142     @param          _rOldValue          the old value of the property, calculated from _rCurrentValue
143     @param          _rValueToSet        the new value which is about to be set
144     @param          _rCurrentValue      the current value of the property
145     @return         sal_True, if the value could be converted and has changed
146                     sal_False, if the value could be converted and has not changed
147     @exception      InvalidArgumentException thrown if the value could not be converted to the requested type (which is the template argument)
148 */
149 template <typename T>
tryPropertyValue(staruno::Any & _rConvertedValue,staruno::Any & _rOldValue,const staruno::Any & _rValueToSet,const T & _rCurrentValue)150 sal_Bool tryPropertyValue(staruno::Any& /*out*/_rConvertedValue, staruno::Any& /*out*/_rOldValue, const staruno::Any& _rValueToSet, const T& _rCurrentValue)
151 {
152     sal_Bool bModified(sal_False);
153     T aNewValue = T();
154     ::cppu::convertPropertyValue(aNewValue, _rValueToSet);
155     if (aNewValue != _rCurrentValue)
156     {
157         _rConvertedValue <<= aNewValue;
158         _rOldValue <<= _rCurrentValue;
159         bModified = sal_True;
160     }
161     return bModified;
162 }
163 
164 /** helper for implementing ::cppu::OPropertySetHelper::convertFastPropertyValue for enum values
165     @param          _rConvertedValue    the conversion result (if successful)
166     @param          _rOldValue          the old value of the property, calculated from _rCurrentValue
167     @param          _rValueToSet        the new value which is about to be set
168     @param          _rCurrentValue      the current value of the property
169     @return         sal_True, if the value could be converted and has changed
170                     sal_False, if the value could be converted and has not changed
171     @exception      InvalidArgumentException thrown if the value could not be converted to the requested type (which is the template argument)
172 */
173 template <class ENUMTYPE>
tryPropertyValueEnum(staruno::Any & _rConvertedValue,staruno::Any & _rOldValue,const staruno::Any & _rValueToSet,const ENUMTYPE & _rCurrentValue)174 sal_Bool tryPropertyValueEnum(staruno::Any& /*out*/_rConvertedValue, staruno::Any& /*out*/_rOldValue, const staruno::Any& _rValueToSet, const ENUMTYPE& _rCurrentValue)
175 {
176     if (cppu::getTypeFavourUnsigned(&_rCurrentValue).getTypeClass()
177         != staruno::TypeClass_ENUM)
178         return tryPropertyValue(_rConvertedValue, _rOldValue, _rValueToSet, _rCurrentValue);
179 
180     sal_Bool bModified(sal_False);
181     ENUMTYPE aNewValue;
182     ::cppu::any2enum(aNewValue, _rValueToSet);
183         // will throw an exception if not convertible
184 
185     if (aNewValue != _rCurrentValue)
186     {
187         _rConvertedValue <<= aNewValue;
188         _rOldValue <<= _rCurrentValue;
189         bModified = sal_True;
190     }
191     return bModified;
192 }
193 
194 /** helper for implementing ::cppu::OPropertySetHelper::convertFastPropertyValue for boolean properties
195     @param          _rConvertedValue    the conversion result (if successful)
196     @param          _rOldValue          the old value of the property, calculated from _rCurrentValue
197     @param          _rValueToSet        the new value which is about to be set
198     @param          _rCurrentValue      the current value of the property
199     @return         sal_True, if the value could be converted and has changed
200                     sal_False, if the value could be converted and has not changed
201     @exception      InvalidArgumentException thrown if the value could not be converted to a boolean type
202 */
tryPropertyValue(staruno::Any & _rConvertedValue,staruno::Any & _rOldValue,const staruno::Any & _rValueToSet,sal_Bool _bCurrentValue)203 inline sal_Bool tryPropertyValue(staruno::Any& /*out*/_rConvertedValue, staruno::Any& /*out*/_rOldValue, const staruno::Any& _rValueToSet, sal_Bool _bCurrentValue)
204 {
205     sal_Bool bModified(sal_False);
206     sal_Bool bNewValue(sal_False);
207     ::cppu::convertPropertyValue(bNewValue, _rValueToSet);
208     if (bNewValue != _bCurrentValue)
209     {
210         _rConvertedValue.setValue(&bNewValue, ::getBooleanCppuType());
211         _rOldValue.setValue(&_bCurrentValue, ::getBooleanCppuType());
212         bModified = sal_True;
213     }
214     return bModified;
215 }
216 
217 /** helper for implementing ::cppu::OPropertySetHelper::convertFastPropertyValue
218     @param          _rConvertedValue    the conversion result (if successful)
219     @param          _rOldValue          the old value of the property, calculated from _rCurrentValue
220     @param          _rValueToSet        the new value which is about to be set
221     @param          _rCurrentValue      the current value of the property
222     @param          _rExpectedType      the type which the property should have (if not void)
223     @return         sal_True, if the value could be converted and has changed
224                     sal_False, if the value could be converted and has not changed
225     @exception      InvalidArgumentException thrown if the value could not be converted to the requested type (which is the template argument)
226 */
227 COMPHELPER_DLLPUBLIC sal_Bool tryPropertyValue(staruno::Any& _rConvertedValue, staruno::Any& _rOldValue, const staruno::Any& _rValueToSet, const staruno::Any& _rCurrentValue, const staruno::Type& _rExpectedType);
228 
229 //.........................................................................
230 }
231 //... namespace comphelper .......................................................
232 
233 #endif // _COMPHELPER_PROPERTY_HXX_
234