xref: /aoo4110/main/sd/source/ui/tools/PropertySet.cxx (revision b1cdbd2c)
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 #include "precompiled_sd.hxx"
25 
26 #include "tools/PropertySet.hxx"
27 #include <boost/bind.hpp>
28 #include <algorithm>
29 #include <functional>
30 
31 using namespace ::com::sun::star;
32 using namespace ::com::sun::star::uno;
33 using ::rtl::OUString;
34 
35 namespace sd { namespace tools {
36 
PropertySet(void)37 PropertySet::PropertySet (void)
38     : PropertySetInterfaceBase(m_aMutex),
39       mpChangeListeners(new ChangeListenerContainer())
40 {
41 }
42 
43 
44 
45 
~PropertySet(void)46 PropertySet::~PropertySet (void)
47 {
48 }
49 
50 
51 
52 
disposing(void)53 void SAL_CALL PropertySet::disposing (void)
54 {
55 }
56 
57 //----- XPropertySet ----------------------------------------------------------
58 
getPropertySetInfo(void)59 Reference<beans::XPropertySetInfo> SAL_CALL PropertySet::getPropertySetInfo (void)
60     throw(RuntimeException)
61 {
62     return NULL;
63 }
64 
65 
66 
67 
setPropertyValue(const rtl::OUString & rsPropertyName,const css::uno::Any & rsPropertyValue)68 void SAL_CALL PropertySet::setPropertyValue (
69     const rtl::OUString& rsPropertyName,
70     const css::uno::Any& rsPropertyValue)
71     throw(css::beans::UnknownPropertyException,
72         css::beans::PropertyVetoException,
73         css::lang::IllegalArgumentException,
74         css::lang::WrappedTargetException,
75         css::uno::RuntimeException)
76 {
77     ThrowIfDisposed();
78 
79     Any aOldValue (SetPropertyValue(rsPropertyName,rsPropertyValue));
80     if (aOldValue != rsPropertyValue)
81     {
82         // Inform listeners that are registered specifically for the
83         // property and those registered for any property.
84         beans::PropertyChangeEvent aEvent(
85             static_cast<XWeak*>(this),
86             rsPropertyName,
87             sal_False,
88             -1,
89             aOldValue,
90             rsPropertyValue);
91         CallListeners(rsPropertyName, aEvent);
92         CallListeners(OUString(), aEvent);
93     }
94 }
95 
96 
97 
98 
getPropertyValue(const OUString & rsPropertyName)99 Any SAL_CALL PropertySet::getPropertyValue (const OUString& rsPropertyName)
100         throw(css::beans::UnknownPropertyException,
101             css::lang::WrappedTargetException,
102             css::uno::RuntimeException)
103 {
104     ThrowIfDisposed();
105 
106     return GetPropertyValue(rsPropertyName);
107 }
108 
109 
110 
111 
addPropertyChangeListener(const rtl::OUString & rsPropertyName,const css::uno::Reference<css::beans::XPropertyChangeListener> & rxListener)112 void SAL_CALL PropertySet::addPropertyChangeListener (
113     const rtl::OUString& rsPropertyName,
114     const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
115     throw(css::beans::UnknownPropertyException,
116         css::lang::WrappedTargetException,
117         css::uno::RuntimeException)
118 {
119     if ( ! rxListener.is())
120         throw lang::IllegalArgumentException();
121 
122     if (rBHelper.bDisposed || rBHelper.bInDispose)
123         return;
124 
125     mpChangeListeners->insert(
126         ChangeListenerContainer::value_type(
127             rsPropertyName,
128             rxListener));
129 }
130 
131 
132 
133 
removePropertyChangeListener(const rtl::OUString & rsPropertyName,const css::uno::Reference<css::beans::XPropertyChangeListener> & rxListener)134 void SAL_CALL PropertySet::removePropertyChangeListener (
135     const rtl::OUString& rsPropertyName,
136     const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
137     throw(beans::UnknownPropertyException,
138         css::lang::WrappedTargetException,
139         css::uno::RuntimeException)
140 {
141     ::std::pair<ChangeListenerContainer::iterator,ChangeListenerContainer::iterator>
142         aRange (mpChangeListeners->equal_range(rsPropertyName));
143 
144     ChangeListenerContainer::iterator iListener (
145         ::std::find_if(
146             aRange.first,
147             aRange.second,
148             std::compose1(
149                 std::bind1st(std::equal_to<Reference<beans::XPropertyChangeListener> >(),
150                     rxListener),
151                 std::select2nd<ChangeListenerContainer::value_type>())));
152     if (iListener != mpChangeListeners->end())
153     {
154         mpChangeListeners->erase(iListener);
155     }
156     else
157     {
158         throw lang::IllegalArgumentException();
159     }
160 }
161 
162 
163 
164 
addVetoableChangeListener(const rtl::OUString & rsPropertyName,const css::uno::Reference<css::beans::XVetoableChangeListener> & rxListener)165 void SAL_CALL PropertySet::addVetoableChangeListener (
166     const rtl::OUString& rsPropertyName,
167     const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener)
168     throw(css::beans::UnknownPropertyException,
169         css::lang::WrappedTargetException,
170         css::uno::RuntimeException)
171 {
172     // Constraint properties are not supported and thus no vetoable
173     // listeners.
174     (void)rsPropertyName;
175     (void)rxListener;
176 }
177 
178 
179 
180 
removeVetoableChangeListener(const rtl::OUString & rsPropertyName,const css::uno::Reference<css::beans::XVetoableChangeListener> & rxListener)181 void SAL_CALL PropertySet::removeVetoableChangeListener (
182     const rtl::OUString& rsPropertyName,
183     const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener)
184     throw(css::beans::UnknownPropertyException,
185         css::lang::WrappedTargetException,
186         css::uno::RuntimeException)
187 {
188     // Constraint properties are not supported and thus no vetoable
189     // listeners.
190     (void)rsPropertyName;
191     (void)rxListener;
192 }
193 
194 
195 
196 
197 //-----------------------------------------------------------------------------
198 
CallListeners(const rtl::OUString & rsPropertyName,const beans::PropertyChangeEvent & rEvent)199 void PropertySet::CallListeners (
200     const rtl::OUString& rsPropertyName,
201     const beans::PropertyChangeEvent& rEvent)
202 {
203     ::std::pair<ChangeListenerContainer::iterator,ChangeListenerContainer::iterator>
204         aRange (mpChangeListeners->equal_range(rsPropertyName));
205     ChangeListenerContainer::const_iterator iListener;
206     for (iListener=aRange.first; iListener!=aRange.second; ++iListener)
207     {
208         if (iListener->second.is())
209             iListener->second->propertyChange(rEvent);
210     }
211 }
212 
213 
214 
215 
ThrowIfDisposed(void)216 void PropertySet::ThrowIfDisposed (void)
217     throw (::com::sun::star::lang::DisposedException)
218 {
219 	if (rBHelper.bDisposed || rBHelper.bInDispose)
220 	{
221         throw lang::DisposedException (
222             ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
223                 "PropertySet object has already been disposed")),
224             static_cast<uno::XWeak*>(this));
225     }
226 }
227 
228 } } // end of namespace ::sd::tools
229