/**************************************************************
 * 
 * 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_TextSegment_idl__
#define __com_sun_star_accessibility_TextSegment_idl__

module com { module sun { module star { module accessibility {

/** This structure describes a text segment that is embedded in a larger
    portion of text.  It is used for example by the
    <type>XAccessibleText</type> interface to describe a text portion that
    was inserted into or deleted from an accessible text.

    <p>The indices <member>TextSegment::SegmentStart</member> and
    <member>TextSegment::SegmentEnd</member> refer to the enclosing text.
    The <member>TextSegment::SegmentText</member> member contains the text
    between these two indices including the start index but not the end
    index.  With it you can use this structure without having to
    access the <type>XAccessibleText</type> interface that represents the
    enclosing text.</p>

    <p>An empty text segment is expressed by
    <member>TextSegment::SegmentStart</member> and
    <member>TextSegment::SegmentEnd</member> set to the same value.  While a
    value of -1 signals an error (like the request for a word after the last
    character of a text) all other values define the empty string at that
    position.</p>

    <p>The <member>SegmentText</member> member is a copy of the
    corresponding text segment of the enclosing text.  Modifying this
    structure does not alter the enclosing text.</p>

    @see XAccessibleText

    @since OOo 1.1.2
*/

published struct TextSegment
{
    /** A copy of the text segment of the enclosing text delimited by the
        text indices <member>TextSegment::SegmentStart</member> and
        <member>TextSegment::SegmentEnd</member>.  Modifying it does not
        alter the enclosing text.
    */
    string SegmentText;

    /** Index of the first character of the text segment represented by this
        structure.  The index refers to the enclosing text.
    */
    long SegmentStart;

    /** Index of the character directly behind the last character of the
        text segment represented by this structure.  The index refers to the
        enclosing text.
    */
    long SegmentEnd;
};
          
}; }; }; };

#endif
