/**************************************************************
 * 
 * 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_awt_XContainerWindowEventHandler_idl__
#define __com_sun_star_awt_XContainerWindowEventHandler_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif
#ifndef __com_sun_star_awt_XWindow_idl__
#include <com/sun/star/awt/XWindow.idl>
#endif
#ifndef __com_sun_star_lang_WrappedTargetException_idl__
#include <com/sun/star/lang/WrappedTargetException.idl>
#endif


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

module com { module sun { module star { module awt {

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

/** Handles events fired by windows represented by a
    <type scope="com::sun::star::awt">XWindow</type> interface.
 */
published interface XContainerWindowEventHandler : ::com::sun::star::uno::XInterface {

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

    /** Handles an event generated by a window.

        The implementation must be aware that the EventObject argument contains types
        which it is not prepared to handle. Similarly this applies for the MethodName
        argument. In this case the method should simply return false.

        @param xWindow
            the window instance that generated the event. If used in the scope of
            <type scope="com::sun::star::awt">XContainerWindowProvider</type> this
            is the same window instance that was returned by the createContainerWindow
            method when passing the XContainerWindowEventHandler instance receiving the
            event as handler parameter.

        @param EventObject
            an object describing the event which occurred in the window or anything else that
            provides additional information for the event.
            If the event was caused by the window or any of the controls which it contains
            then the any should contain an object derived from
            <type scope="com::sun::star::lang">EventObject</type>. Typically this would be one
            of the several com::sun::star::awt::*Event types.

        @param MethodName
            the name of the function which is to be called.

        @returns
            true if the event was handled, otherwise false.

        @throws com::sun::star::lang::WrappedTargetException
            if the implementation of the method, which is determined by the argument MethodName,
            throws an exception. This exception is then wrapped into a
            <type scope="com::sun::star::lang">WrappedTargetException</type>.

     */
    boolean callHandlerMethod(
        [in] com::sun::star::awt::XWindow xWindow,
        [in] any EventObject,
        [in] string MethodName)
        raises(com::sun::star::lang::WrappedTargetException);


    /** returns a sequence of supported method names

        @returns
            all method names that will be accepted in calls to callHandlerMethod.
     */
    sequence<string> getSupportedMethodNames();
};

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

}; }; }; };

#endif
