/**************************************************************
 * 
 * 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_chart2_XInternalDataProvider_idl
#define com_sun_star_chart2_XInternalDataProvider_idl

#include <com/sun/star/chart2/data/XDataProvider.idl>
#include <com/sun/star/chart2/data/XDataSequence.idl>

module com
{
module sun
{
module star
{
module chart2
{

/** An internal DataProvider that has more access to data than a plain
    DataProvider.
 */
interface XInternalDataProvider  : com::sun::star::chart2::data::XDataProvider
{
    boolean         hasDataByRangeRepresentation( [in] string aRange );
    sequence< any > getDataByRangeRepresentation( [in] string aRange );
    void            setDataByRangeRepresentation( [in] string aRange, [in] sequence< any > aNewData );

    /** @param Note that -1 is allowed as the sequence is inserted
               after the given index. So to insert a sequence as the
               new first sequence (index 0), you would pass -1 here.
     */
    void insertSequence( [in] long nAfterIndex );
    void deleteSequence( [in] long nAtIndex );
    /** same as insertSequence with nAfterIndex being the largest
        current index of the data, i.e. (size - 1)
     */
    void appendSequence();

    void insertDataPointForAllSequences( [in] long nAfterIndex );
    void deleteDataPointForAllSequences( [in] long nAtIndex );
    void swapDataPointWithNextOneForAllSequences( [in] long nAtIndex );

    /** If range representations of data sequences change due to
        internal structural changes, they must be registered at the
        data provider.

        <p>Sequences that are directly retrieved via the methods of
        the XDataProvider interface are already registered.  If a
        labeled data sequence was created by cloning an existing one,
        it has to be explicitly registered via this method.</p>
     */
    void registerDataSequenceForChanges( [in] data::XDataSequence xSeq );

    /** insert an additional sequence for categories nLevel>=1;
    categories at level 0 are always present and cannot be inserted or deleted
    @since OOo 3.3
    */
    void insertComplexCategoryLevel( [in] long nLevel );
    /** deletes an additional sequence for categories at nLevel>=1;
    categories at level 0 are always present and cannot be deleted
    @since OOo 3.3
    */
    void deleteComplexCategoryLevel( [in] long nLevel );
};

} ; // chart2
} ; // com
} ; // sun
} ; // star


#endif
