/**************************************************************
 * 
 * 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_Axis_idl
#define com_sun_star_chart_Axis_idl

#include <com/sun/star/beans/PropertySet.idl>

#include <com/sun/star/chart/ChartAxisArrangeOrderType.idl>
#include <com/sun/star/chart/ChartAxisPosition.idl>
#include <com/sun/star/chart/ChartAxisLabelPosition.idl>
#include <com/sun/star/chart/ChartAxisMarkPosition.idl>

#include <com/sun/star/chart2/XAxis.idl>
#include <com/sun/star/chart2/XTitled.idl>

#include <com/sun/star/drawing/LineProperties.idl>
#include <com/sun/star/style/CharacterProperties.idl>
#include <com/sun/star/style/CharacterPropertiesAsian.idl>
#include <com/sun/star/style/CharacterPropertiesComplex.idl>

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

service Axis
{
    service ::com::sun::star::drawing::LineProperties;

    service ::com::sun::star::style::CharacterProperties;
    service ::com::sun::star::beans::PropertySet;
    [optional] service ::com::sun::star::style::CharacterPropertiesAsian;
    [optional] service ::com::sun::star::style::CharacterPropertiesComplex;

    interface ::com::sun::star::chart2::XAxis;
    [optional] interface ::com::sun::star::chart2::XTitled;

    /** Determines, whether the axis should be rendered by the view.
     */
    [property]      boolean   Show;

    /** Determines where the axis crosses the other axis.
	 */
	[optional, property] com::sun::star::chart::ChartAxisPosition CrossoverPosition; 

    /** Determines the scale value on the other axis when CrossoverPosition is set to VALUE.
	 */
	[optional, property] double CrossoverValue; 

    /** Determines whether to display text at the axis or not.
	 */
    [property]      boolean   DisplayLabels;

    /** Determines where the axis labels are placed.
	 */
	[optional, property] com::sun::star::chart::ChartAxisLabelPosition LabelPosition; 

    /** Determines how to stagger the labels at the axis (side by side, even, odd, auto )
    */
    [property]      ::com::sun::star::chart::ChartAxisArrangeOrderType ArrangeOrder;

    /** Determines wether the labels are allowed to break into more than one line
    */
    [property]      boolean   TextBreak;

    /** Determines wether the labels are allowed to overlap
    */
    [property]      boolean   TextOverlap;

    /** Determines wether the characters in a single labels should be stacked one upon each other
    */
    [property]      boolean   StackCharacters;

	/** Determines the rotation of the text labels in degrees
	 */
    [property]      double    TextRotation;

    /** A NumberFormat key.

        <p>If this property is not set, it is treated as auto.  This
        means linked to the source format.</p>

        <p>To determine a source format, the axis can query the
        <type>XDataSequence</type>s used by the data series attached
        to it (see <member>XDataSequence::getNumberFormatKeyByIndex</member>).
        </p>
     */
    [property, maybevoid]      long      NumberFormat;

    [property]      ::com::sun::star::awt::Size  ReferencePageSize;

    /** determines what kind of tickmarks should be shown for major ticks.

         @see <type>TickmarkStyle</type>.
    */
    [property]      long      MajorTickmarks;

    /** determines what kind of tickmarks should be shown for minor ticks.

        @see <type>TickmarkStyle</type>.
     */
    [property]      long      MinorTickmarks;

    /** Determines where the interval marks are placed.
	 */
	[optional, property] com::sun::star::chart::ChartAxisMarkPosition MarkPosition; 
};

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

#endif
