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 #ifndef INCLUDED_SCADDINS_SOURCE_ANALYSIS_ANALYSIS_HXX
21 #define INCLUDED_SCADDINS_SOURCE_ANALYSIS_ANALYSIS_HXX
22 
23 
24 #include <com/sun/star/sheet/XAddIn.hpp>
25 #include <com/sun/star/lang/XServiceName.hpp>
26 #include <com/sun/star/lang/XServiceInfo.hpp>
27 #include <com/sun/star/sheet/addin/XAnalysis.hpp>
28 #include <com/sun/star/sheet/XCompatibilityNames.hpp>
29 
30 #include <cppuhelper/implbase.hxx>
31 
32 #include "analysishelper.hxx"
33 
34 #include <memory>
35 
36 namespace com::sun::star::lang { class XMultiServiceFactory; }
37 namespace com::sun::star::sheet { struct LocalizedName; }
38 
39 css::uno::Reference< css::uno::XInterface > AnalysisAddIn_CreateInstance( const css::uno::Reference< css::lang::XMultiServiceFactory >& );
40 
41 
42 class AnalysisAddIn : public cppu::WeakImplHelper<
43                             css::sheet::XAddIn,
44                             css::sheet::XCompatibilityNames,
45                             css::sheet::addin::XAnalysis,
46                             css::lang::XServiceName,
47                             css::lang::XServiceInfo >
48 {
49 private:
50     css::lang::Locale           aFuncLoc;
51     std::unique_ptr<css::lang::Locale[]> pDefLocales;
52     std::unique_ptr<sca::analysis::FuncDataList> pFD;
53     std::unique_ptr<double[]>   pFactDoubles;
54     std::unique_ptr<sca::analysis::ConvertDataList> pCDL;
55     std::locale                 aResLocale;
56 
57     sca::analysis::ScaAnyConverter aAnyConv;
58 
59     /// @throws css::uno::RuntimeException
60     OUString                    GetFuncDescrStr(const char** pResId, sal_uInt16 nStrIndex);
61     void                        InitDefLocales();
62     inline const css::lang::Locale& GetLocale( sal_uInt32 nInd );
63     void                        InitData();
64 
65                                 /// Converts an Any to sal_Int32 in the range from 0 to 4 (date calculation mode).
66                                 ///
67                                 /// @throws css::uno::RuntimeException
68                                 /// @throws css::lang::IllegalArgumentException
69     sal_Int32                   getDateMode(
70                                     const css::uno::Reference< css::beans::XPropertySet >& xPropSet,
71                                     const css::uno::Any& rAny );
72 
73 public:
74     explicit                    AnalysisAddIn(
75                                     const css::uno::Reference< css::uno::XComponentContext >& xContext );
76 
77     OUString AnalysisResId(const char* pId);
78 
79     virtual                     ~AnalysisAddIn() override;
80 
81     /// @throws css::uno::RuntimeException
82     /// @throws css::lang::IllegalArgumentException
83     double                      FactDouble( sal_Int32 nNum );
84 
85     static OUString               getImplementationName_Static();
86     static css::uno::Sequence< OUString >        getSupportedServiceNames_Static();
87 
88                                 // XAddIn
89     virtual OUString SAL_CALL     getProgrammaticFuntionName( const OUString& aDisplayName ) override;
90     virtual OUString SAL_CALL     getDisplayFunctionName( const OUString& aProgrammaticName ) override;
91     virtual OUString SAL_CALL     getFunctionDescription( const OUString& aProgrammaticName ) override;
92     virtual OUString SAL_CALL     getDisplayArgumentName( const OUString& aProgrammaticFunctionName, sal_Int32 nArgument ) override;
93     virtual OUString SAL_CALL     getArgumentDescription( const OUString& aProgrammaticFunctionName, sal_Int32 nArgument ) override;
94     virtual OUString SAL_CALL     getProgrammaticCategoryName( const OUString& aProgrammaticFunctionName ) override;
95     virtual OUString SAL_CALL     getDisplayCategoryName( const OUString& aProgrammaticFunctionName ) override;
96 
97                                 // XCompatibilityNames
98     virtual css::uno::Sequence< css::sheet::LocalizedName > SAL_CALL getCompatibilityNames( const OUString& aProgrammaticName ) override;
99 
100                                 // XLocalizable
101     virtual void SAL_CALL       setLocale( const css::lang::Locale& eLocale ) override;
102     virtual css::lang::Locale SAL_CALL getLocale(  ) override;
103 
104                                 // XServiceName
105     virtual OUString SAL_CALL     getServiceName(  ) override;
106 
107                                 // XServiceInfo
108     virtual OUString SAL_CALL     getImplementationName(  ) override;
109     virtual sal_Bool SAL_CALL   supportsService( const OUString& ServiceName ) override;
110     virtual css::uno::Sequence< OUString > SAL_CALL  getSupportedServiceNames(  ) override;
111 
112     //  methods from own interfaces start here
113 
114                             // XAnalysis
115 //    virtual double SAL_CALL       get_Test( const css::uno::Reference< css::beans::XPropertySet >&, sal_Int32 nMode, double f1, double f2, double f3 ) throw( css::uno::RuntimeException );
116 
117     virtual sal_Int32 SAL_CALL  getWorkday( const css::uno::Reference< css::beans::XPropertySet >&, sal_Int32 nStartDate, sal_Int32 nDays, const css::uno::Any& aHDay ) override;
118     virtual double SAL_CALL     getYearfrac( const css::uno::Reference< css::beans::XPropertySet >&, sal_Int32 nStartDate, sal_Int32 nEndDate, const css::uno::Any& aMode ) override;
119     virtual sal_Int32 SAL_CALL  getEdate( const css::uno::Reference< css::beans::XPropertySet >&, sal_Int32 nStartDate, sal_Int32 nMonths ) override;
120     virtual sal_Int32 SAL_CALL  getWeeknum( const css::uno::Reference< css::beans::XPropertySet >&, sal_Int32 nStartDate, sal_Int32 nMode ) override;
121     virtual sal_Int32 SAL_CALL  getEomonth( const css::uno::Reference< css::beans::XPropertySet >&, sal_Int32 nStartDate, sal_Int32 nMonths ) override;
122     virtual sal_Int32 SAL_CALL  getNetworkdays( const css::uno::Reference< css::beans::XPropertySet >&, sal_Int32 nStartDate, sal_Int32 nEndDate, const css::uno::Any& aHDay ) override;
123 
124     virtual sal_Int32 SAL_CALL  getIseven( sal_Int32 nVal ) override;
125     virtual sal_Int32 SAL_CALL  getIsodd( sal_Int32 nVal ) override;
126 
127     virtual double SAL_CALL     getMultinomial( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const css::uno::Sequence< css::uno::Sequence< sal_Int32 > >& aVLst, const css::uno::Sequence< css::uno::Any >& aOptVLst ) override;
128     virtual double SAL_CALL     getSeriessum( double fX, double fN, double fM, const css::uno::Sequence< css::uno::Sequence< double > >& aCoeffList ) override;
129     virtual double SAL_CALL     getQuotient( double fNum, double fDenum ) override;
130 
131     virtual double SAL_CALL     getMround( double fNum, double fMult ) override;
132     virtual double SAL_CALL     getSqrtpi( double fNum ) override;
133 
134     virtual double SAL_CALL     getRandbetween( double fMin, double fMax ) override;
135 
136     virtual double SAL_CALL     getGcd( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const css::uno::Sequence< css::uno::Sequence< double > >& aVLst, const css::uno::Sequence< css::uno::Any >& aOptVLst ) override;
137     virtual double SAL_CALL     getLcm( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const css::uno::Sequence< css::uno::Sequence< double > >& aVLst, const css::uno::Sequence< css::uno::Any >& aOptVLst ) override;
138 
139     virtual double SAL_CALL     getBesseli( double fNum, sal_Int32 nOrder ) override;
140     virtual double SAL_CALL     getBesselj( double fNum, sal_Int32 nOrder ) override;
141     virtual double SAL_CALL     getBesselk( double fNum, sal_Int32 nOrder ) override;
142     virtual double SAL_CALL     getBessely( double fNum, sal_Int32 nOrder ) override;
143 
144     virtual OUString SAL_CALL     getBin2Oct( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const OUString& aNum, const css::uno::Any& rPlaces ) override;
145     virtual double SAL_CALL     getBin2Dec( const OUString& aNum ) override;
146     virtual OUString SAL_CALL     getBin2Hex( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const OUString& aNum, const css::uno::Any& rPlaces ) override;
147 
148     virtual OUString SAL_CALL     getOct2Bin( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const OUString& aNum, const css::uno::Any& rPlaces ) override;
149     virtual double SAL_CALL     getOct2Dec( const OUString& aNum ) override;
150     virtual OUString SAL_CALL     getOct2Hex( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const OUString& aNum, const css::uno::Any& rPlaces ) override;
151 
152     virtual OUString SAL_CALL     getDec2Bin( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 fNum, const css::uno::Any& rPlaces ) override;
153     virtual OUString SAL_CALL     getDec2Oct( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 fNum, const css::uno::Any& rPlaces ) override;
154     virtual OUString SAL_CALL     getDec2Hex( const css::uno::Reference< css::beans::XPropertySet >& xOpt, double fNum, const css::uno::Any& rPlaces ) override;
155 
156     virtual OUString SAL_CALL     getHex2Bin( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const OUString& aNum, const css::uno::Any& rPlaces ) override;
157     virtual double SAL_CALL     getHex2Dec( const OUString& aNum ) override;
158     virtual OUString SAL_CALL     getHex2Oct( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const OUString& aNum, const css::uno::Any& rPlaces ) override;
159 
160     virtual sal_Int32 SAL_CALL  getDelta( const css::uno::Reference< css::beans::XPropertySet >& xOpt, double fNum1, const css::uno::Any& rNum2 ) override;
161 
162     virtual double SAL_CALL     getErf( const css::uno::Reference< css::beans::XPropertySet >& xOpt, double fLowerLimit, const css::uno::Any& rUpperLimit ) override;
163     virtual double SAL_CALL     getErfc( double fLowerLimit ) override;
164 
165     virtual sal_Int32 SAL_CALL  getGestep( const css::uno::Reference< css::beans::XPropertySet >& xOpt, double fNum, const css::uno::Any& rStep ) override;
166 
167     virtual double SAL_CALL     getFactdouble( sal_Int32 nNum ) override;
168 
169     virtual double SAL_CALL     getImabs( const OUString& aNum ) override;
170     virtual double SAL_CALL     getImaginary( const OUString& aNum ) override;
171     virtual OUString SAL_CALL     getImpower( const OUString& aNum, double fPower ) override;
172     virtual double SAL_CALL     getImargument( const OUString& aNum ) override;
173     virtual OUString SAL_CALL     getImcos( const OUString& aNum ) override;
174     virtual OUString SAL_CALL     getImdiv( const OUString& aDivident, const OUString& aDivisor ) override;
175     virtual OUString SAL_CALL     getImexp( const OUString& aNum ) override;
176     virtual OUString SAL_CALL     getImconjugate( const OUString& aNum ) override;
177     virtual OUString SAL_CALL     getImln( const OUString& aNum ) override;
178     virtual OUString SAL_CALL     getImlog10( const OUString& aNum ) override;
179     virtual OUString SAL_CALL     getImlog2( const OUString& aNum ) override;
180     virtual OUString SAL_CALL     getImproduct( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const css::uno::Sequence< css::uno::Sequence< OUString > >& aNum1, const css::uno::Sequence< css::uno::Any >& aNumList ) override;
181     virtual double SAL_CALL     getImreal( const OUString& aNum ) override;
182     virtual OUString SAL_CALL     getImsin( const OUString& aNum ) override;
183     virtual OUString SAL_CALL     getImsub( const OUString& aNum1, const OUString& aNum2 ) override;
184     virtual OUString SAL_CALL     getImsum( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const css::uno::Sequence< css::uno::Sequence< OUString > >& aNum1, const css::uno::Sequence< css::uno::Any >& aFollowingPars ) override;
185 
186     virtual OUString SAL_CALL     getImsqrt( const OUString& aNum ) override;
187     virtual OUString SAL_CALL     getImtan( const OUString& aNum ) override;
188     virtual OUString SAL_CALL     getImsec( const OUString& aNum ) override;
189     virtual OUString SAL_CALL     getImcsc( const OUString& aNum ) override;
190     virtual OUString SAL_CALL     getImcot( const OUString& aNum ) override;
191     virtual OUString SAL_CALL     getImsinh( const OUString& aNum ) override;
192     virtual OUString SAL_CALL     getImcosh( const OUString& aNum ) override;
193     virtual OUString SAL_CALL     getImsech( const OUString& aNum ) override;
194     virtual OUString SAL_CALL     getImcsch( const OUString& aNum ) override;
195     virtual OUString SAL_CALL     getComplex( double fReal, double fImaginary, const css::uno::Any& rSuffix ) override;
196 
197     virtual double SAL_CALL     getConvert( double fVal, const OUString& aFromUnit, const OUString& aToUnit ) override;
198 
199     virtual double SAL_CALL     getAmordegrc( const css::uno::Reference< css::beans::XPropertySet >&, double fCost, sal_Int32 nDate, sal_Int32 nFirstPer, double fRestVal, double fPer, double fRate, const css::uno::Any& rOptBase ) override;
200     virtual double SAL_CALL     getAmorlinc( const css::uno::Reference< css::beans::XPropertySet >&, double fCost, sal_Int32 nDate, sal_Int32 nFirstPer, double fRestVal, double fPer, double fRate, const css::uno::Any& rOptBase ) override;
201     virtual double SAL_CALL     getAccrint( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nIssue, sal_Int32 nFirstInter, sal_Int32 nSettle, double fRate, const css::uno::Any& rVal, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
202     virtual double SAL_CALL     getAccrintm( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nIssue, sal_Int32 nSettle, double fRate, const css::uno::Any& rVal, const css::uno::Any& rOptBase ) override;
203     virtual double SAL_CALL     getReceived( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fInvest, double fDisc, const css::uno::Any& rOptBase ) override;
204     virtual double SAL_CALL     getDisc( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fPrice, double fRedemp, const css::uno::Any& rOptBase ) override;
205     virtual double SAL_CALL     getDuration( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fCoup, double fYield, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
206     virtual double SAL_CALL     getEffect( double fNominal, sal_Int32 nPeriods ) override;
207     virtual double SAL_CALL     getCumprinc( double fRate, sal_Int32 nNumPeriods, double fVal, sal_Int32 nStartPer, sal_Int32 nEndPer, sal_Int32 nPayType ) override;
208     virtual double SAL_CALL     getCumipmt( double fRate, sal_Int32 nNumPeriods, double fVal, sal_Int32 nStartPer, sal_Int32 nEndPer, sal_Int32 nPayType ) override;
209     virtual double SAL_CALL     getPrice( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fRate, double fYield, double fRedemp, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
210     virtual double SAL_CALL     getPricedisc( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fDisc, double fRedemp, const css::uno::Any& rOptBase ) override;
211     virtual double SAL_CALL     getPricemat( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nIssue, double fRate, double fYield, const css::uno::Any& rOptBase ) override;
212     virtual double SAL_CALL     getMduration( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fCoup, double fYield, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
213     virtual double SAL_CALL     getNominal( double fRate, sal_Int32 nPeriods ) override;
214     virtual double SAL_CALL     getDollarfr( double fDollarDec, sal_Int32 nFrac ) override;
215     virtual double SAL_CALL     getDollarde( double fDollarFrac, sal_Int32 nFrac ) override;
216     virtual double SAL_CALL     getYield( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fCoup, double fPrice, double fRedemp, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
217     virtual double SAL_CALL     getYielddisc( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fPrice, double fRedemp, const css::uno::Any& rOptBase ) override;
218     virtual double SAL_CALL     getYieldmat( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nIssue, double fRate, double fPrice, const css::uno::Any& rOptBase ) override;
219     virtual double SAL_CALL     getTbilleq( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fDisc ) override;
220     virtual double SAL_CALL     getTbillprice( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fDisc ) override;
221     virtual double SAL_CALL     getTbillyield( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fPrice ) override;
222     virtual double SAL_CALL     getOddfprice( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nIssue, sal_Int32 nFirstCoup, double fRate, double fYield, double fRedemp, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
223     virtual double SAL_CALL     getOddfyield( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nIssue, sal_Int32 nFirstCoup, double fRate, double fPrice, double fRedemp, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
224     virtual double SAL_CALL     getOddlprice( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nLastInterest, double fRate, double fYield, double fRedemp, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
225     virtual double SAL_CALL     getOddlyield( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nLastInterest, double fRate, double fPrice, double fRedemp, sal_Int32 nFreq, const css::uno::Any& rOptBase) override;
226     virtual double SAL_CALL     getXirr( const css::uno::Reference< css::beans::XPropertySet >& xOpt, const css::uno::Sequence< css::uno::Sequence< double > >& rValues, const css::uno::Sequence< css::uno::Sequence< sal_Int32 > >& rDates, const css::uno::Any& rGuess ) override;
227     virtual double SAL_CALL     getXnpv( double fRate, const css::uno::Sequence< css::uno::Sequence< double > >& rValues, const css::uno::Sequence< css::uno::Sequence< sal_Int32 > >& rDates ) override;
228     virtual double SAL_CALL     getIntrate( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, double fInvest, double fRedemp, const css::uno::Any& rOptBase ) override;
229     virtual double SAL_CALL     getCoupncd( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
230     virtual double SAL_CALL     getCoupdays( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
231     virtual double SAL_CALL     getCoupdaysnc( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
232     virtual double SAL_CALL     getCoupdaybs( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
233     virtual double SAL_CALL     getCouppcd( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
234     virtual double SAL_CALL     getCoupnum( const css::uno::Reference< css::beans::XPropertySet >& xOpt, sal_Int32 nSettle, sal_Int32 nMat, sal_Int32 nFreq, const css::uno::Any& rOptBase ) override;
235     virtual double SAL_CALL     getFvschedule( double fPrinc, const css::uno::Sequence< css::uno::Sequence< double > >& rSchedule ) override;
236 };
237 
238 #endif
239 
240 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
241