/**************************************************************
 * 
 * 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_XTextTable_idl__ 
#define __com_sun_star_text_XTextTable_idl__ 
 
#ifndef __com_sun_star_text_XTextContent_idl__ 
#include <com/sun/star/text/XTextContent.idl> 
#endif 
 
#ifndef __com_sun_star_table_XTableRows_idl__ 
#include <com/sun/star/table/XTableRows.idl> 
#endif 
 
#ifndef __com_sun_star_table_XTableColumns_idl__ 
#include <com/sun/star/table/XTableColumns.idl> 
#endif 
 
#ifndef __com_sun_star_table_XCell_idl__ 
#include <com/sun/star/table/XCell.idl> 
#endif 
 
#ifndef __com_sun_star_text_XTextTableCursor_idl__ 
#include <com/sun/star/text/XTextTableCursor.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module text { 
 
//============================================================================= 
 
/** manages a text table.

    @see com::sun::star::text::TextTable
    @see com::sun::star::text::Cell
 */
published interface XTextTable: com::sun::star::text::XTextContent
{ 
	//------------------------------------------------------------------------- 
	 
	/** determines the numbers of rows and columns of the text table.
		
        <p> This method must be called after the object is created and
            before the object is insert or attached elsewhere.
		</p>
	 */
	void initialize( [in] long nRows, 
			 [in] long nColumns ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns 
            the access object for the text table rows. 
		 
        @see com::sun::star::table::XTableRows
	 */
	com::sun::star::table::XTableRows getRows(); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns 
            the access object for the text table columns. 
		 
        @see com::sun::star::table::XTableColumns
	 */
	com::sun::star::table::XTableColumns getColumns(); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns 
            the <type scope="com::sun::star::table">XCell</type> interface of the cell with the specified name. 
		 
        @param aCellName 
            is a concatenation of the alphanumeric column name and the 
            index of the row. 
		 
            <p>Example: The cell in the 4th column and third row has the name "D3". 
		 
            <p>In cells that are split, the naming convention is more complex. 
            In this case the name is a concatenation of the former cell name 
            (i.e. "D3") and the number of the new column and row index inside 
            of the original table cell separated by dots. This is done 
            recursively. 
		 
            <p>Example: If the cell "D3" is horizontally split, it now contains 
            the cells "D3.1.1" and "D3.1.2" 
		 
        @see com::sun::star::table::Cell
        @see com::sun::star::table::XCell
	 */
	com::sun::star::table::XCell getCellByName( [in] string aCellName ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns 
            the names of all cells of this text table.
	 */
	sequence<string> getCellNames(); 
 
	//------------------------------------------------------------------------- 
	 
	/** creates a text table cursor and returns the
		<type>XTextTableCursor</type> interface.
		
		<p>Initially the cursor is positioned in the cell with the specified name.
		</p>

        @see com::sun::star::text::TextTableCursor
	 */
	com::sun::star::text::XTextTableCursor createCursorByCellName( [in] string aCellName ); 
 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
#endif 
