/**************************************************************
 * 
 * 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_AccessibleMenuBar_idl__
#define __com_sun_star_awt_AccessibleMenuBar_idl__

#ifndef __com_sun_star_accessibility_XAccessibleContext_idl__
#include <com/sun/star/accessibility/XAccessibleContext.idl>
#endif
#ifndef __com_sun_star_accessibility_XAccessibleEventBroadcaster_idl__
#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.idl>
#endif
#ifndef __com_sun_star_accessibility_XAccessibleComponent_idl__
#include <com/sun/star/accessibility/XAccessibleComponent.idl>
#endif
#ifndef __com_sun_star_accessibility_XAccessibleExtendedComponent_idl__
#include <com/sun/star/accessibility/XAccessibleExtendedComponent.idl>
#endif
#ifndef __com_sun_star_accessibility_XAccessibleSelection_idl__
#include <com/sun/star/accessibility/XAccessibleSelection.idl>
#endif

module com { module sun { module star { module awt {
    
/** specifies accessibility support for a menu bar.
    
    @since OOo 1.1.2
 */    
published service AccessibleMenuBar
{
    /** This interface gives access to the structural information of a
        menu bar:

        <ul>
        <li>Role: The role of a menu bar is <const
            scope="com::sun::star::accessibility"
            >AccessibleRole::MENU_BAR</const>.</li>
        <li>Name: There is no name.</li>
        <li>Description: The description of a menu bar is its localized
            help text.</li>
        <li>Children: The children of a menu bar are menus, menu items or
            menu separators, whose accessible context supports the services
            <type>AccessibleMenu</type>, <type>AccessibleMenuItem</type> or
            <type>AccessibleMenuSeparator</type>.</li>
        <li>Parent: The parent is the window that contains the menu bar.</li>
        <li>Relations: There are no relations.</li>
        <li>States: The states supported by this service are
            <ul>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::DEFUNC</const>
                is set if the object has already been disposed
                and subsequent calls to this object result in
                <type scope="com::sun::star::lang">DisposedException</type>
                exceptions.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::ENABLED</const> is set
                if the object is enabled.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::FOCUSABLE</const> is always set.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::FOCUSED</const> is set
                if the object currently has the keyboard focus.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::OPAQUE</const> is always set.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::SHOWING</const> is set
                if the object is displayed on the screen.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::VISIBLE</const> is always set.</li>
            </ul>
            </li>
        </ul>
     */
    interface ::com::sun::star::accessibility::XAccessibleContext;
    
    interface ::com::sun::star::accessibility::XAccessibleEventBroadcaster;
    
    interface ::com::sun::star::accessibility::XAccessibleComponent;
    
    interface ::com::sun::star::accessibility::XAccessibleExtendedComponent;

    /** This interface gives access to the selectable children of a
        menu bar.
     */
    interface ::com::sun::star::accessibility::XAccessibleSelection;

};
 
}; }; }; };

#endif
