/**************************************************************
 * 
 * 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_util_XSearchable_idl__ 
#define __com_sun_star_util_XSearchable_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_util_XSearchDescriptor_idl__ 
#include <com/sun/star/util/XSearchDescriptor.idl> 
#endif 
 
#ifndef __com_sun_star_container_XIndexAccess_idl__ 
#include <com/sun/star/container/XIndexAccess.idl> 
#endif 
 
 
//============================================================================= 
 
module com {  module sun {  module star {  module util {  
 
//============================================================================= 
 
/** enables the object to look for specified contents of the object 
	(in particular, for a text range which contains a specific string pattern).
	
	@example 
		in a <type scope="com::sun::star::text">TextDocument</type>: 
		set all "search for" to bold using findFirst()/findNext():
	
	<listing>
	xSearchDescr = xDocument.createSearchDescriptor()
	xSearchDescr.SearchString = "search for"
	xSearchDescr.SearchCaseSensitive = <TRUE/>
	xSearchDescr.SearchWords = <TRUE/>
	xFound = xDocument.findFirst( xSearchDescr )
	do while not IsNull(xFound)
	xFound.CharWeight = com.sun.star.awt.FontWeight.BOLD
	xFound = xDocument.findNext( xFound.End, xSearchDescr )
	loop
	</listing>
	
 */
published interface XSearchable: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	/** creates a <type>SearchDescriptor</type> which contains properties that
		specify a search in this container.@see SearchDescriptor
	 */
	com::sun::star::util::XSearchDescriptor createSearchDescriptor(); 
 
	//------------------------------------------------------------------------- 
	/** searches the contained texts for all occurrences of whatever is specified.@see SearchDescriptor
	 */
	com::sun::star::container::XIndexAccess findAll( [in] com::sun::star::util::XSearchDescriptor xDesc ); 
 
	//------------------------------------------------------------------------- 
	/** searches the contained texts for the next occurrence of whatever is specified.
	
		@returns 
			the position within the component, e.g. a <type scope="com::sun::star::text">XTextRange</type>
			which determines the found elements.

		@see SearchDescriptor
	 */
	com::sun::star::uno::XInterface findFirst( [in] com::sun::star::util::XSearchDescriptor xDesc ); 
 
	//------------------------------------------------------------------------- 
	/** searches the contained texts for the next occurrence of whatever is specified.

		@param xStartAt
			represents a position within the component at which the search continues.
			This position is returned by <method>XSearchable::findFirst</method> or
			the previous <method>XSearchable::findNext</method>.
	
		@see SearchDescriptor
	 */
	com::sun::star::uno::XInterface findNext( [in] com::sun::star::uno::XInterface xStartAt, 
			 [in] com::sun::star::util::XSearchDescriptor xDesc ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
