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 :
10 : #include "simpleformulacalc.hxx"
11 : #include "document.hxx"
12 : #include "tokenarray.hxx"
13 : #include "interpre.hxx"
14 : #include "compiler.hxx"
15 :
16 0 : ScSimpleFormulaCalculator::ScSimpleFormulaCalculator( ScDocument* pDoc, const ScAddress& rAddr,
17 : const OUString& rFormula, formula::FormulaGrammar::Grammar eGram )
18 : : mnFormatType(0)
19 : , mnFormatIndex(0)
20 : , mbCalculated(false)
21 : , maAddr(rAddr)
22 0 : , mpDoc(pDoc)
23 : {
24 : // compile already here
25 0 : ScCompiler aComp(pDoc, rAddr);
26 0 : aComp.SetGrammar(eGram);
27 0 : mpCode.reset(aComp.CompileString(rFormula));
28 0 : if(!mpCode->GetCodeError() && mpCode->GetLen())
29 0 : aComp.CompileTokenArray();
30 0 : }
31 :
32 0 : ScSimpleFormulaCalculator::~ScSimpleFormulaCalculator()
33 : {
34 0 : }
35 :
36 0 : void ScSimpleFormulaCalculator::Calculate()
37 : {
38 0 : if(mbCalculated)
39 0 : return;
40 :
41 0 : mbCalculated = true;
42 0 : ScInterpreter aInt(NULL, mpDoc, maAddr, *mpCode.get());
43 0 : aInt.Interpret();
44 :
45 0 : mnFormatType = aInt.GetRetFormatType();
46 0 : mnFormatIndex = aInt.GetRetFormatIndex();
47 0 : maResult.SetToken(aInt.GetResultToken().get());
48 : }
49 :
50 0 : bool ScSimpleFormulaCalculator::IsValue()
51 : {
52 0 : Calculate();
53 :
54 0 : return maResult.IsValue();
55 : }
56 :
57 0 : sal_uInt16 ScSimpleFormulaCalculator::GetErrCode()
58 : {
59 0 : Calculate();
60 :
61 0 : sal_uInt16 nErr = mpCode->GetCodeError();
62 0 : if (nErr)
63 0 : return nErr;
64 0 : return maResult.GetResultError();
65 : }
66 :
67 0 : double ScSimpleFormulaCalculator::GetValue()
68 : {
69 0 : Calculate();
70 :
71 0 : if ((!mpCode->GetCodeError() || mpCode->GetCodeError() == errDoubleRef) &&
72 0 : !maResult.GetResultError())
73 0 : return maResult.GetDouble();
74 :
75 0 : return 0.0;
76 : }
77 :
78 0 : svl::SharedString ScSimpleFormulaCalculator::GetString()
79 : {
80 0 : Calculate();
81 :
82 0 : if ((!mpCode->GetCodeError() || mpCode->GetCodeError() == errDoubleRef) &&
83 0 : !maResult.GetResultError())
84 0 : return maResult.GetString();
85 :
86 0 : return svl::SharedString::getEmptyString();
87 : }
88 :
89 0 : bool ScSimpleFormulaCalculator::HasColRowName()
90 : {
91 0 : mpCode->Reset();
92 0 : return mpCode->GetNextColRowName() != NULL;
93 : }
94 :
95 0 : ScTokenArray* ScSimpleFormulaCalculator::GetCode()
96 : {
97 0 : return mpCode.get();
98 156 : }
99 :
100 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|