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 1053 : MergedMinimumAndMaximumSupplier::MergedMinimumAndMaximumSupplier()
32 : {
33 1053 : }
34 :
35 1037 : MergedMinimumAndMaximumSupplier::~MergedMinimumAndMaximumSupplier()
36 : {
37 1037 : }
38 :
39 1074 : void MergedMinimumAndMaximumSupplier::addMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier )
40 : {
41 1074 : m_aMinimumAndMaximumSupplierList.insert( pMinimumAndMaximumSupplier );
42 1074 : }
43 :
44 4296 : bool MergedMinimumAndMaximumSupplier::hasMinimumAndMaximumSupplier( MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier )
45 : {
46 4296 : return m_aMinimumAndMaximumSupplierList.count( pMinimumAndMaximumSupplier ) != 0;
47 : }
48 :
49 2117 : double MergedMinimumAndMaximumSupplier::getMinimumX()
50 : {
51 : double fGlobalExtremum;
52 2117 : ::rtl::math::setInf(&fGlobalExtremum, false);
53 4316 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
54 : {
55 2199 : double fLocalExtremum = (*aIt)->getMinimumX();
56 2199 : if(fLocalExtremum<fGlobalExtremum)
57 2115 : fGlobalExtremum=fLocalExtremum;
58 : }
59 2117 : if(::rtl::math::isInf(fGlobalExtremum))
60 2 : ::rtl::math::setNan(&fGlobalExtremum);
61 2117 : return fGlobalExtremum;
62 : }
63 :
64 2117 : double MergedMinimumAndMaximumSupplier::getMaximumX()
65 : {
66 : double fGlobalExtremum;
67 2117 : ::rtl::math::setInf(&fGlobalExtremum, true);
68 4316 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
69 : {
70 2199 : double fLocalExtremum = (*aIt)->getMaximumX();
71 2199 : if(fLocalExtremum>fGlobalExtremum)
72 2115 : fGlobalExtremum=fLocalExtremum;
73 : }
74 2117 : if(::rtl::math::isInf(fGlobalExtremum))
75 2 : ::rtl::math::setNan(&fGlobalExtremum);
76 2117 : return fGlobalExtremum;
77 : }
78 :
79 2121 : double MergedMinimumAndMaximumSupplier::getMinimumYInRange( double fMinimumX, double fMaximumX, sal_Int32 nAxisIndex )
80 : {
81 : double fGlobalExtremum;
82 2121 : ::rtl::math::setInf(&fGlobalExtremum, false);
83 4324 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
84 : {
85 2203 : double fLocalExtremum = (*aIt)->getMinimumYInRange( fMinimumX, fMaximumX, nAxisIndex );
86 2203 : if(fLocalExtremum<fGlobalExtremum)
87 2111 : fGlobalExtremum=fLocalExtremum;
88 : }
89 2121 : if(::rtl::math::isInf(fGlobalExtremum))
90 10 : ::rtl::math::setNan(&fGlobalExtremum);
91 2121 : return fGlobalExtremum;
92 : }
93 :
94 2121 : double MergedMinimumAndMaximumSupplier::getMaximumYInRange( double fMinimumX, double fMaximumX, sal_Int32 nAxisIndex )
95 : {
96 : double fGlobalExtremum;
97 2121 : ::rtl::math::setInf(&fGlobalExtremum, true);
98 4324 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
99 : {
100 2203 : double fLocalExtremum = (*aIt)->getMaximumYInRange( fMinimumX, fMaximumX, nAxisIndex );
101 2203 : if(fLocalExtremum>fGlobalExtremum)
102 2111 : fGlobalExtremum=fLocalExtremum;
103 : }
104 2121 : if(::rtl::math::isInf(fGlobalExtremum))
105 10 : ::rtl::math::setNan(&fGlobalExtremum);
106 2121 : return fGlobalExtremum;
107 : }
108 :
109 104 : double MergedMinimumAndMaximumSupplier::getMinimumZ()
110 : {
111 : double fGlobalExtremum;
112 104 : ::rtl::math::setInf(&fGlobalExtremum, false);
113 208 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
114 : {
115 104 : double fLocalExtremum = (*aIt)->getMinimumZ();
116 104 : if(fLocalExtremum<fGlobalExtremum)
117 104 : fGlobalExtremum=fLocalExtremum;
118 : }
119 104 : if(::rtl::math::isInf(fGlobalExtremum))
120 0 : ::rtl::math::setNan(&fGlobalExtremum);
121 104 : return fGlobalExtremum;
122 : }
123 :
124 104 : double MergedMinimumAndMaximumSupplier::getMaximumZ()
125 : {
126 : double fGlobalExtremum;
127 104 : ::rtl::math::setInf(&fGlobalExtremum, true);
128 208 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
129 : {
130 104 : double fLocalExtremum = (*aIt)->getMaximumZ();
131 104 : if(fLocalExtremum>fGlobalExtremum)
132 104 : fGlobalExtremum=fLocalExtremum;
133 : }
134 104 : if(::rtl::math::isInf(fGlobalExtremum))
135 0 : ::rtl::math::setNan(&fGlobalExtremum);
136 104 : return fGlobalExtremum;
137 : }
138 :
139 4342 : bool MergedMinimumAndMaximumSupplier::isExpandBorderToIncrementRhythm( sal_Int32 nDimensionIndex )
140 : {
141 : // only return true, if *all* suppliers want to scale to the main tick marks
142 6628 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
143 4432 : if( !(*aIt)->isExpandBorderToIncrementRhythm( nDimensionIndex ) )
144 2146 : return false;
145 2196 : return true;
146 : }
147 :
148 4342 : bool MergedMinimumAndMaximumSupplier::isExpandIfValuesCloseToBorder( sal_Int32 nDimensionIndex )
149 : {
150 : // only return true, if *all* suppliers want to expand the range
151 6518 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
152 4432 : if( !(*aIt)->isExpandIfValuesCloseToBorder( nDimensionIndex ) )
153 2256 : return false;
154 2086 : return true;
155 : }
156 :
157 4342 : bool MergedMinimumAndMaximumSupplier::isExpandWideValuesToZero( sal_Int32 nDimensionIndex )
158 : {
159 : // already return true, if at least one supplier wants to expand the range
160 6682 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
161 4424 : if( (*aIt)->isExpandWideValuesToZero( nDimensionIndex ) )
162 2084 : return true;
163 2258 : return false;
164 : }
165 :
166 4342 : bool MergedMinimumAndMaximumSupplier::isExpandNarrowValuesTowardZero( sal_Int32 nDimensionIndex )
167 : {
168 : // already return true, if at least one supplier wants to expand the range
169 6682 : for( MinimumAndMaximumSupplierSet::iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
170 4424 : if( (*aIt)->isExpandNarrowValuesTowardZero( nDimensionIndex ) )
171 2084 : return true;
172 2258 : 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 1053 : void MergedMinimumAndMaximumSupplier::clearMinimumAndMaximumSupplierList()
185 : {
186 1053 : m_aMinimumAndMaximumSupplierList.clear();
187 1053 : }
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: */
|