/**************************************************************
 * 
 * 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_sheet_SpreadsheetDocumentSettings_idl__
#define __com_sun_star_sheet_SpreadsheetDocumentSettings_idl__

#ifndef __com_sun_star_beans_XPropertySet_idl__
#include <com/sun/star/beans/XPropertySet.idl>
#endif

#ifndef __com_sun_star_util_Date_idl__
#include <com/sun/star/util/Date.idl>
#endif

#ifndef __com_sun_star_i18n_XForbiddenCharacters_idl__
#include <com/sun/star/i18n/XForbiddenCharacters.idl>
#endif

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

#ifndef __com_sun_star_awt_XDevice_idl__
#include <com/sun/star/awt/XDevice.idl>
#endif

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

module com {  module sun {  module star {  module sheet {

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

/** contributes properties to control the configuration which is global
	for all views of a spreadsheet document.

	@deprecated

	@see com::sun::star::sheet::SpreadsheetDocument
 */
published service SpreadsheetDocumentSettings
{
	//-------------------------------------------------------------------------

//!published service PropertySet
	/** provides access to the properties.
	 */
	interface com::sun::star::beans::XPropertySet;

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

	/** enables iterated calculation of circular references.
	 */
	[property] boolean IsIterationEnabled;

	//-------------------------------------------------------------------------

	/** specifies how many iterations are carried out.

		<p>This setting is only used, if iteration is enabled using
		<member>SpreadsheetDocumentSettings::IsIterationEnabled</member>.</p>
	 */
	[property] long IterationCount;

	//-------------------------------------------------------------------------

	/** specifies the point at which a change in results will stop
		the iteration.

		<p>More exactly it specifies a difference in the change of the
		result between two iterations. If the result difference
		is less than or equal to this epsilon-value, the iteration
		is stopped.</p>

		<p>This setting is only used, if iteration is enabled using
		<member>SpreadsheetDocumentSettings::IsIterationEnabled</member>.</p>
	 */
	[property] double IterationEpsilon;

	//-------------------------------------------------------------------------

	/** specifies the number of decimals in the default number format.
	 */
	[property] short StandardDecimals;

	//-------------------------------------------------------------------------

	/** specifies the date that is represented by the value zero.
	 */
	[property] com::sun::star::util::Date NullDate;

	//-------------------------------------------------------------------------

	/** specifies the width of default tabulators.
	 */
	[property] short DefaultTabStop;

	//-------------------------------------------------------------------------

	/** specifies whether upper and lower cases are treated as equal
		when comparing cells.
	 */
	[property] boolean IgnoreCase;

	//-------------------------------------------------------------------------

	/** specifies whether calculations are performed with the rounded
		values displayed in cells (set to <TRUE/>) instead of the
		internal values (set to <FALSE/>).
	 */
	[property] boolean CalcAsShown;

	//-------------------------------------------------------------------------

	/** specifies whether filter criteria must match entire cell contents.
	 */
	[property] boolean MatchWholeCell;

	//-------------------------------------------------------------------------

	/** enables online spell checking.
	 */
	[property] boolean SpellOnline;

	//-------------------------------------------------------------------------

	/** specifies whether column or row labels are looked up from
		anywhere on the sheet.

		<p>Explicitly defined label ranges are used even if this property
		is set to <FALSE/>.</p>

		@see com::sun::star::sheet::LabelRanges
	 */
	[property] boolean LookUpLabels;

	//-------------------------------------------------------------------------

    /** specifies whether regular expressions in formulas are enabled,
        e.g., for functions which look up spreadsheet contents.
     */
    [property] boolean RegularExpressions;

	//-------------------------------------------------------------------------

    /** contains the interface XForbiddenCharacters.
     */
    [readonly, optional, property] com::sun::star::i18n::XForbiddenCharacters ForbiddenCharacters;

	//-------------------------------------------------------------------------

    /** If this property is set the document has DrawPages. Use this
		property to find out, whether the document has DrawPages or not,
		because the getDrawPage method on the XDrawPageSupplier and the
		getDrawPages method on the XDrawPagesSupplier always creates the
		DrawPages if there are none; and this is very slow and needs more
		memory.
     */
    [readonly, optional, property] boolean HasDrawPages;

	//-------------------------------------------------------------------------

	/** contains the standard document language for Western text.
	 */
	[optional, property] com::sun::star::lang::Locale CharLocale;

	//-------------------------------------------------------------------------

	/** contains the standard document language for Asian text.
	 */
	[optional, property] com::sun::star::lang::Locale CharLocaleAsian;

	//-------------------------------------------------------------------------

	/** contains the standard document language for Complex text.
	 */
	[optional, property] com::sun::star::lang::Locale CharLocaleComplex;

    //-------------------------------------------------------------------------

    /** specifies whether the document data are already loaded.

        @since OOo 3.0
     */
    [optional, property] boolean IsLoaded;

    //-------------------------------------------------------------------------

    /** specifies whether the undo command is enabled.

        @since OOo 3.0
     */
    [optional, property] boolean IsUndoEnabled;

    //-------------------------------------------------------------------------

    /** specifies whether the automatic adjustment of the row height is
        enabled.

        @since OOo 3.0
     */
    [optional, property] boolean IsAdjustHeightEnabled;

    //-------------------------------------------------------------------------

    /** specifies whether the automatic execution of links is enabled.

        @since OOo 3.0
     */
    [optional, property] boolean IsExecuteLinkEnabled;

    //-------------------------------------------------------------------------

    /** contains the reference device used for formatting the document.

        @since OOo 3.0
     */
    [readonly, optional, property] com::sun::star::awt::XDevice ReferenceDevice;

};

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

}; }; }; };

#endif

