/**************************************************************
 * 
 * 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_AccessibleEdit_idl__
#define __com_sun_star_awt_AccessibleEdit_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_XAccessibleEditableText_idl__
#include <com/sun/star/accessibility/XAccessibleEditableText.idl>
#endif

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

        <ul>
        <li>Role: The role of an edit is <const
            scope="com::sun::star::accessibility"
            >AccessibleRole::TEXT</const>.
            If the text content of the edit is password protected
            the role is <const scope="com::sun::star::accessibility"
            >AccessibleRole::PASSWORD_TEXT</const>.</li>
        <li>Name: If the relation of type <const
            scope="com::sun::star::accessibility"
            >AccessibleRelationType::LABELED_BY</const> is set,
            the name of the edit is the localized label of the target
            object, otherwise there is no name.</li>
        <li>Description: The description of an edit is its localized
            help text.</li>
        <li>Children: There are no children.</li>
        <li>Parent: The parent is the window that contains the edit.</li>
        <li>Relations: The relations supported by this service are
            <ul>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRelationType::LABELED_BY</const> is set
                if the object is labeled by 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::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::EDITABLE</const> is set
                if the content of the object can be changed by the user.</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 an edit.
     */
    interface ::com::sun::star::accessibility::XAccessibleText;
    
    /** This interface extends the
        <type scope="com::sun::star::accessibility">XAccessibleText</type>
        interface and gives read and write access to the text representation
        of an edit.
     */
    interface ::com::sun::star::accessibility::XAccessibleEditableText;
};

}; }; }; };

#endif
