/**************************************************************
 * 
 * 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_LinguProperties_idl__
#define __com_sun_star_linguistic2_LinguProperties_idl__

#ifndef __com_sun_star_beans_XPropertySet_idl__
#include <com/sun/star/beans/XPropertySet.idl>
#endif
#ifndef __com_sun_star_beans_XFastPropertySet_idl__
#include <com/sun/star/beans/XFastPropertySet.idl>
#endif
#ifndef __com_sun_star_lang_XComponent_idl__
#include <com/sun/star/lang/XComponent.idl>
#endif
#ifndef __com_sun_star_lang_XServiceInfo_idl__
#include <com/sun/star/lang/XServiceInfo.idl>
#endif
#ifndef __com_sun_star_lang_Locale_idl__
#include <com/sun/star/lang/Locale.idl>
#endif

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

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

//=============================================================================
/**	the set of linguistic relevant properties.
*/
published service LinguProperties
{
	interface com::sun::star::beans::XPropertySet;
	interface com::sun::star::beans::XFastPropertySet;
	interface com::sun::star::lang::XComponent;
	interface com::sun::star::lang::XServiceInfo;

	//-------------------------------------------------------------------------
	/**	defines whether new German spelling rules should be used for German
	 	text or not when doing spellchecking or hyphenation, or using the 
	 	thesaurus.

        @deprecated since OOo 3.0.1
	  */
    [property, maybevoid] boolean IsGermanPreReform;

	//-------------------------------------------------------------------------
	/**	defines if the dictionary-list should be used for spellchecking
	 	and hyphenation or not.
	*/
	[property] boolean IsUseDictionaryList;

	//-------------------------------------------------------------------------
	/**	defines if control characters should be ignored or not, by the linguistic
	 	(i.e., spellchecker, hyphenator and thesaurus).
	*/
	[property] boolean IsIgnoreControlCharacters;

	//-------------------------------------------------------------------------
	/**	defines if words with only uppercase letters should be 
	 	subject to spellchecking or not.
	*/
	[property] boolean IsSpellUpperCase;

	//-------------------------------------------------------------------------
	/**	defines if words containing digits (or numbers) should be
	 	subject to spellchecking or not.
	*/
	[property] boolean IsSpellWithDigits;

	//-------------------------------------------------------------------------
	/**	defines if the captitalization of words should be checked or not.
	*/
	[property] boolean IsSpellCapitalization;

	//-------------------------------------------------------------------------
	/**	the minimum number of characters of a word to remain before the 
	 	hyphen when doing hyphenation.
	*/
	[property] short HyphMinLeading;
	
	//-------------------------------------------------------------------------
	/**	the minimum number of characters of a word to remain after the 
	 	hyphen when doing hyphenation.
	*/
	[property] short HyphMinTrailing;
	
	//-------------------------------------------------------------------------
	/**	the minimum length of a word in order to be hyphenated.
	*/
	[property] short HyphMinWordLength;

	//-------------------------------------------------------------------------
    /** the default western language for new documents.
	*/
	[property] com::sun::star::lang::Locale DefaultLocale;

	//-------------------------------------------------------------------------
	/**	defines whether interactive hyphenation should be performed without
        requiring the user to select every hyphenation position after the user 
        has triggered the hyphenation.
	*/
	[property] boolean IsHyphAuto;

	//-------------------------------------------------------------------------
	/**	defines whether hyphenation should be done in special regions of 
	 	documents or not.
	*/
	[property] boolean IsHyphSpecial;
	
	//-------------------------------------------------------------------------
	/**	indicates whether spellchecking should be done automatically or not.
	*/
	[property] boolean IsSpellAuto;

	//-------------------------------------------------------------------------
	/**	indicates whether the markings for incorrectly spelled text should be
	 	hidden or not.
        
        @deprecated since OOo 3.0.1
	*/
    [property, maybevoid] boolean IsSpellHide;
	
	//-------------------------------------------------------------------------
	/**	indicates if spellchecking should be performed in all available
	 	languages.
    
        @deprecated since OOo 3.0.1
    */
    [property, maybevoid] boolean IsSpellInAllLanguages;

	//-------------------------------------------------------------------------
	/**	defines whether spellchecking should be done in special regions of
	 	documents or not.
	*/
	[property] boolean IsSpellSpecial;
	
	//-------------------------------------------------------------------------
	/**	defines whether spellchecking should be done in reverse 
	 	direction or not.
	*/
	[property] boolean IsWrapReverse;

	//-------------------------------------------------------------------------
	/**	the default language for CJK languages.
	*/
	[property] com::sun::star::lang::Locale DefaultLocale_CJK;

	//-------------------------------------------------------------------------
	/**	the default language for CTL languages.
	*/
	[property] com::sun::star::lang::Locale DefaultLocale_CTL;

};

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

}; }; }; };

#endif
