/**************************************************************
 * 
 * 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_XPropertySet_idl__ 
#define __com_sun_star_beans_XPropertySet_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_UnknownPropertyException_idl__ 
#include <com/sun/star/beans/UnknownPropertyException.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_XPropertyChangeListener_idl__ 
#include <com/sun/star/beans/XPropertyChangeListener.idl> 
#endif 
 
#ifndef __com_sun_star_beans_XVetoableChangeListener_idl__ 
#include <com/sun/star/beans/XVetoableChangeListener.idl> 
#endif 
 
 
//============================================================================= 
 
module com {  module sun {  module star {  module beans {  
 
//============================================================================= 
 
/** provides information about and access to the 
	properties from an implementation. 
	
	<p>There are three types of properties: </p>

	<ul>
		<li>bound properties </li>
		<li>constrained properties </li>
		<li>free properties </li>
	</ul>
	
	<p>You can listen to changes of bound properties with the 
	<type>XPropertyChangeListener</type> and you can veto changes 
	of constrained properties with the <type>XVetoableChangeListener</type>.  </p>

	<p>To implement inaccurate name access, you must support the 
	interface <type>XExactName</type>. </p>

	@see com::sun::star::beans::XExactName
 */
published interface XPropertySet: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
			the <type>XPropertySetInfo</type> interface, which  
			describes all properties of the object which supplies this 
			interface. 
			 
		@returns	 
			<const>NULL</const> if the implementation cannot or will  
			not provide information about the properties; otherwise the  
			interface <type>XPropertySetInfo</type> is returned.
	 */
	com::sun::star::beans::XPropertySetInfo getPropertySetInfo(); 
 
	//------------------------------------------------------------------------- 
	 
	/** sets the value of the property with the specified name.
		
		<p>If it is a bound property the value will be changed before 
		the change event is fired.  If it is a constrained property 
		a vetoable event is fired before the property value can be
		changed.  </p>

		@throws com::sun::star::beans::PropertyVetoException
			if the property is read-only or vetoable
			and one of the listeners throws this exception
			because of an unaccepted new value.
	 */
	void setPropertyValue( [in] string aPropertyName, 
			 [in] any aValue ) 
			raises( com::sun::star::beans::UnknownPropertyException, 
					com::sun::star::beans::PropertyVetoException, 
					com::sun::star::lang::IllegalArgumentException, 
					com::sun::star::lang::WrappedTargetException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns 
			the value of the property with the specified name. 
				 
		@param PropertyName	 
			This parameter specifies the name of the property. 
		 
		@throws UnknownPropertyException	 
			if the property does not exist. 
				 
		@throws com::sun::star::lang::WrappedTargetException  
			if the implementation has an internal reason for the exception. 
			In this case the original exception is wrapped into that 
			<type scope="com::sun::star::lang">WrappedTargetException</type>.
	 */
	any getPropertyValue( [in] string PropertyName ) 
			raises( com::sun::star::beans::UnknownPropertyException, 
					com::sun::star::lang::WrappedTargetException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** adds an <type>XPropertyChangeListener</type> to the specified property.
		
		<p>An empty name ("") registers the listener to all bound 
		properties. If the property is not bound, the behavior is 
		not specified.  </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.

		@see removePropertyChangeListener
	 */
	void addPropertyChangeListener( [in] string aPropertyName, 
			 [in] com::sun::star::beans::XPropertyChangeListener xListener ) 
			raises( com::sun::star::beans::UnknownPropertyException, 
					com::sun::star::lang::WrappedTargetException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** removes an <type>XPropertyChangeListener</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.

		@see addPropertyChangeListener
	 */
	void removePropertyChangeListener( [in] string aPropertyName, 
			 [in] com::sun::star::beans::XPropertyChangeListener aListener ) 
			raises( com::sun::star::beans::UnknownPropertyException, 
					com::sun::star::lang::WrappedTargetException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** adds an <type>XVetoableChangeListener</type> to the specified 
		property with the name PropertyName.
		
		<p>An empty name ("") registers the listener to all 
		constrained properties. If the property is not constrained, 
		the behavior is not specified.  </p>

		@see removeVetoableChangeListener
	 */
	void addVetoableChangeListener( [in] string PropertyName, 
			 [in] com::sun::star::beans::XVetoableChangeListener aListener ) 
			raises( com::sun::star::beans::UnknownPropertyException, 
					com::sun::star::lang::WrappedTargetException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** removes an <type>XVetoableChangeListener</type> from the 
		listener list.
		
		<p>It is a "noop" if the listener is not registered.  </p>

		@see addVetoableChangeListener
	 */
	void removeVetoableChangeListener( [in] string PropertyName, 
			 [in] com::sun::star::beans::XVetoableChangeListener aListener ) 
			raises( com::sun::star::beans::UnknownPropertyException, 
					com::sun::star::lang::WrappedTargetException ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
