/**************************************************************
 *
 * 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_table_XCellRange_idl__
#define __com_sun_star_table_XCellRange_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_lang_IndexOutOfBoundsException_idl__
#include <com/sun/star/lang/IndexOutOfBoundsException.idl>
#endif

#ifndef __com_sun_star_table_XCell_idl__
#include <com/sun/star/table/XCell.idl>
#endif

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

module com {  module sun {  module star {  module table {

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

/** provides access to the cells or to sub-ranges of a cell range.

	@see com::sun::star::table::CellRange
 */
published interface XCellRange: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------

	/** Returns a single cell within the range.

		@param nColumn
			is the column index of the cell inside the range.

		@param nRow
			is the row index of the cell inside the range.

		@returns
			the specified cell.

		@throws <type scope="com::sun::star::lang">IndexOutOfBoundsException</type>
			if an index is outside the dimensions of this range.

		@see com::sun::star::table::Cell
	 */
	com::sun::star::table::XCell getCellByPosition(
			[in] long nColumn,
			[in] long nRow )
		raises( com::sun::star::lang::IndexOutOfBoundsException );

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

	/** Returns a sub-range of cells within the range.

		@param nLeft
			is the column index of the first cell inside the range.

		@param nTop
			is the row index of the first cell inside the range.

		@param nRight
			is the column index of the last cell inside the range.

		@param nBottom
			is the row index of the last cell inside the range.

		@returns
			the specified cell range.

		@throws <type scope="com::sun::star::lang">IndexOutOfBoundsException</type>
			if an index is outside the dimensions of this range.

		@see com::sun::star::table::CellRange
	 */
	com::sun::star::table::XCellRange getCellRangeByPosition(
			[in] long nLeft,
			[in] long nTop,
			[in] long nRight,
			[in] long nBottom )
		raises( com::sun::star::lang::IndexOutOfBoundsException );

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

	/** Returns a sub-range of cells within the range.

		<p>The sub-range is specified by its name. The format of the range
		name is dependent of the context of the table. In spreadsheets valid
		names may be "A1:C5" or "$B$2" or even defined names for cell ranges
		such as "MySpecialCell".</p>

		@param aRange
			the name of the sub-range.

		@returns
			the specified cell range.

		@see com::sun::star::table::CellRange
	 */
	com::sun::star::table::XCellRange getCellRangeByName( [in] string aRange );

};

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

}; }; }; };

#endif
