/**************************************************************
 * 
 * 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_XMergeableCellRange_idl__ 
#define __com_sun_star_table_XMergeableCellRange_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__ 
#include <com/sun/star/lang/IllegalArgumentException.idl> 
#endif 

#ifndef __com_sun_star_lang_NoSupportException_idl__
#include <com/sun/star/lang/NoSupportException.idl>
#endif
 
//============================================================================= 
 
module com {  module sun {  module star {  module table {  
 
//============================================================================= 
 
/** represents a range of cells that can possibly be merged or unmerged.
 */
interface XMergeableCellRange : com::sun::star::uno::XInterface
{ 
	/** merges the area specified by this range.

		@throws <type scope="com::sun::star::lang">NoSupportException</type>
			if a merge is not possible for this range. You can use
			<method>isMergeable()</method> to check if a merge is possible.
	 */
	void merge() raises( ::com::sun::star::lang::NoSupportException );

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

	/** splits the cells in this range.
		This will be done by inserting rows and columns if needed or unmerging
		cells taht are already splitted.

		@param Columns
			this is the number of columns that will be added to each cell. Zero
			means no new columns

		@param Rows
			this is the number of rows that will be added to each cell. Zero
			means no new rows

		@throws <type scope="com::sun::star::lang">IllegalArgumentException</type>
			if at least one of the parameters is less than zero.

		@throws <type scope="com::sun::star::lang">NoSupportException</type>
			if a split is not possible for this range.
	*/
	void split( [in] long Columns, [in] long Rows )
		raises( ::com::sun::star::lang::NoSupportException, 
				::com::sun::star::lang::IllegalArgumentException );

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

	/** @returns
			<TRUE/> if all cells from this range can be merged to one
			or <FALSE/> otherwise.
	 */
	boolean isMergeable(); 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
