1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _CHART2_VAXIS_PROPERTIES_HXX
24 #define _CHART2_VAXIS_PROPERTIES_HXX
25 
26 #include "TickmarkProperties.hxx"
27 #include "PlottingPositionHelper.hxx"
28 #include "LabelAlignment.hxx"
29 #include "ExplicitCategoriesProvider.hxx"
30 
31 #include <com/sun/star/chart/ChartAxisLabelPosition.hpp>
32 #include <com/sun/star/chart/ChartAxisMarkPosition.hpp>
33 #include <com/sun/star/chart/ChartAxisPosition.hpp>
34 #include <com/sun/star/chart2/XAxis.hpp>
35 #include <com/sun/star/chart2/AxisType.hpp>
36 #include <com/sun/star/chart2/data/XTextualDataSequence.hpp>
37 #include <com/sun/star/awt/Rectangle.hpp>
38 #include <com/sun/star/awt/Size.hpp>
39 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
40 #include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
41 #include <com/sun/star/lang/Locale.hpp>
42 
43 #include <vector>
44 
45 //.............................................................................
46 namespace chart
47 {
48 //.............................................................................
49 
50 //-----------------------------------------------------------------------------
51 /**
52 */
53 
54 //These properties describe how a couple of labels are arranged one to another.
55 //The couple can contain all labels for all tickmark depth or just the labels for one single depth or
56 //the labels from an coherent range of tick depths (e.g. the major and first minor tickmarks should be handled together).
57 //... only allow side by side for different tick depth
58 enum AxisLabelStaggering
59 {
60       SIDE_BY_SIDE
61     , STAGGER_EVEN
62     , STAGGER_ODD
63     , STAGGER_AUTO
64 };
65 
66 struct AxisLabelProperties
67 {
68     AxisLabelProperties();
69 
70     ::com::sun::star::awt::Size         m_aFontReferenceSize;//reference size to calculate the font height
71     ::com::sun::star::awt::Rectangle    m_aMaximumSpaceForLabels;//Labels need to be clipped in order to fit into this rectangle
72 
73     sal_Int32            nNumberFormatKey;
74 
75     AxisLabelStaggering  eStaggering;
76 
77     sal_Bool             bLineBreakAllowed;
78     sal_Bool             bOverlapAllowed;
79 
80     sal_Bool             bStackCharacters;
81     double               fRotationAngleDegree;
82 
83     sal_Int32   nRhythm; //show only each nth label with n==nRhythm
84     bool        bRhythmIsFix; //states whether the given rhythm is fix or may be changed
85 
86     //methods:
87     void init( const ::com::sun::star::uno::Reference<
88                 ::com::sun::star::chart2::XAxis >&  xAxisModel );
89 
90     sal_Bool            getIsStaggered() const;
91 };
92 
93 struct AxisProperties
94 {
95     ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XAxis > m_xAxisModel;
96 
97     sal_Int32   m_nDimensionIndex;
98     bool        m_bIsMainAxis;//not secondary axis
99     bool        m_bSwapXAndY;
100 
101     ::com::sun::star::chart::ChartAxisPosition      m_eCrossoverType;
102     ::com::sun::star::chart::ChartAxisLabelPosition m_eLabelPos;
103     ::com::sun::star::chart::ChartAxisMarkPosition  m_eTickmarkPos;
104 
105     double*     m_pfMainLinePositionAtOtherAxis;
106     double*     m_pfExrtaLinePositionAtOtherAxis;
107 
108     bool        m_bCrossingAxisHasReverseDirection;
109     bool        m_bCrossingAxisIsCategoryAxes;
110 
111     //this direction is used to indicate in which direction the labels are to be drawn
112     double          m_fLabelDirectionSign;
113     //this direction is used to indicate in which direction inner tickmarks are to be drawn
114     double          m_fInnerDirectionSign;
115     LabelAlignment  m_aLabelAlignment;
116     sal_Bool        m_bDisplayLabels;
117 
118     sal_Int32       m_nNumberFormatKey;
119 
120     /*
121     0: no tickmarks         1: inner tickmarks
122     2: outer tickmarks      3: inner and outer tickmarks
123     */
124     sal_Int32                           m_nMajorTickmarks;
125     sal_Int32                           m_nMinorTickmarks;
126     ::std::vector<TickmarkProperties>   m_aTickmarkPropertiesList;
127 
128     VLineProperties                     m_aLineProperties;
129 
130     //for category axes ->
131     sal_Int32                           m_nAxisType;//REALNUMBER, CATEGORY etc. type ::com::sun::star::chart2::AxisType
132     bool                                m_bComplexCategories;
133     ExplicitCategoriesProvider* m_pExplicitCategoriesProvider;/*no ownership here*/
134     ::com::sun::star::uno::Reference<
135         ::com::sun::star::chart2::data::XTextualDataSequence >
136                                                     m_xAxisTextProvider; //for categries or series names
137     //<- category axes
138 
139     //methods:
140 
141     AxisProperties( const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XAxis >& xAxisModel
142                   , ExplicitCategoriesProvider* pExplicitCategoriesProvider );
143     AxisProperties( const AxisProperties& rAxisProperties );
144     virtual ~AxisProperties();
145     virtual void init(bool bCartesian=false);//init from model data (m_xAxisModel)
146 
147     void initAxisPositioning( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xAxisProp );
148 
149     static TickmarkProperties getBiggestTickmarkProperties();
150     TickmarkProperties makeTickmarkPropertiesForComplexCategories( sal_Int32 nTickLength, sal_Int32 nTickStartDistanceToAxis, sal_Int32 nTextLevel ) const;
151 
152 private:
153     AxisProperties();
154 
155 protected:
156     virtual TickmarkProperties  makeTickmarkProperties( sal_Int32 nDepth ) const;
157     VLineProperties      makeLinePropertiesForDepth( sal_Int32 nDepth ) const;
158 };
159 
160 //.............................................................................
161 } //namespace chart
162 //.............................................................................
163 #endif
164