/**************************************************************
 * 
 * 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_AccessibleRadioButton_idl__
#define __com_sun_star_awt_AccessibleRadioButton_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_XAccessibleText_idl__
#include <com/sun/star/accessibility/XAccessibleText.idl>
#endif
#ifndef __com_sun_star_accessibility_XAccessibleAction_idl__
#include <com/sun/star/accessibility/XAccessibleAction.idl>
#endif
#ifndef __com_sun_star_accessibility_XAccessibleValue_idl__
#include <com/sun/star/accessibility/XAccessibleValue.idl>
#endif

module com { module sun { module star { module awt {
    
/** specifies accessibility support for a radio button.

    @since OOo 1.1.2
 */    
published service AccessibleRadioButton
{
    /** This interface gives access to the structural information of a
        radio button:

        <ul>
        <li>Role: The role of a radio button is <const
            scope="com::sun::star::accessibility"
            >AccessibleRole::RADIO_BUTTON</const>.</li>
        <li>Name: The name of a radio button is its localized label.</li>
        <li>Description: The description of a radio button is its localized
            help text.</li>
        <li>Children: There are no children.</li>
        <li>Parent: The parent is the window that contains the radio button.</li>
        <li>Relations: The relations supported by this service are
            <ul>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRelationType::MEMBER_OF</const> is set
                if the object is a member of a group of one or more
                target objects.</li>
            </ul>
            </li>
        <li>States: The states supported by this service are
            <ul>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::CHECKED</const> is set
                if the object is currently checked.</li>
            <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::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 read-only access to the text representation
        of a radio button.
     */
    interface ::com::sun::star::accessibility::XAccessibleText;

    /** This interface gives access to the actions that can be executed for
        a radio button. The supported actions for a radio button are:
        <ul>
        <li>click</li>
        </ul>
     */
    interface ::com::sun::star::accessibility::XAccessibleAction;

    /** This interface gives access to the numerical value of a
        radio button, which is related to the radio button's
        <const scope="com::sun::star::accessibility"
        >AccessibleStateType::CHECKED</const> state.
     */
    interface ::com::sun::star::accessibility::XAccessibleValue;

};
          
}; }; }; };

#endif
