xref: /trunk/main/chart2/source/tools/ImplOPropertySet.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_charttools.hxx"
26 #include "ImplOPropertySet.hxx"
27 #include "CloneHelper.hxx"
28 
29 #include <algorithm>
30 #include <functional>
31 #include <iterator>
32 #include <com/sun/star/beans/XFastPropertySet.hpp>
33 
34 using namespace ::com::sun::star;
35 
36 using ::rtl::OUString;
37 using ::com::sun::star::uno::Sequence;
38 using ::com::sun::star::uno::Reference;
39 using ::com::sun::star::uno::Any;
40 
41 namespace
42 {
43 
44 struct lcl_getPropertyStateByHandle :
45         public ::std::unary_function< sal_Int32,  beans::PropertyState >
46 {
lcl_getPropertyStateByHandle__anonc39fe63c0111::lcl_getPropertyStateByHandle47     lcl_getPropertyStateByHandle(
48         const ::property::impl::ImplOPropertySet::tPropertyMap & rMap )
49             : m_rMap( rMap )
50     {}
51 
operator ()__anonc39fe63c0111::lcl_getPropertyStateByHandle52     inline beans::PropertyState operator() ( sal_Int32 nHandle )
53     {
54         if( m_rMap.end() == m_rMap.find( nHandle ))
55             return beans::PropertyState_DEFAULT_VALUE;
56         return beans::PropertyState_DIRECT_VALUE;
57     }
58 
59 private:
60     const ::property::impl::ImplOPropertySet::tPropertyMap & m_rMap;
61 };
62 
63 template< typename K, typename V >
64 struct lcl_eraseMapEntry :
65         public ::std::unary_function< K, void >
66 {
lcl_eraseMapEntry__anonc39fe63c0111::lcl_eraseMapEntry67     lcl_eraseMapEntry( ::std::map< K, V > & rMap )
68             : m_rMap( rMap )
69     {}
70 
operator ()__anonc39fe63c0111::lcl_eraseMapEntry71     inline void operator() ( const K & aKey )
72     {
73         m_rMap.erase( aKey );
74     }
75 
76 private:
77     ::std::map< K, V > m_rMap;
78 };
79 
80 struct lcl_replaceInterfacePropertiesByClones :
81     public ::std::unary_function< ::property::impl::ImplOPropertySet::tPropertyMap::value_type, void >
82 {
operator ()__anonc39fe63c0111::lcl_replaceInterfacePropertiesByClones83     inline void operator() ( ::property::impl::ImplOPropertySet::tPropertyMap::value_type & rProp )
84     {
85         if( rProp.second.hasValue() &&
86             rProp.second.getValueType().getTypeClass() == uno::TypeClass_INTERFACE )
87         {
88             Reference< util::XCloneable > xCloneable;
89             if( rProp.second >>= xCloneable )
90                 rProp.second <<= xCloneable->createClone();
91         }
92     }
93 };
94 
95 } //  anonymous namespace
96 
97 namespace property
98 {
99 namespace impl
100 {
101 
ImplOPropertySet()102 ImplOPropertySet::ImplOPropertySet()
103 {}
104 
ImplOPropertySet(const ImplOPropertySet & rOther)105 ImplOPropertySet::ImplOPropertySet( const ImplOPropertySet & rOther )
106 {
107     ::std::copy( rOther.m_aProperties.begin(), rOther.m_aProperties.end(),
108                  ::std::inserter( m_aProperties, m_aProperties.begin() ));
109     cloneInterfaceProperties();
110     m_xStyle.set( ::chart::CloneHelper::CreateRefClone< Reference< style::XStyle > >()( rOther.m_xStyle ));
111 }
112 
GetPropertyStateByHandle(sal_Int32 nHandle) const113 beans::PropertyState ImplOPropertySet::GetPropertyStateByHandle( sal_Int32 nHandle ) const
114 {
115     return lcl_getPropertyStateByHandle( m_aProperties ) ( nHandle );
116 }
117 
GetPropertyStatesByHandle(const::std::vector<sal_Int32> & aHandles) const118 Sequence< beans::PropertyState > ImplOPropertySet::GetPropertyStatesByHandle(
119     const ::std::vector< sal_Int32 > & aHandles ) const
120 {
121     Sequence< beans::PropertyState > aResult( aHandles.size());
122 
123     ::std::transform( aHandles.begin(), aHandles.end(),
124                       aResult.getArray(),
125                       lcl_getPropertyStateByHandle( m_aProperties ));
126 
127     return aResult;
128 }
129 
SetPropertyToDefault(sal_Int32 nHandle)130 void ImplOPropertySet::SetPropertyToDefault( sal_Int32 nHandle )
131 {
132     tPropertyMap::iterator aFoundIter( m_aProperties.find( nHandle ) );
133 
134     if( m_aProperties.end() != aFoundIter )
135     {
136         m_aProperties.erase( aFoundIter );
137     }
138 }
139 
SetPropertiesToDefault(const::std::vector<sal_Int32> & aHandles)140 void ImplOPropertySet::SetPropertiesToDefault(
141     const ::std::vector< sal_Int32 > & aHandles )
142 {
143     ::std::for_each( aHandles.begin(), aHandles.end(),
144                      lcl_eraseMapEntry< sal_Int32, Any >( m_aProperties ) );
145 }
146 
SetAllPropertiesToDefault()147 void ImplOPropertySet::SetAllPropertiesToDefault()
148 {
149     m_aProperties.clear();
150 }
151 
GetPropertyValueByHandle(Any & rValue,sal_Int32 nHandle) const152 bool ImplOPropertySet::GetPropertyValueByHandle(
153     Any & rValue,
154     sal_Int32 nHandle ) const
155 {
156     bool bResult = false;
157 
158     tPropertyMap::const_iterator aFoundIter( m_aProperties.find( nHandle ) );
159 
160     if( m_aProperties.end() != aFoundIter )
161     {
162         rValue = (*aFoundIter).second;
163         bResult = true;
164     }
165 
166     return bResult;
167 }
168 
SetPropertyValueByHandle(sal_Int32 nHandle,const Any & rValue,Any * pOldValue)169 void ImplOPropertySet::SetPropertyValueByHandle(
170     sal_Int32 nHandle, const Any & rValue, Any * pOldValue )
171 {
172     if( pOldValue != NULL )
173     {
174         tPropertyMap::const_iterator aFoundIter( m_aProperties.find( nHandle ) );
175         if( m_aProperties.end() != aFoundIter )
176             (*pOldValue) = (*aFoundIter).second;
177     }
178 
179     m_aProperties[ nHandle ] = rValue;
180 }
181 
SetStyle(const Reference<style::XStyle> & xStyle)182 bool ImplOPropertySet::SetStyle( const Reference< style::XStyle > & xStyle )
183 {
184     if( ! xStyle.is())
185         return false;
186 
187     m_xStyle = xStyle;
188     return true;
189 }
190 
GetStyle() const191 Reference< style::XStyle > ImplOPropertySet::GetStyle() const
192 {
193     return m_xStyle;
194 }
195 
cloneInterfaceProperties()196 void ImplOPropertySet::cloneInterfaceProperties()
197 {
198     ::std::for_each( m_aProperties.begin(), m_aProperties.end(),
199                      lcl_replaceInterfacePropertiesByClones());
200 }
201 
202 
203 } //  namespace impl
204 } //  namespace chart
205