summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMuthu Subramanian <sumuthu@suse.com>2011-10-03 16:28:59 +0530
committerMuthu Subramanian <sumuthu@suse.com>2011-10-03 16:32:35 +0530
commit15202ad5b26ff48dc937ed12b57d53108c2731e4 (patch)
tree4182e2233a50e8e2847b0216a2983dbdb994ce7d
parent08d15d0bcb1f6521469fa4ffc684ea1f37065eb2 (diff)
n717290: Feature to allow string constants in chart ranges.
Chart ranges specifically for labels can now be of the form ="Label1". This allows labels to be picked from chart data (from UI) rather than from the sheet.
-rw-r--r--sc/source/core/tool/reftokenhelper.cxx22
-rw-r--r--sc/source/filter/excel/xichart.cxx12
-rw-r--r--sc/source/ui/unoobj/chart2uno.cxx29
3 files changed, 53 insertions, 10 deletions
diff --git a/sc/source/core/tool/reftokenhelper.cxx b/sc/source/core/tool/reftokenhelper.cxx
index f4f09d635575..5d6cbfbd84b7 100644
--- a/sc/source/core/tool/reftokenhelper.cxx
+++ b/sc/source/core/tool/reftokenhelper.cxx
@@ -46,11 +46,23 @@ using ::std::vector;
using ::std::auto_ptr;
using ::rtl::OUString;
+static bool lcl_mayBeRangeConstString( const OUString &aRangeStr )
+{
+ if( aRangeStr.getLength() >= 3 && aRangeStr.endsWithAsciiL( "\"", 1 ) )
+ if( aRangeStr[0] == '"' )
+ return true;
+ else if( aRangeStr[0] == '=' && aRangeStr[1] == '"' )
+ return true;
+
+ return false;
+}
+
void ScRefTokenHelper::compileRangeRepresentation(
vector<ScTokenRef>& rRefTokens, const OUString& rRangeStr, ScDocument* pDoc,
const sal_Unicode cSep, FormulaGrammar::Grammar eGrammar)
{
const sal_Unicode cQuote = '\'';
+ bool bMayBeConstString = lcl_mayBeRangeConstString( rRangeStr );
// #i107275# ignore parentheses
OUString aRangeStr = rRangeStr;
@@ -80,7 +92,7 @@ void ScRefTokenHelper::compileRangeRepresentation(
else
{
pArray->Reset();
- const FormulaToken* p = pArray->GetNextReference();
+ const FormulaToken* p = pArray->Next();
if (!p)
bFailure = true;
else
@@ -104,8 +116,14 @@ void ScRefTokenHelper::compileRangeRepresentation(
if (!pT->GetDoubleRef().ValidExternal())
bFailure = true;
break;
+ case svString:
+ if (!bMayBeConstString)
+ bFailure = true;
+ bMayBeConstString = false;
+ break;
default:
- ;
+ bFailure = true;
+ break;
}
if (!bFailure)
rRefTokens.push_back(
diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx
index d5b357f24769..36c0fe49c5ee 100644
--- a/sc/source/filter/excel/xichart.cxx
+++ b/sc/source/filter/excel/xichart.cxx
@@ -862,6 +862,18 @@ Reference< XDataSequence > XclImpChSourceLink::CreateDataSequence( const OUStrin
// OSL_FAIL( "XclImpChSourceLink::CreateDataSequence - cannot create data sequence" );
}
}
+ else if( rRole == EXC_CHPROP_ROLE_LABEL && mxString && mxString->GetText().Len() )
+ {
+ try
+ {
+ OUString aString = OUString::createFromAscii("\"");
+ xDataSeq = xDataProv->createDataSequenceByRangeRepresentation( aString + mxString->GetText() + aString );
+ // set sequence role
+ ScfPropertySet aSeqProp( xDataSeq );
+ aSeqProp.SetProperty( EXC_CHPROP_ROLE, rRole );
+ }
+ catch( Exception& ) { }
+ }
return xDataSeq;
}
diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx
index 398bcfe5992d..04c1537aa84a 100644
--- a/sc/source/ui/unoobj/chart2uno.cxx
+++ b/sc/source/ui/unoobj/chart2uno.cxx
@@ -371,7 +371,7 @@ Chart2PositionMap::Chart2PositionMap(SCCOL nAllColCount, SCROW nAllRowCount,
maData.init(mnDataColCount,mnDataRowCount);
Table* pCol = static_cast<Table*>(rCols.First());
- FormulaToken* pToken = static_cast<FormulaToken*>(pCol->First());
+ FormulaToken* pToken = NULL;
for (SCCOL nCol = 0; nCol < nAllColCount; ++nCol)
{
if (pCol)
@@ -725,7 +725,8 @@ void Chart2Positioner::createPositionMap()
String aTabName = bExternal ? pToken->GetString() : String();
ScComplexRefData aData;
- ScRefTokenHelper::getDoubleRefDataFromToken(aData, *itr);
+ if( !ScRefTokenHelper::getDoubleRefDataFromToken(aData, *itr) )
+ break;
const ScSingleRefData& s = aData.Ref1;
const ScSingleRefData& e = aData.Ref2;
SCCOL nCol1 = s.nCol, nCol2 = e.nCol;
@@ -2880,17 +2881,29 @@ uno::Sequence< double > SAL_CALL ScChart2DataSequence::getNumericalData()
uno::Sequence< rtl::OUString > SAL_CALL ScChart2DataSequence::getTextualData( ) throw (uno::RuntimeException)
{
SolarMutexGuard aGuard;
- if ( !m_pDocument)
+ uno::Sequence<rtl::OUString> aSeq;
+ if ( !m_pDocument )
throw uno::RuntimeException();
BuildDataCache();
sal_Int32 nCount = m_aDataArray.size();
- uno::Sequence<rtl::OUString> aSeq(nCount);
- rtl::OUString* pArr = aSeq.getArray();
- ::std::list<Item>::const_iterator itr = m_aDataArray.begin(), itrEnd = m_aDataArray.end();
- for (; itr != itrEnd; ++itr, ++pArr)
- *pArr = itr->maString;
+ if ( nCount > 0 )
+ {
+ aSeq = uno::Sequence<rtl::OUString>(nCount);
+ rtl::OUString* pArr = aSeq.getArray();
+ ::std::list<Item>::const_iterator itr = m_aDataArray.begin(), itrEnd = m_aDataArray.end();
+ for(; itr != itrEnd; ++itr, ++pArr)
+ *pArr = itr->maString;
+ }
+ else if ( m_pTokens.get() && m_pTokens->front() )
+ {
+ if( m_pTokens->front()->GetType() == svString )
+ {
+ aSeq = uno::Sequence<rtl::OUString>(1);
+ aSeq[0] = m_pTokens->front()->GetString();
+ }
+ }
return aSeq;
}