/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"

#include "propertyset.hxx"

using ::rtl::OUString;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;

namespace comphelper {

// -----------------------------------------------------------------------------
// FastPropertySetInfo
// -----------------------------------------------------------------------------

FastPropertySetInfo::FastPropertySetInfo()
{
}

// -----------------------------------------------------------------------------

FastPropertySetInfo::FastPropertySetInfo( const PropertyVector& rProps )
{
	addProperties( rProps );
}

// -----------------------------------------------------------------------------

FastPropertySetInfo::~FastPropertySetInfo()
{
}

// -----------------------------------------------------------------------------

void FastPropertySetInfo::addProperty( const Property& rProperty )
{
	maProperties.push_back( rProperty );
	maMap[ rProperty.Name ] = maProperties.size() - 1;
}

// -----------------------------------------------------------------------------

void FastPropertySetInfo::addProperties( const PropertyVector& rProps )
{
	sal_uInt32 nIndex = maProperties.size();
	sal_uInt32 nCount = rProps.size();
	maProperties.resize( nIndex + nCount );
	PropertyVector::const_iterator aIter( rProps.begin() );
	while( nCount-- )
	{
		const Property& rProperty = (*aIter++);
		maProperties[nIndex] = rProperty;
		maMap[ rProperty.Name ] = nIndex++;
	}
}

// -----------------------------------------------------------------------------

const Property& FastPropertySetInfo::getProperty( const OUString& aName ) throw (UnknownPropertyException )
{
	PropertyMap::iterator aIter( maMap.find( aName ) );
	if( aIter == maMap.end() )
		throw UnknownPropertyException();
	return maProperties[(*aIter).second];
}

// -----------------------------------------------------------------------------

const Property* FastPropertySetInfo::hasProperty( const OUString& aName )
{
	PropertyMap::iterator aIter( maMap.find( aName ) );
	if( aIter == maMap.end() )
		return 0;
	else
		return &maProperties[(*aIter).second];
}

// -----------------------------------------------------------------------------
// XPropertySetInfo
// -----------------------------------------------------------------------------

Sequence< Property > SAL_CALL FastPropertySetInfo::getProperties() throw (RuntimeException)
{
	return Sequence< Property >( &maProperties[0], maProperties.size() );
}

// -----------------------------------------------------------------------------

Property SAL_CALL FastPropertySetInfo::getPropertyByName( const OUString& aName ) throw (UnknownPropertyException, RuntimeException)
{
	return getProperty( aName );
}

// -----------------------------------------------------------------------------

sal_Bool SAL_CALL FastPropertySetInfo::hasPropertyByName( const OUString& aName ) throw (RuntimeException)
{
	return hasProperty( aName ) != 0 ? sal_True : sal_False;;
}

// -----------------------------------------------------------------------------
// FastPropertySet
// -----------------------------------------------------------------------------

FastPropertySet::FastPropertySet( const rtl::Reference< FastPropertySetInfo >& xInfo )
: mxInfo( xInfo )
{
}

// -----------------------------------------------------------------------------

FastPropertySet::~FastPropertySet()
{
}

// -----------------------------------------------------------------------------
// XPropertySet
// -----------------------------------------------------------------------------

Reference< XPropertySetInfo > SAL_CALL FastPropertySet::getPropertySetInfo(  ) throw (RuntimeException)
{
	return Reference< XPropertySetInfo >( mxInfo.get() );
}

// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
{
	setFastPropertyValue( mxInfo->getProperty( aPropertyName ).Handle, aValue );
}

// -----------------------------------------------------------------------------

Any SAL_CALL FastPropertySet::getPropertyValue( const OUString& aPropertyName ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
{
	return getFastPropertyValue( mxInfo->getProperty( aPropertyName ).Handle );
}

// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::addPropertyChangeListener( const OUString&, const Reference< XPropertyChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}

// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::removePropertyChangeListener( const OUString&, const Reference< XPropertyChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}

// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::addVetoableChangeListener( const OUString&, const Reference< XVetoableChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}

// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::removeVetoableChangeListener( const OUString&, const Reference< XVetoableChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}

// -----------------------------------------------------------------------------
// XMultiPropertySet
// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues ) throw (PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
{
	const OUString* pPropertyNames = aPropertyNames.getConstArray();
	const Any* pValues = aValues.getConstArray();
	sal_Int32 nCount = aPropertyNames.getLength();
	if( nCount != aValues.getLength() )
		throw IllegalArgumentException();

	while( nCount-- )
	{
		const Property* pProperty = mxInfo->hasProperty( *pPropertyNames++ );
		if( pProperty ) try
		{
			setFastPropertyValue( pProperty->Handle, *pValues );
		}
		catch( UnknownPropertyException& )
		{
		}
		pValues++;
	}
}

// -----------------------------------------------------------------------------

Sequence< Any > SAL_CALL FastPropertySet::getPropertyValues( const Sequence< OUString >& aPropertyNames ) throw (RuntimeException)
{
	sal_Int32 nCount = aPropertyNames.getLength();
	Sequence< Any > aValues( nCount );

	const OUString* pPropertyNames = aPropertyNames.getConstArray();
	Any* pValues = aValues.getArray();
	while( nCount-- )
	{
		const Property* pProperty = mxInfo->hasProperty( *pPropertyNames++ );
		if( pProperty ) try
		{
			*pValues = getFastPropertyValue( pProperty->Handle );
		}
		catch( UnknownPropertyException& )
		{
		}
		pValues++;
	}
	return aValues;
}

// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::addPropertiesChangeListener( const Sequence< OUString >&, const Reference< XPropertiesChangeListener >& ) throw (RuntimeException)
{
}

// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& ) throw (RuntimeException)
{
}

// -----------------------------------------------------------------------------

void SAL_CALL FastPropertySet::firePropertiesChangeEvent( const Sequence< OUString >&, const Reference< XPropertiesChangeListener >& ) throw (RuntimeException)
{
}

}
