/**************************************************************
 * 
 * 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_XExternalSheetCache_idl__
#define __com_sun_star_sheet_XExternalSheetCache_idl__

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

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

/** Primary interface for the <type scope="com::sun::star::sheet">ExternalSheetCache</type> service.

    @see com::sun::star::sheet::ExternalSheetCache

    @since OOo 3.1
 */
interface XExternalSheetCache
{
    /** It sets a cached value for a specified cell position.  The value is expected
        to be either of type <type>string</type> or of type <type>double</type>.  No
        other data types are supported.

        @param nRow row position (0-based)
        @param nColumn column position (0-based)
        @param aValue cell value to be cached
     */
    void setCellValue( [in] long nColumn, [in] long nRow, [in] any aValue )
            raises (com::sun::star::lang::IllegalArgumentException);

    /** It retrieves a cached value from a specified cell position.  The cached
        value can be either <type>string</type> or <type>double</type>.

        @return any cached cell value
     */
    any getCellValue( [in] long nColumn, [in] long nRow )
            raises (com::sun::star::lang::IllegalArgumentException);

    /** It returns a list of all row numbers where a cached cell or cells exist.
        The row numbers are sorted in ascending order.

        @return sequence<long> list of all row numbers with cached cell(s)
     */
    sequence< long > getAllRows();

    /** Given a row number, this method returns a list of all columns numbers
        that store cached cell values in that row.  The column numbers are
        sorted in ascending order.

        @return sequence<long> list of all columns numbers with cached cell values
     */
    sequence< long > getAllColumns( [in] long nRow )
            raises (com::sun::star::lang::IllegalArgumentException);

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

    /** Index corresponding to this instance of an external sheet cache for
        usage in formula tokens.

        <p>This index to the external sheet cache is expected in the
        <member>SingleReference::Sheet</member> member if it is part of an
        external reference token.

        <p>Each external sheet cache has a unique index value inside the
        <type>ExternalDocLink</type> instance.</p>

        @see FormulaToken
        @see ExternalReference
     */
    [attribute, readonly] long TokenIndex;

};

}; }; }; };

#endif
