1cde9e8dcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3cde9e8dcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4cde9e8dcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5cde9e8dcSAndrew Rist  * distributed with this work for additional information
6cde9e8dcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7cde9e8dcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8cde9e8dcSAndrew Rist  * "License"); you may not use this file except in compliance
9cde9e8dcSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cde9e8dcSAndrew Rist  *
11cde9e8dcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cde9e8dcSAndrew Rist  *
13cde9e8dcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14cde9e8dcSAndrew Rist  * software distributed under the License is distributed on an
15cde9e8dcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16cde9e8dcSAndrew Rist  * KIND, either express or implied.  See the License for the
17cde9e8dcSAndrew Rist  * specific language governing permissions and limitations
18cde9e8dcSAndrew Rist  * under the License.
19cde9e8dcSAndrew Rist  *
20cde9e8dcSAndrew Rist  *************************************************************/
21cde9e8dcSAndrew Rist 
22cde9e8dcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_chart2.hxx"
26cdf0e10cSrcweir #include "VAxisProperties.hxx"
27cdf0e10cSrcweir #include "macros.hxx"
28cdf0e10cSrcweir #include "ViewDefines.hxx"
29cdf0e10cSrcweir #include "CommonConverters.hxx"
30cdf0e10cSrcweir #include "AxisHelper.hxx"
31cdf0e10cSrcweir #include "DiagramHelper.hxx"
32cdf0e10cSrcweir #include "ChartModelHelper.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <tools/color.hxx>
35cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
36cdf0e10cSrcweir #include <com/sun/star/chart/ChartAxisArrangeOrderType.hpp>
37cdf0e10cSrcweir #include <com/sun/star/drawing/LineStyle.hpp>
38cdf0e10cSrcweir #include <com/sun/star/text/WritingMode2.hpp>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir //.............................................................................
41cdf0e10cSrcweir namespace chart
42cdf0e10cSrcweir {
43cdf0e10cSrcweir //.............................................................................
44cdf0e10cSrcweir using namespace ::com::sun::star;
45cdf0e10cSrcweir using namespace ::com::sun::star::chart2;
46cdf0e10cSrcweir 
lcl_calcTickLengthForDepth(sal_Int32 nDepth,sal_Int32 nTickmarkStyle)47cdf0e10cSrcweir sal_Int32 lcl_calcTickLengthForDepth(sal_Int32 nDepth,sal_Int32 nTickmarkStyle)
48cdf0e10cSrcweir {
49cdf0e10cSrcweir     sal_Int32 nWidth = AXIS2D_TICKLENGTH; //@maybefuturetodo this length could be offered by the model
50cdf0e10cSrcweir     double fPercent = 1.0;
51cdf0e10cSrcweir     switch(nDepth)
52cdf0e10cSrcweir     {
53cdf0e10cSrcweir         case 0:
54cdf0e10cSrcweir             fPercent = 1.0;
55cdf0e10cSrcweir             break;
56cdf0e10cSrcweir         case 1:
57cdf0e10cSrcweir             fPercent = 0.75;//percentage like in the old chart
58cdf0e10cSrcweir             break;
59cdf0e10cSrcweir         case 2:
60cdf0e10cSrcweir             fPercent = 0.5;
61cdf0e10cSrcweir             break;
62cdf0e10cSrcweir         default:
63cdf0e10cSrcweir             fPercent = 0.3;
64cdf0e10cSrcweir             break;
65cdf0e10cSrcweir     }
66cdf0e10cSrcweir     if(nTickmarkStyle==3)//inner and outer tickmarks
67cdf0e10cSrcweir         fPercent*=2.0;
68cdf0e10cSrcweir     return static_cast<sal_Int32>(nWidth*fPercent);
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
lcl_getTickOffset(sal_Int32 nLength,sal_Int32 nTickmarkStyle)71cdf0e10cSrcweir double lcl_getTickOffset(sal_Int32 nLength,sal_Int32 nTickmarkStyle)
72cdf0e10cSrcweir {
73cdf0e10cSrcweir     double fPercent = 0.0; //0<=fPercent<=1
74*d2b26721Smseidel     //0.0: completely inner
75*d2b26721Smseidel     //1.0: completely outer
76cdf0e10cSrcweir     //0.5: half and half
77cdf0e10cSrcweir 
78cdf0e10cSrcweir     /*
79cdf0e10cSrcweir     nTickmarkStyle:
80cdf0e10cSrcweir     1: inner tickmarks
81cdf0e10cSrcweir     2: outer tickmarks
82cdf0e10cSrcweir     3: inner and outer tickmarks
83cdf0e10cSrcweir     */
84cdf0e10cSrcweir     switch(nTickmarkStyle)
85cdf0e10cSrcweir     {
86cdf0e10cSrcweir         case 1:
87cdf0e10cSrcweir             fPercent = 0.0;
88cdf0e10cSrcweir             break;
89cdf0e10cSrcweir         case 2:
90cdf0e10cSrcweir             fPercent = 1.0;
91cdf0e10cSrcweir             break;
92cdf0e10cSrcweir         default:
93cdf0e10cSrcweir             fPercent = 0.5;
94cdf0e10cSrcweir             break;
95cdf0e10cSrcweir     }
96cdf0e10cSrcweir     return fPercent*nLength;
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
makeLinePropertiesForDepth(sal_Int32) const99cdf0e10cSrcweir VLineProperties AxisProperties::makeLinePropertiesForDepth( sal_Int32 /* nDepth */ ) const
100cdf0e10cSrcweir {
101cdf0e10cSrcweir     //@todo get this from somewhere; maybe for each subincrement
102cdf0e10cSrcweir     //so far the model does not offer different settings for each tick depth
103cdf0e10cSrcweir     return m_aLineProperties;
104cdf0e10cSrcweir }
105cdf0e10cSrcweir 
makeTickmarkProperties(sal_Int32 nDepth) const106cdf0e10cSrcweir TickmarkProperties AxisProperties::makeTickmarkProperties(
107cdf0e10cSrcweir                         sal_Int32 nDepth ) const
108cdf0e10cSrcweir {
109cdf0e10cSrcweir     /*
110cdf0e10cSrcweir     nTickmarkStyle:
111cdf0e10cSrcweir     1: inner tickmarks
112cdf0e10cSrcweir     2: outer tickmarks
113cdf0e10cSrcweir     3: inner and outer tickmarks
114cdf0e10cSrcweir     */
115cdf0e10cSrcweir     sal_Int32 nTickmarkStyle = 1;
116cdf0e10cSrcweir     if(nDepth==0)
117cdf0e10cSrcweir     {
118cdf0e10cSrcweir         nTickmarkStyle = m_nMajorTickmarks;
119cdf0e10cSrcweir         if(!nTickmarkStyle)
120cdf0e10cSrcweir         {
121cdf0e10cSrcweir             //create major tickmarks as if they were minor tickmarks
122cdf0e10cSrcweir             nDepth = 1;
123cdf0e10cSrcweir             nTickmarkStyle = m_nMinorTickmarks;
124cdf0e10cSrcweir         }
125cdf0e10cSrcweir     }
126cdf0e10cSrcweir     else if( nDepth==1)
127cdf0e10cSrcweir     {
128cdf0e10cSrcweir         nTickmarkStyle = m_nMinorTickmarks;
129cdf0e10cSrcweir     }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir     if( m_fInnerDirectionSign == 0.0 )
132cdf0e10cSrcweir     {
133cdf0e10cSrcweir         if( nTickmarkStyle != 0 )
134cdf0e10cSrcweir             nTickmarkStyle = 3; //inner and outer tickmarks
135cdf0e10cSrcweir     }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir     TickmarkProperties aTickmarkProperties;
138cdf0e10cSrcweir     aTickmarkProperties.Length = lcl_calcTickLengthForDepth(nDepth,nTickmarkStyle);
139cdf0e10cSrcweir     aTickmarkProperties.RelativePos = static_cast<sal_Int32>(lcl_getTickOffset(aTickmarkProperties.Length,nTickmarkStyle));
140cdf0e10cSrcweir     aTickmarkProperties.aLineProperties = this->makeLinePropertiesForDepth( nDepth );
141cdf0e10cSrcweir     return aTickmarkProperties;
142cdf0e10cSrcweir }
143cdf0e10cSrcweir 
makeTickmarkPropertiesForComplexCategories(sal_Int32 nTickLength,sal_Int32 nTickStartDistanceToAxis,sal_Int32) const144cdf0e10cSrcweir TickmarkProperties AxisProperties::makeTickmarkPropertiesForComplexCategories(
145cdf0e10cSrcweir     sal_Int32 nTickLength, sal_Int32 nTickStartDistanceToAxis, sal_Int32 /*nTextLevel*/ ) const
146cdf0e10cSrcweir {
147cdf0e10cSrcweir     sal_Int32 nTickmarkStyle = (m_fLabelDirectionSign==m_fInnerDirectionSign) ? 2/*outside*/ : 1/*inside*/;
148cdf0e10cSrcweir 
149cdf0e10cSrcweir     TickmarkProperties aTickmarkProperties;
150cdf0e10cSrcweir     aTickmarkProperties.Length = nTickLength;// + nTextLevel*( lcl_calcTickLengthForDepth(0,nTickmarkStyle) );
151cdf0e10cSrcweir     aTickmarkProperties.RelativePos = static_cast<sal_Int32>(lcl_getTickOffset(aTickmarkProperties.Length+nTickStartDistanceToAxis,nTickmarkStyle));
152cdf0e10cSrcweir     aTickmarkProperties.aLineProperties = this->makeLinePropertiesForDepth( 0 );
153cdf0e10cSrcweir     return aTickmarkProperties;
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
getBiggestTickmarkProperties()156cdf0e10cSrcweir TickmarkProperties AxisProperties::getBiggestTickmarkProperties()
157cdf0e10cSrcweir {
158cdf0e10cSrcweir     TickmarkProperties aTickmarkProperties;
159cdf0e10cSrcweir     sal_Int32 nDepth = 0;
160cdf0e10cSrcweir     sal_Int32 nTickmarkStyle = 3;//inner and outer tickmarks
161cdf0e10cSrcweir     aTickmarkProperties.Length = lcl_calcTickLengthForDepth( nDepth,nTickmarkStyle );
162cdf0e10cSrcweir     aTickmarkProperties.RelativePos = static_cast<sal_Int32>( lcl_getTickOffset( aTickmarkProperties.Length, nTickmarkStyle ) );
163cdf0e10cSrcweir     return aTickmarkProperties;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir //--------------------------------------------------------------------------
167cdf0e10cSrcweir 
AxisProperties(const uno::Reference<XAxis> & xAxisModel,ExplicitCategoriesProvider * pExplicitCategoriesProvider)168cdf0e10cSrcweir AxisProperties::AxisProperties( const uno::Reference< XAxis >& xAxisModel
169cdf0e10cSrcweir                               , ExplicitCategoriesProvider* pExplicitCategoriesProvider )
170cdf0e10cSrcweir     : m_xAxisModel(xAxisModel)
171cdf0e10cSrcweir     , m_nDimensionIndex(0)
172cdf0e10cSrcweir     , m_bIsMainAxis(true)
173cdf0e10cSrcweir     , m_bSwapXAndY(false)
174cdf0e10cSrcweir     , m_eCrossoverType( ::com::sun::star::chart::ChartAxisPosition_ZERO )
175cdf0e10cSrcweir     , m_eLabelPos( ::com::sun::star::chart::ChartAxisLabelPosition_NEAR_AXIS )
176cdf0e10cSrcweir     , m_eTickmarkPos( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS_AND_AXIS )
177cdf0e10cSrcweir     , m_pfMainLinePositionAtOtherAxis(NULL)
178cdf0e10cSrcweir     , m_pfExrtaLinePositionAtOtherAxis(NULL)
179cdf0e10cSrcweir     , m_bCrossingAxisHasReverseDirection(false)
180cdf0e10cSrcweir     , m_bCrossingAxisIsCategoryAxes(false)
181cdf0e10cSrcweir     , m_fLabelDirectionSign(1.0)
182cdf0e10cSrcweir     , m_fInnerDirectionSign(1.0)
183cdf0e10cSrcweir     , m_aLabelAlignment(LABEL_ALIGN_RIGHT_TOP)
184cdf0e10cSrcweir     , m_bDisplayLabels( true )
185cdf0e10cSrcweir     , m_nNumberFormatKey(0)
186cdf0e10cSrcweir     , m_nMajorTickmarks(1)
187cdf0e10cSrcweir     , m_nMinorTickmarks(1)
188cdf0e10cSrcweir     , m_aTickmarkPropertiesList()
189cdf0e10cSrcweir     , m_aLineProperties()
190cdf0e10cSrcweir     //for category axes
191cdf0e10cSrcweir     , m_nAxisType(AxisType::REALNUMBER)
192cdf0e10cSrcweir     , m_bComplexCategories(false)
193cdf0e10cSrcweir     , m_pExplicitCategoriesProvider(pExplicitCategoriesProvider)
194cdf0e10cSrcweir     , m_xAxisTextProvider(0)
195cdf0e10cSrcweir {
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
AxisProperties(const AxisProperties & rAxisProperties)198cdf0e10cSrcweir AxisProperties::AxisProperties( const AxisProperties& rAxisProperties )
199cdf0e10cSrcweir     : m_xAxisModel( rAxisProperties.m_xAxisModel )
2002e7c0666SHerbert Dürr     , m_nDimensionIndex( rAxisProperties.m_nDimensionIndex )
201cdf0e10cSrcweir     , m_bIsMainAxis( rAxisProperties.m_bIsMainAxis )
202cdf0e10cSrcweir     , m_bSwapXAndY( rAxisProperties.m_bSwapXAndY )
203cdf0e10cSrcweir     , m_eCrossoverType( rAxisProperties.m_eCrossoverType )
204cdf0e10cSrcweir     , m_eLabelPos( rAxisProperties.m_eLabelPos )
205cdf0e10cSrcweir     , m_eTickmarkPos( rAxisProperties.m_eTickmarkPos )
206cdf0e10cSrcweir     , m_pfMainLinePositionAtOtherAxis( NULL )
207cdf0e10cSrcweir     , m_pfExrtaLinePositionAtOtherAxis( NULL )
208cdf0e10cSrcweir     , m_bCrossingAxisHasReverseDirection( rAxisProperties.m_bCrossingAxisHasReverseDirection )
209cdf0e10cSrcweir     , m_bCrossingAxisIsCategoryAxes( rAxisProperties.m_bCrossingAxisIsCategoryAxes )
210cdf0e10cSrcweir     , m_fLabelDirectionSign( rAxisProperties.m_fLabelDirectionSign )
211cdf0e10cSrcweir     , m_fInnerDirectionSign( rAxisProperties.m_fInnerDirectionSign )
212cdf0e10cSrcweir     , m_aLabelAlignment( rAxisProperties.m_aLabelAlignment )
213cdf0e10cSrcweir     , m_bDisplayLabels( rAxisProperties.m_bDisplayLabels )
214cdf0e10cSrcweir     , m_nNumberFormatKey( rAxisProperties.m_nNumberFormatKey )
215cdf0e10cSrcweir     , m_nMajorTickmarks( rAxisProperties.m_nMajorTickmarks )
216cdf0e10cSrcweir     , m_nMinorTickmarks( rAxisProperties.m_nMinorTickmarks )
217cdf0e10cSrcweir     , m_aTickmarkPropertiesList( rAxisProperties.m_aTickmarkPropertiesList )
218cdf0e10cSrcweir     , m_aLineProperties( rAxisProperties.m_aLineProperties )
219cdf0e10cSrcweir     //for category axes
220cdf0e10cSrcweir     , m_nAxisType( rAxisProperties.m_nAxisType )
221cdf0e10cSrcweir     , m_bComplexCategories( rAxisProperties.m_bComplexCategories )
222cdf0e10cSrcweir     , m_pExplicitCategoriesProvider( rAxisProperties.m_pExplicitCategoriesProvider )
223cdf0e10cSrcweir     , m_xAxisTextProvider( rAxisProperties.m_xAxisTextProvider )
224cdf0e10cSrcweir {
225cdf0e10cSrcweir     if( rAxisProperties.m_pfMainLinePositionAtOtherAxis )
226cdf0e10cSrcweir         m_pfMainLinePositionAtOtherAxis = new double(*rAxisProperties.m_pfMainLinePositionAtOtherAxis);
227cdf0e10cSrcweir     if( rAxisProperties.m_pfExrtaLinePositionAtOtherAxis )
228cdf0e10cSrcweir         m_pfExrtaLinePositionAtOtherAxis = new double (*rAxisProperties.m_pfExrtaLinePositionAtOtherAxis);
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
~AxisProperties()231cdf0e10cSrcweir AxisProperties::~AxisProperties()
232cdf0e10cSrcweir {
233cdf0e10cSrcweir     delete m_pfMainLinePositionAtOtherAxis;
234cdf0e10cSrcweir     delete m_pfExrtaLinePositionAtOtherAxis;
235cdf0e10cSrcweir }
236cdf0e10cSrcweir 
lcl_getLabelAlignmentForZAxis(const AxisProperties & rAxisProperties)237cdf0e10cSrcweir LabelAlignment lcl_getLabelAlignmentForZAxis( const AxisProperties& rAxisProperties )
238cdf0e10cSrcweir {
239cdf0e10cSrcweir     LabelAlignment aRet( LABEL_ALIGN_RIGHT );
240cdf0e10cSrcweir     if( rAxisProperties.m_fLabelDirectionSign<0 )
241cdf0e10cSrcweir         aRet = LABEL_ALIGN_LEFT;
242cdf0e10cSrcweir     return aRet;
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
lcl_getLabelAlignmentForYAxis(const AxisProperties & rAxisProperties)245cdf0e10cSrcweir LabelAlignment lcl_getLabelAlignmentForYAxis( const AxisProperties& rAxisProperties )
246cdf0e10cSrcweir {
247cdf0e10cSrcweir     LabelAlignment aRet( LABEL_ALIGN_RIGHT );
248cdf0e10cSrcweir     if( rAxisProperties.m_fLabelDirectionSign<0 )
249cdf0e10cSrcweir         aRet = LABEL_ALIGN_LEFT;
250cdf0e10cSrcweir     return aRet;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
lcl_getLabelAlignmentForXAxis(const AxisProperties & rAxisProperties)253cdf0e10cSrcweir LabelAlignment lcl_getLabelAlignmentForXAxis( const AxisProperties& rAxisProperties )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir     LabelAlignment aRet( LABEL_ALIGN_BOTTOM );
256cdf0e10cSrcweir     if( rAxisProperties.m_fLabelDirectionSign<0 )
257cdf0e10cSrcweir         aRet = LABEL_ALIGN_TOP;
258cdf0e10cSrcweir     return aRet;
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
initAxisPositioning(const uno::Reference<beans::XPropertySet> & xAxisProp)261cdf0e10cSrcweir void AxisProperties::initAxisPositioning( const uno::Reference< beans::XPropertySet >& xAxisProp )
262cdf0e10cSrcweir {
263cdf0e10cSrcweir     if( !xAxisProp.is() )
264cdf0e10cSrcweir         return;
265cdf0e10cSrcweir     try
266cdf0e10cSrcweir     {
267cdf0e10cSrcweir         if( AxisHelper::isAxisPositioningEnabled() )
268cdf0e10cSrcweir         {
269cdf0e10cSrcweir             xAxisProp->getPropertyValue(C2U( "CrossoverPosition" )) >>= m_eCrossoverType;
270cdf0e10cSrcweir             if( ::com::sun::star::chart::ChartAxisPosition_VALUE == m_eCrossoverType )
271cdf0e10cSrcweir             {
272cdf0e10cSrcweir                 double fValue = 0.0;
273cdf0e10cSrcweir                 xAxisProp->getPropertyValue(C2U( "CrossoverValue" )) >>= fValue;
274cdf0e10cSrcweir 
275cdf0e10cSrcweir                 if( m_bCrossingAxisIsCategoryAxes )
276cdf0e10cSrcweir                     fValue = ::rtl::math::round(fValue);
277cdf0e10cSrcweir                 m_pfMainLinePositionAtOtherAxis = new double(fValue);
278cdf0e10cSrcweir             }
279cdf0e10cSrcweir             else if( ::com::sun::star::chart::ChartAxisPosition_ZERO == m_eCrossoverType )
280cdf0e10cSrcweir                 m_pfMainLinePositionAtOtherAxis = new double(0.0);
281cdf0e10cSrcweir 
282cdf0e10cSrcweir             xAxisProp->getPropertyValue(C2U( "LabelPosition" )) >>= m_eLabelPos;
283cdf0e10cSrcweir             xAxisProp->getPropertyValue(C2U( "MarkPosition" )) >>= m_eTickmarkPos;
284cdf0e10cSrcweir         }
285cdf0e10cSrcweir         else
286cdf0e10cSrcweir         {
287cdf0e10cSrcweir             m_eCrossoverType = ::com::sun::star::chart::ChartAxisPosition_START;
288cdf0e10cSrcweir             if( m_bIsMainAxis == m_bCrossingAxisHasReverseDirection )
289cdf0e10cSrcweir                 m_eCrossoverType = ::com::sun::star::chart::ChartAxisPosition_END;
290cdf0e10cSrcweir             m_eLabelPos = ::com::sun::star::chart::ChartAxisLabelPosition_NEAR_AXIS;
291cdf0e10cSrcweir             m_eTickmarkPos = ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS;
292cdf0e10cSrcweir         }
293cdf0e10cSrcweir     }
294cdf0e10cSrcweir     catch( uno::Exception& e )
295cdf0e10cSrcweir     {
296cdf0e10cSrcweir         ASSERT_EXCEPTION( e );
297cdf0e10cSrcweir     }
298cdf0e10cSrcweir }
299cdf0e10cSrcweir 
init(bool bCartesian)300cdf0e10cSrcweir void AxisProperties::init( bool bCartesian )
301cdf0e10cSrcweir {
302cdf0e10cSrcweir     uno::Reference< beans::XPropertySet > xProp =
303cdf0e10cSrcweir         uno::Reference<beans::XPropertySet>::query( this->m_xAxisModel );
304cdf0e10cSrcweir     if( !xProp.is() )
305cdf0e10cSrcweir         return;
306cdf0e10cSrcweir 
307cdf0e10cSrcweir     if( m_nDimensionIndex<2 )
308cdf0e10cSrcweir         initAxisPositioning( xProp );
309cdf0e10cSrcweir 
310cdf0e10cSrcweir     ScaleData aScaleData = m_xAxisModel->getScaleData();
311cdf0e10cSrcweir     if( m_nDimensionIndex==0 )
312cdf0e10cSrcweir         AxisHelper::checkDateAxis( aScaleData, m_pExplicitCategoriesProvider, bCartesian );
313cdf0e10cSrcweir     m_nAxisType = aScaleData.AxisType;
314cdf0e10cSrcweir 
315cdf0e10cSrcweir     if( bCartesian )
316cdf0e10cSrcweir     {
317cdf0e10cSrcweir         if( m_nDimensionIndex == 0 && m_nAxisType == AxisType::CATEGORY
318cdf0e10cSrcweir                 && m_pExplicitCategoriesProvider && m_pExplicitCategoriesProvider->hasComplexCategories() )
319cdf0e10cSrcweir             m_bComplexCategories = true;
320cdf0e10cSrcweir 
321cdf0e10cSrcweir         if( ::com::sun::star::chart::ChartAxisPosition_END == m_eCrossoverType )
322cdf0e10cSrcweir             m_fInnerDirectionSign = m_bCrossingAxisHasReverseDirection ? 1 : -1;
323cdf0e10cSrcweir         else
324cdf0e10cSrcweir             m_fInnerDirectionSign = m_bCrossingAxisHasReverseDirection ? -1 : 1;
325cdf0e10cSrcweir 
326cdf0e10cSrcweir         if( ::com::sun::star::chart::ChartAxisLabelPosition_NEAR_AXIS == m_eLabelPos )
327cdf0e10cSrcweir             m_fLabelDirectionSign = m_fInnerDirectionSign;
328cdf0e10cSrcweir         else if( ::com::sun::star::chart::ChartAxisLabelPosition_NEAR_AXIS_OTHER_SIDE == m_eLabelPos )
329cdf0e10cSrcweir             m_fLabelDirectionSign = -m_fInnerDirectionSign;
330cdf0e10cSrcweir         else if( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START == m_eLabelPos )
331cdf0e10cSrcweir             m_fLabelDirectionSign = m_bCrossingAxisHasReverseDirection ? -1 : 1;
332cdf0e10cSrcweir         else if( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_END == m_eLabelPos )
333cdf0e10cSrcweir             m_fLabelDirectionSign = m_bCrossingAxisHasReverseDirection ? 1 : -1;
334cdf0e10cSrcweir 
335cdf0e10cSrcweir         if( m_nDimensionIndex==2 )
336cdf0e10cSrcweir             m_aLabelAlignment = lcl_getLabelAlignmentForZAxis(*this);
337cdf0e10cSrcweir         else
338cdf0e10cSrcweir         {
339cdf0e10cSrcweir             bool bIsYAxisPosition = (m_nDimensionIndex==1 && !m_bSwapXAndY)
340cdf0e10cSrcweir                 || (m_nDimensionIndex==0 && m_bSwapXAndY);
341cdf0e10cSrcweir             if( bIsYAxisPosition )
342cdf0e10cSrcweir             {
343cdf0e10cSrcweir                 m_fLabelDirectionSign*=-1;
344cdf0e10cSrcweir                 m_fInnerDirectionSign*=-1;
345cdf0e10cSrcweir             }
346cdf0e10cSrcweir 
347cdf0e10cSrcweir             if( bIsYAxisPosition )
348cdf0e10cSrcweir                 m_aLabelAlignment = lcl_getLabelAlignmentForYAxis(*this);
349cdf0e10cSrcweir             else
350cdf0e10cSrcweir                 m_aLabelAlignment = lcl_getLabelAlignmentForXAxis(*this);
351cdf0e10cSrcweir         }
352cdf0e10cSrcweir     }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir     try
355cdf0e10cSrcweir     {
356cdf0e10cSrcweir         //init LineProperties
357cdf0e10cSrcweir         m_aLineProperties.initFromPropertySet( xProp );
358cdf0e10cSrcweir 
359cdf0e10cSrcweir         //init display labels
360cdf0e10cSrcweir         xProp->getPropertyValue( C2U( "DisplayLabels" ) ) >>= m_bDisplayLabels;
361cdf0e10cSrcweir 
362cdf0e10cSrcweir         //init TickmarkProperties
363cdf0e10cSrcweir         xProp->getPropertyValue( C2U( "MajorTickmarks" ) ) >>= m_nMajorTickmarks;
364cdf0e10cSrcweir         xProp->getPropertyValue( C2U( "MinorTickmarks" ) ) >>= m_nMinorTickmarks;
365cdf0e10cSrcweir 
366cdf0e10cSrcweir         sal_Int32 nMaxDepth = 0;
367cdf0e10cSrcweir         if(m_nMinorTickmarks!=0)
368cdf0e10cSrcweir             nMaxDepth=2;
369cdf0e10cSrcweir         else if(m_nMajorTickmarks!=0)
370cdf0e10cSrcweir             nMaxDepth=1;
371cdf0e10cSrcweir 
372cdf0e10cSrcweir         this->m_aTickmarkPropertiesList.clear();
373cdf0e10cSrcweir         for( sal_Int32 nDepth=0; nDepth<nMaxDepth; nDepth++ )
374cdf0e10cSrcweir         {
375cdf0e10cSrcweir             TickmarkProperties aTickmarkProperties = this->makeTickmarkProperties( nDepth );
376cdf0e10cSrcweir             this->m_aTickmarkPropertiesList.push_back( aTickmarkProperties );
377cdf0e10cSrcweir         }
378cdf0e10cSrcweir     }
379cdf0e10cSrcweir     catch( uno::Exception& e )
380cdf0e10cSrcweir 	{
381cdf0e10cSrcweir         ASSERT_EXCEPTION( e );
382cdf0e10cSrcweir     }
383cdf0e10cSrcweir }
384cdf0e10cSrcweir 
385cdf0e10cSrcweir //-----------------------------------------------------------------------------
386cdf0e10cSrcweir 
AxisLabelProperties()387cdf0e10cSrcweir AxisLabelProperties::AxisLabelProperties()
388cdf0e10cSrcweir                         : m_aFontReferenceSize( ChartModelHelper::getDefaultPageSize() )
389cdf0e10cSrcweir                         , m_aMaximumSpaceForLabels( 0 , 0, m_aFontReferenceSize.Width, m_aFontReferenceSize.Height )
390cdf0e10cSrcweir                         , nNumberFormatKey(0)
391cdf0e10cSrcweir                         , eStaggering( SIDE_BY_SIDE )
392cdf0e10cSrcweir                         , bLineBreakAllowed( false )
393cdf0e10cSrcweir                         , bOverlapAllowed( false )
394cdf0e10cSrcweir                         , bStackCharacters( false )
395cdf0e10cSrcweir                         , fRotationAngleDegree( 0.0 )
396cdf0e10cSrcweir                         , nRhythm( 1 )
397cdf0e10cSrcweir                         , bRhythmIsFix(false)
398cdf0e10cSrcweir {
399cdf0e10cSrcweir     /*
400cdf0e10cSrcweir     aLocale.Language = C2U( "en" );
401cdf0e10cSrcweir     aLocale.Country  = C2U( "US" );
402cdf0e10cSrcweir 
403cdf0e10cSrcweir     //aLocale.Language = C2U( "ar" );
404cdf0e10cSrcweir     //aLocale.Country  = C2U( "IR" );
405cdf0e10cSrcweir 
406cdf0e10cSrcweir     //aLocale.Language = C2U( "ja" );
407cdf0e10cSrcweir     //aLocale.Country  = C2U( "JP" );
408cdf0e10cSrcweir     */
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
init(const uno::Reference<XAxis> & xAxisModel)411cdf0e10cSrcweir void AxisLabelProperties::init( const uno::Reference< XAxis >& xAxisModel )
412cdf0e10cSrcweir {
413cdf0e10cSrcweir     uno::Reference< beans::XPropertySet > xProp =
414cdf0e10cSrcweir         uno::Reference<beans::XPropertySet>::query( xAxisModel );
415cdf0e10cSrcweir     if(xProp.is())
416cdf0e10cSrcweir     {
417cdf0e10cSrcweir         try
418cdf0e10cSrcweir         {
419cdf0e10cSrcweir             xProp->getPropertyValue( C2U( "TextBreak" ) ) >>= this->bLineBreakAllowed;
420cdf0e10cSrcweir             xProp->getPropertyValue( C2U( "TextOverlap" ) ) >>= this->bOverlapAllowed;
421cdf0e10cSrcweir             xProp->getPropertyValue( C2U( "StackCharacters" ) ) >>= this->bStackCharacters;
422cdf0e10cSrcweir             xProp->getPropertyValue( C2U( "TextRotation" ) ) >>= this->fRotationAngleDegree;
423cdf0e10cSrcweir 
424cdf0e10cSrcweir             ::com::sun::star::chart::ChartAxisArrangeOrderType eArrangeOrder;
425cdf0e10cSrcweir             xProp->getPropertyValue( C2U( "ArrangeOrder" ) ) >>= eArrangeOrder;
426cdf0e10cSrcweir             switch(eArrangeOrder)
427cdf0e10cSrcweir             {
428cdf0e10cSrcweir                 case ::com::sun::star::chart::ChartAxisArrangeOrderType_SIDE_BY_SIDE:
429cdf0e10cSrcweir                     this->eStaggering = SIDE_BY_SIDE;
430cdf0e10cSrcweir                     break;
431cdf0e10cSrcweir                 case ::com::sun::star::chart::ChartAxisArrangeOrderType_STAGGER_EVEN:
432cdf0e10cSrcweir                     this->eStaggering = STAGGER_EVEN;
433cdf0e10cSrcweir                     break;
434cdf0e10cSrcweir                 case ::com::sun::star::chart::ChartAxisArrangeOrderType_STAGGER_ODD:
435cdf0e10cSrcweir                     this->eStaggering = STAGGER_ODD;
436cdf0e10cSrcweir                     break;
437cdf0e10cSrcweir                 default:
438cdf0e10cSrcweir                     this->eStaggering = STAGGER_AUTO;
439cdf0e10cSrcweir                     break;
440cdf0e10cSrcweir             }
441cdf0e10cSrcweir         }
442cdf0e10cSrcweir         catch( uno::Exception& e )
443cdf0e10cSrcweir 	    {
444cdf0e10cSrcweir             ASSERT_EXCEPTION( e );
445cdf0e10cSrcweir         }
446cdf0e10cSrcweir     }
447cdf0e10cSrcweir }
448cdf0e10cSrcweir 
449cdf0e10cSrcweir /*
450cdf0e10cSrcweir sal_Int16 getSwappedWritingMode( sal_Int16 nWritingMode )
451cdf0e10cSrcweir {
452cdf0e10cSrcweir     //LR_TB == LT
453cdf0e10cSrcweir     //RL_TB == RT (Arabic, Hebrew)
454cdf0e10cSrcweir     //TB_RL == TR (Japanese, Chinese, Korean)
455cdf0e10cSrcweir     // ?? TL (Mongolian) see also text::WritingMode2
456cdf0e10cSrcweir 
457cdf0e10cSrcweir     switch(nWritingMode)
458cdf0e10cSrcweir     {
459cdf0e10cSrcweir         case text::WritingMode2::RL_TB:
460cdf0e10cSrcweir             return  text::WritingMode2::TB_RL;
461cdf0e10cSrcweir         case text::WritingMode2::TB_RL:
462cdf0e10cSrcweir             return  text::WritingMode2::RL_TB;
463cdf0e10cSrcweir         case text::WritingMode2::LR_TB:
464cdf0e10cSrcweir             return  text::WritingMode2::TB_LR;
465cdf0e10cSrcweir         default:
466cdf0e10cSrcweir             return  text::WritingMode2::LR_TB;
467cdf0e10cSrcweir     }
468cdf0e10cSrcweir }
469cdf0e10cSrcweir */
470cdf0e10cSrcweir 
getIsStaggered() const471cdf0e10cSrcweir sal_Bool AxisLabelProperties::getIsStaggered() const
472cdf0e10cSrcweir {
473cdf0e10cSrcweir     if( STAGGER_ODD == eStaggering || STAGGER_EVEN == eStaggering )
474cdf0e10cSrcweir         return sal_True;
475cdf0e10cSrcweir     return sal_False;
476cdf0e10cSrcweir }
477cdf0e10cSrcweir 
478cdf0e10cSrcweir //.............................................................................
479cdf0e10cSrcweir } //namespace chart
480cdf0e10cSrcweir //.............................................................................
481