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


#ifndef __com_sun_star_beans_XMultiPropertySet_idl__
#define __com_sun_star_beans_XMultiPropertySet_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_beans_XPropertySetInfo_idl__
#include <com/sun/star/beans/XPropertySetInfo.idl>
#endif

#ifndef __com_sun_star_beans_PropertyVetoException_idl__
#include <com/sun/star/beans/PropertyVetoException.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

#ifndef __com_sun_star_lang_WrappedTargetException_idl__
#include <com/sun/star/lang/WrappedTargetException.idl>
#endif

#ifndef __com_sun_star_beans_XPropertiesChangeListener_idl__
#include <com/sun/star/beans/XPropertiesChangeListener.idl>
#endif


//=============================================================================

module com {  module sun {  module star {  module beans {

//=============================================================================

/** provides access to multiple properties with a single call.
 */
published interface XMultiPropertySet: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------

	/** @returns
			the <type>XPropertySetInfo</type> interface, which describes
			all properties of the object to which this interface belongs.
			<const>NULL</const> is returned if the object cannot or will
			not provide information about the properties.

		@see XPropertySet::getPropertySetInfo
	 */
	com::sun::star::beans::XPropertySetInfo getPropertySetInfo();

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

	/** sets the values to the properties with the specified names.

		<p>The values of the properties must change before the bound
		events are fired. The values of the constrained properties
		should change after the vetoable events are fired and only if no
		exception occurred. Unknown properties are ignored.  </p>

		@param aPropertyNames
			specifies the names of the properties. All names must be unique.
			This sequence must be alphabetically sorted.

		@param aValues
			contains the new values of the properties. The order is the same
			as in <var>aPropertyNames</var>.

		@throws IllegalArgumentException
			if one of the new values cannot be converted to the type
			of the underlying property by an identity or widening conversion.

		@throws com::sun::star::lang:WrappedTargetException
			if the implementation has an internal reason for the exception.
			In this case the original exception is wrapped.
	 */
	void setPropertyValues( [in] sequence<string> aPropertyNames,
			 [in] sequence<any> aValues )
			raises( com::sun::star::beans::PropertyVetoException,
					com::sun::star::lang::IllegalArgumentException,
					com::sun::star::lang::WrappedTargetException );

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

	/** @returns
			a sequence of all values of the properties which are specified by their names.

		<p>The order of the values in the returned sequence will be the same
		as the order of the names in the argument. </p>

		@param aPropertyNames
			specifies the names of the properties.
			This sequence must be alphabetically sorted.
	 */
	sequence<any> getPropertyValues( [in] sequence<string> aPropertyNames );

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

	/** adds an <type>XPropertiesChangeListener</type> to the
		specified property with the specified names.

		<p>The implementation can ignore the names of the properties
		and fire the event on all properties. </p>

		<p>It is suggested to allow multiple registration of the same listener,
		thus for each time a listener is added, it has to be removed.

		@param aPropertyNames
			specifies the names of the properties.

		@param xListener
			contains the listener for the property change events.

		@see removePropertiesChangeListener
	 */
	[oneway] void addPropertiesChangeListener( [in] sequence<string> aPropertyNames,
			 [in] com::sun::star::beans::XPropertiesChangeListener xListener );

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

	/** removes an <type>XPropertiesChangeListener</type> from the listener list.

		<p>It is a "noop" if the listener is not registered.  </p>

		<p>It is suggested to allow multiple registration of the same listener,
		thus for each time a listener is added, it has to be removed.

		@param
			contains the listener to be removed.

		@see addPropertiesChangeListener
	 */
	[oneway] void removePropertiesChangeListener( [in] com::sun::star::beans::XPropertiesChangeListener xListener );

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

	/** fires a sequence of <type>PropertyChangeEvent</type>s to the specified
		listener.

		@param aPropertynames
			specifies the sorted names of the properties.

		@param xListener
			contains the listener for the property change events.
	 */
	[oneway] void firePropertiesChangeEvent( [in] sequence<string> aPropertyNames,
			 [in] com::sun::star::beans::XPropertiesChangeListener xListener );

};

//=============================================================================

}; }; }; };

#endif
