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