blob: f049156c5684dfc4544b9cb35dd7b1da292d4efa [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "precompiled_sd.hxx"
#include "tools/PropertySet.hxx"
#include <boost/bind.hpp>
#include <algorithm>
#include <functional>
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using ::rtl::OUString;
namespace sd { namespace tools {
PropertySet::PropertySet (void)
: PropertySetInterfaceBase(m_aMutex),
mpChangeListeners(new ChangeListenerContainer())
{
}
PropertySet::~PropertySet (void)
{
}
void SAL_CALL PropertySet::disposing (void)
{
}
//----- XPropertySet ----------------------------------------------------------
Reference<beans::XPropertySetInfo> SAL_CALL PropertySet::getPropertySetInfo (void)
throw(RuntimeException)
{
return NULL;
}
void SAL_CALL PropertySet::setPropertyValue (
const rtl::OUString& rsPropertyName,
const css::uno::Any& rsPropertyValue)
throw(css::beans::UnknownPropertyException,
css::beans::PropertyVetoException,
css::lang::IllegalArgumentException,
css::lang::WrappedTargetException,
css::uno::RuntimeException)
{
ThrowIfDisposed();
Any aOldValue (SetPropertyValue(rsPropertyName,rsPropertyValue));
if (aOldValue != rsPropertyValue)
{
// Inform listeners that are registered specifically for the
// property and those registered for any property.
beans::PropertyChangeEvent aEvent(
static_cast<XWeak*>(this),
rsPropertyName,
sal_False,
-1,
aOldValue,
rsPropertyValue);
CallListeners(rsPropertyName, aEvent);
CallListeners(OUString(), aEvent);
}
}
Any SAL_CALL PropertySet::getPropertyValue (const OUString& rsPropertyName)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
css::uno::RuntimeException)
{
ThrowIfDisposed();
return GetPropertyValue(rsPropertyName);
}
void SAL_CALL PropertySet::addPropertyChangeListener (
const rtl::OUString& rsPropertyName,
const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
css::uno::RuntimeException)
{
if ( ! rxListener.is())
throw lang::IllegalArgumentException();
if (rBHelper.bDisposed || rBHelper.bInDispose)
return;
mpChangeListeners->insert(
ChangeListenerContainer::value_type(
rsPropertyName,
rxListener));
}
void SAL_CALL PropertySet::removePropertyChangeListener (
const rtl::OUString& rsPropertyName,
const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
throw(beans::UnknownPropertyException,
css::lang::WrappedTargetException,
css::uno::RuntimeException)
{
::std::pair<ChangeListenerContainer::iterator,ChangeListenerContainer::iterator>
aRange (mpChangeListeners->equal_range(rsPropertyName));
ChangeListenerContainer::iterator iListener (
::std::find_if(
aRange.first,
aRange.second,
std::compose1(
std::bind1st(std::equal_to<Reference<beans::XPropertyChangeListener> >(),
rxListener),
std::select2nd<ChangeListenerContainer::value_type>())));
if (iListener != mpChangeListeners->end())
{
mpChangeListeners->erase(iListener);
}
else
{
throw lang::IllegalArgumentException();
}
}
void SAL_CALL PropertySet::addVetoableChangeListener (
const rtl::OUString& rsPropertyName,
const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
css::uno::RuntimeException)
{
// Constraint properties are not supported and thus no vetoable
// listeners.
(void)rsPropertyName;
(void)rxListener;
}
void SAL_CALL PropertySet::removeVetoableChangeListener (
const rtl::OUString& rsPropertyName,
const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener)
throw(css::beans::UnknownPropertyException,
css::lang::WrappedTargetException,
css::uno::RuntimeException)
{
// Constraint properties are not supported and thus no vetoable
// listeners.
(void)rsPropertyName;
(void)rxListener;
}
//-----------------------------------------------------------------------------
void PropertySet::CallListeners (
const rtl::OUString& rsPropertyName,
const beans::PropertyChangeEvent& rEvent)
{
::std::pair<ChangeListenerContainer::iterator,ChangeListenerContainer::iterator>
aRange (mpChangeListeners->equal_range(rsPropertyName));
ChangeListenerContainer::const_iterator iListener;
for (iListener=aRange.first; iListener!=aRange.second; ++iListener)
{
if (iListener->second.is())
iListener->second->propertyChange(rEvent);
}
}
void PropertySet::ThrowIfDisposed (void)
throw (::com::sun::star::lang::DisposedException)
{
if (rBHelper.bDisposed || rBHelper.bInDispose)
{
throw lang::DisposedException (
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
"PropertySet object has already been disposed")),
static_cast<uno::XWeak*>(this));
}
}
} } // end of namespace ::sd::tools