/**************************************************************
 * 
 * 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_AccessibleMenuSeparator_idl__
#define __com_sun_star_awt_AccessibleMenuSeparator_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

module com { module sun { module star { module awt {
    
/** specifies accessibility support for a menu separator.

    @since OOo 1.1.2
 */
published service AccessibleMenuSeparator
{
    /** This interface gives access to the structural information of a
        menu separator:

        <ul>
        <li>Role: The role of a menu separator is <const 
            scope="com::sun::star::accessibility"
            >AccessibleRole::SEPARATOR</const>.</li>
        <li>Name: There is no name.</li>
        <li>Description: There is no description.</li>
        <li>Children: There are no children.</li>
        <li>Parent: The parent of a menu separator is a menu bar,
            a popup menu or a menu, whose accessible context supports the
            services <type>AccessibleMenuBar</type>,
            <type>AccessiblePopupMenu</type> or
            <type>AccessibleMenu</type>.</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::OPAQUE</const> is always set.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::SELECTABLE</const> is always set.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::SELECTED</const> is set
                if the object is selected.</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;

};
    
}; }; }; };

#endif
