/**************************************************************
 * 
 * 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 OpenOffice 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 OpenOffice 3.0.1
	*/
    [property, maybevoid] boolean IsSpellHide;
	
	//-------------------------------------------------------------------------
	/**	indicates if spellchecking should be performed in all available
	 	languages.
    
        @deprecated since OpenOffice 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
