/**************************************************************
 * 
 * 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_text_TextSection_idl__
#define __com_sun_star_text_TextSection_idl__

#ifndef __com_sun_star_text_TextContent_idl__
#include <com/sun/star/text/TextContent.idl>
#endif

#ifndef __com_sun_star_text_XTextSection_idl__
#include <com/sun/star/text/XTextSection.idl>
#endif

#ifndef __com_sun_star_container_XNamed_idl__
#include <com/sun/star/container/XNamed.idl>
#endif

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

#ifndef __com_sun_star_beans_XPropertyState_idl__
#include <com/sun/star/beans/XPropertyState.idl>
#endif

#ifndef __com_sun_star_text_SectionFileLink_idl__
#include <com/sun/star/text/SectionFileLink.idl>
#endif
#ifndef __com_sun_star_style_GraphicLocation_idl__
#include <com/sun/star/style/GraphicLocation.idl>
#endif
#ifndef __com_sun_star_text_XTextColumns_idl__
#include <com/sun/star/text/XTextColumns.idl>
#endif
#ifndef _com_sun_star_xml_UserDefinedAttributesSupplier_idl_
#include <com/sun/star/xml/UserDefinedAttributesSupplier.idl>
#endif


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

module com { module sun { module star { module text {

//=============================================================================
/** A <type>TextSection</type> is a range of complete paragraphs within a text.

	<p>The content of the section may be the content of a link into another
	document, a link from the same document, or the result of a DDE
	operation.

	<p><type>TextSection</type> instances can be linked from and to other
	texts.

*/
published service TextSection
{
	service com::sun::star::text::TextContent;

    [optional] service com::sun::star::xml::UserDefinedAttributesSupplier;

	interface com::sun::star::text::XTextSection;
	interface com::sun::star::container::XNamed;
	interface com::sun::star::beans::XPropertySet;
	interface com::sun::star::beans::XPropertyState;

	//-------------------------------------------------------------------------
	/**  This property contains a conditional expression.

	<p>If the result of the conditional expression is <true/> and the property
	<member>TextSection::IsVisible</member> is <false/>, then the section is hidden.</p>
	*/
	[property] string Condition;

	//-------------------------------------------------------------------------
	/** If this property is <FALSE/>, the text section is hidden.
	*/
	[property] boolean IsVisible;

	//-------------------------------------------------------------------------
	/** If this property is <TRUE/>, the text section is protected
		and cannot be modified from the user interface.
	*/
	[property] boolean IsProtected;

	//-------------------------------------------------------------------------
	/** If this property is set, then the content of the section is read
		from the specified document.

	*/
	[property] com::sun::star::text::SectionFileLink FileLink;

	//-------------------------------------------------------------------------
	/**  specifies the source of a file link in the document that is
	specified in <member>TextSection::FileLink</member>.

	<p>The source may be a text section or a bookmark.
	If <member>TextSection::FileLink</member> is empty, then the
	current document is searched for the source. If this property
	is empty and <member>TextSection::FileLink</member> is set,
	then the complete document content is linked into this section.</p>
	*/
	[property] string LinkRegion;

	//-------------------------------------------------------------------------
	/**  specifies the type of the command string for a DDE operation.
	 <p>The type can be the name of the application that provides a DDE source.</p>
	*/
	[property] string DDECommandType;

	//-------------------------------------------------------------------------
	/**  specifies the source file name of the command string for a DDE operation.
	*/
	[property] string DDECommandFile;

	//-------------------------------------------------------------------------
	/**  specifies the source element of the command string for a DDE operation.
	 <p>The element can be i.e. a name of a cell in a sheet or a bookmark.</p>
	*/
	[property] string DDECommandElement;

	//-------------------------------------------------------------------------
	/**  contains the URL for the background graphic.
	*/
	[property] string BackGraphicURL;

	//-------------------------------------------------------------------------
	/**  contains the name of the file filter for the background graphic.
	*/
	[property] string BackGraphicFilter;

	//-------------------------------------------------------------------------
	/** determines the position of the background graphic.

		@see GraphicLocation
	*/
	[property] com::sun::star::style::GraphicLocation BackGraphicLocation;
	/** determins whether footnotes inside the section are displayed at the end of the
	 section text.
	*/
	[property] boolean FootnoteIsCollectAtTextEnd;
	//-------------------------------------------------------------------------
	/** determins whether the footnotes numbering restarts within the section.
	 This is only valid if <code>FootnoteIsRestartNumbering</code> is set.
	*/
	[property] boolean FootnoteIsRestartNumbering;
	//-------------------------------------------------------------------------
	/** determins at which number the footnote numbering inside of the section starts.
	 This is only valid if <code>FootnoteIsRestartNumbering</code> is set.
	*/
	[property] short FootnoteRestartNumberingAt;
	//-------------------------------------------------------------------------
	/** determins whether the footnotes within the section use an own numbering format.
	 This is only valid if <code>FootnoteIsRestartNumbering</code> is set.
	*/
	[property] boolean FootnoteIsOwnNumbering;
	//-------------------------------------------------------------------------
	/** determins the numbering type of the footnote numbering as a value of
	 <type scope="com::sun::star::style">NumberingType</type>.
	 This is only valid if <code>FootnoteIsOwnNumbering</code> is set.
	*/
	[property] short FootnoteNumberingType;
	//-------------------------------------------------------------------------
	/** determins the prefix that is display before the footnote number.
	 This is only valid if <code>FootnoteIsOwnNumbering</code> is set.
	*/
	[property] string FootnoteNumberingPrefix;
	//-------------------------------------------------------------------------
	/** determins the suffix that is display after of the footnote number.
	 This is only valid if <code>FootnoteIsOwnNumbering</code> is set.
	*/
	[property] string FootnoteNumberingSuffix;
	//-------------------------------------------------------------------------
	/** determins whether endnotes inside the section are displayed at the end of the
	 section text.
	*/
	[property] boolean EndnoteIsCollectAtTextEnd;
	//-------------------------------------------------------------------------
	/** determins whether the endnotes numbering restarts within the section.
	 This is only valid if <code>EndnoteIsRestartNumbering</code> is set.
	*/
	[property] boolean EndnoteIsRestartNumbering;
	//-------------------------------------------------------------------------
	/** determins at which number the endnote numbering inside of the section starts.
	 This is only valid if <code>EndnoteIsRestartNumbering</code> is set.
	*/
	[property] short EndnoteRestartNumberingAt;
	//-------------------------------------------------------------------------
	/** determins whether the endnotes within the section use an own numbering format.
	 This is only valid if <code>EndnoteIsRestartNumbering</code> is set.
	*/
	[property] boolean EndnoteIsOwnNumbering;
	//-------------------------------------------------------------------------
	/** determins the numbering type of the endnote numbering as a value of
	 <type scope="com::sun::star::style">NumberingType</type>.
	 This is only valid if <code>EndoteIsOwnNumbering</code> is set.
	*/
	[property] short EndnoteNumberingType;
	//-------------------------------------------------------------------------
	/** determins the prefix that is display before the endnote number.
	 This is only valid if <code>EndnoteIsOwnNumbering</code> is set.
	*/
	[property] string EndnoteNumberingPrefix;
	//-------------------------------------------------------------------------
	/** determins the suffix that is display after the endnote number.
	 This is only valid if <code>EndnoteIsOwnNumbering</code> is set.
	*/
	[property] string EndnoteNumberingSuffix;
	//-------------------------------------------------------------------------
	/** determins if a DDE link is updated automatically.
	*/
	[property] boolean IsAutomaticUpdate;
	//-------------------------------------------------------------------------
	/** allows columns to be set into the text section
	*/
	[property] com::sun::star::text::XTextColumns TextColumns;
    /** determins the left margin of the section
     */
    [optional, property] long SectionLeftMargin;
	//-------------------------------------------------------------------------
    /** determins the left margin of the section
     */
    [optional, property] long SectionRightMargin;
	//-------------------------------------------------------------------------
};

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

}; }; }; };

#endif
