/**************************************************************
 * 
 * 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_xmloff.hxx"
#include <com/sun/star/beans/XPropertyState.hpp>
#include "PropertySetMerger.hxx"

using ::rtl::OUString;

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

#ifndef _CPPUHELPER_IMPLBASE1_HXX_
#include <cppuhelper/implbase3.hxx>
#endif

class SvXMLAttrContainerItem_Impl;

class PropertySetMergerImpl : public ::cppu::WeakAggImplHelper3< XPropertySet, XPropertyState, XPropertySetInfo >
{
private:
	Reference< XPropertySet > mxPropSet1;
	Reference< XPropertyState > mxPropSet1State;
	Reference< XPropertySetInfo > mxPropSet1Info;

	Reference< XPropertySet > mxPropSet2;
	Reference< XPropertyState > mxPropSet2State;
	Reference< XPropertySetInfo > mxPropSet2Info;

public:
	PropertySetMergerImpl( const Reference< XPropertySet > rPropSet1, const Reference< XPropertySet > rPropSet2 );
	virtual ~PropertySetMergerImpl();

    // XPropertySet
    virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(RuntimeException);
    virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException);
    virtual Any SAL_CALL getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException);

    // XPropertyState
    virtual PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException);
    virtual Sequence< PropertyState > SAL_CALL getPropertyStates( const Sequence< OUString >& aPropertyName ) throw(UnknownPropertyException, RuntimeException);
    virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException);
    virtual Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException);

    // XPropertySetInfo
    virtual Sequence< Property > SAL_CALL getProperties(  ) throw(RuntimeException);
    virtual Property SAL_CALL getPropertyByName( const OUString& aName ) throw(UnknownPropertyException, RuntimeException);
    virtual sal_Bool SAL_CALL hasPropertyByName( const OUString& Name ) throw(RuntimeException);
};

// --------------------------------------------------------------------
// Interface implementation
// --------------------------------------------------------------------

PropertySetMergerImpl::PropertySetMergerImpl( Reference< XPropertySet > rPropSet1, Reference< XPropertySet > rPropSet2 )
: mxPropSet1( rPropSet1 )
, mxPropSet1State( rPropSet1, UNO_QUERY )
, mxPropSet1Info( rPropSet1->getPropertySetInfo() )
, mxPropSet2( rPropSet2 )
, mxPropSet2State( rPropSet2, UNO_QUERY )
, mxPropSet2Info( rPropSet2->getPropertySetInfo() )
{
}

PropertySetMergerImpl::~PropertySetMergerImpl()
{
}

// XPropertySet
Reference< XPropertySetInfo > SAL_CALL PropertySetMergerImpl::getPropertySetInfo(  ) throw(RuntimeException)
{
	return this;
}

void SAL_CALL PropertySetMergerImpl::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
{
	if( mxPropSet1Info->hasPropertyByName( aPropertyName ) )
	{
		mxPropSet1->setPropertyValue( aPropertyName, aValue );
	}
	else
	{
		mxPropSet2->setPropertyValue( aPropertyName, aValue );
	}
}

Any SAL_CALL PropertySetMergerImpl::getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
	if( mxPropSet1Info->hasPropertyByName( PropertyName ) )
	{
		return mxPropSet1->getPropertyValue( PropertyName );
	}
	else
	{
		return mxPropSet2->getPropertyValue( PropertyName );
	}
}

void SAL_CALL PropertySetMergerImpl::addPropertyChangeListener( const OUString& /*aPropertyName*/, const Reference< XPropertyChangeListener >& /*xListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}

void SAL_CALL PropertySetMergerImpl::removePropertyChangeListener( const OUString& /*aPropertyName*/, const Reference< XPropertyChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}

void SAL_CALL PropertySetMergerImpl::addVetoableChangeListener( const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}

void SAL_CALL PropertySetMergerImpl::removeVetoableChangeListener( const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}

// XPropertyState
PropertyState SAL_CALL PropertySetMergerImpl::getPropertyState( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException)
{
	if( mxPropSet1Info->hasPropertyByName( PropertyName ) )
	{
		if( mxPropSet1State.is() )
		{
			return mxPropSet1State->getPropertyState( PropertyName );
		}
		else
		{
			return PropertyState_DIRECT_VALUE;
		}
	}
	else
	{
		if( mxPropSet2State.is() )
		{
			return mxPropSet2State->getPropertyState( PropertyName );
		}
		else
		{
			return PropertyState_DIRECT_VALUE;
		}
	}
}

Sequence< PropertyState > SAL_CALL PropertySetMergerImpl::getPropertyStates( const Sequence< OUString >& aPropertyName ) throw(UnknownPropertyException, RuntimeException)
{
	const sal_Int32 nCount = aPropertyName.getLength();
	Sequence< PropertyState > aPropStates( nCount );
	PropertyState* pPropStates = aPropStates.getArray();
	const OUString* pPropNames = aPropertyName.getConstArray();

	sal_Int32 nIndex;
	for( nIndex = 0; nIndex < nCount; nIndex++ )
		*pPropStates++ = getPropertyState( *pPropNames++ );

	return aPropStates;
}

void SAL_CALL PropertySetMergerImpl::setPropertyToDefault( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException)
{
	if( mxPropSet1State.is() && mxPropSet1Info->hasPropertyByName( PropertyName ) )
	{
		mxPropSet1State->setPropertyToDefault( PropertyName );
	}
	else
	{
		if( mxPropSet2State.is() )
		{
			mxPropSet2State->setPropertyToDefault( PropertyName );
		}
	}
}

Any SAL_CALL PropertySetMergerImpl::getPropertyDefault( const OUString& aPropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
	if( mxPropSet1State.is() && mxPropSet1Info->hasPropertyByName( aPropertyName ) )
	{
		return mxPropSet1State->getPropertyDefault( aPropertyName );
	}
	else
	{
		if( mxPropSet2State.is() )
		{
			return mxPropSet2State->getPropertyDefault( aPropertyName );
		}
		else
		{
			Any aAny;
			return aAny;
		}
	}
}

// XPropertySetInfo
Sequence< Property > SAL_CALL PropertySetMergerImpl::getProperties() throw(RuntimeException)
{
	Sequence< Property > aProps1( mxPropSet1Info->getProperties() );
	const Property* pProps1 = aProps1.getArray();
	const sal_Int32 nCount1 = aProps1.getLength();

	Sequence< Property > aProps2( mxPropSet1Info->getProperties() );
	const Property* pProps2 = aProps2.getArray();
	const sal_Int32 nCount2 = aProps2.getLength();

	Sequence< Property > aProperties( nCount1 + nCount2 );

	sal_Int32 nIndex;

	Property* pProperties = aProperties.getArray();

	for( nIndex = 0; nIndex < nCount1; nIndex++ )
		*pProperties++ = *pProps1++;

	for( nIndex = 0; nIndex < nCount2; nIndex++ )
		*pProperties++ = *pProps2++;

	return aProperties;
}

Property SAL_CALL PropertySetMergerImpl::getPropertyByName( const OUString& aName ) throw(UnknownPropertyException, RuntimeException)
{
	if( mxPropSet1Info->hasPropertyByName( aName ) )
		return mxPropSet1Info->getPropertyByName( aName );

	return mxPropSet2Info->getPropertyByName( aName );
}

sal_Bool SAL_CALL PropertySetMergerImpl::hasPropertyByName( const OUString& Name ) throw(RuntimeException)
{
	if(mxPropSet1Info->hasPropertyByName( Name ) )
		return sal_True;

	return mxPropSet2Info->hasPropertyByName( Name );
}

Reference< XPropertySet > PropertySetMerger_CreateInstance( Reference< XPropertySet > rPropSet1, Reference< XPropertySet > rPropSet2 ) throw()
{
	return new PropertySetMergerImpl( rPropSet1, rPropSet2 );
}
