/**************************************************************
 * 
 * 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_AccessibleTextFrameView_idl__
#define __com_sun_star_text_AccessibleTextFrameView_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_XAccessibleEventBroadcaster_idl__
#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.idl>
#endif

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

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

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

/** The accessible view of text frames.

	 @since OOo 1.1.2
 */
published service AccessibleTextFrameView
{
	/** This interface gives access to any paragraph fragment and table 
	    fragment that is contained in a text frame and at least
		partially visible on the screen.
		
		<ul>
			<li>The parent returned by 
                <method scope="::com::sun::star::accessibility"
                >XAccessibleContext::getAccessibleParent</type> is the
                accessible view of a paragraph if the text frame is bound as
                character, and the accessible view (or of a page in the page
                preview) of the document in any other case.
			<li>The children returned by 
                <method scope="::com::sun::star::accessibility"
                >XAccessibleContext::getAccessibleChild</type> all support the
                interface XAccessible. Calling
				<method scope="::com::sun::star::accessibility"
                >XAccessible::getAccessibleContext</type> for these children
                returns an object that supports one of the following
                services.
				<ul>
					<li><type scope="::com::sun::star::text"
                        >AccessibleParagraphView</type>: A child of this
                        kind is returned for every paragraph fragment that
                        is contained in the document body and is at least
                        partially visible. A paragraph fragment is the part
                        of a paragraph that is displayed on a certain page
                        or a certain column.
					<li><type scope="::com::sun::star::table"
                        >AccessibleTableView</type>: A child of this kind is
                        returned for every table fragment that is contained
                        in the document body and is at least partially
                        visible. A table fragment is the part of a table
                        that is displayed on a certain page or a certain
                        column.
				</ul>
				<p>The logical order of paragraph and table fragments is never
				   changed.
			<li>The role is <const scope="::com::sun::star::accessibility"
                >AccessibleRole::TEXT_FRAME</const>
			<li>The name is the one assigned to the text frame in the text
				document. This means that it is not internationalized.
			<li>The description is the one assigned to the text frame 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.
			<li>There are the two relations CONTENT_FLOWS_FROM and
				CONTENT_FLOWS_TO supported.
		</ul>

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

	/** This interface describes the graphical representation of a 
	  	text frame.
	 */
	interface ::com::sun::star::accessibility::XAccessibleComponent;

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

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

}; }; }; };

#endif
