1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chart2.hxx" 26 27 #include "MinimumAndMaximumSupplier.hxx" 28 29 #include <com/sun/star/chart/TimeUnit.hpp> 30 31 #include <rtl/math.hxx> 32 #include <com/sun/star/awt/Size.hpp> 33 34 //............................................................................. 35 namespace chart 36 { 37 //............................................................................. 38 using namespace ::com::sun::star; 39 40 MergedMinimumAndMaximumSupplier::MergedMinimumAndMaximumSupplier() 41 { 42 } 43 44 MergedMinimumAndMaximumSupplier::~MergedMinimumAndMaximumSupplier() 45 { 46 } 47 48 void MergedMinimumAndMaximumSupplier::addMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier ) 49 { 50 m_aMinimumAndMaximumSupplierList.insert( pMinimumAndMaximumSupplier ); 51 } 52 53 bool MergedMinimumAndMaximumSupplier::hasMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier ) 54 { 55 return m_aMinimumAndMaximumSupplierList.count( pMinimumAndMaximumSupplier ) != 0; 56 } 57 58 double MergedMinimumAndMaximumSupplier::getMinimumX() 59 { 60 double fGlobalExtremum; 61 ::rtl::math::setInf(&fGlobalExtremum, false); 62 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 63 { 64 double fLocalExtremum = (*aIt)->getMinimumX(); 65 if(fLocalExtremum<fGlobalExtremum) 66 fGlobalExtremum=fLocalExtremum; 67 } 68 if(::rtl::math::isInf(fGlobalExtremum)) 69 ::rtl::math::setNan(&fGlobalExtremum); 70 return fGlobalExtremum; 71 } 72 73 double MergedMinimumAndMaximumSupplier::getMaximumX() 74 { 75 double fGlobalExtremum; 76 ::rtl::math::setInf(&fGlobalExtremum, true); 77 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 78 { 79 double fLocalExtremum = (*aIt)->getMaximumX(); 80 if(fLocalExtremum>fGlobalExtremum) 81 fGlobalExtremum=fLocalExtremum; 82 } 83 if(::rtl::math::isInf(fGlobalExtremum)) 84 ::rtl::math::setNan(&fGlobalExtremum); 85 return fGlobalExtremum; 86 } 87 88 double MergedMinimumAndMaximumSupplier::getMinimumYInRange( double fMinimumX, double fMaximumX, sal_Int32 nAxisIndex ) 89 { 90 double fGlobalExtremum; 91 ::rtl::math::setInf(&fGlobalExtremum, false); 92 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 93 { 94 double fLocalExtremum = (*aIt)->getMinimumYInRange( fMinimumX, fMaximumX, nAxisIndex ); 95 if(fLocalExtremum<fGlobalExtremum) 96 fGlobalExtremum=fLocalExtremum; 97 } 98 if(::rtl::math::isInf(fGlobalExtremum)) 99 ::rtl::math::setNan(&fGlobalExtremum); 100 return fGlobalExtremum; 101 } 102 103 double MergedMinimumAndMaximumSupplier::getMaximumYInRange( double fMinimumX, double fMaximumX, sal_Int32 nAxisIndex ) 104 { 105 double fGlobalExtremum; 106 ::rtl::math::setInf(&fGlobalExtremum, true); 107 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 108 { 109 double fLocalExtremum = (*aIt)->getMaximumYInRange( fMinimumX, fMaximumX, nAxisIndex ); 110 if(fLocalExtremum>fGlobalExtremum) 111 fGlobalExtremum=fLocalExtremum; 112 } 113 if(::rtl::math::isInf(fGlobalExtremum)) 114 ::rtl::math::setNan(&fGlobalExtremum); 115 return fGlobalExtremum; 116 } 117 118 double MergedMinimumAndMaximumSupplier::getMinimumZ() 119 { 120 double fGlobalExtremum; 121 ::rtl::math::setInf(&fGlobalExtremum, false); 122 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 123 { 124 double fLocalExtremum = (*aIt)->getMinimumZ(); 125 if(fLocalExtremum<fGlobalExtremum) 126 fGlobalExtremum=fLocalExtremum; 127 } 128 if(::rtl::math::isInf(fGlobalExtremum)) 129 ::rtl::math::setNan(&fGlobalExtremum); 130 return fGlobalExtremum; 131 } 132 133 double MergedMinimumAndMaximumSupplier::getMaximumZ() 134 { 135 double fGlobalExtremum; 136 ::rtl::math::setInf(&fGlobalExtremum, true); 137 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 138 { 139 double fLocalExtremum = (*aIt)->getMaximumZ(); 140 if(fLocalExtremum>fGlobalExtremum) 141 fGlobalExtremum=fLocalExtremum; 142 } 143 if(::rtl::math::isInf(fGlobalExtremum)) 144 ::rtl::math::setNan(&fGlobalExtremum); 145 return fGlobalExtremum; 146 } 147 148 bool MergedMinimumAndMaximumSupplier::isExpandBorderToIncrementRhythm( sal_Int32 nDimensionIndex ) 149 { 150 // only return true, if *all* suppliers want to scale to the main tick marks 151 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 152 if( !(*aIt)->isExpandBorderToIncrementRhythm( nDimensionIndex ) ) 153 return false; 154 return true; 155 } 156 157 bool MergedMinimumAndMaximumSupplier::isExpandIfValuesCloseToBorder( sal_Int32 nDimensionIndex ) 158 { 159 // only return true, if *all* suppliers want to expand the range 160 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 161 if( !(*aIt)->isExpandIfValuesCloseToBorder( nDimensionIndex ) ) 162 return false; 163 return true; 164 } 165 166 bool MergedMinimumAndMaximumSupplier::isExpandWideValuesToZero( sal_Int32 nDimensionIndex ) 167 { 168 // already return true, if at least one supplier wants to expand the range 169 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 170 if( (*aIt)->isExpandWideValuesToZero( nDimensionIndex ) ) 171 return true; 172 return false; 173 } 174 175 bool MergedMinimumAndMaximumSupplier::isExpandNarrowValuesTowardZero( sal_Int32 nDimensionIndex ) 176 { 177 // already return true, if at least one supplier wants to expand the range 178 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 179 if( (*aIt)->isExpandNarrowValuesTowardZero( nDimensionIndex ) ) 180 return true; 181 return false; 182 } 183 184 bool MergedMinimumAndMaximumSupplier::isSeperateStackingForDifferentSigns( sal_Int32 nDimensionIndex ) 185 { 186 // should not be called 187 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 188 if( (*aIt)->isSeperateStackingForDifferentSigns( nDimensionIndex ) ) 189 return true; 190 return false; 191 } 192 193 void MergedMinimumAndMaximumSupplier::clearMinimumAndMaximumSupplierList() 194 { 195 m_aMinimumAndMaximumSupplierList.clear(); 196 } 197 198 long MergedMinimumAndMaximumSupplier::calculateTimeResolutionOnXAxis() 199 { 200 long nRet = ::com::sun::star::chart::TimeUnit::YEAR; 201 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 202 { 203 long nCurrent = (*aIt)->calculateTimeResolutionOnXAxis(); 204 if(nRet>nCurrent) 205 nRet=nCurrent; 206 } 207 return nRet; 208 } 209 210 void MergedMinimumAndMaximumSupplier::setTimeResolutionOnXAxis( long nTimeResolution, const Date& rNullDate ) 211 { 212 for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt ) 213 (*aIt)->setTimeResolutionOnXAxis( nTimeResolution, rNullDate ); 214 } 215 216 //............................................................................. 217 } //namespace chart 218 //............................................................................. 219