/**************************************************************
 * 
 * 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_script_XEventAttacherManager_idl__ 
#define __com_sun_star_script_XEventAttacherManager_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_script_ScriptEventDescriptor_idl__ 
#include <com/sun/star/script/ScriptEventDescriptor.idl> 
#endif 
 
#ifndef __com_sun_star_lang_IllegalArgumentException_idl__ 
#include <com/sun/star/lang/IllegalArgumentException.idl> 
#endif 
 
#ifndef __com_sun_star_lang_ServiceNotRegisteredException_idl__ 
#include <com/sun/star/lang/ServiceNotRegisteredException.idl> 
#endif 
 
#ifndef __com_sun_star_script_XScriptListener_idl__ 
#include <com/sun/star/script/XScriptListener.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module script {  
 
//============================================================================= 
/** registers listeners for specified events.
 */
published interface XEventAttacherManager: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	/** registers one event for an object identified by its index.
		
		<p>If any object is attached under this index, then this
		event is attached automatically.</p>
		<p>Exceptions of type
		<type scope="com::sun::star::beans">IntrospectionException</type> and
		<type scope="com::sun::star::script">CannotCreateAdapterException</type>
		that can be thrown by methods of <type>XEventAttacher</type> are caught 
		and ignored.</p>
	 */
	void registerScriptEvent( [in] long nIndex, 
			 [in] com::sun::star::script::ScriptEventDescriptor aScriptEvent ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** registers several events for an object identified by its index. 
		
		<p>The result is the same as if the method <member>registerScriptEvent
		</member> was called once for each <type>ScriptEventDescriptor</type>
		in the sequence.</p>

		<p>If any object is attached under this index, then this
		event is attached automatically (see <member>attach</member>)</p>

		<p>Exceptions of type
		<type scope="com::sun::star::beans">IntrospectionException</type> and 
		<type scope="com::sun::star::script">CannotCreateAdapterException</type> 
		that can be thrown by methods of <type>XEventAttacher</type> are caught 
		and ignored.</p>

		@see registerScriptEvent
		@see attach
	 */
	void registerScriptEvents( [in] long nIndex, 
			 [in] sequence<com::sun::star::script::ScriptEventDescriptor> aScriptEvents ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** revokes the registration of an event. 
		
		<p>The parameters <var>ListenerType</var> and
		<var>EventMethod</var> are equivalent to the first two
		members of the <type>ScriptEventDescriptor</type> 
		used to register events. If this event at this index has
		been attached to any object, it is detached automatically 
		(see <member>attach</member>).</p>

		<p>Exceptions of type
		<type scope="com::sun::star::beans">IntrospectionException</type> and 
		<type scope="com::sun::star::script">CannotCreateAdapterException</type> 
		that can be thrown by methods of <type>XEventAttacher</type> are caught 
		and ignored.</p>

		@see attach
	 */
	void revokeScriptEvent( [in] long nIndex, 
			 [in] string aListenerType, 
			 [in] string aEventMethod, 
			 [in] string aRemoveListenerParam ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** revokes all events which are registered for the given index.

		<p>If the events at this index have been attached to any
		object, they are detached automatically.
		(see <member>attach</member>).</p>

		@see attach
	 */
	void revokeScriptEvents( [in] long nIndex ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** creates an empty entry at the given position. 

		<p>The index <var>n</var> of all entries with <code>n &amp;gt;=
		nIndex</code> will be increased by one.</p>
	 */
	void insertEntry( [in] long nIndex ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** removes the entry at the given position. 
		
		<p>If any events are registered at this index, they will
		be revoked, too. So if the events at this index have been
		attached to any object they are detached automatically.
		(see <member>attach</member>).</p>
		
		@see attach
	 */
	void removeEntry( [in] long nIndex ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** @eturns 
			all events registered for the given object index. 
			  
		@param Index	
			an index previously inserted with the method insertEntry. 
		     
		@throws IllegalArgumentException  
			if Index is not valid.
	 */
	sequence<com::sun::star::script::ScriptEventDescriptor> getScriptEvents( [in] long Index ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** attaches all the <type>ScriptEvent</type>s which are registered 
		for the given index to the given object.
		
		<p>Exceptions of type
		<type scope="com::sun::star::beans">IntrospectionException</type> and 
		<type scope="com::sun::star::script">CannotCreateAdapterException</type> 
		that can be thrown by methods of <type>XEventAttacher</type> are caught 
		and ignored.</p>
	 */
	void attach( [in] long nIndex, 
			 [in] com::sun::star::uno::XInterface xObject, 
			 [in] any aHelper ) 
			raises( com::sun::star::lang::IllegalArgumentException, 
					com::sun::star::lang::ServiceNotRegisteredException ); 
 
	//------------------------------------------------------------------------- 
	/** detaches all the <type>ScriptEvent</type>s from the given object 
		which are registered at this object for the given index.

		<p>Exceptions of type
		<type scope="com::sun::star::beans">IntrospectionException</type> and 
		<type scope="com::sun::star::script">CannotCreateAdapterException</type> 
		that can be thrown by methods of <type>XEventAttacher</type> are caught 
		and ignored.</p>
	 */
	void detach( [in] long nIndex, 
			 [in] com::sun::star::uno::XInterface xObject ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** adds an <type>XScriptListener</type> that will be notified when an
		event takes place. For that a
		<type>ScriptEventDescriptor</type> is registered at and
		attached to an object by an <type>XEventAttacherManager</type>.

       <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 removeScriptListener
	 */
	void addScriptListener( [in] com::sun::star::script::XScriptListener xListener ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
	//------------------------------------------------------------------------- 
	/** removes a <type>XScriptListener</type> from the listener list.
		
		<p>Nothing happens if the listener is not registered.

       <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 addScriptListener
	 */
	void removeScriptListener( [in] com::sun::star::script::XScriptListener Listener ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
