/**************************************************************
 * 
 * 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_TextTable_idl__
#define __com_sun_star_text_TextTable_idl__

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

#ifndef __com_sun_star_util_Color_idl__
#include <com/sun/star/util/Color.idl>
#endif

#ifndef __com_sun_star_text_XTextTable_idl__
#include <com/sun/star/text/XTextTable.idl>
#endif
#ifndef __com_sun_star_text_TableColumnSeparator_idl__
#include <com/sun/star/text/TableColumnSeparator.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_style_GraphicLocation_idl__
#include <com/sun/star/style/GraphicLocation.idl>
#endif
#ifndef __com_sun_star_style_BreakType_idl__
#include <com/sun/star/style/BreakType.idl>
#endif
#ifndef __com_sun_star_table_ShadowFormat_idl__
#include <com/sun/star/table/ShadowFormat.idl>
#endif
#ifndef __com_sun_star_table_TableBorder_idl__
#include <com/sun/star/table/TableBorder.idl>
#endif
#ifndef __com_sun_star_table_XCellRange_idl__
#include <com/sun/star/table/XCellRange.idl>
#endif
#ifndef __com_sun_star_table_XAutoFormattable_idl__
#include <com/sun/star/table/XAutoFormattable.idl>
#endif
#ifndef __com_sun_star_chart_XChartDataArray_idl__
#include <com/sun/star/chart/XChartDataArray.idl>
#endif
#ifndef __com_sun_star_util_XSortable_idl__
#include <com/sun/star/util/XSortable.idl>
#endif
#ifndef __com_sun_star_sheet_XCellRangeData_idl__
#include <com/sun/star/sheet/XCellRangeData.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 {

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

/** is a table of text cells which is anchored to a surrounding text.

    <p>Note: The anchor of the actual implementation for text tables 
    does not have a position in the text. Thus that anchor can not be 
    used for some operation like <member>XTextContent::attach</member> or
    <member>XText::insertTextContent</member>
    or other function that require the object to have a position in the text.</p>

    <p>The reason why a text table still needs an anchor is that for example
    tables should be insertable via <member>XText::insertTextContent</member>
    and that interface uses a parameter of that type.</p>

    @example

    <p>Create and insert a TextTable:</p>

	<listing>
    xTable = xTextDoc.createInstance( "com.sun.star.text.TextTable" )
    xTable.initialize(5, 8)
    xTable.HoriOrient = 0 'com::sun::star::text::HoriOrientation::NONE
    xTable.LeftMargin = 2000
    xTable.RightMargin = 1500
    xTextDoc.getText.insertTextContent( xTextRange, xTable, false )
	</listing>

    @see    com::sun::star::text::Cell
    @see    com::sun::star::text::CellRange
    @see    com::sun::star::text::TableColumns
    @see    com::sun::star::text::TableRows
    @see    com::sun::star::text::TextTableCursor
 */
published service TextTable
{
    service com::sun::star::text::TextContent;
    
    [optional] service com::sun::star::xml::UserDefinedAttributesSupplier;

	interface com::sun::star::text::XTextTable;

	interface com::sun::star::container::XNamed;

	interface com::sun::star::table::XCellRange;

	interface com::sun::star::chart::XChartDataArray;

	interface com::sun::star::table::XAutoFormattable;

	interface com::sun::star::util::XSortable;

    [optional] interface com::sun::star::sheet::XCellRangeData;

	/** determins the type of break that is applied at the beginning of the table. @see com::sun::star::style::BreakType
	 */
	[property] com::sun::star::style::BreakType BreakType;
	//-------------------------------------------------------------------------

	/** contains the left margin of the table.
	 */
	[property] long LeftMargin;
	//-------------------------------------------------------------------------

	/** contains the right margin of the table.
	 */
	[property] long RightMargin;
	//-------------------------------------------------------------------------

	/** contains the horizontal orientation. @see com::sun::star::text::HoriOrientation
	 */
	[property] short HoriOrient;
	//-------------------------------------------------------------------------

	/** Setting this property to TRUE prevents page or column
		breaks between this table and the following paragraph or text table.
	 */
	[property] boolean KeepTogether;
	//-------------------------------------------------------------------------

	/** Setting this property to FALSE prevents the table from
		getting spread on two pages.
	 */
	[property] boolean Split;
	//-------------------------------------------------------------------------

	/** If a page break property is set at the table,
		this property contains the new value for the page number.
	 */
	[property] short PageNumberOffset;
	//-------------------------------------------------------------------------

	/** If this property is set, it creates a page break before the
		table and assigns the value as the name of the new page style sheet to use.
	 */
	[property] string PageDescName;
	//-------------------------------------------------------------------------

	/** determins the width of the table relative to its environment.
	 */
	[property] short RelativeWidth;
	//-------------------------------------------------------------------------
	/** determins if the value of the relative width is valid.
	 */
    [property] boolean IsWidthRelative;
	//-------------------------------------------------------------------------

	/** determins if the first row of the table is repeated on every new page.
	 */
	[property] boolean RepeatHeadline;
        //-------------------------------------------------------------------------
        /** determins the number of rows of the table repeated on every new page.
         */
        [optional, property] long HeaderRowCount;
        //-------------------------------------------------------------------------

	/** determins the type, color and size of the shadow. @see com::sun::star::table::ShadowFormat
	 */
	[property] com::sun::star::table::ShadowFormat ShadowFormat;
	//-------------------------------------------------------------------------

	/** determins the top margin.
	 */
	[property] long TopMargin;
	//-------------------------------------------------------------------------

	/** determins the bottom margin.
	 */
	[property] long BottomMargin;
	//-------------------------------------------------------------------------

	/** determins if the background color is transparent.
	 */
	[property] boolean BackTransparent;
	//-------------------------------------------------------------------------

	/** contains the absolute table width.

		<p>As this is only a describing property the value of the actual table may vary depending on the
		environment the table is located in and the settings of LeftMargin,
		RightMargin and HoriOrient. </p>
	 */
	[property] long Width;
	//-------------------------------------------------------------------------

	/** determins if the first row of the table should be treated as
		axis labels when a chart is to be created.
	 */
	[property] boolean ChartRowAsLabel;
	//-------------------------------------------------------------------------

	/** determins if the first column of the table should be treated as
		axis labels when a chart is to be created.
	 */
	[property] boolean ChartColumnAsLabel;
	//-------------------------------------------------------------------------

	/** contains the description of the table borders. @see com::sun::star::table::TableBorder
	 */
	[property] com::sun::star::table::TableBorder TableBorder;
	//-------------------------------------------------------------------------

	/** contains the column description of the table.
			 @see com::sun::star::text::TableColumnSeparator
	 */
	[property] sequence<com::sun::star::text::TableColumnSeparator> TableColumnSeparators;
	//-------------------------------------------------------------------------

	/** contains the sum of the column width values used in TableColumnSeparators.
	 */
	[property] short TableColumnRelativeSum;
	//-------------------------------------------------------------------------

	/** contains the color of the background.
	 */
	[property] com::sun::star::util::Color BackColor;
	//-------------------------------------------------------------------------

	/** 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;

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

    /** determines whether borders of neighbouring table cells are
     * collapsed into one
     */
    [optional, property] boolean CollapsingBorders;

};

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

}; }; }; };

#endif
