summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kyoshida@novell.com>2009-03-20 22:42:35 +0000
committerKohei Yoshida <kyoshida@novell.com>2009-03-20 22:42:35 +0000
commitd15e49a94324805020266774e2543903fcca2229 (patch)
tree433a3aff7bab150f9f7296c6eccd6b9d86e652f1
parenta9a212f9feb3da65add0d51cb17046143a2f34fc (diff)
Got chart to work again when the formula syntax is set to non-default syntax (i.OOO-BUILD-GIT
* patches/dev300/chart-formula-syntax.diff: * patches/dev300/apply: got chart to work again when the formula syntax is set to non-default syntax (i.e. Excel A1 and R1C1). (n#487350)
-rw-r--r--patches/dev300/apply5
-rw-r--r--patches/dev300/chart-formula-syntax.diff154
2 files changed, 157 insertions, 2 deletions
diff --git a/patches/dev300/apply b/patches/dev300/apply
index 12365828f..766bde3a7 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -2025,8 +2025,6 @@ calc-formula-asian-phonetic-m1.diff, i#80764, i#80765, i#80766, kohei
[ CalcFixes > dev300-m42 > ooo310-m1]
# Support PHONETIC function to display asian phonetic guide.
-# FIXME: update by pmladek for ooo310-m2; Kohei, please review sc/inc/cell.hxx
-# they started to define the inline method inside the class definition, ...
calc-formula-asian-phonetic.diff, i#80764, i#80765, i#80766, kohei
[ CalcFixes ]
@@ -2049,6 +2047,9 @@ calc-formula-variable-separators-officecfg.diff, n#447164, i#92056, kohei
# Display references when entering input mode, even when the separators are not ';'.
calc-formula-variable-separators-ref-display.diff, n#469395, kohei
+# Fix chart breakage for non-default formula syntax (Excel A1 and R1C1).
+chart-formula-syntax.diff, n#487350, kohei
+
# Squeeze chart's subtitle into the 2nd line of the main title when exporting
# to xls.
chart-subtitle-xls-export.diff, i#92357, kohei
diff --git a/patches/dev300/chart-formula-syntax.diff b/patches/dev300/chart-formula-syntax.diff
new file mode 100644
index 000000000..492ebeaf4
--- /dev/null
+++ b/patches/dev300/chart-formula-syntax.diff
@@ -0,0 +1,154 @@
+diff --git sc/inc/reftokenhelper.hxx sc/inc/reftokenhelper.hxx
+index b1159cc..d7b335f 100644
+--- sc/inc/reftokenhelper.hxx
++++ sc/inc/reftokenhelper.hxx
+@@ -56,7 +56,8 @@ public:
+ * The source range may consist of multiple ranges separated by ';'s.
+ */
+ static void compileRangeRepresentation(
+- ::std::vector<ScSharedTokenRef>& rRefTokens, const ::rtl::OUString& rRangeStr, ScDocument* pDoc);
++ ::std::vector<ScSharedTokenRef>& rRefTokens, const ::rtl::OUString& rRangeStr, ScDocument* pDoc,
++ ::formula::FormulaGrammar::Grammar eGrammar = ::formula::FormulaGrammar::GRAM_ENGLISH);
+
+ static bool getRangeFromToken(ScRange& rRange, const ScSharedTokenRef& pToken, bool bExternal = false);
+
+diff --git sc/source/core/data/documen5.cxx sc/source/core/data/documen5.cxx
+index 19f6b09..a921945 100644
+--- sc/source/core/data/documen5.cxx
++++ sc/source/core/data/documen5.cxx
+@@ -130,6 +130,7 @@ void lcl_SetChartRanges( const uno::Reference< chart2::XChartDocument >& xChartD
+
+ if( xLabel.is())
+ {
++ // the range string must be in Calc A1 format.
+ uno::Reference< chart2::data::XDataSequence > xNewSeq(
+ xDataProvider->createDataSequenceByRangeRepresentation( rRanges[nRange++] ));
+
+@@ -145,6 +146,7 @@ void lcl_SetChartRanges( const uno::Reference< chart2::XChartDocument >& xChartD
+
+ if( xValues.is())
+ {
++ // the range string must be in Calc A1 format.
+ uno::Reference< chart2::data::XDataSequence > xNewSeq(
+ xDataProvider->createDataSequenceByRangeRepresentation( rRanges[nRange++] ));
+
+@@ -391,7 +393,7 @@ void ScDocument::GetChartRanges( const String& rChartName, ::std::vector< ScRang
+ for( sal_Int32 nN=0; nN<aRangeStrings.getLength(); nN++ )
+ {
+ ScRangeList aRanges;
+- aRanges.Parse( aRangeStrings[nN], pSheetNameDoc );
++ aRanges.Parse( aRangeStrings[nN], pSheetNameDoc, SCA_VALID, pSheetNameDoc->GetAddressConvention() );
+ rRangesVector.push_back(aRanges);
+ }
+ }
+@@ -407,8 +409,8 @@ void ScDocument::SetChartRanges( const String& rChartName, const ::std::vector<
+ for( sal_Int32 nN=0; nN<nCount; nN++ )
+ {
+ ScRangeList aScRangeList( rRangesVector[nN] );
+- String sRangeStr;
+- aScRangeList.Format( sRangeStr, SCR_ABS_3D, this, GetAddressConvention() );
++ String sRangeStr; // This range must be in Calc A1 format.
++ aScRangeList.Format( sRangeStr, SCR_ABS_3D, this );
+ aRangeStrings[nN]=sRangeStr;
+ }
+ lcl_SetChartRanges( xChartDoc, aRangeStrings );
+diff --git sc/source/core/tool/reftokenhelper.cxx sc/source/core/tool/reftokenhelper.cxx
+index 8ecb44a..0e07819 100644
+--- sc/source/core/tool/reftokenhelper.cxx
++++ sc/source/core/tool/reftokenhelper.cxx
+@@ -49,7 +49,7 @@ using ::std::auto_ptr;
+ using ::rtl::OUString;
+
+ void ScRefTokenHelper::compileRangeRepresentation(
+- vector<ScSharedTokenRef>& rRefTokens, const OUString& rRangeStr, ScDocument* pDoc)
++ vector<ScSharedTokenRef>& rRefTokens, const OUString& rRangeStr, ScDocument* pDoc, FormulaGrammar::Grammar eGrammar)
+ {
+ const sal_Unicode cSep = ';';
+ const sal_Unicode cQuote = '\'';
+@@ -63,7 +63,7 @@ void ScRefTokenHelper::compileRangeRepresentation(
+ break;
+
+ ScCompiler aCompiler(pDoc, ScAddress(0,0,0));
+- aCompiler.SetGrammar(FormulaGrammar::GRAM_ENGLISH);
++ aCompiler.SetGrammar(eGrammar);
+ auto_ptr<ScTokenArray> pArray(aCompiler.CompileString(aToken));
+
+ // There should only be one reference per range token.
+diff --git sc/source/ui/drawfunc/fuins2.cxx sc/source/ui/drawfunc/fuins2.cxx
+index f2562a3..22b46b9 100644
+--- sc/source/ui/drawfunc/fuins2.cxx
++++ sc/source/ui/drawfunc/fuins2.cxx
+@@ -167,8 +167,10 @@ void lcl_ChartInit( const uno::Reference < embed::XEmbeddedObject >& xObj, ScVie
+ if ( aRangeListRef->Count() )
+ {
+ pScDoc->LimitChartIfAll( aRangeListRef ); // limit whole columns/rows to used area
++
++ // update string from modified ranges. The ranges must be in the current formula syntax.
+ String aTmpStr;
+- aRangeListRef->Format( aTmpStr, SCR_ABS_3D, pScDoc, pScDoc->GetAddressConvention() ); // update string from changed ranges
++ aRangeListRef->Format( aTmpStr, SCR_ABS_3D, pScDoc, pScDoc->GetAddressConvention() );
+ aRangeString = aTmpStr;
+
+ ScChartPositioner aChartPositioner( pScDoc, aRangeListRef );
+diff --git sc/source/ui/unoobj/chart2uno.cxx sc/source/ui/unoobj/chart2uno.cxx
+index 8bbd382..d9c2698 100644
+--- sc/source/ui/unoobj/chart2uno.cxx
++++ sc/source/ui/unoobj/chart2uno.cxx
+@@ -1057,7 +1057,7 @@ void lcl_SeperateOneRowRange(ScRange aR, const ScAddress& rPos, ScRangeListRef&
+ }
+
+ vector<ScSharedTokenRef> aTokens;
+- ScRefTokenHelper::compileRangeRepresentation(aTokens, aRangeRepresentation, m_pDocument);
++ ScRefTokenHelper::compileRangeRepresentation(aTokens, aRangeRepresentation, m_pDocument, m_pDocument->GetGrammar());
+ return !aTokens.empty();
+ }
+
+@@ -1451,7 +1451,7 @@ ScChart2DataProvider::createDataSource(
+ }
+
+ vector<ScSharedTokenRef> aRefTokens;
+- ScRefTokenHelper::compileRangeRepresentation(aRefTokens, aRangeRepresentation, m_pDocument);
++ ScRefTokenHelper::compileRangeRepresentation(aRefTokens, aRangeRepresentation, m_pDocument, m_pDocument->GetGrammar());
+ if (aRefTokens.empty())
+ // Invalid range representation. Bail out.
+ throw lang::IllegalArgumentException();
+@@ -2184,7 +2184,7 @@ uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArgum
+ return false;
+
+ vector<ScSharedTokenRef> aTokens;
+- ScRefTokenHelper::compileRangeRepresentation(aTokens, aRangeRepresentation, m_pDocument);
++ ScRefTokenHelper::compileRangeRepresentation(aTokens, aRangeRepresentation, m_pDocument, m_pDocument->GetGrammar());
+ return !aTokens.empty();
+ }
+
+@@ -2201,6 +2201,12 @@ uno::Reference< chart2::data::XDataSequence > SAL_CALL
+ if(!m_pDocument || (aRangeRepresentation.getLength() == 0))
+ return xResult;
+
++ // Note: the range representation must be in Calc A1 format. The import
++ // filters use this method to pass data ranges, and they have no idea what
++ // the current formula syntax is. In the future we should add another
++ // method to allow the client code to directly pass tokens representing
++ // ranges.
++
+ vector<ScSharedTokenRef> aRefTokens;
+ ScRefTokenHelper::compileRangeRepresentation(aRefTokens, aRangeRepresentation, m_pDocument);
+ if (aRefTokens.empty())
+@@ -2246,7 +2252,7 @@ rtl::OUString SAL_CALL ScChart2DataProvider::convertRangeToXML( const rtl::OUStr
+ return aRet;
+
+ vector<ScSharedTokenRef> aRefTokens;
+- ScRefTokenHelper::compileRangeRepresentation(aRefTokens, sRangeRepresentation, m_pDocument);
++ ScRefTokenHelper::compileRangeRepresentation(aRefTokens, sRangeRepresentation, m_pDocument, m_pDocument->GetGrammar());
+ if (aRefTokens.empty())
+ throw lang::IllegalArgumentException();
+
+@@ -2405,7 +2411,7 @@ void ScChart2DataProvider::detectRangesFromDataSource(vector<ScSharedTokenRef>&
+ {
+ const OUString& rRangeRep = *itr;
+ vector<ScSharedTokenRef> aTokens;
+- ScRefTokenHelper::compileRangeRepresentation(aTokens, rRangeRep, m_pDocument);
++ ScRefTokenHelper::compileRangeRepresentation(aTokens, rRangeRep, m_pDocument, m_pDocument->GetGrammar());
+
+ CollectRefTokens func;
+ func = for_each(aTokens.begin(), aTokens.end(), func);