Kaydet (Commit) 24ddf0d9 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Handle named database ranges in CreateString().

Change-Id: I6904b9de0f7d711252797bb2e33ba4c462476b2d
üst b73b5750
......@@ -35,6 +35,7 @@ struct SC_DLLPUBLIC TokenStringContext
std::vector<OUString> maTabNames;
IndexNameMapType maGlobalRangeNames;
IndexNameMapType maNamedDBs;
TokenStringContext( const ScDocument* pDoc, formula::FormulaGrammar::Grammar eGram );
};
......
......@@ -23,6 +23,7 @@
#include "docfunc.hxx"
#include "paramisc.hxx"
#include "tokenstringcontext.hxx"
#include "dbdata.hxx"
#include "formula/vectortoken.hxx"
......@@ -65,6 +66,31 @@ void Test::testFormulaCreateStringFromTokens()
CPPUNIT_ASSERT_MESSAGE("Failed to insert a new name.", bInserted);
}
// Insert DB ranges.
struct {
const char* pName;
SCTAB nTab;
SCCOL nCol1;
SCROW nRow1;
SCCOL nCol2;
SCROW nRow2;
} aDBs[] = {
{ "Table1", 0, 0, 0, 10, 10 },
{ "Table2", 1, 0, 0, 10, 10 },
{ "Table3", 2, 0, 0, 10, 10 }
};
ScDBCollection* pDBs = m_pDoc->GetDBCollection();
CPPUNIT_ASSERT_MESSAGE("Failed to fetch DB collection object.", pDBs);
for (size_t i = 0, n = SAL_N_ELEMENTS(aDBs); i < n; ++i)
{
ScDBData* pData = new ScDBData(
OUString::createFromAscii(
aDBs[i].pName), aDBs[i].nTab, aDBs[i].nCol1, aDBs[i].nRow1, aDBs[i].nCol2,aDBs[i].nRow2);
pDBs->getNamedDBs().insert(pData);
}
const char* aTests[] = {
"1+2",
"SUM(A1:A10;B1:B10;C5;D6)",
......@@ -72,7 +98,8 @@ void Test::testFormulaCreateStringFromTokens()
"AVERAGE('2013'.B10:C20)",
"'Kevin''s Data'.B10",
"'Past Data'.B1+'2013'.B2*(1+'Kevin''s Data'.C10)",
"x+y*z"
"x+y*z", // named ranges
"MAX(Table1)+MIN(Table2)*SUM(Table3)" // database ranges
};
boost::scoped_ptr<ScTokenArray> pArray;
......
......@@ -40,6 +40,7 @@
#include "refupdatecontext.hxx"
#include "tokenstringcontext.hxx"
#include "types.hxx"
#include "globstr.hrc"
#include "svl/sharedstring.hxx"
using ::std::vector;
......@@ -3273,9 +3274,15 @@ void appendTokenByType( sc::TokenStringContext& rCxt, OUStringBuffer& rBuf, cons
rBuf.append(it->second);
}
break;
// TODO : Handle other name types.
case ocDBArea:
{
sc::TokenStringContext::IndexNameMapType::const_iterator it = rCxt.maNamedDBs.find(nIndex);
if (it != rCxt.maNamedDBs.end())
rBuf.append(it->second);
}
break;
default:
;
rBuf.append(ScGlobal::GetRscString(STR_NO_NAME_REF));
}
}
break;
......
......@@ -10,6 +10,7 @@
#include "tokenstringcontext.hxx"
#include "compiler.hxx"
#include "document.hxx"
#include "dbdata.hxx"
using namespace com::sun::star;
......@@ -26,6 +27,7 @@ TokenStringContext::TokenStringContext( const ScDocument* pDoc, formula::Formula
if (pDoc)
{
// Fetch all sheet names.
maTabNames = pDoc->GetAllTableNames();
{
std::vector<OUString>::iterator it = maTabNames.begin(), itEnd = maTabNames.end();
......@@ -33,6 +35,7 @@ TokenStringContext::TokenStringContext( const ScDocument* pDoc, formula::Formula
ScCompiler::CheckTabQuotes(*it, formula::FormulaGrammar::extractRefConvention(eGram));
}
// Fetch all named range names.
const ScRangeName* pNames = pDoc->GetRangeName();
if (pNames)
{
......@@ -43,6 +46,19 @@ TokenStringContext::TokenStringContext( const ScDocument* pDoc, formula::Formula
maGlobalRangeNames.insert(IndexNameMapType::value_type(pData->GetIndex(), pData->GetName()));
}
}
// Fetch all named database ranges names.
const ScDBCollection* pDBs = pDoc->GetDBCollection();
if (pDBs)
{
const ScDBCollection::NamedDBs& rNamedDBs = pDBs->getNamedDBs();
ScDBCollection::NamedDBs::const_iterator it = rNamedDBs.begin(), itEnd = rNamedDBs.end();
for (; it != itEnd; ++it)
{
const ScDBData& rData = *it;
maNamedDBs.insert(IndexNameMapType::value_type(rData.GetIndex(), rData.GetName()));
}
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment