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 10*cde9e8dcSAndrew Rist * 11*cde9e8dcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*cde9e8dcSAndrew Rist * 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. 19*cde9e8dcSAndrew Rist * 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 "Tickmarks_Dates.hxx" 27cdf0e10cSrcweir #include "DateScaling.hxx" 28cdf0e10cSrcweir #include <rtl/math.hxx> 29cdf0e10cSrcweir #include <tools/debug.hxx> 30cdf0e10cSrcweir #include "DateHelper.hxx" 31cdf0e10cSrcweir 32cdf0e10cSrcweir //............................................................................. 33cdf0e10cSrcweir namespace chart 34cdf0e10cSrcweir { 35cdf0e10cSrcweir //............................................................................. 36cdf0e10cSrcweir using namespace ::com::sun::star; 37cdf0e10cSrcweir using namespace ::com::sun::star::chart2; 38cdf0e10cSrcweir using namespace ::rtl::math; 39cdf0e10cSrcweir using ::basegfx::B2DVector; 40cdf0e10cSrcweir using ::com::sun::star::chart::TimeUnit::DAY; 41cdf0e10cSrcweir using ::com::sun::star::chart::TimeUnit::MONTH; 42cdf0e10cSrcweir using ::com::sun::star::chart::TimeUnit::YEAR; 43cdf0e10cSrcweir 44cdf0e10cSrcweir DateTickFactory::DateTickFactory( 45cdf0e10cSrcweir const ExplicitScaleData& rScale, const ExplicitIncrementData& rIncrement ) 46cdf0e10cSrcweir : m_aScale( rScale ) 47cdf0e10cSrcweir , m_aIncrement( rIncrement ) 48cdf0e10cSrcweir , m_xInverseScaling(NULL) 49cdf0e10cSrcweir { 50cdf0e10cSrcweir //@todo: make sure that the scale is valid for the scaling 51cdf0e10cSrcweir 52cdf0e10cSrcweir if( m_aScale.Scaling.is() ) 53cdf0e10cSrcweir { 54cdf0e10cSrcweir m_xInverseScaling = m_aScale.Scaling->getInverseScaling(); 55cdf0e10cSrcweir DBG_ASSERT( m_xInverseScaling.is(), "each Scaling needs to return a inverse Scaling" ); 56cdf0e10cSrcweir } 57cdf0e10cSrcweir 58cdf0e10cSrcweir m_fScaledVisibleMin = m_aScale.Minimum; 59cdf0e10cSrcweir if( m_xInverseScaling.is() ) 60cdf0e10cSrcweir m_fScaledVisibleMin = m_aScale.Scaling->doScaling(m_fScaledVisibleMin); 61cdf0e10cSrcweir 62cdf0e10cSrcweir m_fScaledVisibleMax = m_aScale.Maximum; 63cdf0e10cSrcweir if( m_xInverseScaling.is() ) 64cdf0e10cSrcweir m_fScaledVisibleMax = m_aScale.Scaling->doScaling(m_fScaledVisibleMax); 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir DateTickFactory::~DateTickFactory() 68cdf0e10cSrcweir { 69cdf0e10cSrcweir } 70cdf0e10cSrcweir 71cdf0e10cSrcweir void DateTickFactory::getAllTicks( ::std::vector< ::std::vector< TickInfo > >& rAllTickInfos, bool bShifted ) const 72cdf0e10cSrcweir { 73cdf0e10cSrcweir rAllTickInfos.resize(2); 74cdf0e10cSrcweir ::std::vector< TickInfo >& rMajorTicks = rAllTickInfos[0]; 75cdf0e10cSrcweir ::std::vector< TickInfo >& rMinorTicks = rAllTickInfos[1]; 76cdf0e10cSrcweir rMajorTicks.clear(); 77cdf0e10cSrcweir rMinorTicks.clear(); 78cdf0e10cSrcweir 79cdf0e10cSrcweir Date aNull(m_aScale.NullDate); 80cdf0e10cSrcweir 81cdf0e10cSrcweir Date aDate = aNull + static_cast<long>(::rtl::math::approxFloor(m_aScale.Minimum)); 82cdf0e10cSrcweir Date aMaxDate = aNull + static_cast<long>(::rtl::math::approxFloor(m_aScale.Maximum)); 83cdf0e10cSrcweir 84cdf0e10cSrcweir uno::Reference< chart2::XScaling > xScaling(m_aScale.Scaling); 85cdf0e10cSrcweir uno::Reference< chart2::XScaling > xInverseScaling(m_xInverseScaling); 86cdf0e10cSrcweir if( bShifted ) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir xScaling = new DateScaling(aNull,m_aScale.TimeResolution,true/*bShifted*/); 89cdf0e10cSrcweir xInverseScaling = xScaling->getInverseScaling(); 90cdf0e10cSrcweir } 91cdf0e10cSrcweir 92cdf0e10cSrcweir //create major date tickinfos 93cdf0e10cSrcweir while( aDate<= aMaxDate ) 94cdf0e10cSrcweir { 95cdf0e10cSrcweir if( bShifted && aDate==aMaxDate ) 96cdf0e10cSrcweir break; 97cdf0e10cSrcweir 98cdf0e10cSrcweir TickInfo aNewTick(xInverseScaling); aNewTick.fScaledTickValue = aDate - aNull; 99cdf0e10cSrcweir 100cdf0e10cSrcweir if( xInverseScaling.is() ) 101cdf0e10cSrcweir aNewTick.fScaledTickValue = xScaling->doScaling(aNewTick.fScaledTickValue); 102cdf0e10cSrcweir rMajorTicks.push_back( aNewTick ); 103cdf0e10cSrcweir 104cdf0e10cSrcweir if(m_aIncrement.MajorTimeInterval.Number<=0) 105cdf0e10cSrcweir break; 106cdf0e10cSrcweir 107cdf0e10cSrcweir //find next major date 108cdf0e10cSrcweir switch( m_aIncrement.MajorTimeInterval.TimeUnit ) 109cdf0e10cSrcweir { 110cdf0e10cSrcweir case DAY: 111cdf0e10cSrcweir aDate += m_aIncrement.MajorTimeInterval.Number; 112cdf0e10cSrcweir break; 113cdf0e10cSrcweir case YEAR: 114cdf0e10cSrcweir aDate = DateHelper::GetDateSomeYearsAway( aDate, m_aIncrement.MajorTimeInterval.Number ); 115cdf0e10cSrcweir break; 116cdf0e10cSrcweir case MONTH: 117cdf0e10cSrcweir default: 118cdf0e10cSrcweir aDate = DateHelper::GetDateSomeMonthsAway( aDate, m_aIncrement.MajorTimeInterval.Number ); 119cdf0e10cSrcweir break; 120cdf0e10cSrcweir } 121cdf0e10cSrcweir } 122cdf0e10cSrcweir 123cdf0e10cSrcweir //create minor date tickinfos 124cdf0e10cSrcweir aDate = aNull + static_cast<long>(::rtl::math::approxFloor(m_aScale.Minimum)); 125cdf0e10cSrcweir while( aDate<= aMaxDate ) 126cdf0e10cSrcweir { 127cdf0e10cSrcweir if( bShifted && aDate==aMaxDate ) 128cdf0e10cSrcweir break; 129cdf0e10cSrcweir 130cdf0e10cSrcweir TickInfo aNewTick(xInverseScaling); aNewTick.fScaledTickValue = aDate - aNull; 131cdf0e10cSrcweir if( xInverseScaling.is() ) 132cdf0e10cSrcweir aNewTick.fScaledTickValue = xScaling->doScaling(aNewTick.fScaledTickValue); 133cdf0e10cSrcweir rMinorTicks.push_back( aNewTick ); 134cdf0e10cSrcweir 135cdf0e10cSrcweir if(m_aIncrement.MinorTimeInterval.Number<=0) 136cdf0e10cSrcweir break; 137cdf0e10cSrcweir 138cdf0e10cSrcweir //find next minor date 139cdf0e10cSrcweir switch( m_aIncrement.MinorTimeInterval.TimeUnit ) 140cdf0e10cSrcweir { 141cdf0e10cSrcweir case DAY: 142cdf0e10cSrcweir aDate += m_aIncrement.MinorTimeInterval.Number; 143cdf0e10cSrcweir break; 144cdf0e10cSrcweir case YEAR: 145cdf0e10cSrcweir aDate = DateHelper::GetDateSomeYearsAway( aDate, m_aIncrement.MinorTimeInterval.Number ); 146cdf0e10cSrcweir break; 147cdf0e10cSrcweir case MONTH: 148cdf0e10cSrcweir default: 149cdf0e10cSrcweir aDate = DateHelper::GetDateSomeMonthsAway( aDate, m_aIncrement.MinorTimeInterval.Number ); 150cdf0e10cSrcweir break; 151cdf0e10cSrcweir } 152cdf0e10cSrcweir } 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir void DateTickFactory::getAllTicks( ::std::vector< ::std::vector< TickInfo > >& rAllTickInfos ) const 156cdf0e10cSrcweir { 157cdf0e10cSrcweir getAllTicks( rAllTickInfos, false ); 158cdf0e10cSrcweir } 159cdf0e10cSrcweir 160cdf0e10cSrcweir void DateTickFactory::getAllTicksShifted( ::std::vector< ::std::vector< TickInfo > >& rAllTickInfos ) const 161cdf0e10cSrcweir { 162cdf0e10cSrcweir getAllTicks( rAllTickInfos, true ); 163cdf0e10cSrcweir } 164cdf0e10cSrcweir 165cdf0e10cSrcweir //............................................................................. 166cdf0e10cSrcweir } //namespace chart 167cdf0e10cSrcweir //............................................................................. 168