summaryrefslogtreecommitdiff
path: root/sc/source/core/data/simpleformulacalc.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/core/data/simpleformulacalc.cxx')
-rw-r--r--sc/source/core/data/simpleformulacalc.cxx100
1 files changed, 100 insertions, 0 deletions
diff --git a/sc/source/core/data/simpleformulacalc.cxx b/sc/source/core/data/simpleformulacalc.cxx
new file mode 100644
index 000000000000..1b2cd35f3b19
--- /dev/null
+++ b/sc/source/core/data/simpleformulacalc.cxx
@@ -0,0 +1,100 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "simpleformulacalc.hxx"
+#include "document.hxx"
+#include "tokenarray.hxx"
+#include "interpre.hxx"
+#include "compiler.hxx"
+
+
+ScSimpleFormulaCalculator::ScSimpleFormulaCalculator( ScDocument* pDoc, const ScAddress& rAddr,
+ const OUString& rFormula, formula::FormulaGrammar::Grammar eGram ):
+ mbCalculated(false),
+ maAddr(rAddr),
+ mpDoc(pDoc)
+{
+ // compile already here
+ ScCompiler aComp(pDoc, rAddr);
+ aComp.SetGrammar(eGram);
+ mpCode.reset(aComp.CompileString(rFormula));
+ if(!mpCode->GetCodeError() && mpCode->GetLen())
+ aComp.CompileTokenArray();
+}
+
+ScSimpleFormulaCalculator::~ScSimpleFormulaCalculator()
+{
+}
+
+void ScSimpleFormulaCalculator::Calculate()
+{
+ if(mbCalculated)
+ return;
+
+ mbCalculated = true;
+ ScInterpreter aInt(NULL, mpDoc, maAddr, *mpCode.get());
+ aInt.Interpret();
+
+ mnFormatType = aInt.GetRetFormatType();
+ mnFormatIndex = aInt.GetRetFormatIndex();
+ maResult.SetToken(aInt.GetResultToken().get());
+}
+
+bool ScSimpleFormulaCalculator::IsValue()
+{
+ Calculate();
+
+ return maResult.IsValue();
+}
+
+sal_uInt16 ScSimpleFormulaCalculator::GetErrCode()
+{
+ Calculate();
+
+ sal_uInt16 nErr = mpCode->GetCodeError();
+ if (nErr)
+ return nErr;
+ return maResult.GetResultError();
+}
+
+
+double ScSimpleFormulaCalculator::GetValue()
+{
+ Calculate();
+
+ if ((!mpCode->GetCodeError() || mpCode->GetCodeError() == errDoubleRef) &&
+ !maResult.GetResultError())
+ return maResult.GetDouble();
+
+ return 0.0;
+}
+
+OUString ScSimpleFormulaCalculator::GetString()
+{
+ Calculate();
+
+ if ((!mpCode->GetCodeError() || mpCode->GetCodeError() == errDoubleRef) &&
+ !maResult.GetResultError())
+ return maResult.GetString();
+
+ return OUString();
+}
+
+bool ScSimpleFormulaCalculator::HasColRowName()
+{
+ mpCode->Reset();
+ return mpCode->GetNextColRowName() != NULL;
+}
+
+ScTokenArray* ScSimpleFormulaCalculator::GetCode()
+{
+ return mpCode.get();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */