[Libreoffice-commits] core.git: Branch 'feature/calc-group-interpreter' - sc/source
Noel Power
noel.power at suse.com
Thu Jul 25 08:45:15 PDT 2013
sc/source/ui/vba/vbarange.cxx | 34 +++++++++++++++++++++++++++++++---
1 file changed, 31 insertions(+), 3 deletions(-)
New commits:
commit e1082c3af7924ff0eba8740a290e92397388d6e7
Author: Noel Power <noel.power at suse.com>
Date: Thu Jul 25 14:45:36 2013 +0100
better support Range.FormulaArray ( set )
Change-Id: Ic6c7b6908db2eb01a026aab14bb417dccdbe55b4
diff --git a/sc/source/ui/vba/vbarange.cxx b/sc/source/ui/vba/vbarange.cxx
index 852fefa..dd09b37 100644
--- a/sc/source/ui/vba/vbarange.cxx
+++ b/sc/source/ui/vba/vbarange.cxx
@@ -170,7 +170,8 @@
#include <ooo/vba/excel/Range.hpp>
#include <com/sun/star/bridge/oleautomation/Date.hpp>
-
+#include "tokenarray.hxx"
+#include "tokenuno.hxx"
using namespace ::ooo::vba;
using namespace ::com::sun::star;
using ::std::vector;
@@ -1968,6 +1969,15 @@ ScVbaRange::getFormulaArray() throw (uno::RuntimeException)
return xRange->getFormulaArray();
}
+ // return a formula if there is one or else an array
+ // still not sure when the return as array code should run
+ // ( I think it is if there is more than one formula ) at least
+ // that is what the doc says ( but I am not even sure how to detect that )
+ // for the moment any tests we have pass
+ uno::Reference< sheet::XArrayFormulaRange> xFormulaArray( mxRange, uno::UNO_QUERY_THROW );
+ if ( xFormulaArray.is() && !xFormulaArray->getArrayFormula().isEmpty() )
+ return uno::makeAny( xFormulaArray->getArrayFormula() );
+
uno::Reference< sheet::XCellRangeFormula> xCellRangeFormula( mxRange, uno::UNO_QUERY_THROW );
uno::Reference< script::XTypeConverter > xConverter = getTypeConverter( mxContext );
uno::Any aSingleValueOrMatrix;
@@ -1998,8 +2008,26 @@ ScVbaRange::setFormulaArray(const uno::Any& rFormula) throw (uno::RuntimeExcepti
}
// #TODO need to distinguish between getFormula and getFormulaArray e.g. (R1C1)
// but for the moment its just easier to treat them the same for setting
-
- setFormula( rFormula );
+ // seems
+ uno::Reference< lang::XMultiServiceFactory > xModelFactory( getUnoModel(), uno::UNO_QUERY_THROW );
+ uno::Reference< sheet::XFormulaParser > xParser( xModelFactory->createInstance( "com.sun.star.sheet.FormulaParser" ), uno::UNO_QUERY_THROW );
+ uno::Reference< sheet::XCellRangeAddressable > xSource( mxRange, uno::UNO_QUERY_THROW);
+
+ table::CellRangeAddress aRangeAddress = xSource->getRangeAddress();
+ // #TODO check if api orders the address
+ // e.g. do we need to order the RangeAddress to get the topleft ( or can we assume it
+ // is in the correct order )
+ table::CellAddress aAddress;
+ aAddress.Sheet = aRangeAddress.Sheet;
+ aAddress.Column = aRangeAddress.StartColumn;
+ aAddress.Row = aRangeAddress.StartRow;
+ OUString sFormula;
+ rFormula >>= sFormula;
+ uno::Sequence<sheet::FormulaToken> aTokens = xParser->parseFormula( sFormula, aAddress );
+ ScTokenArray aTokenArray;
+ (void)ScTokenConversion::ConvertToTokenArray( *getScDocument(), aTokenArray, aTokens );
+
+ getScDocShell()->GetDocFunc().EnterMatrix( *getScRangeList()[0], NULL, &aTokenArray, OUString(), sal_True, sal_True, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
}
OUString
More information about the Libreoffice-commits
mailing list