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 <MinimumAndMaximumSupplier.hxx>
21
22 #include <com/sun/star/chart/TimeUnit.hpp>
23
24 #include <rtl/math.hxx>
25
26 namespace chart
27 {
28 using namespace ::com::sun::star;
29
MergedMinimumAndMaximumSupplier()30 MergedMinimumAndMaximumSupplier::MergedMinimumAndMaximumSupplier()
31 {
32 }
33
~MergedMinimumAndMaximumSupplier()34 MergedMinimumAndMaximumSupplier::~MergedMinimumAndMaximumSupplier()
35 {
36 }
37
addMinimumAndMaximumSupplier(MinimumAndMaximumSupplier * pMinimumAndMaximumSupplier)38 void MergedMinimumAndMaximumSupplier::addMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier )
39 {
40 m_aMinimumAndMaximumSupplierList.insert( pMinimumAndMaximumSupplier );
41 }
42
hasMinimumAndMaximumSupplier(MinimumAndMaximumSupplier * pMinimumAndMaximumSupplier)43 bool MergedMinimumAndMaximumSupplier::hasMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier )
44 {
45 return m_aMinimumAndMaximumSupplierList.count( pMinimumAndMaximumSupplier ) != 0;
46 }
47
getMinimumX()48 double MergedMinimumAndMaximumSupplier::getMinimumX()
49 {
50 double fGlobalExtremum;
51 ::rtl::math::setInf(&fGlobalExtremum, false);
52 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
53 {
54 double fLocalExtremum = elem->getMinimumX();
55 if(fLocalExtremum<fGlobalExtremum)
56 fGlobalExtremum=fLocalExtremum;
57 }
58 if(std::isinf(fGlobalExtremum))
59 ::rtl::math::setNan(&fGlobalExtremum);
60 return fGlobalExtremum;
61 }
62
getMaximumX()63 double MergedMinimumAndMaximumSupplier::getMaximumX()
64 {
65 double fGlobalExtremum;
66 ::rtl::math::setInf(&fGlobalExtremum, true);
67 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
68 {
69 double fLocalExtremum = elem->getMaximumX();
70 if(fLocalExtremum>fGlobalExtremum)
71 fGlobalExtremum=fLocalExtremum;
72 }
73 if(std::isinf(fGlobalExtremum))
74 ::rtl::math::setNan(&fGlobalExtremum);
75 return fGlobalExtremum;
76 }
77
getMinimumYInRange(double fMinimumX,double fMaximumX,sal_Int32 nAxisIndex)78 double MergedMinimumAndMaximumSupplier::getMinimumYInRange( double fMinimumX, double fMaximumX, sal_Int32 nAxisIndex )
79 {
80 double fGlobalExtremum;
81 ::rtl::math::setInf(&fGlobalExtremum, false);
82 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
83 {
84 double fLocalExtremum = elem->getMinimumYInRange( fMinimumX, fMaximumX, nAxisIndex );
85 if(fLocalExtremum<fGlobalExtremum)
86 fGlobalExtremum=fLocalExtremum;
87 }
88 if(std::isinf(fGlobalExtremum))
89 ::rtl::math::setNan(&fGlobalExtremum);
90 return fGlobalExtremum;
91 }
92
getMaximumYInRange(double fMinimumX,double fMaximumX,sal_Int32 nAxisIndex)93 double MergedMinimumAndMaximumSupplier::getMaximumYInRange( double fMinimumX, double fMaximumX, sal_Int32 nAxisIndex )
94 {
95 double fGlobalExtremum;
96 ::rtl::math::setInf(&fGlobalExtremum, true);
97 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
98 {
99 double fLocalExtremum = elem->getMaximumYInRange( fMinimumX, fMaximumX, nAxisIndex );
100 if(fLocalExtremum>fGlobalExtremum)
101 fGlobalExtremum=fLocalExtremum;
102 }
103 if(std::isinf(fGlobalExtremum))
104 ::rtl::math::setNan(&fGlobalExtremum);
105 return fGlobalExtremum;
106 }
107
getMinimumZ()108 double MergedMinimumAndMaximumSupplier::getMinimumZ()
109 {
110 double fGlobalExtremum;
111 ::rtl::math::setInf(&fGlobalExtremum, false);
112 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
113 {
114 double fLocalExtremum = elem->getMinimumZ();
115 if(fLocalExtremum<fGlobalExtremum)
116 fGlobalExtremum=fLocalExtremum;
117 }
118 if(std::isinf(fGlobalExtremum))
119 ::rtl::math::setNan(&fGlobalExtremum);
120 return fGlobalExtremum;
121 }
122
getMaximumZ()123 double MergedMinimumAndMaximumSupplier::getMaximumZ()
124 {
125 double fGlobalExtremum;
126 ::rtl::math::setInf(&fGlobalExtremum, true);
127 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
128 {
129 double fLocalExtremum = elem->getMaximumZ();
130 if(fLocalExtremum>fGlobalExtremum)
131 fGlobalExtremum=fLocalExtremum;
132 }
133 if(std::isinf(fGlobalExtremum))
134 ::rtl::math::setNan(&fGlobalExtremum);
135 return fGlobalExtremum;
136 }
137
isExpandBorderToIncrementRhythm(sal_Int32 nDimensionIndex)138 bool MergedMinimumAndMaximumSupplier::isExpandBorderToIncrementRhythm( sal_Int32 nDimensionIndex )
139 {
140 // only return true, if *all* suppliers want to scale to the main tick marks
141 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
142 if( !elem->isExpandBorderToIncrementRhythm( nDimensionIndex ) )
143 return false;
144 return true;
145 }
146
isExpandIfValuesCloseToBorder(sal_Int32 nDimensionIndex)147 bool MergedMinimumAndMaximumSupplier::isExpandIfValuesCloseToBorder( sal_Int32 nDimensionIndex )
148 {
149 // only return true, if *all* suppliers want to expand the range
150 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
151 if( !elem->isExpandIfValuesCloseToBorder( nDimensionIndex ) )
152 return false;
153 return true;
154 }
155
isExpandWideValuesToZero(sal_Int32 nDimensionIndex)156 bool MergedMinimumAndMaximumSupplier::isExpandWideValuesToZero( sal_Int32 nDimensionIndex )
157 {
158 // already return true, if at least one supplier wants to expand the range
159 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
160 if( elem->isExpandWideValuesToZero( nDimensionIndex ) )
161 return true;
162 return false;
163 }
164
isExpandNarrowValuesTowardZero(sal_Int32 nDimensionIndex)165 bool MergedMinimumAndMaximumSupplier::isExpandNarrowValuesTowardZero( sal_Int32 nDimensionIndex )
166 {
167 // already return true, if at least one supplier wants to expand the range
168 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
169 if( elem->isExpandNarrowValuesTowardZero( nDimensionIndex ) )
170 return true;
171 return false;
172 }
173
isSeparateStackingForDifferentSigns(sal_Int32 nDimensionIndex)174 bool MergedMinimumAndMaximumSupplier::isSeparateStackingForDifferentSigns( sal_Int32 nDimensionIndex )
175 {
176 // should not be called
177 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
178 if( elem->isSeparateStackingForDifferentSigns( nDimensionIndex ) )
179 return true;
180 return false;
181 }
182
clearMinimumAndMaximumSupplierList()183 void MergedMinimumAndMaximumSupplier::clearMinimumAndMaximumSupplierList()
184 {
185 m_aMinimumAndMaximumSupplierList.clear();
186 }
187
calculateTimeResolutionOnXAxis()188 tools::Long MergedMinimumAndMaximumSupplier::calculateTimeResolutionOnXAxis()
189 {
190 tools::Long nRet = css::chart::TimeUnit::YEAR;
191 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
192 {
193 tools::Long nCurrent = elem->calculateTimeResolutionOnXAxis();
194 if(nRet>nCurrent)
195 nRet=nCurrent;
196 }
197 return nRet;
198 }
199
setTimeResolutionOnXAxis(tools::Long nTimeResolution,const Date & rNullDate)200 void MergedMinimumAndMaximumSupplier::setTimeResolutionOnXAxis( tools::Long nTimeResolution, const Date& rNullDate )
201 {
202 for (auto const& elem : m_aMinimumAndMaximumSupplierList)
203 elem->setTimeResolutionOnXAxis( nTimeResolution, rNullDate );
204 }
205
206 } //namespace chart
207
208 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
209