/**************************************************************
 * 
 * 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_XFlatParagraph_idl__
#define __com_sun_star_text_XFlatParagraph_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_lang_Locale_idl__
#include <com/sun/star/lang/Locale.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

#ifndef __com_sun_star_beans_PropertyValue_idl__
#include <com/sun/star/beans/PropertyValue.idl>
#endif

#ifndef __com_sun_star_text_XTextMarkup_idl__
#include <com/sun/star/text/XTextMarkup.idl>
#endif

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

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

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

/** provides functionality to ...

    @since OOo 3.0
 */

interface XFlatParagraph: com::sun::star::text::XTextMarkup
{

    //-------------------------------------------------------------------------
    /** get the content of the paragraph

        @returns
                the content of the paragraph.
    */
    string getText();

    //-------------------------------------------------------------------------
    /** check whether the content has been modified

		@returns
                <TRUE/>  if the content has been modified,
                <FALSE/> otherwise.
    */
    boolean isModified();

    //-------------------------------------------------------------------------
    /** change the 'checked' flag of the respective text node, i.e., mark the
        text node as 'processed'

        @param nType
                type, see <type>TextMarkupType</type>.

        @param  bVal
                <TRUE/>  the respective text node has been processed
                <FALSE/> the respective text node needs to be processed again
                         later
    */
    void setChecked( [in] long nType, [in] boolean bVal );

    //-------------------------------------------------------------------------
    /** returns whether the respective text node has already been processed

        @param nType
                type, see <type>TextMarkupType</type>.

		@returns
                <TRUE/>  if the respective text node has been checked
                <FALSE/> otherwise.
    */
    boolean isChecked( [in] long nType );

    //-------------------------------------------------------------------------
    /** get the language of the specific text

		@param  nPos
                start index of the text.

        @param  nLen
                the length of the text.

		@returns
                the locale for the language identified.
                If no language could be identified, the locale will be empty.

        @throws IllegalArgumentException
                when any argument is wrong.
    */
    com::sun::star::lang::Locale getLanguageOfText( [in] long nPos, [in] long nLen )
            raises( com::sun::star::lang::IllegalArgumentException );

    //-------------------------------------------------------------------------
    /** get the single most probable language of the specific text,
        especially after getLanguageOfText fails

		@param  nPos
                start index of the text.

        @param  nLen
                the length of the text.

		@returns
                the locale for the language identified.

        @throws IllegalArgumentException
                when any argument is wrong.
    */
    com::sun::star::lang::Locale getPrimaryLanguageOfText( [in] long nPos,
                                                           [in] long nLen )
            raises( com::sun::star::lang::IllegalArgumentException );

    //-------------------------------------------------------------------------
    /** replace the specific text with new text.

		@param  nPos
                start index of the text.

        @param  nLen
                the length of the text.

        @param  nNewText
                new text.

        @param aAttributes
                the given set of attributes e.g. Language

        @throws IllegalArgumentException
                when any argument is wrong.
    */
    void changeText( [in] long nPos, [in] long nLen, [in] string aNewText,
                     [in] sequence<::com::sun::star::beans::PropertyValue> aAttributes )
            raises( com::sun::star::lang::IllegalArgumentException );

    //-------------------------------------------------------------------------
    /** replace the attributes of the specific text with the given set of attributes.

		@param  nPos
                start index of the text.

        @param  nLen
                the length of the text.

        @param aAttributes
                the given set of attributes e.g. Language.

        @throws IllegalArgumentException
                when any argument is wrong.
    */
    void    changeAttributes( [in] long nPos, [in] long nLen,
                              [in] sequence<::com::sun::star::beans::PropertyValue> aAttributes )
            raises( com::sun::star::lang::IllegalArgumentException );

    //-------------------------------------------------------------------------
    /** get a list of indexes that separate each two different languages

        @returns
            a list of indices.
    */
    sequence< long > getLanguagePortions();
};

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

}; }; }; };

#endif
