/**************************************************************
 * 
 * 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_text_AccessibleTextEmbeddedObjectView_idl__
#define __com_sun_star_text_AccessibleTextEmbeddedObjectView_idl__

#ifndef __com_sun_star_accessibility_XAccessibleContext_idl__
#include <com/sun/star/accessibility/XAccessibleContext.idl>
#endif

#ifndef __com_sun_star_accessibility_XAccessibleComponent_idl__
#include <com/sun/star/accessibility/XAccessibleComponent.idl>
#endif

#ifndef __com_sun_star_accessibility_XAccessibleImage_idl__
#include <com/sun/star/accessibility/XAccessibleImage.idl>
#endif

#ifndef __com_sun_star_accessibility_XAccessibleEventBroadcaster_idl__
#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.idl>
#endif



//=============================================================================

module com {  module sun {  module star {  module text {

//=============================================================================

/** The accessible view of an inactive embedded object. If an embedded
    object gets active, the active document gets an accessible object
	tree of its own. This tree is not a subtree of the object that supports
	this service but of the document service itself. The tree exist only 
	until the ovject is deactivated.

	 @since OOo 1.1.2
 */
published service AccessibleTextEmbeddedObject
{
	/** This interface comprises the basic accessibility of embedded objects.
		
		<ul>
			<li>The parent returned by 
                <method scope="::com::sun::star::accessibility"
                >XAccessibleContext::getAccessibleParent</method> is the
                accessible view of a paragraph if the embedded object is
                bound as character, and the accessible view of the document
                (or of a page in the page preview) in any other case.
			<li>There are no children returned by
				<method scope="::com::sun::star::accessibility"
                >XAccessibleContext::getAccessibleChild</method>. See above.
			<li>The role is <const scope="::com::sun::star::accessibility"
                >AccessibleRole::EMBEDDED_OBJECT</const>
			<li>The name is the one assigned to the object in the text
				document. This means that it is not internationalized.
			<li>The description is the one assigned to the object in the text
				document. This means that it is not internationalized. If no
				description has been set, the description equals the name.
			<li>There are no relations.
			<li>The following states might be contained in the state set
				returned by <method scope="::com::sun::star::accessibility"
                >XAccessibleContext::getAccessibleStateSet</method>:
				<ul>
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::DEFUNC</const> (indicates that
                        the document window has been closed or the graphic
                        is not existing any longer)
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::EDITABLE</const>
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::ENABLED</const> (always
                        contained)
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::OPAQUE</const>
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::SELECTABLE</const>
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::SELECTED</const>
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::FOCUSABLE</const>
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::FOCUSED</const>
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::SHOWING</const>
					<li><const scope="::com::sun::star::accessibility"
                        >AccessibleStateType::VISIBLE</const>
				</ul>
			<li>The locale is the one the text document itself.
		</ul>

    */
	interface ::com::sun::star::accessibility::XAccessibleContext;

	/** This interface describes the graphical representation of an
	  	embedded object.
    */
	interface ::com::sun::star::accessibility::XAccessibleComponent;

	/** This interface gives access to the object's size and its description.
    */
	interface ::com::sun::star::accessibility::XAccessibleImage;

	/** This is the interface for listeners 
    */
	interface ::com::sun::star::accessibility::XAccessibleEventBroadcaster;
};

//=============================================================================

}; }; }; };

#endif
