Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "AxisItemConverter.hxx"
21 : #include "ItemPropertyMap.hxx"
22 : #include "CharacterPropertyItemConverter.hxx"
23 : #include "GraphicPropertyItemConverter.hxx"
24 : #include "chartview/ChartSfxItemIds.hxx"
25 : #include "chartview/ExplicitValueProvider.hxx"
26 : #include "SchWhichPairs.hxx"
27 : #include "macros.hxx"
28 : #include "ChartModelHelper.hxx"
29 : #include "AxisHelper.hxx"
30 : #include "CommonConverters.hxx"
31 : #include "ChartTypeHelper.hxx"
32 :
33 : #include <com/sun/star/chart/ChartAxisLabelPosition.hpp>
34 : #include <com/sun/star/chart/ChartAxisMarkPosition.hpp>
35 : #include <com/sun/star/chart/ChartAxisPosition.hpp>
36 : #include <com/sun/star/chart2/XAxis.hpp>
37 : #include <com/sun/star/chart2/AxisOrientation.hpp>
38 : #include <com/sun/star/chart2/AxisType.hpp>
39 :
40 : // for SfxBoolItem
41 : #include <svl/eitem.hxx>
42 : // for SvxDoubleItem
43 : #include <svx/chrtitem.hxx>
44 : // for SfxInt32Item
45 : #include <svl/intitem.hxx>
46 : #include <rtl/math.hxx>
47 :
48 : #include <algorithm>
49 :
50 : using namespace ::com::sun::star;
51 : using namespace ::com::sun::star::chart2;
52 : using ::com::sun::star::uno::Reference;
53 : using ::com::sun::star::chart::TimeInterval;
54 : using ::com::sun::star::chart::TimeIncrement;
55 :
56 : namespace
57 : {
58 0 : ::comphelper::ItemPropertyMapType & lcl_GetAxisPropertyMap()
59 : {
60 : static ::comphelper::ItemPropertyMapType aAxisPropertyMap(
61 : ::comphelper::MakeItemPropertyMap
62 : IPM_MAP_ENTRY( SCHATTR_AXIS_SHOWDESCR, "DisplayLabels", 0 )
63 0 : IPM_MAP_ENTRY( SCHATTR_AXIS_TICKS, "MajorTickmarks", 0 )
64 0 : IPM_MAP_ENTRY( SCHATTR_AXIS_HELPTICKS, "MinorTickmarks", 0 )
65 0 : IPM_MAP_ENTRY( SCHATTR_AXIS_LABEL_ORDER, "ArrangeOrder", 0 )
66 0 : IPM_MAP_ENTRY( SCHATTR_TEXT_STACKED, "StackCharacters", 0 )
67 0 : IPM_MAP_ENTRY( SCHATTR_AXIS_LABEL_BREAK, "TextBreak", 0 )
68 0 : IPM_MAP_ENTRY( SCHATTR_AXIS_LABEL_OVERLAP, "TextOverlap", 0 )
69 0 : );
70 :
71 0 : return aAxisPropertyMap;
72 : };
73 : } // anonymous namespace
74 :
75 : namespace chart
76 : {
77 : namespace wrapper
78 : {
79 :
80 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
81 0 : AxisItemConverter::AxisItemConverter(
82 : const Reference< beans::XPropertySet > & rPropertySet,
83 : SfxItemPool& rItemPool,
84 : SdrModel& rDrawModel,
85 : const Reference< chart2::XChartDocument > & xChartDoc,
86 : ::chart::ExplicitScaleData * pScale /* = NULL */,
87 : ::chart::ExplicitIncrementData * pIncrement /* = NULL */,
88 : ::std::auto_ptr< awt::Size > pRefSize /* = NULL */ ) :
89 : ItemConverter( rPropertySet, rItemPool ),
90 : m_xChartDoc( xChartDoc ),
91 : m_pExplicitScale( NULL ),
92 0 : m_pExplicitIncrement( NULL )
93 : {
94 0 : Reference< lang::XMultiServiceFactory > xNamedPropertyContainerFactory( xChartDoc, uno::UNO_QUERY );
95 :
96 0 : if( pScale )
97 0 : m_pExplicitScale = new ::chart::ExplicitScaleData( *pScale );
98 0 : if( pIncrement )
99 0 : m_pExplicitIncrement = new ::chart::ExplicitIncrementData( *pIncrement );
100 :
101 : m_aConverters.push_back( new GraphicPropertyItemConverter(
102 : rPropertySet, rItemPool, rDrawModel,
103 : xNamedPropertyContainerFactory,
104 0 : GraphicPropertyItemConverter::LINE_PROPERTIES ));
105 : m_aConverters.push_back( new CharacterPropertyItemConverter( rPropertySet, rItemPool, pRefSize,
106 0 : "ReferencePageSize" ));
107 :
108 0 : m_xAxis.set( Reference< chart2::XAxis >( rPropertySet, uno::UNO_QUERY ) );
109 0 : OSL_ASSERT( m_xAxis.is());
110 0 : }
111 : SAL_WNODEPRECATED_DECLARATIONS_POP
112 :
113 0 : AxisItemConverter::~AxisItemConverter()
114 : {
115 0 : delete m_pExplicitScale;
116 0 : delete m_pExplicitIncrement;
117 :
118 : ::std::for_each( m_aConverters.begin(), m_aConverters.end(),
119 0 : ::comphelper::DeleteItemConverterPtr() );
120 0 : }
121 :
122 0 : void AxisItemConverter::FillItemSet( SfxItemSet & rOutItemSet ) const
123 : {
124 : ::std::for_each( m_aConverters.begin(), m_aConverters.end(),
125 0 : ::comphelper::FillItemSetFunc( rOutItemSet ));
126 :
127 : // own items
128 0 : ItemConverter::FillItemSet( rOutItemSet );
129 0 : }
130 :
131 0 : bool AxisItemConverter::ApplyItemSet( const SfxItemSet & rItemSet )
132 : {
133 0 : bool bResult = false;
134 :
135 : ::std::for_each( m_aConverters.begin(), m_aConverters.end(),
136 0 : ::comphelper::ApplyItemSetFunc( rItemSet, bResult ));
137 :
138 : // own items
139 0 : return ItemConverter::ApplyItemSet( rItemSet ) || bResult;
140 : }
141 :
142 0 : const sal_uInt16 * AxisItemConverter::GetWhichPairs() const
143 : {
144 : // must span all used items!
145 0 : return nAxisWhichPairs;
146 : }
147 :
148 0 : bool AxisItemConverter::GetItemProperty( tWhichIdType nWhichId, tPropertyNameWithMemberId & rOutProperty ) const
149 : {
150 0 : ::comphelper::ItemPropertyMapType & rMap( lcl_GetAxisPropertyMap());
151 0 : ::comphelper::ItemPropertyMapType::const_iterator aIt( rMap.find( nWhichId ));
152 :
153 0 : if( aIt == rMap.end())
154 0 : return false;
155 :
156 0 : rOutProperty =(*aIt).second;
157 :
158 0 : return true;
159 : }
160 :
161 0 : bool lcl_hasTimeIntervalValue( const uno::Any& rAny )
162 : {
163 0 : bool bRet = false;
164 0 : TimeInterval aValue;
165 0 : if( rAny >>= aValue )
166 0 : bRet = true;
167 0 : return bRet;
168 : }
169 :
170 0 : void AxisItemConverter::FillSpecialItem( sal_uInt16 nWhichId, SfxItemSet & rOutItemSet ) const
171 : throw( uno::Exception )
172 : {
173 0 : if( !m_xAxis.is() )
174 0 : return;
175 :
176 0 : const chart2::ScaleData& rScale( m_xAxis->getScaleData() );
177 0 : const chart2::IncrementData& rIncrement( rScale.IncrementData );
178 0 : const uno::Sequence< chart2::SubIncrement >& rSubIncrements( rScale.IncrementData.SubIncrements );
179 0 : const TimeIncrement& rTimeIncrement( rScale.TimeIncrement );
180 0 : bool bDateAxis = (chart2::AxisType::DATE == rScale.AxisType);
181 0 : if( m_pExplicitScale )
182 0 : bDateAxis = (chart2::AxisType::DATE == m_pExplicitScale->AxisType);
183 :
184 0 : switch( nWhichId )
185 : {
186 : case SCHATTR_AXIS_AUTO_MAX:
187 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, !hasDoubleValue(rScale.Maximum) ) );
188 0 : break;
189 :
190 : case SCHATTR_AXIS_MAX:
191 : {
192 0 : double fMax = 10.0;
193 0 : if( rScale.Maximum >>= fMax )
194 0 : rOutItemSet.Put( SvxDoubleItem( fMax, nWhichId ) );
195 : else
196 : {
197 0 : if( m_pExplicitScale )
198 0 : fMax = m_pExplicitScale->Maximum;
199 0 : rOutItemSet.Put( SvxDoubleItem( fMax, nWhichId ) );
200 : }
201 : }
202 0 : break;
203 :
204 : case SCHATTR_AXIS_AUTO_MIN:
205 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, !hasDoubleValue(rScale.Minimum) ) );
206 0 : break;
207 :
208 : case SCHATTR_AXIS_MIN:
209 : {
210 0 : double fMin = 0.0;
211 0 : if( rScale.Minimum >>= fMin )
212 0 : rOutItemSet.Put( SvxDoubleItem( fMin, nWhichId ) );
213 0 : else if( m_pExplicitScale )
214 0 : rOutItemSet.Put( SvxDoubleItem( m_pExplicitScale->Minimum, nWhichId ));
215 : }
216 0 : break;
217 :
218 : case SCHATTR_AXIS_LOGARITHM:
219 : {
220 0 : sal_Bool bValue = AxisHelper::isLogarithmic( rScale.Scaling );
221 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, bValue ));
222 : }
223 0 : break;
224 :
225 : case SCHATTR_AXIS_REVERSE:
226 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, (AxisOrientation_REVERSE == rScale.Orientation) ));
227 0 : break;
228 :
229 : // Increment
230 : case SCHATTR_AXIS_AUTO_STEP_MAIN:
231 0 : if( bDateAxis )
232 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, !lcl_hasTimeIntervalValue(rTimeIncrement.MajorTimeInterval) ) );
233 : else
234 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, !hasDoubleValue(rIncrement.Distance) ) );
235 0 : break;
236 :
237 : case SCHATTR_AXIS_MAIN_TIME_UNIT:
238 : {
239 0 : TimeInterval aTimeInterval;
240 0 : if( rTimeIncrement.MajorTimeInterval >>= aTimeInterval )
241 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, aTimeInterval.TimeUnit ) );
242 0 : else if( m_pExplicitIncrement )
243 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, m_pExplicitIncrement->MajorTimeInterval.TimeUnit ) );
244 : }
245 0 : break;
246 :
247 : case SCHATTR_AXIS_STEP_MAIN:
248 0 : if( bDateAxis )
249 : {
250 0 : TimeInterval aTimeInterval;
251 0 : if( rTimeIncrement.MajorTimeInterval >>= aTimeInterval )
252 0 : rOutItemSet.Put( SvxDoubleItem(aTimeInterval.Number, nWhichId ));
253 0 : else if( m_pExplicitIncrement )
254 0 : rOutItemSet.Put( SvxDoubleItem( m_pExplicitIncrement->MajorTimeInterval.Number, nWhichId ));
255 : }
256 : else
257 : {
258 0 : double fDistance = 1.0;
259 0 : if( rIncrement.Distance >>= fDistance )
260 0 : rOutItemSet.Put( SvxDoubleItem(fDistance, nWhichId ));
261 0 : else if( m_pExplicitIncrement )
262 0 : rOutItemSet.Put( SvxDoubleItem( m_pExplicitIncrement->Distance, nWhichId ));
263 : }
264 0 : break;
265 :
266 : // SubIncrement
267 : case SCHATTR_AXIS_AUTO_STEP_HELP:
268 0 : if( bDateAxis )
269 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, !lcl_hasTimeIntervalValue(rTimeIncrement.MinorTimeInterval) ) );
270 : else
271 : rOutItemSet.Put( SfxBoolItem( nWhichId,
272 0 : ! ( rSubIncrements.getLength() > 0 && rSubIncrements[0].IntervalCount.hasValue() )));
273 0 : break;
274 :
275 : case SCHATTR_AXIS_HELP_TIME_UNIT:
276 : {
277 0 : TimeInterval aTimeInterval;
278 0 : if( rTimeIncrement.MinorTimeInterval >>= aTimeInterval )
279 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, aTimeInterval.TimeUnit ) );
280 0 : else if( m_pExplicitIncrement )
281 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, m_pExplicitIncrement->MinorTimeInterval.TimeUnit ) );
282 : }
283 0 : break;
284 :
285 : case SCHATTR_AXIS_STEP_HELP:
286 0 : if( bDateAxis )
287 : {
288 0 : TimeInterval aTimeInterval;
289 0 : if( rTimeIncrement.MinorTimeInterval >>= aTimeInterval )
290 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, aTimeInterval.Number ));
291 0 : else if( m_pExplicitIncrement )
292 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, m_pExplicitIncrement->MinorTimeInterval.Number ));
293 : }
294 : else
295 : {
296 0 : if( rSubIncrements.getLength() > 0 && rSubIncrements[0].IntervalCount.hasValue())
297 : {
298 : OSL_ASSERT( rSubIncrements[0].IntervalCount.getValueTypeClass() == uno::TypeClass_LONG );
299 : rOutItemSet.Put( SfxInt32Item( nWhichId,
300 : *reinterpret_cast< const sal_Int32 * >(
301 0 : rSubIncrements[0].IntervalCount.getValue()) ));
302 : }
303 : else
304 : {
305 0 : if( m_pExplicitIncrement && !m_pExplicitIncrement->SubIncrements.empty() )
306 : {
307 : rOutItemSet.Put( SfxInt32Item( nWhichId,
308 0 : m_pExplicitIncrement->SubIncrements[0].IntervalCount ));
309 : }
310 : }
311 : }
312 0 : break;
313 :
314 : case SCHATTR_AXIS_AUTO_TIME_RESOLUTION:
315 : {
316 : rOutItemSet.Put( SfxBoolItem( nWhichId,
317 0 : !rTimeIncrement.TimeResolution.hasValue() ));
318 : }
319 0 : break;
320 : case SCHATTR_AXIS_TIME_RESOLUTION:
321 : {
322 0 : long nTimeResolution=0;
323 0 : if( rTimeIncrement.TimeResolution >>= nTimeResolution )
324 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, nTimeResolution ) );
325 0 : else if( m_pExplicitScale )
326 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, m_pExplicitScale->TimeResolution ) );
327 : }
328 0 : break;
329 :
330 : case SCHATTR_AXIS_AUTO_ORIGIN:
331 : {
332 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, ( !hasDoubleValue(rScale.Origin) )));
333 : }
334 0 : break;
335 :
336 : case SCHATTR_AXIS_ORIGIN:
337 : {
338 0 : double fOrigin = 0.0;
339 0 : if( !(rScale.Origin >>= fOrigin) )
340 : {
341 0 : if( m_pExplicitScale )
342 0 : fOrigin = m_pExplicitScale->Origin;
343 : }
344 0 : rOutItemSet.Put( SvxDoubleItem( fOrigin, nWhichId ));
345 : }
346 0 : break;
347 :
348 : case SCHATTR_AXIS_POSITION:
349 : {
350 0 : ::com::sun::star::chart::ChartAxisPosition eAxisPos( ::com::sun::star::chart::ChartAxisPosition_ZERO );
351 0 : GetPropertySet()->getPropertyValue( "CrossoverPosition" ) >>= eAxisPos;
352 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, eAxisPos ) );
353 : }
354 0 : break;
355 :
356 : case SCHATTR_AXIS_POSITION_VALUE:
357 : {
358 0 : double fValue = 0.0;
359 0 : if( GetPropertySet()->getPropertyValue( "CrossoverValue" ) >>= fValue )
360 0 : rOutItemSet.Put( SvxDoubleItem( fValue, nWhichId ) );
361 : }
362 0 : break;
363 :
364 : case SCHATTR_AXIS_CROSSING_MAIN_AXIS_NUMBERFORMAT:
365 : {
366 : //read only item
367 : //necessary tp display the crossing value with an appropriate format
368 :
369 : Reference< chart2::XCoordinateSystem > xCooSys( AxisHelper::getCoordinateSystemOfAxis(
370 0 : m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) ) );
371 :
372 0 : Reference< chart2::XAxis > xCrossingMainAxis( AxisHelper::getCrossingMainAxis( m_xAxis, xCooSys ) );
373 :
374 : sal_Int32 nFormatKey = ExplicitValueProvider::getExplicitNumberFormatKeyForAxis(
375 0 : xCrossingMainAxis, xCooSys, Reference< util::XNumberFormatsSupplier >( m_xChartDoc, uno::UNO_QUERY ) );
376 :
377 0 : rOutItemSet.Put( SfxUInt32Item( nWhichId, nFormatKey ));
378 : }
379 0 : break;
380 :
381 : case SCHATTR_AXIS_LABEL_POSITION:
382 : {
383 0 : ::com::sun::star::chart::ChartAxisLabelPosition ePos( ::com::sun::star::chart::ChartAxisLabelPosition_NEAR_AXIS );
384 0 : GetPropertySet()->getPropertyValue( "LabelPosition" ) >>= ePos;
385 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, ePos ) );
386 : }
387 0 : break;
388 :
389 : case SCHATTR_AXIS_MARK_POSITION:
390 : {
391 0 : ::com::sun::star::chart::ChartAxisMarkPosition ePos( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS_AND_AXIS );
392 0 : GetPropertySet()->getPropertyValue( "MarkPosition" ) >>= ePos;
393 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, ePos ) );
394 : }
395 0 : break;
396 :
397 : case SCHATTR_TEXT_DEGREES:
398 : {
399 : // convert double to int (times 100)
400 0 : double fVal = 0;
401 :
402 0 : if( GetPropertySet()->getPropertyValue( "TextRotation" ) >>= fVal )
403 : {
404 : rOutItemSet.Put( SfxInt32Item( nWhichId, static_cast< sal_Int32 >(
405 0 : ::rtl::math::round( fVal * 100.0 ) ) ));
406 : }
407 : }
408 0 : break;
409 :
410 : case SID_ATTR_NUMBERFORMAT_VALUE:
411 : {
412 0 : if( m_pExplicitScale )
413 : {
414 : Reference< chart2::XCoordinateSystem > xCooSys(
415 : AxisHelper::getCoordinateSystemOfAxis(
416 0 : m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) ) );
417 :
418 : sal_Int32 nFormatKey = ExplicitValueProvider::getExplicitNumberFormatKeyForAxis(
419 0 : m_xAxis, xCooSys, Reference< util::XNumberFormatsSupplier >( m_xChartDoc, uno::UNO_QUERY ) );
420 :
421 0 : rOutItemSet.Put( SfxUInt32Item( nWhichId, nFormatKey ));
422 : }
423 : }
424 0 : break;
425 :
426 : case SID_ATTR_NUMBERFORMAT_SOURCE:
427 : {
428 0 : bool bNumberFormatIsSet = ( GetPropertySet()->getPropertyValue( "NumberFormat" ).hasValue());
429 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, ! bNumberFormatIsSet ));
430 : }
431 0 : break;
432 :
433 : case SCHATTR_AXISTYPE:
434 0 : rOutItemSet.Put( SfxInt32Item( nWhichId, rScale.AxisType ));
435 0 : break;
436 :
437 : case SCHATTR_AXIS_AUTO_DATEAXIS:
438 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, rScale.AutoDateAxis ));
439 0 : break;
440 :
441 : case SCHATTR_AXIS_ALLOW_DATEAXIS:
442 : {
443 : Reference< chart2::XCoordinateSystem > xCooSys(
444 0 : AxisHelper::getCoordinateSystemOfAxis( m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) ) );
445 0 : sal_Int32 nDimensionIndex=0; sal_Int32 nAxisIndex=0;
446 0 : AxisHelper::getIndicesForAxis(m_xAxis, xCooSys, nDimensionIndex, nAxisIndex );
447 0 : bool bChartTypeAllowsDateAxis = ChartTypeHelper::isSupportingDateAxis( AxisHelper::getChartTypeByIndex( xCooSys, 0 ), 2, nDimensionIndex );
448 0 : rOutItemSet.Put( SfxBoolItem( nWhichId, bChartTypeAllowsDateAxis ));
449 : }
450 0 : break;
451 0 : }
452 : }
453 :
454 0 : bool lcl_isDateAxis( const SfxItemSet & rItemSet )
455 : {
456 0 : sal_Int32 nAxisType = static_cast< const SfxInt32Item & >( rItemSet.Get( SCHATTR_AXISTYPE )).GetValue();//::com::sun::star::chart2::AxisType
457 0 : return (chart2::AxisType::DATE == nAxisType);
458 : }
459 :
460 0 : bool lcl_isAutoMajor( const SfxItemSet & rItemSet )
461 : {
462 0 : bool bRet = static_cast< const SfxBoolItem & >( rItemSet.Get( SCHATTR_AXIS_AUTO_STEP_MAIN )).GetValue();
463 0 : return bRet;
464 : }
465 :
466 0 : bool lcl_isAutoMinor( const SfxItemSet & rItemSet )
467 : {
468 0 : bool bRet = static_cast< const SfxBoolItem & >( rItemSet.Get( SCHATTR_AXIS_AUTO_STEP_HELP )).GetValue();
469 0 : return bRet;
470 : }
471 :
472 0 : bool AxisItemConverter::ApplySpecialItem( sal_uInt16 nWhichId, const SfxItemSet & rItemSet )
473 : throw( uno::Exception )
474 : {
475 0 : if( !m_xAxis.is() )
476 0 : return false;
477 :
478 0 : chart2::ScaleData aScale( m_xAxis->getScaleData() );
479 :
480 0 : bool bSetScale = false;
481 0 : bool bChangedOtherwise = false;
482 :
483 0 : uno::Any aValue;
484 :
485 0 : switch( nWhichId )
486 : {
487 : case SCHATTR_AXIS_AUTO_MAX:
488 0 : if( (static_cast< const SfxBoolItem & >(
489 0 : rItemSet.Get( nWhichId )).GetValue() ))
490 : {
491 0 : aScale.Maximum.clear();
492 0 : bSetScale = true;
493 : }
494 : // else SCHATTR_AXIS_MAX must have some value
495 0 : break;
496 :
497 : case SCHATTR_AXIS_MAX:
498 : // only if auto if false
499 0 : if( ! (static_cast< const SfxBoolItem & >(
500 0 : rItemSet.Get( SCHATTR_AXIS_AUTO_MAX )).GetValue() ))
501 : {
502 0 : rItemSet.Get( nWhichId ).QueryValue( aValue );
503 :
504 0 : if( aScale.Maximum != aValue )
505 : {
506 0 : aScale.Maximum = aValue;
507 0 : bSetScale = true;
508 : }
509 : }
510 0 : break;
511 :
512 : case SCHATTR_AXIS_AUTO_MIN:
513 0 : if( (static_cast< const SfxBoolItem & >(
514 0 : rItemSet.Get( nWhichId )).GetValue() ))
515 : {
516 0 : aScale.Minimum.clear();
517 0 : bSetScale = true;
518 : }
519 : // else SCHATTR_AXIS_MIN must have some value
520 0 : break;
521 :
522 : case SCHATTR_AXIS_MIN:
523 : // only if auto if false
524 0 : if( ! (static_cast< const SfxBoolItem & >(
525 0 : rItemSet.Get( SCHATTR_AXIS_AUTO_MIN )).GetValue() ))
526 : {
527 0 : rItemSet.Get( nWhichId ).QueryValue( aValue );
528 :
529 0 : if( aScale.Minimum != aValue )
530 : {
531 0 : aScale.Minimum = aValue;
532 0 : bSetScale = true;
533 : }
534 : }
535 0 : break;
536 :
537 : case SCHATTR_AXIS_LOGARITHM:
538 : {
539 0 : bool bWasLogarithm = AxisHelper::isLogarithmic( aScale.Scaling );
540 :
541 0 : if( (static_cast< const SfxBoolItem & >(
542 0 : rItemSet.Get( nWhichId )).GetValue() ))
543 : {
544 : // logarithm is true
545 0 : if( ! bWasLogarithm )
546 : {
547 0 : aScale.Scaling = AxisHelper::createLogarithmicScaling( 10.0 );
548 0 : bSetScale = true;
549 : }
550 : }
551 : else
552 : {
553 : // logarithm is false => linear scaling
554 0 : if( bWasLogarithm )
555 : {
556 0 : aScale.Scaling = AxisHelper::createLinearScaling();
557 0 : bSetScale = true;
558 : }
559 : }
560 : }
561 0 : break;
562 :
563 : case SCHATTR_AXIS_REVERSE:
564 : {
565 0 : bool bWasReverse = ( AxisOrientation_REVERSE == aScale.Orientation );
566 : bool bNewReverse = (static_cast< const SfxBoolItem & >(
567 0 : rItemSet.Get( nWhichId )).GetValue() );
568 0 : if( bWasReverse != bNewReverse )
569 : {
570 0 : aScale.Orientation = bNewReverse ? AxisOrientation_REVERSE : AxisOrientation_MATHEMATICAL;
571 0 : bSetScale = true;
572 : }
573 : }
574 0 : break;
575 :
576 : // Increment
577 : case SCHATTR_AXIS_AUTO_STEP_MAIN:
578 0 : if( lcl_isAutoMajor(rItemSet) )
579 : {
580 0 : aScale.IncrementData.Distance.clear();
581 0 : aScale.TimeIncrement.MajorTimeInterval.clear();
582 0 : bSetScale = true;
583 : }
584 : // else SCHATTR_AXIS_STEP_MAIN must have some value
585 0 : break;
586 :
587 : case SCHATTR_AXIS_MAIN_TIME_UNIT:
588 0 : if( !lcl_isAutoMajor(rItemSet) )
589 : {
590 0 : if( rItemSet.Get( nWhichId ).QueryValue( aValue ) )
591 : {
592 0 : TimeInterval aTimeInterval;
593 0 : aScale.TimeIncrement.MajorTimeInterval >>= aTimeInterval;
594 0 : aValue >>= aTimeInterval.TimeUnit;
595 0 : aScale.TimeIncrement.MajorTimeInterval = uno::makeAny( aTimeInterval );
596 0 : bSetScale = true;
597 : }
598 : }
599 0 : break;
600 :
601 : case SCHATTR_AXIS_STEP_MAIN:
602 : // only if auto if false
603 0 : if( !lcl_isAutoMajor(rItemSet) )
604 : {
605 0 : rItemSet.Get( nWhichId ).QueryValue( aValue );
606 0 : if( lcl_isDateAxis(rItemSet) )
607 : {
608 0 : double fValue = 1.0;
609 0 : if( aValue >>= fValue )
610 : {
611 0 : TimeInterval aTimeInterval;
612 0 : aScale.TimeIncrement.MajorTimeInterval >>= aTimeInterval;
613 0 : aTimeInterval.Number = static_cast<sal_Int32>(fValue);
614 0 : aScale.TimeIncrement.MajorTimeInterval = uno::makeAny( aTimeInterval );
615 0 : bSetScale = true;
616 : }
617 : }
618 0 : else if( aScale.IncrementData.Distance != aValue )
619 : {
620 0 : aScale.IncrementData.Distance = aValue;
621 0 : bSetScale = true;
622 : }
623 : }
624 0 : break;
625 :
626 : // SubIncrement
627 : case SCHATTR_AXIS_AUTO_STEP_HELP:
628 0 : if( lcl_isAutoMinor(rItemSet) )
629 : {
630 0 : if( aScale.IncrementData.SubIncrements.getLength() > 0 &&
631 0 : aScale.IncrementData.SubIncrements[0].IntervalCount.hasValue() )
632 : {
633 0 : aScale.IncrementData.SubIncrements[0].IntervalCount.clear();
634 0 : bSetScale = true;
635 : }
636 0 : if( aScale.TimeIncrement.MinorTimeInterval.hasValue() )
637 : {
638 0 : aScale.TimeIncrement.MinorTimeInterval.clear();
639 0 : bSetScale = true;
640 : }
641 : }
642 : // else SCHATTR_AXIS_STEP_MAIN must have some value
643 0 : break;
644 :
645 : case SCHATTR_AXIS_HELP_TIME_UNIT:
646 0 : if( !lcl_isAutoMinor(rItemSet) )
647 : {
648 0 : if( rItemSet.Get( nWhichId ).QueryValue( aValue ) )
649 : {
650 0 : TimeInterval aTimeInterval;
651 0 : aScale.TimeIncrement.MinorTimeInterval >>= aTimeInterval;
652 0 : aValue >>= aTimeInterval.TimeUnit;
653 0 : aScale.TimeIncrement.MinorTimeInterval = uno::makeAny( aTimeInterval );
654 0 : bSetScale = true;
655 : }
656 : }
657 0 : break;
658 :
659 : case SCHATTR_AXIS_STEP_HELP:
660 : // only if auto is false
661 0 : if( !lcl_isAutoMinor(rItemSet) )
662 : {
663 0 : rItemSet.Get( nWhichId ).QueryValue( aValue );
664 0 : if( lcl_isDateAxis(rItemSet) )
665 : {
666 0 : TimeInterval aTimeInterval;
667 0 : aScale.TimeIncrement.MinorTimeInterval >>= aTimeInterval;
668 0 : aValue >>= aTimeInterval.Number;
669 0 : aScale.TimeIncrement.MinorTimeInterval = uno::makeAny(aTimeInterval);
670 0 : bSetScale = true;
671 : }
672 0 : else if( aScale.IncrementData.SubIncrements.getLength() > 0 )
673 : {
674 0 : if( ! aScale.IncrementData.SubIncrements[0].IntervalCount.hasValue() ||
675 0 : aScale.IncrementData.SubIncrements[0].IntervalCount != aValue )
676 : {
677 : OSL_ASSERT( aValue.getValueTypeClass() == uno::TypeClass_LONG );
678 0 : aScale.IncrementData.SubIncrements[0].IntervalCount = aValue;
679 0 : bSetScale = true;
680 : }
681 : }
682 : }
683 0 : break;
684 :
685 : case SCHATTR_AXIS_AUTO_TIME_RESOLUTION:
686 0 : if( (static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue() ))
687 : {
688 0 : aScale.TimeIncrement.TimeResolution.clear();
689 0 : bSetScale = true;
690 : }
691 0 : break;
692 : case SCHATTR_AXIS_TIME_RESOLUTION:
693 : // only if auto is false
694 0 : if( ! (static_cast< const SfxBoolItem & >( rItemSet.Get( SCHATTR_AXIS_AUTO_TIME_RESOLUTION )).GetValue() ))
695 : {
696 0 : rItemSet.Get( nWhichId ).QueryValue( aValue );
697 :
698 0 : if( aScale.TimeIncrement.TimeResolution != aValue )
699 : {
700 0 : aScale.TimeIncrement.TimeResolution = aValue;
701 0 : bSetScale = true;
702 : }
703 : }
704 0 : break;
705 :
706 :
707 : case SCHATTR_AXIS_AUTO_ORIGIN:
708 : {
709 0 : if( (static_cast< const SfxBoolItem & >(
710 0 : rItemSet.Get( nWhichId )).GetValue() ))
711 : {
712 0 : aScale.Origin.clear();
713 0 : bSetScale = true;
714 : }
715 : }
716 0 : break;
717 :
718 : case SCHATTR_AXIS_ORIGIN:
719 : {
720 : // only if auto is false
721 0 : if( ! (static_cast< const SfxBoolItem & >(
722 0 : rItemSet.Get( SCHATTR_AXIS_AUTO_ORIGIN )).GetValue() ))
723 : {
724 0 : rItemSet.Get( nWhichId ).QueryValue( aValue );
725 :
726 0 : if( aScale.Origin != aValue )
727 : {
728 0 : aScale.Origin = aValue;
729 0 : bSetScale = true;
730 :
731 0 : if( !AxisHelper::isAxisPositioningEnabled() )
732 : {
733 : //keep old and new settings for axis positioning in sync somehow
734 : Reference< chart2::XCoordinateSystem > xCooSys( AxisHelper::getCoordinateSystemOfAxis(
735 0 : m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) ) );
736 :
737 0 : sal_Int32 nDimensionIndex=0;
738 0 : sal_Int32 nAxisIndex=0;
739 0 : if( AxisHelper::getIndicesForAxis( m_xAxis, xCooSys, nDimensionIndex, nAxisIndex ) && nAxisIndex==0 )
740 : {
741 0 : Reference< beans::XPropertySet > xCrossingMainAxis( AxisHelper::getCrossingMainAxis( m_xAxis, xCooSys ), uno::UNO_QUERY );
742 0 : if( xCrossingMainAxis.is() )
743 : {
744 0 : double fValue = 0.0;
745 0 : if( aValue >>= fValue )
746 : {
747 0 : xCrossingMainAxis->setPropertyValue( "CrossoverPosition" , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_VALUE ));
748 0 : xCrossingMainAxis->setPropertyValue( "CrossoverValue" , uno::makeAny( fValue ));
749 : }
750 : else
751 0 : xCrossingMainAxis->setPropertyValue( "CrossoverPosition" , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START ));
752 0 : }
753 0 : }
754 : }
755 : }
756 : }
757 : }
758 0 : break;
759 :
760 : case SCHATTR_AXIS_POSITION:
761 : {
762 : ::com::sun::star::chart::ChartAxisPosition eAxisPos =
763 : (::com::sun::star::chart::ChartAxisPosition)
764 0 : static_cast< const SfxInt32Item & >( rItemSet.Get( nWhichId )).GetValue();
765 :
766 0 : ::com::sun::star::chart::ChartAxisPosition eOldAxisPos( ::com::sun::star::chart::ChartAxisPosition_ZERO );
767 0 : bool bPropExisted = ( GetPropertySet()->getPropertyValue( "CrossoverPosition" ) >>= eOldAxisPos );
768 :
769 0 : if( !bPropExisted || ( eOldAxisPos != eAxisPos ))
770 : {
771 0 : GetPropertySet()->setPropertyValue( "CrossoverPosition" , uno::makeAny( eAxisPos ));
772 0 : bChangedOtherwise = true;
773 :
774 : //move the parallel axes to the other side if necessary
775 0 : if( eAxisPos==::com::sun::star::chart::ChartAxisPosition_START || eAxisPos==::com::sun::star::chart::ChartAxisPosition_END )
776 : {
777 0 : Reference< beans::XPropertySet > xParallelAxis( AxisHelper::getParallelAxis( m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) ), uno::UNO_QUERY );
778 0 : if( xParallelAxis.is() )
779 : {
780 : ::com::sun::star::chart::ChartAxisPosition eOtherPos;
781 0 : if( xParallelAxis->getPropertyValue( "CrossoverPosition" ) >>= eOtherPos )
782 : {
783 0 : if( eOtherPos == eAxisPos )
784 : {
785 : ::com::sun::star::chart::ChartAxisPosition eOppositePos =
786 : (eAxisPos==::com::sun::star::chart::ChartAxisPosition_START)
787 : ? ::com::sun::star::chart::ChartAxisPosition_END
788 0 : : ::com::sun::star::chart::ChartAxisPosition_START;
789 0 : xParallelAxis->setPropertyValue( "CrossoverPosition" , uno::makeAny( eOppositePos ));
790 : }
791 : }
792 0 : }
793 : }
794 : }
795 : }
796 0 : break;
797 :
798 : case SCHATTR_AXIS_POSITION_VALUE:
799 : {
800 0 : double fValue = static_cast< const SvxDoubleItem & >( rItemSet.Get( nWhichId )).GetValue();
801 :
802 0 : double fOldValue = 0.0;
803 0 : bool bPropExisted = ( GetPropertySet()->getPropertyValue( "CrossoverValue" ) >>= fOldValue );
804 :
805 0 : if( !bPropExisted || ( fOldValue != fValue ))
806 : {
807 0 : GetPropertySet()->setPropertyValue( "CrossoverValue" , uno::makeAny( fValue ));
808 0 : bChangedOtherwise = true;
809 :
810 : //keep old and new settings for axis positioning in sync somehow
811 : {
812 : Reference< chart2::XCoordinateSystem > xCooSys( AxisHelper::getCoordinateSystemOfAxis(
813 0 : m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) ) );
814 :
815 0 : sal_Int32 nDimensionIndex=0;
816 0 : sal_Int32 nAxisIndex=0;
817 0 : if( AxisHelper::getIndicesForAxis( m_xAxis, xCooSys, nDimensionIndex, nAxisIndex ) && nAxisIndex==0 && nDimensionIndex==0 )
818 : {
819 0 : Reference< chart2::XAxis > xCrossingMainAxis( AxisHelper::getCrossingMainAxis( m_xAxis, xCooSys ) );
820 0 : if( xCrossingMainAxis.is() )
821 : {
822 0 : ScaleData aCrossingScale( xCrossingMainAxis->getScaleData() );
823 0 : aCrossingScale.Origin = uno::makeAny(fValue);
824 0 : xCrossingMainAxis->setScaleData(aCrossingScale);
825 0 : }
826 0 : }
827 : }
828 : }
829 : }
830 0 : break;
831 :
832 : case SCHATTR_AXIS_LABEL_POSITION:
833 : {
834 : ::com::sun::star::chart::ChartAxisLabelPosition ePos =
835 : (::com::sun::star::chart::ChartAxisLabelPosition)
836 0 : static_cast< const SfxInt32Item & >( rItemSet.Get( nWhichId )).GetValue();
837 :
838 0 : ::com::sun::star::chart::ChartAxisLabelPosition eOldPos( ::com::sun::star::chart::ChartAxisLabelPosition_NEAR_AXIS );
839 0 : bool bPropExisted = ( GetPropertySet()->getPropertyValue( "LabelPosition" ) >>= eOldPos );
840 :
841 0 : if( !bPropExisted || ( eOldPos != ePos ))
842 : {
843 0 : GetPropertySet()->setPropertyValue( "LabelPosition" , uno::makeAny( ePos ));
844 0 : bChangedOtherwise = true;
845 :
846 : //move the parallel axes to the other side if necessary
847 0 : if( ePos==::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START || ePos==::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_END )
848 : {
849 0 : Reference< beans::XPropertySet > xParallelAxis( AxisHelper::getParallelAxis( m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) ), uno::UNO_QUERY );
850 0 : if( xParallelAxis.is() )
851 : {
852 : ::com::sun::star::chart::ChartAxisLabelPosition eOtherPos;
853 0 : if( xParallelAxis->getPropertyValue( "LabelPosition" ) >>= eOtherPos )
854 : {
855 0 : if( eOtherPos == ePos )
856 : {
857 : ::com::sun::star::chart::ChartAxisLabelPosition eOppositePos =
858 : (ePos==::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START)
859 : ? ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_END
860 0 : : ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START;
861 0 : xParallelAxis->setPropertyValue( "LabelPosition" , uno::makeAny( eOppositePos ));
862 : }
863 : }
864 0 : }
865 : }
866 : }
867 : }
868 0 : break;
869 :
870 : case SCHATTR_AXIS_MARK_POSITION:
871 : {
872 : ::com::sun::star::chart::ChartAxisMarkPosition ePos =
873 : (::com::sun::star::chart::ChartAxisMarkPosition)
874 0 : static_cast< const SfxInt32Item & >( rItemSet.Get( nWhichId )).GetValue();
875 :
876 0 : ::com::sun::star::chart::ChartAxisMarkPosition eOldPos( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS_AND_AXIS );
877 0 : bool bPropExisted = ( GetPropertySet()->getPropertyValue( "MarkPosition" ) >>= eOldPos );
878 :
879 0 : if( !bPropExisted || ( eOldPos != ePos ))
880 : {
881 0 : GetPropertySet()->setPropertyValue( "MarkPosition" , uno::makeAny( ePos ));
882 0 : bChangedOtherwise = true;
883 : }
884 : }
885 0 : break;
886 :
887 : case SCHATTR_TEXT_DEGREES:
888 : {
889 : // convert int to double (divided by 100)
890 : double fVal = static_cast< double >(
891 : static_cast< const SfxInt32Item & >(
892 0 : rItemSet.Get( nWhichId )).GetValue()) / 100.0;
893 0 : double fOldVal = 0.0;
894 : bool bPropExisted =
895 0 : ( GetPropertySet()->getPropertyValue( "TextRotation" ) >>= fOldVal );
896 :
897 0 : if( ! bPropExisted ||
898 : ( bPropExisted && fOldVal != fVal ))
899 : {
900 0 : GetPropertySet()->setPropertyValue( "TextRotation" , uno::makeAny( fVal ));
901 0 : bChangedOtherwise = true;
902 : }
903 : }
904 0 : break;
905 :
906 : case SID_ATTR_NUMBERFORMAT_VALUE:
907 : {
908 0 : if( m_pExplicitScale )
909 : {
910 : bool bUseSourceFormat =
911 : (static_cast< const SfxBoolItem & >(
912 0 : rItemSet.Get( SID_ATTR_NUMBERFORMAT_SOURCE )).GetValue() );
913 :
914 0 : if( ! bUseSourceFormat )
915 : {
916 : sal_Int32 nFmt = static_cast< sal_Int32 >(
917 : static_cast< const SfxUInt32Item & >(
918 0 : rItemSet.Get( nWhichId )).GetValue());
919 :
920 0 : aValue = uno::makeAny(nFmt);
921 0 : if( GetPropertySet()->getPropertyValue( "NumberFormat" ) != aValue )
922 : {
923 0 : GetPropertySet()->setPropertyValue( "NumberFormat" , aValue );
924 0 : bChangedOtherwise = true;
925 : }
926 : }
927 : }
928 : }
929 0 : break;
930 :
931 : case SID_ATTR_NUMBERFORMAT_SOURCE:
932 : {
933 : bool bUseSourceFormat =
934 : (static_cast< const SfxBoolItem & >(
935 0 : rItemSet.Get( nWhichId )).GetValue() );
936 0 : bool bNumberFormatIsSet = ( GetPropertySet()->getPropertyValue( "NumberFormat").hasValue());
937 :
938 0 : bChangedOtherwise = (bUseSourceFormat == bNumberFormatIsSet);
939 0 : if( bChangedOtherwise )
940 : {
941 0 : if( ! bUseSourceFormat )
942 : {
943 0 : SfxItemState aState = rItemSet.GetItemState( SID_ATTR_NUMBERFORMAT_VALUE );
944 0 : if( aState == SFX_ITEM_SET )
945 : {
946 : sal_Int32 nFormatKey = static_cast< sal_Int32 >(
947 : static_cast< const SfxUInt32Item & >(
948 0 : rItemSet.Get( SID_ATTR_NUMBERFORMAT_VALUE )).GetValue());
949 0 : aValue <<= nFormatKey;
950 : }
951 : else
952 : {
953 : Reference< chart2::XCoordinateSystem > xCooSys(
954 : AxisHelper::getCoordinateSystemOfAxis(
955 0 : m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) ) );
956 :
957 : sal_Int32 nFormatKey = ExplicitValueProvider::getExplicitNumberFormatKeyForAxis(
958 0 : m_xAxis, xCooSys, Reference< util::XNumberFormatsSupplier >( m_xChartDoc, uno::UNO_QUERY ) );
959 :
960 0 : aValue <<= nFormatKey;
961 : }
962 : }
963 : // else set a void Any
964 0 : GetPropertySet()->setPropertyValue( "NumberFormat" , aValue );
965 : }
966 : }
967 0 : break;
968 :
969 : case SCHATTR_AXISTYPE:
970 : {
971 0 : sal_Int32 nNewAxisType = static_cast< const SfxInt32Item & >( rItemSet.Get( nWhichId )).GetValue();//::com::sun::star::chart2::AxisType
972 0 : aScale.AxisType = nNewAxisType;
973 0 : bSetScale = true;
974 : }
975 0 : break;
976 :
977 : case SCHATTR_AXIS_AUTO_DATEAXIS:
978 : {
979 0 : bool bNewValue = static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue();
980 0 : bool bOldValue = aScale.AutoDateAxis;
981 0 : if( bOldValue != bNewValue )
982 : {
983 0 : aScale.AutoDateAxis = bNewValue;
984 0 : bSetScale = true;
985 : }
986 : }
987 0 : break;
988 : }
989 :
990 0 : if( bSetScale )
991 0 : m_xAxis->setScaleData( aScale );
992 :
993 0 : return (bSetScale || bChangedOtherwise);
994 : }
995 :
996 : } // namespace wrapper
997 : } // namespace chart
998 :
999 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|