/**************************************************************
 * 
 * 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_linguistic2_XProofreadingIterator_idl__
#define __com_sun_star_linguistic2_XProofreadingIterator_idl__

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

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

#ifndef __com_sun_star_text_XFlatParagraphIteratorProvider_idl__
#include <com/sun/star/text/XFlatParagraphIteratorProvider.idl>
#endif

#ifndef __com_sun_star_text_XFlatParagraph_idl__
#include <com/sun/star/text/XFlatParagraph.idl>
#endif

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

#ifndef __com_sun_star_linguistic2_ProofreadingResult_idl__
#include <com/sun/star/linguistic2/ProofreadingResult.idl>
#endif

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

module com {  module sun {  module star {  module linguistic2 {

//=============================================================================
/** API for the proofreading iterator that mediates between the document and the proofreader.

	@since	OOo 3.0.1
*/
interface XProofreadingIterator: com::sun::star::uno::XInterface
{
    //-------------------------------------------------------------------------
    /** start proofreading and automatically process the whole text

        @param  xDoc
                the text document.

        @param  xIteratorProvider
                the flat paragraph iterator provider.

        @throws IllegalArgumentException
                when any argument is wrong.
    */
    void startProofreading( [in] com::sun::star::uno::XInterface xDocument,
					[in] com::sun::star::text::XFlatParagraphIteratorProvider xIteratorProvider )
            raises( com::sun::star::lang::IllegalArgumentException );

    //-------------------------------------------------------------------------
    /** start proofreading from a given position

		@param  xDoc
                the document.

        @param  xStartPara
                the single flat paragraph to be checked.

        @param  nErrorPosInPara
                the given index.

        @throws IllegalArgumentException
                when any argument is wrong.
    */

    ProofreadingResult checkSentenceAtPosition( [in] com::sun::star::uno::XInterface xDocument,
					[in] com::sun::star::text::XFlatParagraph xFlatParagraph,
					[in] string aText,
					[in] com::sun::star::lang::Locale aLocale,
					[in] long nStartOfSentencePosition,
					[in] long nSuggestedBehindEndOfSentencePosition,
					[in] long nErrorPositionInParagraph )
            raises( com::sun::star::lang::IllegalArgumentException );

    //-------------------------------------------------------------------------
    /** clears the list of ignored rules for each prrofreader
    */
    void resetIgnoreRules();
    
    //-------------------------------------------------------------------------
    /** checks if the given document is currently being checked

        @param  xDoc
                the document.

        @returns
                if the document is currently being checked.
    */
    boolean isProofreading( [in] com::sun::star::uno::XInterface xDocument );
};

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

}; }; }; };

#endif
