/**************************************************************
 * 
 * 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_XKeyHandler_idl__ 
#define __com_sun_star_awt_XKeyHandler_idl__ 
 
#ifndef __com_sun_star_lang_XEventListener_idl__ 
#include <com/sun/star/lang/XEventListener.idl> 
#endif 
 
#ifndef __com_sun_star_awt_KeyEvent_idl__ 
#include <com/sun/star/awt/KeyEvent.idl> 
#endif 
 
 
module com {  module sun {  module star {  module awt {  

/** This key handler is similar to <type
    scope="::com::sun::star::awt">XKeyListener</type> but allows the
    consumption of key events.  If a key event is consumed by one
    handler both the following handlers, with respect to the list of key
    handlers of the broadcaster, and a following handling by the
    broadcaster will not take place.

    @since OpenOffice 1.1.2
*/
published interface XKeyHandler : ::com::sun::star::lang::XEventListener
{
    /** This function is called by the broadcaster, an <type
        scope="::com::sun::star::awt">XExtendedToolkit</type> for
        instance, after a key has been pressed but before it is released.
        The return value decides about whether other handlers will be
        called and a handling by the broadcaster will take place.

        <p>Consume the event if the action performed by the implementation
        is mutually exclusive with the default action of the broadcaster or,
        when known, with that of other handlers.</p>

        <p>Consuming this event does not prevent the pending key-release
        event from beeing broadcasted.</p>

        @param aEvent
            The key event informs about the pressed key.
        @return
            When <FALSE/> is returned the other handlers are called and a
            following handling of the event by the broadcaster takes place.
            Otherwise, when <TRUE/> is returned, no other handler will be
            called and the broadcaster will take no further actions
            regarding the event.
    */
	boolean keyPressed ([in] com::sun::star::awt::KeyEvent aEvent);
 
    /** This function is called by the broadcaster, an <type
        scope="::com::sun::star::awt">XExtendedToolkit</type> for
        instance, after a key has been pressed and released.  The return
        value decides about whether other handlers will be called and a
        handling by the broadcaster will take place.

        <p>Consume the event if the action performed by the implementation
        is mutualy exclusive with the default action of the broadcaster or,
        when known, with that of other handlers.</p>

        @param aEvent
            The key event informs about the pressed key.
        @return
            When <FALSE/> is returned the other handlers are called and a
            following handling of the event by the broadcaster takes place.
            Otherwise, when <TRUE/> is returned, no other handler will be
            called and the broadcaster will take no further actions
            regarding the event.
    */
	boolean keyReleased ([in] com::sun::star::awt::KeyEvent aEvent); 
}; 
 
}; }; }; };
 
#endif 
