/**************************************************************
 * 
 * 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 OpenOffice 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
