/**************************************************************
 * 
 * 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_sheet_XConsolidationDescriptor_idl__
#define __com_sun_star_sheet_XConsolidationDescriptor_idl__

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

#ifndef __com_sun_star_sheet_GeneralFunction_idl__
#include <com/sun/star/sheet/GeneralFunction.idl>
#endif

#ifndef __com_sun_star_table_CellRangeAddress_idl__
#include <com/sun/star/table/CellRangeAddress.idl>
#endif

#ifndef __com_sun_star_table_CellAddress_idl__
#include <com/sun/star/table/CellAddress.idl>
#endif

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

module com {  module sun {  module star {  module sheet {

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

/** provides access to the settings of a consolidation descriptor.

	@deprecated

	@see com::sun::star::sheet::ConsolidationDescriptor
 */
published interface XConsolidationDescriptor: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------

	/** returns the function by which the ranges are consolidated.
	 */
	com::sun::star::sheet::GeneralFunction getFunction();

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

	/** sets the function by which the ranges are consolidated.
	 */
	void setFunction( [in] com::sun::star::sheet::GeneralFunction nFunction );

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

	/** returns the cell ranges which are consolidated.
	 */
	sequence< com::sun::star::table::CellRangeAddress > getSources();

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

	/** sets the cell ranges which are consolidated.
	 */
	void setSources(
			[in] sequence< com::sun::star::table::CellRangeAddress > aSources );

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

	/** returns the position of the top left cell of the cell range where
		the consolidated data are copied.
	 */
	com::sun::star::table::CellAddress getStartOutputPosition();

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

	/** sets the position of the top left cell of the cell range
		where the consolidated data are copied.
	 */
	void setStartOutputPosition(
			[in] com::sun::star::table::CellAddress aStartOutputPosition );

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

	/** returns, whether column headers from the cell ranges are used to
		find matching data or not.
	 */
	boolean getUseColumnHeaders();

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

	/** specifies if column headers from the cell ranges are used to find
		matching data.
	 */
	void setUseColumnHeaders( [in] boolean bUseColumnHeaders );

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

	/** returns, whether row headers from the cell ranges are used to
		find matching data or not.
	 */
	boolean getUseRowHeaders();

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

	/** specifies if row headers from the cell ranges are used to find
		matching data.
	 */
	void setUseRowHeaders( [in] boolean bUseRowHeaders );

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

	/** returns, whether links to the original data are inserted in the
		output area or not.
	 */
	boolean getInsertLinks();

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

	/** specifies if links to the original data are inserted in the
		output area.
	 */
	void setInsertLinks( [in] boolean bInsertLinks );

};

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

}; }; }; };

#endif

