/**************************************************************
 * 
 * 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_AccessibleWindow_idl__
#define __com_sun_star_awt_AccessibleWindow_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 window.
    
    @since OOo 1.1.2
 */
published service AccessibleWindow
{
    /** This interface gives access to the structural information of a window:

        <ul>
        <li>Role: The role of a window is not fixed. A window may have
            one of the following roles:
            <ul>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRole::DIALOG</const></li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRole::FRAME</const></li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRole::LAYERED_PANE</const></li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRole::PANEL</const></li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRole::ROOT_PANE</const></li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRole::SCROLL_PANE</const></li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRole::SPLIT_PANE</const></li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleRole::WINDOW</const></li>
            <li>...</li>               
            </ul>
            </li>     
        <li>Name: The name of a window is its localized title.</li>
        <li>Description: The description of a window is its localized
            help text.</li>
        <li>Children: The children of a window are the child windows.</li>
        <li>Parent: The parent of a window is the parent window.</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::ACTIVE</const> is set
                if the object is currently the active object.</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::MODAL</const> is set
                if the object is modal.</li>
            <li><const scope="com::sun::star::accessibility"
                >AccessibleStateType::RESIZABLE</const> is set
                if the size of the object is not fixed.</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
