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