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