/**************************************************************
 * 
 * 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_lang_XTextSearch_idl__
#define __com_sun_star_lang_XTextSearch_idl__


#include <com/sun/star/lang/Locale.idl>
#include <com/sun/star/uno/XInterface.idl>
//#include <com/sun/star/lang/CascadeTransliterator.idl>

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

module com { module sun { module star { module util {

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


published enum SearchAlgorithms
{
    /// Literal
    ABSOLUTE,   // implemented as a kind of Boyer-Moore
    /// Regular expression
    REGEXP,
    /// Weighted Levenshtein Distance
    APPROXIMATE
};

/// Flags for search methods
published constants SearchFlags
{
    /**
        @deprecated The constant ALL_IGNORE_CASE is never supported - use
                    <const scope="com::sun::star::i18n">TransliterationModules::IGNORE_CASE</const> 
                    with 
                    <member>SearchOptions::transliterateFlags</member> 
                    instead.

        @see <type scope="com::sun::star::i18n">TransliterationModules</type> 
    */
    const long  ALL_IGNORE_CASE     = 0x00000001;

    /** Flag for normal (Boyer-Moore) search / Search for word only. */
    const long  NORM_WORD_ONLY      = 0x00000010;

    /** Flag for "regular expression" search / Interpret as extended 
        regular expression.

        @deprecated The flag is currently not supported by OOo.
    */
    const long  REG_EXTENDED        = 0x00000100;

    /** Flag for "regular expression" search / No register information 
        or backreferences, i.e., avoid sub expressions. Return only 
        true/false if matched or not.

        @deprecated The flag is currently not supported by OOo.
    */
    const long  REG_NOSUB           = 0x00000200;

    /** Flag for "regular expression" search / Special new line 
        treatment.

        @deprecated The flag is currently not supported by OOo.

        <p> A NEWLINE character in string will not be matched by a 
        period outside bracket expression or by any form of a non 
        matching list. </p>

        <p> A circumflex (^) in pattern when used to specify expression 
        anchoring will match the zero length string immediately after a 
        newline in string, regardless of the setting of 
        REG_NOT_BEGINOFLINE. </p>

        <p> A dollar-sign ($) in pattern when used to specify expression 
        anchoring, will match zero-length string immediately before a 
        new line in string, regardless of the setting of 
        REG_NOT_ENDOFLINE. </p>
    */
    const long  REG_NEWLINE         = 0x00000400;

    /** The first character in the string is not the beginning of the 
        line therefore ^ will not match with first character of the 
        string.
    */
    const long  REG_NOT_BEGINOFLINE = 0x00000800;

    /** The last character in the string is not the end of the line 
        therefore $ will not match with last character of the string. 
    */
    const long  REG_NOT_ENDOFLINE   = 0x00001000;

    /** Flag for "Weighted Levenshtein Distance" search / Relaxed 
        checking of limit, split weigh pools.

        <p> If not specified (<b>strict</b>), the search is sucessful if 
        the WLD is within a calculated limit where each insertion, 
        deletion and replacement adds a weight to a common pool of 
        weights. This is the mathematically correct WLD. </p>

        <p> From a user's point of view the strict WLD is an 
        exclusive-OR of the arguments given, for example if allowed 
        insertions=2 and allowed replacements=2, the search fails if 2 
        characters had been inserted and an additional operation would 
        be needed to match. Depending on the weights it may also fail if 
        1 character was inserted and 1 character replaced and an 
        additional operation would be needed to match. The strict 
        algorithm may match less than expected from a first glance of 
        the specified arguments, but does not return false positives. </p>

        <p> If specified (<b>relaxed</b>), the search is also successful 
        if the combined pool for insertions and deletions is below a 
        doubled calculated limit and replacements are treated 
        differently. Additionally, swapped characters are counted as one 
        replacement. </p>

        <p> From a user's point of view the relaxed WLD is an 
        inclusive-OR of the arguments given, for example if allowed 
        insertions=2 and allowed replacements=2, the search succeeds if 
        2 characters had been inserted and an additional replacement is 
        needed to match. The relaxed algorithm may return false 
        positives, but meets user expectation better. </p>
    */
    const long  LEV_RELAXED     = 0x00010000;
};


published  struct SearchOptions  {
	//-------------------------------------------------------------------------
    /** search type */
	SearchAlgorithms	algorithmType;

	/** some flags - can be mixed

		@see <type>SearchFlags</type>
	*/
	long 			searchFlag;

    /** The text or pattern to be searched. */
	string			searchString;

    /** The replacement text
        (is for optional replacing - SearchOption is only the data container for it) */
	string			replaceString;

    /** The locale for case insensitive search. */
	::com::sun::star::lang::Locale  Locale;

    /** This many characters can be different (as a replacement) between 
        the found word and the search pattern in a "Weighted Levenshtein 
        Distance" search. */
	long			changedChars;

    /** This many characters can be missing in the found word in a 
        "Weighted Levenshtein Distance" search. */
	long			deletedChars;

    /** This many characters can be additional in the found word in a 
        "Weighted Levenshtein Distance" search. */
	long			insertedChars;

    /** Flags for the transliteration. Same meaning as the enum of
        <type scope="com::sun::star::i18n">TransliterationModules</type>
	*/
	long			transliterateFlags;
};


published  struct SearchResult  {
	//-------------------------------------------------------------------------
	/** Number of subexpressions,
	if it is 0, then no match found; this value is 1 for ABSOLUTE and APPROXIMATE match.
	The start and endOffset are always dependent on the search direction.
	For example:
	if you search "X" in the text "-X-" the offset are:
		for forward: 	start = 1, end = 2
        for backward:   start = 2, end = 1
    Forward, the startOffset is inclusive, the endOffset exclusive.
    Backward, the startOffset is exclusive, the endOffset inclusive.

	For regular expressions it can be greater than 1.
	If the value is 1, startoffset[0] and endoffset[0] points to the matching sub string
	if value is > 1, still startoffset[0] and endoffset[0] points to the matching substring for whole regular expression
	startoffset[i] and endoffset[i] points to the matching substring of i th matching substring.
	*/
	long subRegExpressions;
	sequence<long> startOffset;		// inclusive
	sequence<long> endOffset;  		// exclusive
};



/** enables an object to search in its content.
 */
published interface XTextSearch : com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** set the options for the forward or backward search.

	*/
	void setOptions ([in] SearchOptions options);
	//-------------------------------------------------------------------------
	/** search forward in the searchStr, starts at startPos and ends by endpos.
		The result is returned in the SearchResult.

	*/
	SearchResult  searchForward  ([in] string searchStr, [in] long startPos, [in] long endPos );
	//-------------------------------------------------------------------------
	/** search backward in the searchStr, starts at startPos and ends by endpos.
		The endpos must be lower then the startpos, because the function searches backward!
		The result is returned in the SearchResult.

	*/
	SearchResult  searchBackward ([in] string searchStr, [in] long startPos, [in] long endPos );
};

//=============================================================================
}; }; }; };

#endif