1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
32 #include <com/sun/star/sheet/XAddIn.hpp>
33 #include <com/sun/star/lang/XServiceName.hpp>
34 #include <com/sun/star/lang/XServiceInfo.hpp>
35 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36 #include <com/sun/star/sheet/addin/XAnalysis.hpp>
37 #include <com/sun/star/sheet/LocalizedName.hpp>
38 #include <com/sun/star/sheet/XCompatibilityNames.hpp>
39 #include <com/sun/star/sheet/NoConvergenceException.hpp>
41 #include <cppuhelper/implbase5.hxx> // helper for implementations
43 #include "analysisdefs.hxx"
44 #include "analysishelper.hxx"
49 class ConvertDataList
;
53 REF( CSS::uno::XInterface
) SAL_CALL
AnalysisAddIn_CreateInstance( const REF( CSS::lang::XMultiServiceFactory
)& );
56 class AnalysisAddIn
: public cppu::WeakImplHelper5
<
58 CSS::sheet::XCompatibilityNames
,
59 CSS::sheet::addin::XAnalysis
,
60 CSS::lang::XServiceName
,
61 CSS::lang::XServiceInfo
>
64 CSS::lang::Locale aFuncLoc
;
65 CSS::lang::Locale
* pDefLocales
;
68 ConvertDataList
* pCDL
;
71 ScaAnyConverter aAnyConv
;
73 ResMgr
& GetResMgr( void ) THROWDEF_RTE
;
74 STRING
GetDisplFuncStr( sal_uInt16 nFuncNum
) THROWDEF_RTE
;
75 STRING
GetFuncDescrStr( sal_uInt16 nResId
, sal_uInt16 nStrIndex
) THROWDEF_RTE
;
76 void InitDefLocales( void );
77 inline const CSS::lang::Locale
& GetLocale( sal_uInt32 nInd
);
78 void InitData( void );
80 /// Converts an Any to sal_Int32 in the range from 0 to 4 (date calculation mode).
81 sal_Int32
getDateMode(
82 const CSS::uno::Reference
< CSS::beans::XPropertySet
>& xPropSet
,
83 const CSS::uno::Any
& rAny
)
84 throw( CSS::uno::RuntimeException
, CSS::lang::IllegalArgumentException
);
88 const CSS::uno::Reference
< CSS::lang::XMultiServiceFactory
>& xServiceFact
);
89 virtual ~AnalysisAddIn();
91 double FactDouble( sal_Int32 nNum
) THROWDEF_RTE_IAE
;
93 static STRING
getImplementationName_Static();
94 static SEQ( STRING
) getSupportedServiceNames_Static();
97 virtual STRING SAL_CALL
getProgrammaticFuntionName( const STRING
& aDisplayName
) THROWDEF_RTE
;
98 virtual STRING SAL_CALL
getDisplayFunctionName( const STRING
& aProgrammaticName
) THROWDEF_RTE
;
99 virtual STRING SAL_CALL
getFunctionDescription( const STRING
& aProgrammaticName
) THROWDEF_RTE
;
100 virtual STRING SAL_CALL
getDisplayArgumentName( const STRING
& aProgrammaticFunctionName
, sal_Int32 nArgument
) THROWDEF_RTE
;
101 virtual STRING SAL_CALL
getArgumentDescription( const STRING
& aProgrammaticFunctionName
, sal_Int32 nArgument
) THROWDEF_RTE
;
102 virtual STRING SAL_CALL
getProgrammaticCategoryName( const STRING
& aProgrammaticFunctionName
) THROWDEF_RTE
;
103 virtual STRING SAL_CALL
getDisplayCategoryName( const STRING
& aProgrammaticFunctionName
) THROWDEF_RTE
;
105 // XCompatibilityNames
106 virtual SEQofLocName SAL_CALL
getCompatibilityNames( const STRING
& aProgrammaticName
) THROWDEF_RTE
;
109 virtual void SAL_CALL
setLocale( const CSS::lang::Locale
& eLocale
) THROWDEF_RTE
;
110 virtual CSS::lang::Locale SAL_CALL
getLocale( ) THROWDEF_RTE
;
113 virtual STRING SAL_CALL
getServiceName( ) THROWDEF_RTE
;
116 virtual STRING SAL_CALL
getImplementationName( ) THROWDEF_RTE
;
117 virtual sal_Bool SAL_CALL
supportsService( const STRING
& ServiceName
) THROWDEF_RTE
;
118 virtual SEQ( STRING
) SAL_CALL
getSupportedServiceNames( ) THROWDEF_RTE
;
120 // methods from own interfaces start here
123 // virtual double SAL_CALL get_Test( constREFXPS&, sal_Int32 nMode, double f1, double f2, double f3 ) THROWDEF_RTE;
125 virtual sal_Int32 SAL_CALL
getWorkday( constREFXPS
&, sal_Int32 nStartDate
, sal_Int32 nDays
, const ANY
& aHDay
) THROWDEF_RTE_IAE
;
126 virtual double SAL_CALL
getYearfrac( constREFXPS
&, sal_Int32 nStartDate
, sal_Int32 nEndDate
, const ANY
& aMode
) THROWDEF_RTE_IAE
;
127 virtual sal_Int32 SAL_CALL
getEdate( constREFXPS
&, sal_Int32 nStartDate
, sal_Int32 nMonths
) THROWDEF_RTE_IAE
;
128 virtual sal_Int32 SAL_CALL
getWeeknum( constREFXPS
&, sal_Int32 nStartDate
, sal_Int32 nMode
) THROWDEF_RTE_IAE
;
129 virtual sal_Int32 SAL_CALL
getEomonth( constREFXPS
&, sal_Int32 nStartDate
, sal_Int32 nMonths
) THROWDEF_RTE_IAE
;
130 virtual sal_Int32 SAL_CALL
getNetworkdays( constREFXPS
&, sal_Int32 nStartDate
, sal_Int32 nEndDate
, const ANY
& aHDay
) THROWDEF_RTE_IAE
;
132 virtual sal_Int32 SAL_CALL
getIseven( sal_Int32 nVal
) THROWDEF_RTE_IAE
;
133 virtual sal_Int32 SAL_CALL
getIsodd( sal_Int32 nVal
) THROWDEF_RTE_IAE
;
135 virtual double SAL_CALL
getMultinomial( constREFXPS
& xOpt
, const SEQSEQ( sal_Int32
)& aVLst
, const SEQ( com::sun::star::uno::Any
)& aOptVLst
) THROWDEF_RTE_IAE
;
136 virtual double SAL_CALL
getSeriessum( double fX
, double fN
, double fM
, const SEQSEQ( double )& aCoeffList
) THROWDEF_RTE_IAE
;
137 virtual double SAL_CALL
getQuotient( double fNum
, double fDenum
) THROWDEF_RTE_IAE
;
139 virtual double SAL_CALL
getMround( double fNum
, double fMult
) THROWDEF_RTE_IAE
;
140 virtual double SAL_CALL
getSqrtpi( double fNum
) THROWDEF_RTE_IAE
;
142 virtual double SAL_CALL
getRandbetween( double fMin
, double fMax
) THROWDEF_RTE_IAE
;
144 virtual double SAL_CALL
getGcd( constREFXPS
& xOpt
, const SEQSEQ( double )& aVLst
, const SEQ( ANY
)& aOptVLst
) THROWDEF_RTE_IAE
;
145 virtual double SAL_CALL
getLcm( constREFXPS
& xOpt
, const SEQSEQ( double )& aVLst
, const SEQ( ANY
)& aOptVLst
) THROWDEF_RTE_IAE
;
147 virtual double SAL_CALL
getBesseli( double fNum
, sal_Int32 nOrder
) THROWDEF_RTE_IAE_NCE
;
148 virtual double SAL_CALL
getBesselj( double fNum
, sal_Int32 nOrder
) THROWDEF_RTE_IAE_NCE
;
149 virtual double SAL_CALL
getBesselk( double fNum
, sal_Int32 nOrder
) THROWDEF_RTE_IAE_NCE
;
150 virtual double SAL_CALL
getBessely( double fNum
, sal_Int32 nOrder
) THROWDEF_RTE_IAE_NCE
;
152 virtual STRING SAL_CALL
getBin2Oct( constREFXPS
& xOpt
, const STRING
& aNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
153 virtual double SAL_CALL
getBin2Dec( const STRING
& aNum
) THROWDEF_RTE_IAE
;
154 virtual STRING SAL_CALL
getBin2Hex( constREFXPS
& xOpt
, const STRING
& aNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
156 virtual STRING SAL_CALL
getOct2Bin( constREFXPS
& xOpt
, const STRING
& aNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
157 virtual double SAL_CALL
getOct2Dec( const STRING
& aNum
) THROWDEF_RTE_IAE
;
158 virtual STRING SAL_CALL
getOct2Hex( constREFXPS
& xOpt
, const STRING
& aNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
160 virtual STRING SAL_CALL
getDec2Bin( constREFXPS
& xOpt
, sal_Int32 fNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
161 virtual STRING SAL_CALL
getDec2Oct( constREFXPS
& xOpt
, sal_Int32 fNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
162 virtual STRING SAL_CALL
getDec2Hex( constREFXPS
& xOpt
, double fNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
164 virtual STRING SAL_CALL
getHex2Bin( constREFXPS
& xOpt
, const STRING
& aNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
165 virtual double SAL_CALL
getHex2Dec( const STRING
& aNum
) THROWDEF_RTE_IAE
;
166 virtual STRING SAL_CALL
getHex2Oct( constREFXPS
& xOpt
, const STRING
& aNum
, const ANY
& rPlaces
) THROWDEF_RTE_IAE
;
168 virtual sal_Int32 SAL_CALL
getDelta( constREFXPS
& xOpt
, double fNum1
, const ANY
& rNum2
) THROWDEF_RTE_IAE
;
170 virtual double SAL_CALL
getErf( constREFXPS
& xOpt
, double fLowerLimit
, const ANY
& rUpperLimit
) THROWDEF_RTE_IAE
;
171 virtual double SAL_CALL
getErfc( double fLowerLimit
) THROWDEF_RTE_IAE
;
173 virtual sal_Int32 SAL_CALL
getGestep( constREFXPS
& xOpt
, double fNum
, const ANY
& rStep
) THROWDEF_RTE_IAE
;
175 virtual double SAL_CALL
getFactdouble( sal_Int32 nNum
) THROWDEF_RTE_IAE
;
177 virtual double SAL_CALL
getImabs( const STRING
& aNum
) THROWDEF_RTE_IAE
;
178 virtual double SAL_CALL
getImaginary( const STRING
& aNum
) THROWDEF_RTE_IAE
;
179 virtual STRING SAL_CALL
getImpower( const STRING
& aNum
, double fPower
) THROWDEF_RTE_IAE
;
180 virtual double SAL_CALL
getImargument( const STRING
& aNum
) THROWDEF_RTE_IAE
;
181 virtual STRING SAL_CALL
getImcos( const STRING
& aNum
) THROWDEF_RTE_IAE
;
182 virtual STRING SAL_CALL
getImdiv( const STRING
& aDivident
, const STRING
& aDivisor
) THROWDEF_RTE_IAE
;
183 virtual STRING SAL_CALL
getImexp( const STRING
& aNum
) THROWDEF_RTE_IAE
;
184 virtual STRING SAL_CALL
getImconjugate( const STRING
& aNum
) THROWDEF_RTE_IAE
;
185 virtual STRING SAL_CALL
getImln( const STRING
& aNum
) THROWDEF_RTE_IAE
;
186 virtual STRING SAL_CALL
getImlog10( const STRING
& aNum
) THROWDEF_RTE_IAE
;
187 virtual STRING SAL_CALL
getImlog2( const STRING
& aNum
) THROWDEF_RTE_IAE
;
188 virtual STRING SAL_CALL
getImproduct( constREFXPS
& xOpt
, const SEQSEQ( STRING
)& aNum1
, const SEQ_ANY
& aNumList
) THROWDEF_RTE_IAE
;
189 virtual double SAL_CALL
getImreal( const STRING
& aNum
) THROWDEF_RTE_IAE
;
190 virtual STRING SAL_CALL
getImsin( const STRING
& aNum
) THROWDEF_RTE_IAE
;
191 virtual STRING SAL_CALL
getImsub( const STRING
& aNum1
, const STRING
& aNum2
) THROWDEF_RTE_IAE
;
192 virtual STRING SAL_CALL
getImsum( constREFXPS
& xOpt
, const SEQSEQ( STRING
)& aNum1
, const SEQ( ANY
)& aFollowingPars
) THROWDEF_RTE_IAE
;
194 virtual STRING SAL_CALL
getImsqrt( const STRING
& aNum
) THROWDEF_RTE_IAE
;
195 virtual STRING SAL_CALL
getComplex( double fReal
, double fImaginary
, const ANY
& rSuffix
) THROWDEF_RTE_IAE
;
197 virtual double SAL_CALL
getConvert( double fVal
, const STRING
& aFromUnit
, const STRING
& aToUnit
) THROWDEF_RTE_IAE
;
199 virtual double SAL_CALL
getAmordegrc( constREFXPS
&, double fCost
, sal_Int32 nDate
, sal_Int32 nFirstPer
, double fRestVal
, double fPer
, double fRate
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
200 virtual double SAL_CALL
getAmorlinc( constREFXPS
&, double fCost
, sal_Int32 nDate
, sal_Int32 nFirstPer
, double fRestVal
, double fPer
, double fRate
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
201 virtual double SAL_CALL
getAccrint( constREFXPS
& xOpt
, sal_Int32 nIssue
, sal_Int32 nFirstInter
, sal_Int32 nSettle
, double fRate
, const ANY
& rVal
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
202 virtual double SAL_CALL
getAccrintm( constREFXPS
& xOpt
, sal_Int32 nIssue
, sal_Int32 nSettle
, double fRate
, const ANY
& rVal
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
203 virtual double SAL_CALL
getReceived( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fInvest
, double fDisc
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
204 virtual double SAL_CALL
getDisc( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fPrice
, double fRedemp
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
205 virtual double SAL_CALL
getDuration( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fCoup
, double fYield
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
206 virtual double SAL_CALL
getEffect( double fNominal
, sal_Int32 nPeriods
) THROWDEF_RTE_IAE
;
207 virtual double SAL_CALL
getCumprinc( double fRate
, sal_Int32 nNumPeriods
, double fVal
, sal_Int32 nStartPer
, sal_Int32 nEndPer
, sal_Int32 nPayType
) THROWDEF_RTE_IAE
;
208 virtual double SAL_CALL
getCumipmt( double fRate
, sal_Int32 nNumPeriods
, double fVal
, sal_Int32 nStartPer
, sal_Int32 nEndPer
, sal_Int32 nPayType
) THROWDEF_RTE_IAE
;
209 virtual double SAL_CALL
getPrice( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fRate
, double fYield
, double fRedemp
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
210 virtual double SAL_CALL
getPricedisc( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fDisc
, double fRedemp
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
211 virtual double SAL_CALL
getPricemat( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nIssue
, double fRate
, double fYield
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
212 virtual double SAL_CALL
getMduration( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fCoup
, double fYield
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
213 virtual double SAL_CALL
getNominal( double fRate
, sal_Int32 nPeriods
) THROWDEF_RTE_IAE
;
214 virtual double SAL_CALL
getDollarfr( double fDollarDec
, sal_Int32 nFrac
) THROWDEF_RTE_IAE
;
215 virtual double SAL_CALL
getDollarde( double fDollarFrac
, sal_Int32 nFrac
) THROWDEF_RTE_IAE
;
216 virtual double SAL_CALL
getYield( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fCoup
, double fPrice
, double fRedemp
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
217 virtual double SAL_CALL
getYielddisc( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fPrice
, double fRedemp
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
218 virtual double SAL_CALL
getYieldmat( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nIssue
, double fRate
, double fPrice
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
219 virtual double SAL_CALL
getTbilleq( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fDisc
) THROWDEF_RTE_IAE
;
220 virtual double SAL_CALL
getTbillprice( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fDisc
) THROWDEF_RTE_IAE
;
221 virtual double SAL_CALL
getTbillyield( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fPrice
) THROWDEF_RTE_IAE
;
222 virtual double SAL_CALL
getOddfprice( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nIssue
, sal_Int32 nFirstCoup
, double fRate
, double fYield
, double fRedemp
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
223 virtual double SAL_CALL
getOddfyield( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nIssue
, sal_Int32 nFirstCoup
, double fRate
, double fPrice
, double fRedemp
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
224 virtual double SAL_CALL
getOddlprice( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nLastInterest
, double fRate
, double fYield
, double fRedemp
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
225 virtual double SAL_CALL
getOddlyield( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nLastInterest
, double fRate
, double fPrice
, double fRedemp
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
226 virtual double SAL_CALL
getXirr( constREFXPS
& xOpt
, const SEQSEQ( double )& rValues
, const SEQSEQ( sal_Int32
)& rDates
, const ANY
& rGuess
) THROWDEF_RTE_IAE
;
227 virtual double SAL_CALL
getXnpv( double fRate
, const SEQSEQ( double )& rValues
, const SEQSEQ( sal_Int32
)& rDates
) THROWDEF_RTE_IAE
;
228 virtual double SAL_CALL
getIntrate( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, double fInvest
, double fRedemp
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
229 virtual double SAL_CALL
getCoupncd( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
230 virtual double SAL_CALL
getCoupdays( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
231 virtual double SAL_CALL
getCoupdaysnc( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
232 virtual double SAL_CALL
getCoupdaybs( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
233 virtual double SAL_CALL
getCouppcd( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
234 virtual double SAL_CALL
getCoupnum( constREFXPS
& xOpt
, sal_Int32 nSettle
, sal_Int32 nMat
, sal_Int32 nFreq
, const ANY
& rOptBase
) THROWDEF_RTE_IAE
;
235 virtual double SAL_CALL
getFvschedule( double fPrinc
, const SEQSEQ( double )& rSchedule
) THROWDEF_RTE_IAE
;
238 //------------------------------------------------------------------