/**************************************************************
 * 
 * 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_ScaleData_idl
#define com_sun_star_chart2_ScaleData_idl

#include <com/sun/star/chart2/XScaling.idl>
#include <com/sun/star/chart2/AxisOrientation.idl>
#include <com/sun/star/chart2/data/XLabeledDataSequence.idl>
#include <com/sun/star/chart2/AxisType.idl>
#include <com/sun/star/chart2/IncrementData.idl>
#include <com/sun/star/chart/TimeIncrement.idl>

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

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

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

struct ScaleData
{
    /** if the any contains a double value this is used as a fixed
        maximum.  Otherwise, if the any is empty or contains an
        incompatible type, the maximum is automatic.

        <p>If the maximum is automatic, this means, each view that
        represents the model containing this scale, has to calculate a
        maximum by its own means.</p>
     */
    any Minimum;

    /** if the any contains a double value this is used as a fixed
        minimum.  Otherwise, if the any is empty or contains an
        incompatible type, the minimum is automatic.

        <p>If the minimum is automatic, this means, each view that
        represents the model containing this scale, has to calculate a
        minimum by its own means.</p>
     */
    any Maximum;


    /** The Origin indicates where other axes cross this axis.
        If the any contains a double value that value is used.
        Otherwise an appropriate value has to be calculated
        by that instances using Origin.
     */
    any Origin;

    /** Axis orientation (standard or reversed).

        <p>If used at the Y axis in pie charts or doughnut charts, specifies
        the rotation direction of the pie. The value
        <const>AxisOrientation::MATHEMATICAL</const> rotates the pie
        counterclockwise, the value <const>AxisOrientation::REVERSE</const>
        rotates the pie clockwise.</p>

        <p>Note: Is this a good place for the axis orientation? Two axes may
        use the same scale, but point into two different directions.</p>
     */
    AxisOrientation     Orientation;

    XScaling            Scaling;

    data::XLabeledDataSequence Categories;

    /** describes the type of the axis.

        <p>It can be a real number axis or a category axis or something else.
        AxisType is one value out of the constant group <type>AxisType</type>.</p>
    */
    long   AxisType;

    /** if true an AxisType CATEGORY is interpreted as DATE if the underlying data given in Categories are dates
    */
    boolean AutoDateAxis;

    /** describes wether data points on category or date axis are placed between tickmarks or not
    if true the maximum on the scale will be expanded for one interval
    */
    boolean ShiftedCategoryPosition;

    /** increment data to be used for not date-time axis
    */
    IncrementData IncrementData;

    /** increment data to be used in case of date-time axis
    */
    ::com::sun::star::chart::TimeIncrement TimeIncrement;
};

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

}; }; }; };

#endif
