/**************************************************************
 * 
 * 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_chart_XChartDataArray_idl__ 
#define __com_sun_star_chart_XChartDataArray_idl__ 
 
#ifndef __com_sun_star_chart_XChartData_idl__ 
#include <com/sun/star/chart/XChartData.idl> 
#endif 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module chart {  
 
//============================================================================= 
 
/** gives access to data represented as an array of rows.
	
    <p>Can be obtained from interface <type>XChartDocument</type> via method getData().</p>

	<p>If used for an <type>XYDiagram</type>, the row number 0
	represents the <i>x</i>-values.</p>
 */
published interface XChartDataArray: XChartData
{ 
	//------------------------------------------------------------------------- 

	/** retrieves the numerical data as a nested sequence of values.

        @returns
        	the values as a sequence of sequences.  The inner sequence
        	represents rows.
    */
	sequence< sequence< double > > getData(); 

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

	/** sets the chart data as an array of numbers.

        @param aData
        	the values as a sequence of sequences.  The inner sequence
        	represents rows.
	 */
	void setData( [in] sequence< sequence< double > > aData ); 

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

	/** retrieves the description texts for all rows.

    	@returns
        	a sequence of strings, each representing the description
        	of a row.
	 */
	sequence< string > getRowDescriptions();
 
	//------------------------------------------------------------------------- 
	 
	/** sets the description texts for all rows.

        @param aRowDescriptions
        	a sequence of strings which represent a description for
        	each row.
    */
	void setRowDescriptions( [in] sequence< string > aRowDescriptions ); 
 
	//------------------------------------------------------------------------- 

	/** retrieves the description texts for all columns.

        @returns
        	a sequence of strings, each representing the description
        	of a column.
	 */
	sequence< string > getColumnDescriptions();
 
	//------------------------------------------------------------------------- 

	/** sets the description texts for all columns.

        @param aColumnDescriptions
        	a sequence of strings which represent a description for
        	each column.
	 */
	void setColumnDescriptions( [in] sequence< string > aColumnDescriptions );
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
