2005-11-02 11:55:02 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 08:41:07 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2005-11-02 11:55:02 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2005-11-02 11:55:02 +00:00
|
|
|
*
|
2008-04-11 08:41:07 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2005-11-02 11:55:02 +00:00
|
|
|
*
|
2008-04-11 08:41:07 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2005-11-02 11:55:02 +00:00
|
|
|
*
|
2008-04-11 08:41:07 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2005-11-02 11:55:02 +00:00
|
|
|
*
|
2008-04-11 08:41:07 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2005-11-02 11:55:02 +00:00
|
|
|
*
|
2008-04-11 08:41:07 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2005-11-02 11:55:02 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 02:27:14 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_canvas.hxx"
|
|
|
|
|
2005-11-02 11:55:02 +00:00
|
|
|
#include <canvas/propertysethelper.hxx>
|
|
|
|
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
|
|
|
|
namespace canvas
|
|
|
|
{
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
void throwUnknown( const ::rtl::OUString& aPropertyName )
|
|
|
|
{
|
|
|
|
throw beans::UnknownPropertyException(
|
|
|
|
::rtl::OUString::createFromAscii("PropertySetHelper: property ") +
|
|
|
|
aPropertyName +
|
|
|
|
::rtl::OUString::createFromAscii(" not found."),
|
|
|
|
uno::Reference< uno::XInterface >()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
void throwVeto( const ::rtl::OUString& aPropertyName )
|
|
|
|
{
|
|
|
|
throw beans::PropertyVetoException(
|
|
|
|
::rtl::OUString::createFromAscii("PropertySetHelper: property ") +
|
|
|
|
aPropertyName +
|
|
|
|
::rtl::OUString::createFromAscii(" access was vetoed."),
|
|
|
|
uno::Reference< uno::XInterface >() );
|
|
|
|
}
|
|
|
|
|
|
|
|
struct EntryComparator
|
|
|
|
{
|
|
|
|
bool operator()( const PropertySetHelper::MapType::MapEntry& rLHS,
|
|
|
|
const PropertySetHelper::MapType::MapEntry& rRHS )
|
|
|
|
{
|
|
|
|
return strcmp( rLHS.maKey,
|
|
|
|
rRHS.maKey ) < 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
PropertySetHelper::PropertySetHelper() :
|
|
|
|
mpMap(),
|
|
|
|
maMapEntries()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
PropertySetHelper::PropertySetHelper( const InputMap& rMap ) :
|
|
|
|
mpMap(),
|
|
|
|
maMapEntries()
|
|
|
|
{
|
|
|
|
initProperties(rMap);
|
|
|
|
}
|
|
|
|
|
|
|
|
void PropertySetHelper::initProperties( const InputMap& rMap )
|
|
|
|
{
|
|
|
|
mpMap.reset();
|
|
|
|
maMapEntries = rMap;
|
|
|
|
|
|
|
|
std::sort( maMapEntries.begin(),
|
|
|
|
maMapEntries.end(),
|
|
|
|
EntryComparator() );
|
|
|
|
|
|
|
|
if( !maMapEntries.empty() )
|
|
|
|
mpMap.reset( new MapType(&maMapEntries[0],
|
|
|
|
maMapEntries.size(),
|
|
|
|
true) );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PropertySetHelper::addProperties( const InputMap& rMap )
|
|
|
|
{
|
|
|
|
InputMap aMerged( getPropertyMap() );
|
|
|
|
aMerged.insert( aMerged.end(),
|
|
|
|
rMap.begin(),
|
|
|
|
rMap.end() );
|
|
|
|
|
|
|
|
initProperties( aMerged );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool PropertySetHelper::isPropertyName( const ::rtl::OUString& aPropertyName ) const
|
|
|
|
{
|
|
|
|
if( !mpMap.get() )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
Callbacks aDummy;
|
|
|
|
return mpMap->lookup( aPropertyName,
|
|
|
|
aDummy );
|
|
|
|
}
|
|
|
|
|
|
|
|
uno::Reference< beans::XPropertySetInfo > PropertySetHelper::getPropertySetInfo() const
|
|
|
|
{
|
|
|
|
// we're a stealth property set
|
|
|
|
return uno::Reference< beans::XPropertySetInfo >();
|
|
|
|
}
|
|
|
|
|
|
|
|
void PropertySetHelper::setPropertyValue( const ::rtl::OUString& aPropertyName,
|
|
|
|
const uno::Any& aValue )
|
|
|
|
{
|
|
|
|
Callbacks aCallbacks;
|
|
|
|
if( !mpMap.get() ||
|
|
|
|
!mpMap->lookup( aPropertyName,
|
|
|
|
aCallbacks ) )
|
|
|
|
{
|
|
|
|
throwUnknown( aPropertyName );
|
|
|
|
}
|
|
|
|
|
|
|
|
if( aCallbacks.setter.empty() )
|
|
|
|
throwVeto( aPropertyName );
|
|
|
|
|
|
|
|
aCallbacks.setter(aValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
uno::Any PropertySetHelper::getPropertyValue( const ::rtl::OUString& aPropertyName ) const
|
|
|
|
{
|
|
|
|
Callbacks aCallbacks;
|
|
|
|
if( !mpMap.get() ||
|
|
|
|
!mpMap->lookup( aPropertyName,
|
|
|
|
aCallbacks ) )
|
|
|
|
{
|
|
|
|
throwUnknown( aPropertyName );
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !aCallbacks.getter.empty() )
|
|
|
|
return aCallbacks.getter();
|
|
|
|
|
|
|
|
// TODO(Q1): subtlety, empty getter method silently returns
|
|
|
|
// the empty any
|
|
|
|
return uno::Any();
|
|
|
|
}
|
|
|
|
|
|
|
|
void PropertySetHelper::addPropertyChangeListener( const ::rtl::OUString& aPropertyName,
|
2006-06-20 01:19:13 +00:00
|
|
|
const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
|
2005-11-02 11:55:02 +00:00
|
|
|
{
|
|
|
|
// check validity of property, but otherwise ignore the
|
|
|
|
// request
|
|
|
|
if( !isPropertyName( aPropertyName ) )
|
|
|
|
throwUnknown( aPropertyName );
|
|
|
|
}
|
|
|
|
|
2006-06-20 01:19:13 +00:00
|
|
|
void PropertySetHelper::removePropertyChangeListener( const ::rtl::OUString& /*aPropertyName*/,
|
|
|
|
const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
|
2005-11-02 11:55:02 +00:00
|
|
|
{
|
|
|
|
// ignore request, no listener added in the first place
|
|
|
|
}
|
|
|
|
|
|
|
|
void PropertySetHelper::addVetoableChangeListener( const ::rtl::OUString& aPropertyName,
|
2006-06-20 01:19:13 +00:00
|
|
|
const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/ )
|
2005-11-02 11:55:02 +00:00
|
|
|
{
|
|
|
|
// check validity of property, but otherwise ignore the
|
|
|
|
// request
|
|
|
|
if( !isPropertyName( aPropertyName ) )
|
|
|
|
throwUnknown( aPropertyName );
|
|
|
|
}
|
|
|
|
|
2006-06-20 01:19:13 +00:00
|
|
|
void PropertySetHelper::removeVetoableChangeListener( const ::rtl::OUString& /*aPropertyName*/,
|
|
|
|
const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/ )
|
2005-11-02 11:55:02 +00:00
|
|
|
{
|
|
|
|
// ignore request, no listener added in the first place
|
|
|
|
}
|
|
|
|
}
|