/**************************************************************
 * 
 * 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_awt_grid_XGridDataModel_idl__ 
#define __com_sun_star_awt_grid_XGridDataModel_idl__ 
 

#include <com/sun/star/lang/XComponent.idl> 
#include <com/sun/star/util/XCloneable.idl> 
#include <com/sun/star/awt/grid/XGridDataListener.idl> 
#include <com/sun/star/lang/IndexOutOfBoundsException.idl>

//============================================================================= 
 
module com {  module sun {  module star {  module awt { module grid { 
 
//============================================================================= 
/** An instance of this interface is used by the <type>UnoControlGrid</type> to
	retrieve the content data that is displayed in the actual control.

	If you do not need your own model implementation, you can also use the <type>DefaultGridDataModel</type>.
	
	@since OOo 3.3
*/   
published interface XGridDataModel
{ 
    /** implements life time control for the component
    */
    interface ::com::sun::star::lang::XComponent;

    /** allows cloning the complete data model
    */
    interface ::com::sun::star::util::XCloneable;

    /** denotes the number of rows for which the model can provide data
    */
    [attribute, readonly] long RowCount;

    /** denotes the number of columns for which the model can provide data
    */
    [attribute, readonly] long ColumnCount;

    /** retrieves the data for a given cell

        @throws ::com::sun::star::lang::IndexOutOfBoundsException
            if the column or row index do not denote a valid cell position.
    */
    any getCellData( [in] long Column, [in] long RowIndex )
        raises ( ::com::sun::star::lang::IndexOutOfBoundsException );

    /** retrieves the tool tip to be displayed when the mouse hovers over a given cell

        <p>At the moment, only string tool tips are supported.</p>

        <p>If <VOID/> is returned here, the cell's content will be displayed as tip, but only if it does
        not fit into the cell.</p>

        @throws ::com::sun::star::lang::IndexOutOfBoundsException
            if the column or row index do not denote a valid cell position.
    */
    any getCellToolTip( [in] long Column, [in] long RowIndex )
        raises ( ::com::sun::star::lang::IndexOutOfBoundsException );

    /** retrieves the heading of a given row

        <p>A grid control will usually paint a row's title in the header column of the respective row.</p>

        <p>At the moment, only strings are supported as row headings.</p>

        @throws ::com::sun::star::lang::IndexOutOfBoundsException
            if the given index does not denote a valid row.
    */
    any
        getRowHeading( [in] long RowIndex )
        raises ( ::com::sun::star::lang::IndexOutOfBoundsException );

    /** retrieves the data for a complete row

        <p>This method is provided for performance and convenience reasons, it delivers the same result
        as subsequent calls to <member>getCellData</member> would.</p>

        @param Row
            the index of the row whose data should is to be retrieved.
        @raises ::com::sun::star::lang::IndexOutOfBoundsException
            of the given row index does not denote a valid row.
    */
    sequence< any >
        getRowData( [in] long RowIndex )
        raises ( ::com::sun::star::lang::IndexOutOfBoundsException );
}; 
 
//============================================================================= 
 
}; }; }; };};  
 
#endif 
