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