/**************************************************************
 * 
 * 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_accessibility_XAccessibleMultiLineText_idl__
#define __com_sun_star_accessibility_XAccessibleMultiLineText_idl__

#ifndef __com_sun_star_accessibility_XAccessibleText_idl__ 
#include <com/sun/star/accessibility/XAccessibleText.idl> 
#endif 
#ifndef __com_sun_star_lang_IndexOutOfBoundsException_idl__ 
#include <com/sun/star/lang/IndexOutOfBoundsException.idl> 
#endif 
#ifndef __com_sun_star_beans_PropertyValue_idl__
#include <com/sun/star/beans/PropertyValue.idl>
#endif

module com { module sun { module star { module accessibility {
        
/** Implement this interface to give provide a mapping between text index
    and line numbers.

    <p>This interface is typically used in conjunction with the
    <type>XAccessibleText</type> interface and extents it with a notion
    of line numbers</p>

    @since OOo 3.0
*/

/// not yet published
interface XAccessibleMultiLineText
    : ::com::sun::star::accessibility::XAccessibleText
{
    /** Returns the line number at the specified index.
    
        <p>For a text object that is spread over multiple lines, this method
        provides a mapping from a text index to the corresponding line number.
        </p>
        
        @param nIndex
            Index for which the line number should be returned.
            The valid range is 0..length.
            
        @return
            Returns the line number of the specified text index.

        @throws ::com::sun::star::lang::IndexOutOfBoundsException
            if the index is invalid.
    */
    long getLineNumberAtIndex([in] long nIndex)
        raises (::com::sun::star::lang::IndexOutOfBoundsException);

    /** Retuns the text of the specified line.
    
        <p>Returns the substring of text that makes up the specified line
        number.</p>

        <p>The number of lines can be obtained by calling 
        <member>XAccessibleMultiLineText::getLineNumberAtIndex</member>
        with the index of the last character. In a loop, the last line
        has been reached when <member>TextSegment::SegmentEnd</member>
        of the returned value is equal to the index of the last 
        character of the text.</p>
        
        @param nLineNo
            The number of the line to return the substring from.
            The valid range is 0..getLineNumberAtIndex(getCharacterCount()).

        @return
            Returns the requested text portion.  This portion may be empty
            or invalid when no appropriate text portion is found.

        @throws ::com::sun::star::lang::IndexOutOfBoundsException
            if the line number is invalid
    */

    TextSegment getTextAtLineNumber([in] long nLineNo)
        raises (::com::sun::star::lang::IndexOutOfBoundsException);
    
    /** Returns the text of the line in which the caret is located.
    
        <p>The substring returned will most of the time be identical to
        calling <member>XAccessibleText::getTextAtIndex</member> with 
        the index returned by <member>XAccessibleText::getCaretPosition</member>
        and type  <const scope="AccessibleTextType">LINE</type> beside the
        following special case:</p>

        <p>Some text implementations place the caret at the end of the current 
        line when the <b>End</b> key gets pressed. Since the index of this position
        is identical to the one of the first character of the following line,
        <member>XAccessibleMultiLineText::getLineNumberAtIndex</member> will 
        return the line following the current one in this case.</p>
        
        @return
            Returns the requested text portion. This portion may be empty
            or invalid if the paragraph object does not have a valid caret
            position.
    */

    TextSegment getTextAtLineWithCaret();
  
    /** Returns the number of the line in which the caret is located.
    
        <p>The line number returned will most of the time be identical to
        calling <member>XAccessibleMultiLineText::getLineNumberAtIndex</member>
        with the index returned by <member>XAccessibleText::getCaretPosition</member>
        beside the following special case:</p>

        <p>Some text implementations place the caret at the end of the current 
        line when the <b>End</b> key gets pressed. Since the index of this position
        is identical to the one of the first character of the following line,
        <member>XAccessibleMultiLineText::getLineNumberAtIndex</member> will 
        return the line following the current one in this case.</p>
        
        @return
            Returns the index of the line in which the caret is located or -1
            if the paragraph does not have a valid caret position.
    */

    long getNumberOfLineWithCaret();
};
          
}; }; }; };

#endif
